Якорь: ошибка при попытке инициализировать производную учетную запись программы (КПК)
Я получаю сообщение об ошибке ниже всякий раз, когда пытаюсь инициализировать учетную запись КПК:
Error: failed to send transaction: Transaction simulation failed: Error processing Instruction 0: Cross-program invocation with unauthorized signer or writable account
#[program]
pub mod myprogram {
use super::*;
pub fn initialize(ctx: Context<Initialize>, bump:u8) -> ProgramResult {
let base_account: &mut Account<BaseAccount> = &mut ctx.accounts.base_account;
base_account.bump = bump;
base_account.counter = Some(0);
return Ok(());
}
}
#[derive(Accounts)]
#[instruction(bump:u8)]
pub struct Initialize<'info> {
#[account(
seeds = [b"seed".as_ref()],
bump, init, payer = creator, space = 20000)]
pub base_account: Account<'info, BaseAccount>,
#[account(mut)]
pub creator: Signer<'info>,
#[account(address = system_program::ID)]
pub system_program: AccountInfo<'info>,
}
#[account]
#[derive(Default)]
pub struct BaseAccount {
pub counter: Option<u64>,
pub bump: u8,
}
Мой тестовый код выглядит так:
const [baseAccountPDA, baseAccountPDABump] = await anchor.web3.PublicKey.findProgramAddress(
[Buffer.from("seed")],
program.programId
);
await program.rpc.initialize(baseAccountPDABump, {
accounts: {
baseAccount: baseAccountPDA,
creator: program.provider.wallet.publicKey,
systemProgram: anchor.web3.SystemProgram.programId,
},
signers: [],
});
Я попытался использовать недавно сгенерированную пару ключей в качестве создателя и добавить эту пару ключей подписавшим, но, похоже, я не могу заставить это работать.
2 ответа
Оказывается, этот код является правильным способом создания КПК :) У меня был запущен тестовый валидатор, поэтому он пытался выполнить против ранее существовавшего контракта!
как вы упомянули, вы должны закрыть терминал test-validator перед выполнением
anchor test
якорь запускает тестовый валидатор для вас сам по себе, и после теста вы можете увидеть папку тестовой книги в корневом каталоге вашего проекта якоря соланы. Еще один момент: вы должны добавить папку тестовой книги в свой файл .gitignore. может быть, это помогает.