我知道可以通过上下文结构(Context struct)像Anchor教程2中所示,给我的Solana Rust程序提供用户的令牌账户:
https://project-serum.github.io/anchor/tutorials/tutorial-2.html#defining-a-program#[derive(Accounts)]
pub struct Stake<'info> {
pub user_reward_token_account: CpiAccount<'info, TokenAccount>,
...
}
但是如果我想让用户先将该用户的令牌账户保存在特定用户的存储账户中,然后让我的 Solana 程序从该用户的存储账户获取这些令牌账户呢?
let user_acct = &ctx.accounts.user_acct;
当尝试将一些奖励代币铸造到用户的代币账户时:
let cpi_accounts = MintTo {
mint: ctx.accounts.reward_mint.to_account_info(),
to: user_acct.reward_user,
authority: ctx.accounts.pg_signer.clone()
};
在编译时出现了错误:期望结构体 anchor_lang::prelude::AccountInfo
,但找到结构体 anchor_lang::prelude::Pubkey
。
但在 anchor_lang::prelude::Pubkey
中找不到 to_account_info() 方法。
我检查了 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,
};
但这真的很困难,而且我不知道Lamports、数据和Rent_Epoch值是什么...
那么我该如何将公钥转换为AccountInfo类型?