我知道我可以通过 Context 结构为我的 Solana Rust 程序提供用户的令牌帐户,如 Anchor 教程 2 所示:https ://project-serum.github.io/anchor/tutorials/tutorial-2.html#defining-a-程序
#[derive(Accounts)]
pub struct Stake<'info> {
pub user_reward_token_account: CpiAccount<'info, TokenAccount>,
...
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我希望用户首先将该用户的令牌帐户保存在某个用户的存储帐户中,然后让我的 Solana 程序从该用户的存储帐户中获取这些令牌帐户,该怎么办?
let user_acct = &ctx.accounts.user_acct;
Run Code Online (Sandbox Code Playgroud)
然后,当尝试将一些奖励代币铸造到用户的代币帐户时:
let cpi_accounts = MintTo {
mint: ctx.accounts.reward_mint.to_account_info(),
to: user_acct.reward_user,
authority: ctx.accounts.pg_signer.clone()
};
Run Code Online (Sandbox Code Playgroud)
我在编译时遇到错误:预期结构anchor_lang::prelude::AccountInfo
,发现结构anchor_lang::prelude::Pubkey
但是这个 to_account_info() 方法在anchor_lang::prelude::Pubkey
我检查了 Pubkey 文档:https://docs.rs/anchor-lang/0.13.2/anchor_lang/prelude/struct.Pubkey.html
但它没有说任何关于 AccountInfo 的事情......
然后我尝试在https://docs.rs/anchor-lang/0.13.2/anchor_lang/prelude/struct.AccountInfo.html的帮助下从reward_user地址创建一个AccountInfo结构:
let to_addr = AccountInfo {
key: &user_acct.reward_user,
is_signer: false,
is_writable: true,
lamports: Rc<RefCell<&'a mut u64>>,
data: Rc<RefCell<&'a mut [u8]>>,
owner: &user_pda.user_acct,
executable: false,
rent_epoch: u64,
};
Run Code Online (Sandbox Code Playgroud)
但这真的很难,我不知道 lamports、data、rent_epoch 值是什么......
那么如何将公钥转换为AccountInfo类型呢?
您需要通过上下文传递帐户才能访问其数据。这种设计允许 Solana 通过在运行前了解需要哪些帐户和数据来更好地并行化事务。
归档时间: |
|
查看次数: |
8165 次 |
最近记录: |