交易失败也要收钱:链上那笔白烧的 Gas 该怎么记账 图 1
交易失败也要收钱:链上那笔白烧的 Gas 该怎么记账 · 图 1

在链上做 DeFi 操作,有一笔费用经常被忽略:失败的交易所烧掉的 Gas。很多人凭直觉认为,交易既然没有成交,资金没有变动,那这笔操作就应该是免费的。实际情况恰好相反。以太坊及其兼容链的执行模型是先行付款的:节点从你发起交易的那一刻起就开始消耗计算资源执行合约,走到哪一步、为什么停下来,都不影响已经发生的成本。交易回滚只是把状态改动整体撤销,不会把执行过程退还给你。

要理解这一点,可以把一次链上调用想成一场已经开演的演出。门票在售票处就被核验、灯光和场地已经开始计费,就算演出中途停电、观众被全部请回座位,场地费也照收。链上交易的 Gas 就是对占用节点资源、区块空间与存储读写的计费。回滚撤销的是「结果」——余额、持仓、授权都回到执行前;保留的是「过程」——计算已经做了,字节已经进了区块,验证者已经为打包付出了成本。

因此在费用构成上,失败交易的账和成功交易基本一致。基础费部分通常由协议销毁,优先费部分归打包该交易的节点侧收入。两者都不会因为交易回滚而自动退还给你。唯一的区别是「用没用满」:失败交易实际消耗的 Gas 由它回滚前执行的路径决定,可能只用掉了你设定的 Gas 上限中的一部分,未用尽的额度部分会留在上限内不被扣取,但这并不意味着整笔免费。

还有一个常被忽略的事实:失败交易同样消耗随机数编号并永久留在链上。它不是「什么都没发生」,而是一条有记录、有费用、占位置的执行凭证。对经常操作账户的人来说,这些记录是排查问题的第一手材料:哪一笔在什么区块、估算多少 Gas、大概卡在哪类检查上,都能回溯。把它当作纯浪费,反而丢掉了信息价值。

那么这笔钱该记在哪个科目下?合理的做法不是把它归入「亏损」,而是归入「操作成本」,像运输途中的损耗率一样管理。具体算法很简单:单次失败的直接成本大约是该次交易实际消耗的 Gas 数量乘以当时的 Gas 单价,再乘上该操作的预期失败概率。一个需要连做五步操作的复合动作,如果每步失败率两成,整条链路重试一轮的期望成本就要按多轮计费来估,而不是按一次计费来估。

哪些场景最容易反复交学费?兑换类操作里滑点容忍设得过窄,行情一动报价就过期,提交即回滚;借贷类操作里对健康系数的估计慢半拍,还款交易排在清算交易之后,钱没还进去、手续费照付;领取奖励类交易对着一个还没到发放条件的合约反复提交;跨链操作在源链已确认、目标链未到账的窗口里盲目重试本地脚本。这几类的共同点是:失败原因在链上状态里,而不在你的运气里,重复提交只会重复付费。

省钱的路径也因此清晰:先在本地把失败概率压下来,再谈重试成本。提交前用模拟执行核对关键条件是否满足;给滑点容忍留出与波动相称的余量而不是盲目收紧;对有时间窗口的操作,先查协议状态再决定重试节奏;把多个确定性的动作合并到一笔交易里,失败只付一次费用,成功也只付一次。这些动作都不改变「失败要收费」的规则,它们改变的只是你要为失败付多少次费。

最后把边界说清楚:不同链对失败交易的计费细节并不相同,有的链回滚交易的实际消耗明显低于上限、有的链对失败收取固定的低价费用,规则会随协议升级调整,动手前应核对该链当前的计费文档与协议官方说明。本文只解释机制与成本核算方法,不构成投资建议,也不对任何具体协议的参数做实时承诺。涉及真金白银的操作,请以链上数据和官方文档为准,先小额演练再放量执行。

交易失败也要收钱:链上那笔白烧的 Gas 该怎么记账 图 2
交易失败也要收钱:链上那笔白烧的 Gas 该怎么记账 · 图 2