Solana Anchor:如何为/读取关联帐户制作#[account(seeds)]?

Posted

技术标签:

【中文标题】Solana Anchor:如何为/读取关联帐户制作#[account(seeds)]?【英文标题】:Solana Anchor: How to make #[account(seeds)] for/ read associated accounts? 【发布时间】:2021-10-15 07:46:01 【问题描述】:

在 project-serum/anchor repo 的 Basic-5 教程中 我怎样才能替换#[关联] 像这样:

#[account(seeds = [user_data.deposit_last.as_ref(), &[user_data.__nonce]])]

上面有一些不正确的地方,那么 Anchor 无法读取关联账户的值

const userData = await program.account.userData.associated(wallet1, usdcMint);

那么在关联帐户结构上方替换这个即将被弃用的#[关联] 的正确方法是什么?

#[associated]
#[derive(Default)]
pub struct UserData 
  pub authority: Pubkey,
  pub deposit_last: i64,
  pub shares: u64,
  pub reward_debt: u64,


//UserData is initialized here first
#[derive(Accounts)]
pub struct Initialize<'info> 
  #[account(init, associated = authority, with = usdc_mint)]
  pub user_data: ProgramAccount<'info, UserData>,
...

【问题讨论】:

【参考方案1】:

所以种子方法是一个 PDA,这实际上是 #related 在引擎盖下使用的

您将需要一个函数来初始化具有以下 initpayer 特征的种子。 payer 也应该是实际支付交易费用的同一用户。

请注意#[instruction(bump: u8] 与此处的函数签名匹配,因此您需要将签名中的凹凸作为第一个参数传入。

#[instruction(bump: u8]
pub struct Ctx<'info> 
  #[account(init, seeds = [user_data.deposit_last.as_ref(), &[bump]], payer = payer)]
  pub user_data = ProgramAccount<'info, UserData>,


以后其他功能如果你只想看账号,可以直接使用

#[account(seeds = [user_data.deposit_last.as_ref(), &[user_data.__nonce]])]
pub user_data = ProgramAccount<'info, UserData>,

更改您的帐户数据以使用 #[account] 而不是 #[related]

#[account]
#[derive(Default)]
pub struct UserData 
  pub authority: Pubkey,
  pub deposit_last: i64,
  pub shares: u64,
  pub reward_debt: u64,

这是一个例子https://github.com/project-serum/anchor/blob/master/examples/misc/programs/misc/src/context.rs#L10

【讨论】:

yangli-io,谢谢!我试过了,我只需用#[account]替换#[associated],然后将“pub __nonce:u8”添加到UserData结构,就可以进行锚测试!这是你的函数#[instruction(bump: u8] 的快捷方式吗? 这不是一个捷径,#[instruction(bump: u8)] 是用于当您希望能够访问您的方法参数时 @yangli-io 您的示例链接给了我一个 404 错误。也许将页面内容复制到您的答案中会有所帮助?

以上是关于Solana Anchor:如何为/读取关联帐户制作#[account(seeds)]?的主要内容,如果未能解决你的问题,请参考以下文章

通过向关联令牌元数据帐户发送资金来解决 Solana 钱包问题

如何使用 web3js solana 工具关闭关联的令牌帐户

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

Solana中利用Anchor自动解析TokenAccount

Solana中利用Anchor自动解析TokenAccount

Solana Anchor:程序如何检查用户提供的已批准令牌配额?