Якорь: ошибка при попытке инициализировать производную учетную запись программы (КПК)

Я получаю сообщение об ошибке ниже всякий раз, когда пытаюсь инициализировать учетную запись КПК:

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. может быть, это помогает.

Другие вопросы по тегам