调用Solana合约时出现指令所需账户缺失错误的排查求助
Solana合约调用报错:An account required by the instruction is missing
问题代码
SolAccountInfo *store_account = ¶ms->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
排查与解决步骤
确认子合约的指令需求
先查看pk_holder合约中处理指令2的代码逻辑,明确它需要的账户数量、顺序和权限。报错的核心原因是你传入的账户列表不满足子合约要求——子合约的指令2需要的账户不止当前传入的store_account一个。补全必要账户到AccountMeta数组
比如如果子合约的指令2要求第一个账户是store_account(可写入),第二个账户是当前合约(作为签名者),那么需要修改arguments数组:SolAccountMeta arguments[] = { {store_account->key, false, true}, // store_account:无需签名,允许写入 {params->program_id, true, false} // 当前合约账户:作为签名者,无需写入 };注意:子合约需要的所有账户必须存在于你传给
sol_invoke的params->ka数组中——也就是调用当前合约的交易里必须预先包含这些账户。修正佣金计算的精度问题
当前用浮点数计算佣金*store_account->lamports * 0.2会导致精度丢失,Solana的lamports是整数类型,必须用整数运算:uint64_t ref_comission = (*store_account->lamports * 2) / 10;验证账户权限匹配
检查子合约对每个账户的权限要求:如果子合约需要修改某个账户,对应的is_writable要设为true;如果需要该账户作为签名者,is_signer要设为true,权限不匹配也会触发类似错误。
内容的提问来源于stack exchange,提问作者Jakub Kutrzeba
相关产品推荐
相关产品推荐

