简体   繁体   English

Anchor测试交易模拟失败:指令要求的账户丢失

[英]Anchor test Transaction simulation failed: An account required by the instruction is missing

I am trying to create a simple program that lets users donates.我正在尝试创建一个让用户捐赠的简单程序。 This program is bootstrapped by Anchor.该程序由 Anchor 引导。 Unfortunately, It failed on very first step creating a PDA account by CPI.不幸的是,它在通过 CPI 创建 PDA 帐户的第一步失败了。 Please see the detailed info below:请参阅以下详细信息:

Anchor test fails with:锚点测试失败:

    PublicKey {
  _bn: <BN: 265af4367675fa484c7148bf59dd7392a0a290cee149a6912c35a01495da14df>
} PublicKey {
  _bn: <BN: ee4f6de6f56f9606ca2af702908a5655ede672356998a6139802e3cdde9325f3>
}
Transaction simulation failed: Error processing Instruction 0: An account required by the instruction is missing 
    Program Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS invoke [1]
    Program log: Instruction: SendDonation
    Instruction references an unknown account 11111111111111111111111111111111
    Program Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS consumed 5599 of 1400000 compute units
    Program Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS failed: An account required by the instruction is missing
    1) Should send donation

Here the lib.rs这里是 lib.rs

use anchor_lang::prelude::*;

declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");

#[program]
pub mod crypto_donut {
    use super::*;
    use anchor_lang::solana_program::entrypoint::ProgramResult;
    use anchor_lang::solana_program::program::invoke;
    use anchor_lang::solana_program::system_instruction::transfer;

    pub fn initialize(ctx: Context<Initialize>) -> ProgramResult {
        let base_account = &mut ctx.accounts.base_account;
        base_account.owner = ctx.accounts.user.to_account_info().key();
        Ok(())
    }

    pub fn send_donation(ctx: Context<Donation>, amount: u64) -> ProgramResult {
        let base_account = &mut ctx.accounts.base_account;
        base_account.donators.push(ctx.accounts.user.key());

        let instruction = transfer(ctx.accounts.user.key, &base_account.key(), amount);

        invoke(
            &instruction,
            &[
                ctx.accounts.user.to_account_info(),
                base_account.to_account_info(),
            ],
        )
        .unwrap();

        Ok(())
    }
}

#[derive(Accounts)]
pub struct Initialize<'info> {
    #[account(init, payer = user, space = 64 + 1024)]
    pub base_account: Account<'info, BaseAccount>,

    #[account(mut)]
    pub user: Signer<'info>,
    pub system_program: Program<'info, System>,
}

#[account]
pub struct BaseAccount {
    pub donators: Vec<Pubkey>,
    pub owner: Pubkey,
}

#[derive(Accounts)]
pub struct Donation<'info> {
    #[account(mut)]
    pub base_account: Account<'info, BaseAccount>,
    pub user: Signer<'info>,
}

Here the test which failed:这里是失败的测试:

  it("Should send donation", async () => {
      const donator = anchor.web3.Keypair.generate();

      console.log(donator.publicKey, baseAccount.publicKey);

      await provider.connection.confirmTransaction(
          await provider.connection.requestAirdrop(donator.publicKey, 10000000000),
          "confirmed"
        );

        const tx = await program.rpc.sendDonation(new anchor.BN(100), {
          accounts: {
              baseAccount: baseAccount.publicKey,
              user: donator.publicKey,
          },
          signers: [donator],
        });

        const balance = await program.account.baseAccount.getAccountInfo(donator.publicKey);
      console.log(balance);
        expect(balance.lamports.toString()).equal("100");
      });
});

What am I doing wrong?我究竟做错了什么?

Lol, i forget #[account(mut)] before pub user: Signer<'info> :))大声笑,我忘记了pub user: Signer<'info>之前的#[account(mut)] : Signer<'info> :))

#[derive(Accounts)]
pub struct Donation<'info> {
    #[account(mut)]
    pub base_account: Account<'info, BaseAccount>,
    #[account(mut)]
    pub user: Signer<'info>,
    pub system_program: Program<'info, System>,
}

and system_program too.还有system_program Thanks for Stepan comment感谢 Stepan 的评论

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 锚点测试交易失败并显示“缺少指令所需的帐户” - Anchor test transaction failed with "An account required by the instruction is missing" 交易模拟失败:错误处理指令0:使用未经授权的签名者或可写帐户进行跨程序调用 - Transaction simulation failed: Error processing Instruction 0: Cross-program invocation with unauthorized signer or writable account 交易模拟失败:错误处理指令0:自定义程序错误:0x0 - Transaction simulation failed: Error processing Instruction 0: custom program error: 0x0 Solana 锚点错误:发送交易失败:交易无效:交易未能正确清理账户偏移 - Solana Anchor Error: failed to send transaction: invalid transaction: Transaction failed to sanitize accounts offsets correctly 错误处理指令0:账户数据序列化或反序列化失败:未知 - Error processing Instruction 0: Failed to serialize or deserialize account data: Unknown 通过 system_instruction::create_account(带锚框架的链上程序)创建新帐户时,Solana CPI(运行时)调用失败 - Solana CPI (runtime) invoke fails when creating a new account by system_instruction::create_account (on-chain program with anchor framework) 如何在锚定智能合约指令中转账SOL - How to transfer SOL in anchor smart contract instruction 锚点:指令包装器中可变数量的帐户 - Anchor: variable number of accounts in instruction wrapper Anchor中的Program、Account、Publickey和Keypair - Program, Account, Publickey and Keypair in Anchor 锚点:Solana 帐户初始化问题 - Anchor: Solana Account Initialization Issue
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM