交易失败但 gas 照扣:四层排查顺序与重发纪律 图 1
交易失败但 gas 照扣:四层排查顺序与重发纪律 · 图 1

一笔交易失败了,钱包提示 gas 估计不通过或者执行被回滚,反复重发只是多烧钱。失败的交易同样会扣掉已消耗的 gas,理解这条规则之后,正确的动作顺序其实很短,本文按排查成本从低到高排一遍。

先明确一个前提:交易在钱包里点发送后,节点会先在本地模拟执行一遍,模拟失败的交易大多数钱包会拦下或警告;真正上链后回滚的交易,说明模拟和真实执行之间出现了偏差——最常见的是你提交前的几秒里,链上状态被别人改动了。这类失败有一个共同特征:花了 gas,什么都没发生。

第一层检查滑点与截止时间。报价里承诺的最低产出量对应一个有效期,如果你的交易排在有效期之后的区块,或期间价格移动超出了你的容忍度,合约会主动回滚以保护你。表现为重发一次就能成功,且第二次的新报价和第一次略有不同。对策是检查钱包的高级设置,确认截止时间与滑点没有设成极端值,金额大的单子拆小一点,别用默认的高滑点裸奔。

第二层检查授权边界。代币授权不足,转账环节直接回滚;授权用 Permit2 一类的批量授权通道时,签过但过期的授权同样表现为调用失败。分辨方法是看失败交易的输入数据:目标函数是兑换类调用、事件日志里第一笔 revert 发生在转账阶段的,优先怀疑授权。修复动作是重新走一次授权或改用无限额以外的精确额度授权,撤销入口在区块浏览器的代币授权页面可以查到。

第三层看代币本身的特殊性。带转账税的代币,你余额显示够、合约收到的少,凡按名义余额构造的交易都会差一个税率的量回滚;重基代币的显示余额与链上数量在不同工具间换算错位,同样制造假不足。检查方式是拿区块浏览器里逐笔转账的实际增减核对,而不是看钱包的格式化余额。

第四层才是协议与路由本身。池子被治理暂停、路由里的某个中间池子深度枯竭、聚合器选了过期缓存的报价,都会产生难以自证的失败。此时把路由换一笔小的直接单池兑换做对照实验,一次成功的直连能立刻把问题范围从整条路径缩小到具体某个环节;仍然失败,就去协议的官方状态通道查是否处于维护窗口。

重发的纪律比工具重要:每次重发前重新获取报价,不要修改 gas 后直接重放旧数据——旧报价配新状态是回滚高发组合;连续两次同样失败就停止机械重试,回到上面的层级从头排,每一次盲目重发都在真实地烧预算。

最后划一条边界:失败交易消耗的 gas 归出块网络,不是协议或钱包没收了你的钱;任何声称能帮你追回失败交易手续费的服务,本身就是钓鱼话术。

把排查顺序压成一句口诀:先重取报价,再看授权,三查代币特性,最后对照协议状态。四步走完仍失败,才值得去读失败交易的 revert 信息原文并在测试网复现。多数情况下,失败现场最重要的证据不是报错文字,而是那笔失败交易在浏览器里的输入数据和 gas 消耗曲线——gas 用到上限附近才失败的,多半是逻辑 revert;只烧了很少就停住的,多半在前置检查阶段就被拒绝。会用这两条曲线,一半的失败案例在三十秒内就能归入正确的那一层。

本文提供的是失败排查的顺序与原理,不构成投资建议;具体接口行为以协议文档与链上数据核验为准。