首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Solana Anchor:如何为/读取关联帐户制作#[account(seeds)]?

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

Stack Overflow用户
提问于 2021-08-11 21:06:25
回答 1查看 1.4K关注 0票数 4

在项目的Basic-5教程--血清/锚库中,我怎样才能用下面这样的东西替换#:

代码语言:javascript
复制
#[account(seeds = [user_data.deposit_last.as_ref(), &[user_data.__nonce]])]

如果上面有一些不正确的地方,那么Anchor无法读取相关帐号的值

代码语言:javascript
复制
const userData = await program.account.userData.associated(wallet1, usdcMint);

那么,在关联的account结构上替换这个即将被废弃的#的正确方法是什么呢?

代码语言:javascript
复制
#[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>,
...
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-12 01:33:48

因此,种子方法是PDA,这实际上是#associated在幕后使用的

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

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

代码语言:javascript
复制
#[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>,
}

稍后,对于其他函数,如果您只想读取帐户,则可以使用

代码语言:javascript
复制
#[account(seeds = [user_data.deposit_last.as_ref(), &[user_data.__nonce]])]
pub user_data = ProgramAccount<'info, UserData>,

将您的帐户数据更改为使用#account而不是#associated

代码语言:javascript
复制
#[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示例

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68748932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档