链上交易失败 out of gas 怎么办?常见报错对照

第一次在去中心化交易所里换币,点了兑换、钱包提示已提交,几秒后记录却变成红色的 Fail。想换的币没到,BNB 倒是少了一小截。很多人这时的第一反应是再点一次。第二次还是失败,又少一小截。
报 out of gas,是这笔给的燃料上限(gas limit)不够执行完:按钱包建议值调高 gas limit 再发,不是调 gas price;调过一次还失败就停手,可能是合约本身出错。其它报错在下面的对照表里。失败的交易多数留下了原因,只是写在一句不起眼的英文里。找到那一句、认出它属于哪一类,再决定改个设置重发,还是到此为止。交易记录上每个字段是什么意思,BscScan 交易记录怎么看:各字段什么意思 已经讲过,这里不再重复。
报错出在钱包里,还是链上
同样叫「失败」,其实分三种情况,花不花钱差别很大。
- 钱包直接弹出报错,交易没发出去。浏览器里搜不到这笔,也没有扣手续费。最常见的是钱包里的 BNB 不够付手续费,PancakeSwap 的排障文档对
insufficient funds for transfer的解释就是这个。还有一种是钱包在预估阶段就算出这笔会失败,有的钱包会直接拦下;对应文档里estimateGas failed那一条,兑换时碰到它,文档说只能等代币项目方解决。 - 交易进了区块,状态是 Fail。这笔已经执行过,手续费照扣。BscScan 的说明是这样写的:标成 Fail 的交易,你原本要转出去的钱没有扣走、还在钱包里,但 gas 费会被扣掉。
- 浏览器里搜不到这笔哈希,钱包也没报错。多半还在排队,或者根本没广播成功。这是「还没结果」,不算失败。
第一种大多改完再发不花钱。第二种已经上链、已经付过钱,每重试一次就要再付一次,下面讲的都是这一种。
那句报错写在哪、怎么读
在区块浏览器的交易详情里,Fail 旁边或下方有时会跟着一句英文原文,有的钱包在交易记录里也能点开看到。这句话是合约自己写的。BscScan 解释 Reverted 时说,错误信息可能按合约里的定义附带,所以有的交易有这句,有的没有。没有的时候,只能靠后面几节的其他线索判断。
常见的写法长这样,下面两句都是 PancakeSwap 排障文档里的原文示例:
Fail with error 'PancakeRouter: INSUFFICIENT_A_AMOUNT'Warning! Error encountered during contract execution [out of gas]
读的时候先找冒号。冒号前面通常是报错那段合约代码的名字:PancakeRouter 是这家交易所的路由合约,兑换请求先经过它;TransferHelper 是专门转代币的那段代码;以 BEP20 开头的,多半来自代币合约自己。原因写在冒号后面。方括号里的 out of gas 则不是合约写的话,意思是执行到一半燃料烧完了。
把整句复制下来,比截图管用。拿去搜的时候,要精确到这串大写单词,才找得到对应的解释。换一家去中心化交易所,合约名会变,但不少是同一套开源代码改出来的,冒号后面的原因词常常一样。
常见报错对照:改什么再发
表里按报错中出现的关键词排。第三列写的是重发之前该动的地方,写着「先别重发」的,接着看下一节。
| 报错里的关键词 | 大概发生了什么 | 重发前改什么 |
|---|---|---|
| out of gas | 你给的燃料上限(gas limit)不够这笔执行完 | 调高 gas limit,不是调 gas price。钱包一般会给建议值,也可以参考同类成功交易实际用了多少 |
| INSUFFICIENT_OUTPUT_AMOUNT | 成交时能换到的数量低于你允许的最低值:滑点容差设得太小,或者池子里流动性太少 | 刷新报价,分成小一点的量换;滑点容差只往上加一点 |
| EXPIRED | 交易生成后没及时签名发出,或者发出去后排队太久,执行时已过截止时间 | 重新发起,报价出来后尽快确认 |
| TRANSFER_FROM_FAILED | 合约没能从你钱包里把代币划走:余额不够,或者给它的授权额度不够 | 核对余额和授权额度,再按这次要用的数量授权 |
| transfer amount exceeds allowance | 授权额度比这次要动的数量少 | 补足授权再试 |
| transfer amount exceeds balance | 余额不够;也可能是这批代币已经被一笔还在排队的交易占着 | 等前一笔出结果,再确认余额 |
| Pancake: K / TRANSFER_FAILED | 常见于每笔转账自带扣费、或会自动调整余额的代币;也可能是发行方停了交易,只放行部分地址卖出 | 自己买的扣税币:文档的办法是改「To」一栏的数量后马上兑换(K),或只卖七成左右(TRANSFER_FAILED)。空投来的、买得进卖不出的:先别重发 |
| Bad Instruction / Bad Jump Destination | 合约代码本身出错,和你的设置关系不大;Bad Instruction 出在代币合约上时,可能是这枚币暂时还不允许转账 | 先别重发 |
第二列按两份说明整理:out of gas 那一行两份都对照了,第二到第七行出自 PancakeSwap 的排障文档,最后一行出自 BscScan。第三列是本站的建议,第五行(授权)和第七行(空投币先别重发)与文档给的办法不完全一样,原因写在下面。两份都在 2026 年 9 月 13 日打开核对过,BscScan 那页自己标的更新日期是 2023 年 10 月 27 日。
授权额度不够那一条,PancakeSwap 文档给的办法是重新授权、而且不设上限。这一步我们不照做:宁可每次按这次要用的量授权、多点一次确认,也不愿让一个合约长期拿着能把这枚币全部划走的许可。授权为什么要小心,BscScan 交易记录怎么看:各字段什么意思 里讲 Success 读反的那段说过。
这几种,别再点重试
有几种失败,换什么设置都成不了,只会一笔一笔接着付钱,哪怕每笔只是一点手续费。
卖不出去的币,尤其是空投来的。买进很顺利,卖出却总是报 TRANSFER_FAILED,先怀疑代币本身。PancakeSwap 文档也提到了这种可能:发行方可能暂停了交易,或者只让指定地址能卖;如果报这个错的代币是空投来的,多半是骗局,不要去授权,也不要点对方给的链接。怎么查一枚币的来路,见 怎么认出假 BNB。
滑点高不一定就是骗局。有些代币每笔转账都要扣一截税,文档里举过一个要把滑点设到 12% 以上才能买的例子。但这类税该在买之前弄清楚,别等卖不出去了才发现。我们自己的做法是:一枚币要把滑点调到两位数才卖得动,就先停手去查合约,不再往上加。
Bad Instruction、Bad Jump Destination。BscScan 把这两类归为合约本身的问题,建议是去联系合约的创建者。你这边改参数,改不了人家的代码。
out of gas 反复出现,调高上限也没用。BscScan 的说明里提到,合约执行出错之后,还可能一直执行下去,直到把 gas 上限耗光。有些看上去是「燃料不够」的失败,底下是合约出了错;上限调得越高,下一笔烧掉的就越多。按钱包建议值调过一次还是失败,就别再往上加了。
重发之前核三样
- 钱包里留的 BNB 够不够付手续费。手续费只能用原生 BNB 付,钱包里全是 WBNB 也发不出去,这个坑在 钱包里的 WBNB 是什么 里讲过。平时留多少够用,见 BNB gas 费要留多少?一笔大概多少钱。
- 上一笔是不是还挂着。同一个地址发出的交易按编号(Nonce)依次上链,前一笔没出结果,后一笔就得跟着等,还可能出现明明看着有余额、却报「余额不够」的情况。先在交易记录里看有没有 pending 的那一笔。
- 这次和失败那次比,到底改了哪一项。数量、授权额度、滑点、gas limit,一项都没动就原样重发,结果大概率还是一样。
失败交易扣掉的那点手续费,已经付给了替你执行这笔交易的网络,链上没有退款按钮,也没有客服能撤回,能省的只有下一笔。私信里自称能帮你「追回失败交易的费用」「解冻卡住的资金」的,一律先按骗局处理。
本文对照的两份原始说明(均为英文):BscScan:交易失败有哪些原因、PancakeSwap:常见报错排障。
本文是一般性科普,不构成投资建议,也不对任何代币的真假下结论。钱包、浏览器和交易所页面上的报错措辞会随版本变动,动手时请看你当时屏幕上的原文。链上交易一旦发出无法撤回,授权和兑换前请核对合约地址与数量。
接着看
BscScan 交易记录怎么看:各字段什么意思 · 钱包里的 WBNB 是什么 · 怎么认出假 BNB · 滑点设太高会多付多少 · gas 费估算(工具)