程序(合约)的交互JS交互通过anchor库,可以实现调用其他程序中的方法,与查看程序中定义的PDA账户中的数据//调用程序中的某个方法//导入相关库//anchor库更好的实现了程序方法的调用constanchor=require("@coral-xyz/anchor
通过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();
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))
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!