题目
用户拿着一个交易哈希来投诉:「钱包里显示已发送,但区块浏览器查不到这笔交易,是不是钱丢了?」
请说明交易哈希、区块哈希和交易收据分别代表什么,并列出「查不到」的几种可能原因,以及你会如何排查。
考察目标
- 交易、区块、收据三者的先后关系。
- 「拿到哈希」不等同于「交易已被网络接受」。
- 节点可见性问题与真正的交易失败的区别。
考察交易哈希、区块哈希与收据的层级关系,以及查询失败的多种真实原因。
用户拿着一个交易哈希来投诉:「钱包里显示已发送,但区块浏览器查不到这笔交易,是不是钱丢了?」
请说明交易哈希、区块哈希和交易收据分别代表什么,并列出「查不到」的几种可能原因,以及你会如何排查。
交易哈希由交易内容确定,区块哈希标识包含它的区块,收据记录执行结果:包含状态、实际消耗的 gas 与日志。三者对应「交易被构造、被打包、产生执行结果」三个阶段。收据在交易被打包之后才可用,eth_getTransactionByHash 查不到时返回 null,因此「查不到」不构成交易失败的结论。
TransactionType || TransactionPayload 的字节序列表示,其哈希由该字节序列确定(依据:EIP-2718 §Specification)。gasUsed、cumulativeGasUsed、日志与日志布隆过滤器、blockHash 与 blockNumber、transactionHash 与 transactionIndex 等(依据:EIP-1474 §eth_getTransactionReceipt)。eth_getTransactionByHash 在按哈希查不到交易时返回 null,而不是以错误表示交易失败(依据:EIP-1474 §eth_getTransactionByHash)。nonce 的另一笔交易替换、当前节点尚未同步到对应区块、查询的网络与交易所在网络不同(依据:工程经验,无规范依据)。0 理解成交易不存在(【协议保证】status 为 0 表示执行失败,依据:EIP-1474 §eth_getTransactionReceipt)。nonce 与余额变化反查的排查路径,并说明重组对区块号与区块哈希的影响。发现这道题有问题? 反馈此题