以下是导致这种情况的主要原因、排查思路和解决方案。 主要原因分析1. 交易费用不足 (最常见的原因)原因:Solana 交易需要支付一笔很小的交易费(目前通常是 0.000005 SOL 或更少)。这笔费用用于支付网络处理成本并防止垃圾交易。 具体场景: 错误信息:RPC 响应中通常会包含 {"err":{"InstructionError":[0,{"Custom":1}]}} 之类的错误,其中 Custom:1 常常表示余额不足。
2. 区块哈希过期3. 前置交易失败 (在复杂交易中)原因:一笔 Solana 交易可以包含多条指令(Instructions)。这些指令按顺序执行。如果其中任何一条指令执行失败(例如,在一条 Swap 指令中,滑点过大导致无法满足最小收益),那么整个交易都会失败并被回滚,不会有任何指令生效。 具体场景:你发送一笔交易,包含:1)将 USDC 换成 SOL;2)将换来的 SOL 发送到另一个地址。如果第一条兑换指令因为价格波动失败,那么整个交易(包括第二步)都会失败。
4. 模拟成功但与实际执行时状态不符5. RPC 节点问题6. 其他常见编程错误账户未签名:交易中要求签名的账户没有全部正确签名。 账户顺序错误:在构造交易时,账户的传入顺序与程序期望的顺序不匹配。 租金豁免:对于新创建的系统账户或 Token 账户,没有存入足够的 SOL 使其达到租金豁免状态。
排查思路和解决方案当遇到这个问题时,请按照以下步骤排查: 获取明确的错误信息:
使用 getSignatureStatuses RPC 方法查询交易的最终状态。 如果使用 @solana/web3.js,可以用 connection.getSignatureStatus(signature)。 错误信息是解决问题的关键! 不要只看“失败”,要看具体的错误码。
检查签名账户的余额: 检查区块哈希: 分析复杂交易: 更换 RPC 节点: 重试机制:
总结原因 现象 解决方案
费用不足Custom:1 错误给支付手续费的地址充值 SOL
区块哈希过期Blockhash not found发送前更新为最新区块哈希
前置指令失败复杂交易部分失败检查业务逻辑,处理滑点等问题
抢跑/状态变化模拟成功,实际失败增加校验,接受失败可能性
RPC 节点问题交易未传播使用更稳定可靠的 RPC 服务
核心要点:广播成功只意味着交易进入了内存池,而上链成功需要交易通过执行阶段的全部校验。始终通过 RPC 查询交易的最终状态和错误信息来定位问题。
|