Solana Anchor Rust: Как преобразовать открытый ключ в тип AccountInfo

#rust #solana

Вопрос:

Я знаю, что могу предоставить своей программе Solana Rust учетную запись токена пользователя с помощью контекстной структуры, как показано в учебнике 2: 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 = amp;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

но этот метод to_account_info() не найден в anchor_lang::prelude::Pubkey

Я проверил документ Pubkey: https://docs.rs/anchor-lang/0.13.2/anchor_lang/prelude/struct.Pubkey.html

Но это ничего не говорит об AccountInfo …

Затем я попытался создать структуру AccountInfo с адреса reward_user с помощью https://docs.rs/anchor-lang/0.13.2/anchor_lang/prelude/struct.AccountInfo.html:

 let to_addr = AccountInfo {
  key: amp;user_acct.reward_user,
  is_signer: false,
  is_writable: true,
  lamports: Rc<RefCell<amp;'a mut u64>>,
  data: Rc<RefCell<amp;'a mut [u8]>>,
  owner: amp;user_pda.user_acct,
  executable: false,
  rent_epoch: u64,
};
 

Но это действительно сложно, и я не знаю, каковы значения lamports, data, rent_epoch…

Итак, как я могу преобразовать открытый ключ в тип AccountInfo?

Ответ №1:

Вам нужно будет передать учетные записи через контекст, чтобы иметь возможность получить доступ к его данным. Такая конструкция позволяет Solana лучше распараллеливать транзакции, зная, какие учетные записи и данные требуются до выполнения.