一笔以太坊交易显示失败,钱包里的 ETH 却少了,少的通常就是 Gas 费。原因在于:**只要交易已经被区块收录并进入执行阶段,网络就为处理它消耗了计算资源;失败改变的是交易结果,不改变已经付出的计算代价。**失败交易里,原本要转的 ETH 或代币会回滚,但 Gas 费照常结算。以太坊文档说明,费用按消耗的 Gas 乘以单位价格计算,与交易成功或失败无关;Etherscan 的支持文章也指出,失败交易中发送方拟转出的资金不会离开钱包,Gas 费仍会扣除。
两种“失败”的结算方式不同
**请求未被区块收录。**比如普通 ETH 转账把 Gas limit 设得低于验证所需的最低值,交易在进入区块前就被拒绝。它没有上链,不占用区块空间,也不产生 Gas 支出。这种情形更像请求没有被受理,链上查不到这笔交易的执行记录。
**已上链执行失败。**交易被区块收录,虚拟机开始执行,但因“Out of Gas”或“Reverted”等原因中止。此时区块空间已被占用,指令已被执行,验证者也完成了打包和验证,Gas 费按实际消耗结算。失败交易中,资产转移和合约状态变化会回滚到执行前,但计算成本不会退回。
钱包里“资产没少、ETH 少了”,通常属于第二种:少掉的部分是 Gas 费,不是转账金额。
收费针对执行,不针对结果
Gas 是对计算步骤的计价单位。一笔交易无论最终成功还是失败,都要经历检查余额、读取合约状态、执行调用、写入或回滚状态等步骤。回滚撤销的是状态变化,节点已经做过的计算不会因此消失;交易记录、nonce 和 Gas 支出仍留在链上。
所以判断一笔失败交易花了多少,不能看“转账有没有成功”,而要看链上记录的 gasUsed 和 effectiveGasPrice。
实际费用看 gasUsed,不看 gas limit
Gas limit 是发送方愿意为这笔交易消耗的上限,不是实际扣费金额。实际费用为:
实际费用 = gasUsed × effectiveGasPrice
普通 ETH 转账通常设 21000 的 Gas limit,实际用量一般也是 21000。若设成 50000 而只用了 21000,未用完的额度不会扣费。合约调用复杂时,gasUsed 可能远高于 21000。
交易因 Gas 不足失败,也要区分两种情形:
| 情形 | 是否上链 | 是否消耗 Gas | 说明 |
|---|---|---|---|
| 验证阶段被拒 | 否 | 否 | Gas limit 低于最低要求,交易未进入区块 |
| 执行中耗尽 Gas | 是 | 是 | 可能消耗提供的 Gas 限额,状态回滚 |
| 执行中 revert | 是 | 是 | 按执行到回滚点的实际 gasUsed 计费 |
注意最后一行:**不是所有 revert 都会花满 Gas limit。**实际消耗取决于执行走到了哪一步;只有执行中耗尽 Gas 的情形,才可能把提供的限额用完。
一组教学假设数字
假设一笔合约调用交易把 Gas limit 设为 60000,实际执行消耗 42000 Gas,effectiveGasPrice 为 3 gwei:
- 42000 × 3 = 126000 gwei
- 1 gwei = 0.000000001 ETH
- 126000 gwei = 0.000126 ETH
- 未使用的 Gas 为 60000 − 42000 = 18000,这部分不扣费
这组数字是虚构的教学算例,不是实测数据,也不对应任何真实地址或交易。它说明扣费由实际 Gas 用量和单价决定:即便交易失败并回滚,这 0.000126 ETH 仍会作为 Gas 费扣除,而交易中原本要转移的资产会回到执行前状态。
几个容易混淆的点
**Gas limit 设高会多扣吗?**不会。未用完的部分不扣费,设高只是给自己留余量。
**Gas limit 设低一定不扣费吗?**不一定。低于验证最低要求、交易未上链时不扣;但如果交易已上链、执行中耗尽 Gas,则会产生实际消耗。两者不能混为一谈。
**失败交易的资产去哪了?**回滚到执行前状态。发送方拟转出的 ETH 或代币不会转出,合约状态变化也被撤销;被扣除的只有 Gas 费。
**这是交易所提币费吗?**不是。交易所提币费是平台收取的服务费用,和以太坊按 Gas 计费是两套逻辑。这里讨论的范围仅限以太坊主网普通交易的 Gas 结算,不推断其他链或所有 Layer 2 的费用规则,不同网络可能有自己的计价与退款机制。
核对一笔失败交易
看到失败交易,按顺序核对:
- 交易是否出现在区块中?未上链的请求不产生 Gas 支出。
- 查看交易详情里的
gasUsed,不要用 Gas limit 代替。 - 查看
effectiveGasPrice,两者相乘得到实际费用。 - 对照失败原因:验证阶段被拒、执行中耗尽 Gas、执行中 revert,结算方式不同。
Gas 费没有退回来,是因为这笔交易已经被网络执行过,执行消耗的计算资源需要付费。失败回滚的是资产转移和状态变化,不是已经发生的计算成本。判断实际花了多少,应看链上的 gasUsed 和 effectiveGasPrice,而不是把 Gas limit 当成扣费金额。