使用 Anchor 时系统程序账号需要传入啥?

Posted

技术标签:

【中文标题】使用 Anchor 时系统程序账号需要传入啥?【英文标题】:What to pass in for system program account when using Anchor?使用 Anchor 时系统程序账号需要传入什么? 【发布时间】:2022-01-05 21:56:50 【问题描述】:

我在 Solana 中使用 Anchor 框架。

我在 Rust 中有以下一组帐户:

但我正试图弄清楚如何在 javascript 中传递这些帐户。

我有以下测试代码:

    const admin = anchor.web3.Keypair.generate();

    const [gameAccount, bump] = await anchor.web3.PublicKey.findProgramAddress(
      [],
      program.programId
    );


    const tx = await program.rpc.createGameState(bump, 
      accounts: 
        gameAccount: gameAccount,
        user: admin,
        systemProgram: anchor.web3.SystemProgram.programId,
      ,
    );

但是,Anchor 抱怨:

     TypeError: x.pubkey.equals is not a function
      at findIndex (node_modules/@solana/web3.js/src/transaction.ts:285:23)
      at Array.findIndex (<anonymous>)
      at Transaction.compileMessage (node_modules/@solana/web3.js/src/transaction.ts:284:39)
      at Transaction._compile (node_modules/@solana/web3.js/src/transaction.ts:376:26)
      at Transaction.partialSign (node_modules/@solana/web3.js/src/transaction.ts:501:26)
      at NodeWallet.signTransaction (node_modules/@project-serum/anchor/src/provider.ts:246:8)
      at Provider.send (node_modules/@project-serum/anchor/src/provider.ts:105:23)
      at processTicksAndRejections (node:internal/process/task_queues:94:5)
      at Object.rpc [as createGameState] (node_modules/@project-serum/anchor/src/program/namespace/rpc.ts:24:23)

我很确定这正在发生 b/c 我在 anchor.web3.SystemProgram.programId 中传递 systemProgram,而它需要 anchor.Address。有人有解决办法吗?

【问题讨论】:

【参考方案1】:

这可能来自admin 参数。我不是锚方面的专家,但似乎将PublicKeys 和Keypairs 传递到同一个函数中存在问题。你可以试试通过吗:

const tx = await program.rpc.createGameState(bump, 
  accounts: 
    gameAccount: gameAccount,
    user: admin.publicKey,
    systemProgram: anchor.web3.SystemProgram.programId,
  ,
);

您还必须从管理员那里获得签名,不幸的是我不确定这是如何通过的。

【讨论】:

以上是关于使用 Anchor 时系统程序账号需要传入啥?的主要内容,如果未能解决你的问题,请参考以下文章

Linux中root账号和普通账号有啥区别,root账号为啥不能删除?

main函数是(唯一)被操作系统显式调用的函数。这里的显式调用是啥意思。

树莓派中用Python配置WIFI账号密码

远程要啥条件?

centos7的磁盘配额有啥特点

Linux账号权限管理