繁体   English   中英

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

[英]Solana Anchor: How to make #[account(seeds)] for/ read associated accounts?

在 project-serum/anchor repo 的 Basic-5 教程中我如何用这样的东西替换#[associated]:

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

上面有不对的地方,那么Anchor读取关联账户的值失败

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

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

#[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>,
...
}

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

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

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

#[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] 而不是#[associated]

#[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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM