以太坊交易失败 gas 消耗:先分清失败发生在哪一步 图 1
以太坊交易失败 gas 消耗:先分清失败发生在哪一步 · 图 1

钱包弹出“失败”两个字,并不能直接回答是否产生链上 Gas 费用。关键是失败发生在哪一层:交易若在被纳入区块前就因有效性或验证问题被拒绝,它和已经上链、由 EVM 执行后回滚,不是同一类情况。对已被纳入区块并执行的交易,Gas 衡量执行所需计算;即便执行失败,已完成的计算仍可能按规则计费。

先把交易过程分成几个阶段

可以把用户看到的操作拆为四步:发起请求、节点或交易池检查、交易被纳入区块、EVM 执行并形成回执。钱包预执行时报错、节点拒绝请求,与链上执行后返回失败状态,是不同阶段。没有具体交易哈希和错误响应时,不能仅凭某一条钱包提示判断到底发生了哪一步。

情形发生阶段链上是否已有执行Gas 后果的事实边界
入块前被拒绝有效性/验证或提交阶段尚未作为区块内交易执行该请求未作为有效交易纳入区块,因此没有对应的区块内 EVM 执行;这不能与执行期间耗尽 Gas 混为一谈
执行触发 REVERT已纳入区块并进入 EVM执行发生,状态修改回滚回滚不恢复此前已消耗的 Gas;未使用部分按规则退还
执行时耗尽 Gas已纳入区块并进入 EVM执行耗尽可用 Gas执行状态回滚,提供给该笔交易的 Gas 会被消耗;具体费用还受费用参数与规则影响

REVERT:状态恢复,不代表计算免费

合约执行到 REVERT 时,状态更改会回滚,意思是这些更改不会作为成功执行结果保留下来。但这不等于此前的计算从未发生。Ethereum.org 的 Gas 文档将执行前已经消耗的 Gas 与状态回滚区分开来:已消耗的部分不会因为回滚而返还,未使用的 Gas 则按规则退还。

因此,“资产状态没有变化”和“没有费用”是两个判断。前者关注状态修改是否留下,后者关注执行过程消耗了多少资源以及交易费用规则如何结算。把回滚理解成整个交易从链上消失,会遗漏这一层差别。

out-of-gas:预算耗尽后的结果

交易执行如果耗尽提供的 Gas,EVM 执行状态会回滚,提供给这笔交易的 Gas 会被消耗。这里不应擅自填入固定扣费数值:实际费用会依赖交易费用参数与适用的 Gas 规则,而本文事实包没有提供某笔交易的实时参数或快照。因而,对某个具体交易问“究竟花了多少”,需要查看该交易的回执和交易参数,而不是套用文章里的统一数字。

如何通过链上证据定位

有交易哈希时,先查询回执。 使用 eth_getTransactionReceipt 检查是否已经有回执,再查看 status 和 gasUsed。回执存在,说明可以围绕该交易的链上执行结果核查;status 表示成功或失败,gasUsed 给出该笔交易的 Gas 使用量。具体费用金额还需要结合适用的交易费用参数,不能把 Gas 数量直接等同于某个固定的 ETH 费用。

没有回执时,不要立即归类。 交易可能还未被纳入区块,也可能查询的网络或节点不匹配。没有哈希或 RPC 错误响应时,不能从钱包界面的“失败”字样诊断具体原因。钱包预执行错误、交易池拒绝、EVM REVERT 与 out-of-gas 的提示会因钱包、客户端和 RPC 服务而异。

区分链上失败和客户端错误。 如果请求在纳入区块前就被拒绝,链上没有对应的已执行交易;如果已经有回执且状态失败,则需要按执行失败理解,并结合 Gas 字段确认消耗情况。不要为验证猜测而反复签名或广播不同交易,也不要根据不明来源的“加速”指引操作。

适用边界

本文不提供当前费用报价,也不罗列固定的失败成本。交易类型和协议升级可能影响计费细节;钱包估算、节点预执行错误和 RPC 提示则需要针对具体工具核验。若要判断个人交易,应保留网络、交易哈希、回执及相关错误响应,再对照官方资料;缺少这些信息时,答案只能停留在机制层面。

还可参阅以太坊 Gas 使用量怎么看?、以太坊 Gas 费怎么算?和以太坊交易回执怎么看?。这些内容分别解释 Gas 字段、费用口径与回执信息。本文仅用于解释以太坊交易机制,不构成投资建议或交易指令;签名和广播可能导致资产或费用变化,请在采取任何链上操作前自行核验交易内容、网络和接收对象。