区块链(19):revert 以后为什么仍要核算 Gas 与 nonce
交易先经过签名、余额和 nonce 等可接收性检查,执行中还要为每一步消耗 gas。eth_estimateGas 是在给定当时的状态和参数下模拟,后续实际状态、排序和费用环境可能变化;“估算成功”不是“上链执行成功”,模拟时的读数据可能被其他交易改写。区块链(18):EVM 执行后哪些状态进入状态根中的 revert 撤销执行帧的状态效果,不能据此推断发起者完全不付费用。
flowchart TD
S[签名与 nonce 有效] --> I[被纳入区块]
I --> E{EVM 执行}
E -->|成功| C[状态变化 + 用气 + 回执成功]
E -->|revert/耗尽 gas| F[业务状态未按预期改变,仍有费用]
C --> B[再检查区块与最终性]
F --> B
EIP-1559 风格费用把协议动态调整的基础费与交易提出的费用上限、小费上限联系起来;基础费按规则处理,不应简单写成全部支付给验证者。应用实际支出要从回执用气量与生效单位价格复算,不能把 maxFeePerGas × gasLimit 当每次实付。交易执行失败仍可能消费 nonce;构造阶段因 nonce 错误被拒、执行阶段 revert、链重组导致旧回执不再在规范链上,这三者的补偿方式不同。
用一张账区分预留与实付
对采用 EIP-1559 类型交易的教学案例,交易字段中 gas limit 是可供执行的上限,不等于实际已用量;maxFeePerGas 是愿付单位价格上限,maxPriorityFeePerGas 是小费上限。在符合该费用机制的网络规则下,有效单位价格受基础费与小费上限、总上限共同约束,最终按回执的 gasUsed 和相应的有效价格核对执行资源账单。报出 maxFeePerGas × gasLimit 只是最坏情形一类上限估计,不能填到商家实际收到的资产栏;具体基础费处理与额外费用还要由所用链的规则确定。
合成订单 confirm 读到尚未交付时触发 revert:执行前接收性检查若已通过,它可能已经占了发起者 nonce、使用了 gas,却没有为卖家建立可领债权。重复同 nonce 的交易不应被应用自动当成重试成功。若交易在签名前或提交时因余额不足/nonce 错误被拒,那是另一个状态,通常根本没有本次执行回执。若回执先在旧分支出现后重组,该回执的历史位置要重新核对,不能只存交易哈希和旧费用。eth_estimateGas 在不同前状态和输入下模拟的结果不具备上述真实执行证据,当前亦无 EL 实测 gas 数字。
练习一:估算时订单为 OPEN,实际执行前另一笔交易已经取消订单,原估算能保证结算成功吗?答案:不能;执行前状态改变,必须读实际回执并检查当前合约状态。练习二:回执 status=0、gasUsed>0,后台是否能只写“没发生任何事、无需对账”?答案:不能;订单结算效果可能撤销,但费用、nonce 和链上纳入历史仍要单列记录。
本地没有 Anvil、Forge 或 EL/CL 私网,成功、revert 和 out-of-gas 对照均 NOT_RUN;不预填气价或 gas 常量。可迁移原则:区分提交有效性、执行状态与资源账单。参考:EIP-1559、执行规范(fork 配置、源码 SHA 和实测待核);导航:区块链(18):EVM 执行后哪些状态进入状态根 · 19 · 区块链(20):教学托管合约先写清谁能推动状态。



