0

每当尝试初始化 PDA 帐户时,我都会收到以下错误:

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: [],
    });

我尝试使用新生成的密钥对作为创建者,并将该密钥对添加到签名者,但我似乎无法让它工作。

4

2 回答 2

0

正如您提到的,您应该在执行之前关闭测试验证器终端

anchor test

锚自己运行 test-validator 并且在测试之后你可以在你的 solana 锚项目根目录中看到 test-ledger 文件夹,另一点是你应该将 test-ledger 文件夹添加到你的 .gitignore 文件中。也许它有帮助。

于 2022-01-06T10:10:58.397 回答
0

Turns out this code is the correct way to create a PDA :) I had a test-validator running so it was trying to execute against a previously existing contract!

于 2022-01-05T16:05:43.363 回答