Solana 中的程序的交互

  • nilliol
  • 更新于 2024-08-10 23:10
  • 阅读 571

程序(合约)的交互JS交互通过anchor库,可以实现调用其他程序中的方法,与查看程序中定义的PDA账户中的数据//调用程序中的某个方法//导入相关库//anchor库更好的实现了程序方法的调用constanchor=require("@coral-xyz/anchor

程序(合约)的交互

JS 交互

通过anchor库,可以实现调用其他程序中的方法,与查看程序中定义的PDA账户中的数据

// 调用程序中的某个方法

// 导入相关库
// anchor 库更好的实现了程序方法的调用
const anchor = require("@coral-xyz/anchor");
const { PublicKey } = require("@solana/web3.js");
const { Buffer } = require("buffer");
const fs = require("fs");

const connection = new anchor.web3.Connection(anchor.web3.clusterApiUrl("devnet"), "confirmed");

// 加载钱包文件
function localwalletkey(keypairFile) {
    const fs = require("fs");
    const loaded = anchor.web3.Keypair.fromSecretKey(
        new Uint8Array(JSON.parse(fs.readFileSync(keypairFile).toString()))
    );
    return loaded;
}

const keypair = localwalletkey("$path");
const wallet = new anchor.Wallet(keypair);

const provider = new anchor.AnchorProvider(connection, wallet, {
    preflightCommitment: "confirmed",
});
// 设置当前客户端的默认 provider
anchor.setProvider(provider);

// 调用其他程序的方法
async function callProgram() {
    // 加载相关的文件
    const idl = JSON.parse(fs.readFileSync("idl.json"));
    const programid = new anchor.web3.PublicKey("programID");
    // 实例化程序
    const program = new anchor.Program(idl, programid, provider);

    // 构建相关 PDA 地址
    const [Pda] = anchor.web3.PublicKey.findProgramAddressSync([Buffer.from("pda")], programid);

    // methods.方法名(方法中除了账户外的参数).accounts({方法的账户参数})
    // 方法名需要注意,并非与程序中定义(在seahorse框架下)的一致,而是驼峰写法
    const txhash = await program.methods
        .transferSol(new anchor.BN(1000))
        .accounts({
            Sender: wallet,
            pda: Pda,
        })
        .rpc();

    console.log("交易hash:", txhash);

    // 此处的 program.account.账户名称 ,需要采用驼峰写法
    const class_account = await program.account.pda.fetch(Pda);
    console.log("pda data:", class_account.owner);
}

callProgram();

Python 交互

from seahorse.prelude import *

declare_id("")

# Program 为一个程序类型
# callpda 为调用其他程序中涉及的 pda ,类型必定为UncheckedAccount
@instruction
def call_program(signer:Signer,callpda:UncheckedAccount ,program:Program,u:u64):
    # cpi调用
    program.invoke(accounts=[
        CpiAccount(callpda,mut=True)
    ],data = int_bytes(u))
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
nilliol
nilliol
0xbe3e...29A9
web3 的学习者,寻找实习机会中。 博客地址:https://llwh2333.github.io