You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用Solana合约时出现指令所需账户缺失错误的排查求助

Solana合约调用报错:An account required by the instruction is missing

问题代码

SolAccountInfo *store_account = &params->ka[0];

uint64_t ref_comission = *store_account->lamports * 0.2;

SolPubkey pk_holder = { .x = { 0x04 ,0x34 ,0x1d ,0xfa ,0xbf ,0xb9 ,0x24 ,0x0d ,0xda ,0x80 ,0x0f ,0xad ,0xd6 ,0x1d ,0xeb ,0xd7 ,0xd1 ,0x3f ,0x74 ,0x00 ,0xa1 ,0xf5 ,0xa3 ,0xe6 ,0xa9 ,0xb0 ,0x5d ,0x32 ,0xdb ,0x51 ,0x67 ,0x03 } };

SolAccountMeta arguments[] = {{store_account->key,true,true}};

uint8_t data[4 + 8];
*(uint32_t*)data = 2;
*(uint64_t *)(data + 4) = ref_comission;

const SolInstruction instruction = {
  &pk_holder, arguments, SOL_ARRAY_SIZE(arguments), data, SOL_ARRAY_SIZE(data)
};

uint64_t res = sol_invoke(&instruction, params->ka, params->ka_num);

报错信息

Error: failed to send transaction: Transaction simulation failed:
Error processing Instruction 1: An account required by the instruction
is missing


排查与解决步骤

  1. 确认子合约的指令需求
    先查看pk_holder合约中处理指令2的代码逻辑,明确它需要的账户数量、顺序和权限。报错的核心原因是你传入的账户列表不满足子合约要求——子合约的指令2需要的账户不止当前传入的store_account一个。

  2. 补全必要账户到AccountMeta数组
    比如如果子合约的指令2要求第一个账户是store_account(可写入),第二个账户是当前合约(作为签名者),那么需要修改arguments数组:

    SolAccountMeta arguments[] = {
        {store_account->key, false, true},  // store_account:无需签名,允许写入
        {params->program_id, true, false}   // 当前合约账户:作为签名者,无需写入
    };
    

    注意:子合约需要的所有账户必须存在于你传给sol_invoke的params->ka数组中——也就是调用当前合约的交易里必须预先包含这些账户。

  3. 修正佣金计算的精度问题
    当前用浮点数计算佣金*store_account->lamports * 0.2会导致精度丢失,Solana的lamports是整数类型,必须用整数运算:

    uint64_t ref_comission = (*store_account->lamports * 2) / 10;
    
  4. 验证账户权限匹配
    检查子合约对每个账户的权限要求:如果子合约需要修改某个账户,对应的is_writable要设为true;如果需要该账户作为签名者,is_signer要设为true,权限不匹配也会触发类似错误。


内容的提问来源于stack exchange,提问作者Jakub Kutrzeba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 23:22:15