DEX 交易失败为什么?滑点、授权与 gas 的排查顺序 图 1
DEX 交易失败为什么?滑点、授权与 gas 的排查顺序 · 图 1

结论先说

DEX 交易失败(revert)意味着这笔交易被模拟执行后主动回滚,你的资产没有被改变,只损失了 gas(如果广播过)。绝大多数失败来自四类原因:滑点保护触发、代币授权不足或过期、gas 设置问题、交易对与路由本身的问题。正确的做法不是反复点确认,而是按排查成本从低到高定位原因。

第一层:看失败信息本身

多数钱包会带一句失败原因,常见词对应不同方向:

  • 提示收到金额过少:滑点保护触发。价格在你点击和上链之间动了,超过你设置的最大可接受变化,参考 DEX 滑点是什么?交易前怎么看。处理:提高滑点上限重下一笔,或者拆小金额、换更深的池子。
  • 提示授权不足:你给合约的授权额度用完或被撤销。Uniswap Permit2 等新路径的授权边界见 Uniswap Permit2 授权边界是什么?。处理:重新授权,尽量用精确数量而非无限授权。
  • 提示余额不足:余额或 gas 余额不够。注意有些代币兑换会占用主链代币付 gas。
  • 没有原因的裸回滚:通常是路由或合约内部检查失败,进入下一层。

第二层:区分环境问题还是交易问题

同一笔失败,先排除三类环境因素:网络拥堵时 gas 价格估算偏低导致失败或反复 pending;节点或 RPC 返回过时状态导致模拟与实际不一致——换一个 RPC 或换钱包重试一次即知;L2 序列器过载时会出现 gas 估算异常,稍后重试即可。

第三层:路由与交易对

如果重下和改滑点都失败,怀疑交易对本身:路径里的某个中间池流动性被抽走、代币是带转账费或黑名单逻辑的 ERC-20、或者你点进了假币的同名池。核验方法是到官方列表或主流数据站核对合约地址,再用小额测试交易探路。貔貅币(能买不能卖)的失败方式恰恰是卖出时回滚——这是危险信号而不是运气差。

第四层:看链上痕迹

失败交易在浏览器里依然有记录。用状态为失败的那笔调用 trace,看回滚发生在哪个合约、哪个方法。如果你熟悉区块浏览器,从 trace 最后一层调用基本能确定是交换检查失败还是转账失败。不会读 trace 时,把失败交易链接贴给协议的 Discord 或客服渠道比自己猜快。

成本最低的保险:先测后换

金额较大时,永远先用最小金额走一遍完整路径,成功再放大。这一单多花的 gas,是比任何翻车都便宜的保险。

重下之前,先理解价格保护是怎么工作的

滑点设置背后是一个常被误解的机制:前端在发送前会先模拟一次交易,把“预期最少到手”写入交易参数,链上执行时如果实际到手低于这个值就整笔回滚。所以回滚本身说明价格在模拟和上链之间动了,或者你提交的模拟结果已经过时。理解这点就能理解三种正确应对:价格快速单边波动时,小幅提高滑点容忍而不是反复原价重下(重下一次就是再等一个区块的暴露时间);交易金额相对池子太大时,正确解是拆单或换更深池子,滑点参数救不了结构性过大的单子;网络拥堵导致交易延迟入块时,过期参数必然失效,缩短交易有效期或换低峰时段更有效。

一个 60 秒自查流程

失败后按顺序过一遍:钱包显示的失败原因关键词是什么(第一层)——换 RPC 或稍等后用同样参数重试一次(第二层快速排除)——换小额重试判断是不是交易对问题(第三层)——三次失败停止重试,保留哈希进入 trace 或社区求助。整个流程控制在几分钟内,避免在情绪驱动下连续重下同一笔交易烧 gas。

风险提示

本文为排错方法科普,不构成投资建议。链上交易不可撤销,与未知合约交互存在资产损失风险;授权操作请在官方域名进行,谨防钓鱼站点诱导你签名。任何要求你先转一点测试到指定地址的客服话术都是骗局。