题目
一个页面用 cumulativeGasUsed 展示单笔交易的 gas 消耗,另一个页面拿到 status 为 0x1 就提示「成功」。请逐项解释 receipt 字段,并说明正确的读取方式与展示口径。
考察目标
- 逐项理解 receipt 字段的含义与用途。
- 说明
status与执行结果、费用结算的关系。 - 设计确认深度与界面状态的对应关系。
逐项解释 receipt 字段的含义与用途,并说明 status、确认深度与失败成本之间的关系。
一个页面用 cumulativeGasUsed 展示单笔交易的 gas 消耗,另一个页面拿到 status 为 0x1 就提示「成功」。请逐项解释 receipt 字段,并说明正确的读取方式与展示口径。
status 与执行结果、费用结算的关系。receipt 中 status 为 0x1 表示执行成功、0x0 表示执行失败;blockNumber 与 blockHash 标定打包位置;gasUsed 是本交易实际消耗,cumulativeGasUsed 是区块内累计消耗;effectiveGasPrice 是实际每 gas 价格;logs 是本交易产生的事件;contractAddress 在部署交易中返回;交易未打包时 receipt 为 null。实现差异与工程取舍见深入回答。
【协议保证】receipt 的 status 取值 0x1 表示执行成功,0x0 表示执行失败(依据:EIP-1474 §eth_getTransactionReceipt)。
【协议保证】blockNumber 与 blockHash 标定交易被打包的区块位置(依据:EIP-1474 §eth_getTransactionReceipt)。
【协议保证】gasUsed 是本交易实际消耗的 gas;cumulativeGasUsed 是区块内累计消耗(依据:EIP-1474 §eth_getTransactionReceipt)。
【协议保证】交易的 effective gas price 由区块 base fee 与 priority fee 计算(依据:EIP-1559 §Specification)。
【协议保证】logs 是本交易产生的日志条目集合(依据:EIP-1474 §eth_getTransactionReceipt)。
【协议保证】contractAddress 用于标识新合约地址(依据:EIP-1474 §eth_getTransactionReceipt)。
【协议保证】交易尚未被打包时,收据查询返回空结果(依据:EIP-1474 §eth_getTransactionReceipt 的说明)。
【工程经验】执行失败的交易已经进入区块并按实际消耗结算费用,界面上不适合把 status 为 0x0 当作免费操作来呈现(依据:ethereum.org Transactions §Transaction lifecycle 对交易结果的描述;工程经验)。
【工程经验】只读到一次 status 为 0x1 并不代表最终性达成,界面状态按确认深度分档展示(依据:工程经验,无规范依据)。
【工程经验】排查失败原因时依赖模拟与回滚原因解析:执行回滚会同时撤销该交易内的日志记录,receipt 里可能没有可用于排查的业务事件(依据:工程经验,无规范依据)。
cumulativeGasUsed 展示单笔交易的 gas 消耗。null 当作交易失败。status 就提示最终成功,不等待确认。logs 中查找业务事件来定位原因。contractAddress。gasUsed 与 cumulativeGasUsed 分别适合用在什么展示场景?status 的两种取值含义,以及 receipt 为 null 表示尚未打包。gasUsed 与 cumulativeGasUsed 的口径不同。blockNumber、logs、contractAddress 的用途。发现这道题有问题? 反馈此题