同一笔Solana交易,钱包可能已经拿到签名,getSignatureStatuses却返回null。最危险的处理不是继续等待,而是把null直接翻译成“失败”:程序随后重新发起转账,反而可能造成重复操作。这个RPC查询的是签名状态视图,必须把缓存范围、历史搜索、响应位置和执行结果四件事分开。
null首先表示当前查询没有状态对象
该RPC返回每个输入交易签名的当前状态,输入必须是交易的第一签名,单次最多256个。
未启用searchTransactionHistory时,只搜索活动slot与MAX_RECENT_BLOCKHASHES个已root slot的近期状态缓存。
返回value数组与输入签名逐项对应,条目可以是状态对象或null;null本身不证明交易失败。
| 返回项 | 当前能确认 | 不能推断 |
|---|---|---|
| null | 本次查询没有取得状态对象 | 交易一定失败、从未上链 |
| err不为null | 交易执行记录包含错误 | 交易从未被打包 |
| confirmed | 已达到confirmed语境 | 永久不可回滚 |
| finalized | 已达到finalized语境 | 业务账务已完成 |
返回数组和输入签名按位置对应。批量查询时应保存“输入索引—签名—输出索引”,不能先删除null再处理剩余对象,否则第二个状态可能被错误写给第一个签名。若整个RPC请求失败,则所有条目都应是unknown,而不是批量null。
两阶段查询避免每次都扫描历史
第一阶段使用默认近期缓存,适合高频轮询新交易;第二阶段只对超过业务等待窗口且仍为null的签名启用searchTransactionHistory。这样既保留实时性,也避免所有请求都强制访问历史索引。进入第二阶段的原因、时间和RPC节点要随记录保存。
历史搜索仍返回null时,先核对集群、签名格式和最初发送响应,再选择另一家已验收的历史节点交叉检查。不能无限缩短轮询间隔,也不能不断重发原始交易。支付系统应先冻结重复提交,直到签名状态或业务幂等键给出明确结果。
confirmationStatus和err要独立读取
状态对象包含slot、confirmations、err、status与confirmationStatus;示例中finalized记录的confirmations可为null。
confirmations为null可能出现在finalized记录中,因此不能把null confirmations解释为“零确认”。程序优先读取confirmationStatus,并同时检查err。一个交易可以已经进入区块却执行失败;这时状态不是“未找到”,业务也不能把失败交易当作成功扣款。
status字段为兼容结构时,解析器要允许未来增加字段,并保留原始响应。面向用户只展示必要结论:仍在确认、已确认、已最终化、执行失败或状态未知;不要把节点内部字段堆成一个含糊的“处理中”。
context.slot用于判断这份答案有多新
每次响应同时保存context.slot、RPC端点、请求时间和集群身份。若负载均衡把请求发到落后节点,后一次查询的context.slot可能比前一次低;状态机不能因为旧视图又出现null就回退到“交易不存在”。可设置最低上下文或拒绝明显倒退的样本。
跨节点对账时先对齐集群和确认语境。一个节点给confirmed、另一个节点给null,通常应该继续观察并检查两者上下文,而不是投票决定结果。最终业务入账还要结合接收地址、金额、程序日志和自己的幂等记录。
可恢复的状态机比单次判断更重要
推荐状态为submitted、recent-unknown、history-searching、confirmed、finalized、execution-failed和query-unknown。每次转移保存触发证据,且finalized或execution-failed不因一次旧节点响应自动回退。超时后由人工或补偿流程处理,不自动重新签名。
相关排障可结合交易哈希返回null排障、Solana区块分页和Solana余额口径。本文用于RPC状态读取和支付工程,不证明任何交易必然成功,也不构成资产追回或投资建议。
来源、日期与未决边界
- Solana getSignatureStatuses:参数、近期缓存、历史搜索、返回字段和256上限。
- Solana getTransaction:按签名回读已确认交易及null边界。
资料访问时间为2026-08-12。仍需留意:不同RPC供应商的历史保留、限流和索引能力不同;文章不把单节点null扩写成链上最终不存在。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。