看到交易失败提示"Reverted",钱包里扣了Gas费,你第一反应应该是去查失败原因,而不是再试一次——再试也是白扣钱。
核心操作思路
在发交易之前,用模拟执行(Simulation)判断这笔交易会不会回滚失败。
交易失败扣费的底层逻辑
你付的是"计算费",不是"成交费"。验证者消耗了算力执行你的指令,哪怕执行到一半因合约条件不满足而回滚,算力已经消耗,这笔费用照扣。所以关键是在交易发出去之前就知道它会不会失败。
方法一:用钱包自带的模拟功能
MetaMask操作要点:
在交易确认弹窗里,点底部的"Show Advanced"或者"Hex Data"附近,部分版本会显示模拟结果。如果提示"This transaction is expected to fail",就不要确认提交。
更新到最新版本,MetaMask会在你确认前自动做一次eth_call模拟。
Rabby/进阶钱包操作要点:
Rabby钱包默认会在确认前做完整模拟,会直接显示"Revert Reason"(失败原因),比如"Insufficient output amount"或者"Ownable: caller is not the owner"。
看到红色警告,直接取消,不用花钱试错。
风险提醒:不要用小号钱包反复试错。每次失败交易都扣Gas费,扣的是真实资产。有人尝试先拿一个没ETH的钱包试,这没用,余额不足本身就会导致模拟失败,得用有足够余额的钱包做模拟,但确认前取消才行。
方法二:用Etherscan查同类失败交易
在Etherscan输入你要交互的合约地址,点"Contract" → "Write Contract"或"Read Contract",找到对应的函数,参考以下步骤操作:
在Etherscan搜这个合约地址。
点"Transactions"列表,看最近失败的交易(Status显示红色"Fail")。
点开一笔失败的,看"Error Message"那一栏——这里会显示具体的回滚原因。
如果显示"Out of Gas",说明需要调高Gas Limit;如果显示"reverted with reason string: ...",照着调整你的交易参数。
方法三:用Tenderly做离线模拟(适合进阶玩家)
打开Tenderly,创建一个免费账户。
在"Debugger"里输入你要发的交易哈希(如果是已失败交易),或者用"Simulator"模拟一笔新交易。
Tenderly会显示完整的调用堆栈,精确到哪一行合约代码触发了revert。
它还能模拟修改参数后的结果,不产生任何实际费用。
交易预校验完成标准
MetaMask确认弹窗不显示红色警告。
Etherscan上同类交易没有高频失败记录。
Tenderly模拟显示"Success"。
常见回滚失败原因
很多人疑惑:"我在Etherscan上看到别的交易都成功,为什么我照抄参数还是失败?" 核心原因是你的钱包状态和他人不一样,常见回滚原因包括:
授权不足:要Swap USDT,但你还没给Router合约授权足够额度,Etherscan上会显示"Transfer amount exceeds allowance"。
滑点太小:Uniswap类DEX的交易,如果价格在你发交易的瞬间波动超过你设的滑点,合约会直接回滚。
白名单/黑名单限制:有些代币(比如USDT)有转账黑名单机制,你的地址如果被项目方标记了,合约会回滚。
权限不足:调用了带onlyOwner修饰器的函数,但你不是合约所有者。
常见问题解答
Q:为什么有些交易失败了,Etherscan上不显示具体错误原因? A:如果合约的require/revert没有附带错误字符串,或者代码用汇编写的,Etherscan只显示"Reverted"或空数据。这时候需要用Tenderly这类工具反编译获取堆栈信息。
Q:eth_estimateGas能帮我预判失败吗? A:能,但它有局限。eth_estimateGas本身就是一笔模拟交易,如果模拟失败,它会返回revert原因。但有些RPC节点会因为余额不足或状态不一致报错,导致你拿不到真实原因,建议直接用钱包的模拟功能或Tenderly。
Q:交易失败了,Gas费被扣了,这笔钱还能找回来吗? A:找不回来。Gas费就是计算资源费,跟交易结果无关。唯一能做的就是从失败原因里总结教训,下次发交易之前先做模拟校验。



