链上交易失败了,为什么还扣 BNB Gas 费
要转的金额会留在原处,已经执行的计算要付费。扣多少,看它是合约回滚、Gas 耗尽,还是根本没进区块。
- 没进区块
- 没有网络费用
- 合约回滚
- 按停下前用掉的 Gas 收费
- Gas 耗尽
- 整笔 Gas 上限全部扣除
先看状态栏和错误文字,再决定用哪一种算法。
本文内容
钱包里那笔操作标着“失败”,要转出的代币一个没少,BNB 却少了一点。这一点就是网络手续费:交易已经被打包进区块、虚拟机也已经执行过,只是执行到中途停下了。BscScan 的失败交易说明页把这件事写得很直白——标为 Fail 的交易,原本要发送的资金留在发送方地址里,但 Gas Fee 照样扣除。本文引用的这一页,和下面提到的以太坊 Gas 文档,都在 2026 年 10 月核对过;官方页面的措辞以你打开时的实时显示为准。
扣多少,取决于它是怎么停下来的。合约主动拒绝和 Gas 耗尽,账单可以差好几倍;还没上链就被拒的那种,根本不收费。下面按这三种情况分开算。
失败交易扣掉的是哪一笔 BNB
一笔链上交易至少有两个数:你想转出的金额(区块浏览器上的 Value),和执行这笔交易的网络费用(Transaction Fee)。失败时,前者随状态一起回滚,后者不回滚。
费用的算法和成功交易一样:实际消耗的 Gas 数量 × 每单位 Gas 的价格。在 BNB Smart Chain 上价格通常用 gwei 表示,1 gwei 等于 0.000000001 BNB。两项相乘之后记得换算单位,这一步漏掉,预算会差出九个数量级。数量和单价分别是什么、上限和实耗为什么不是一回事,Gas 上限与实际消耗那篇有完整演算,这里只看失败这一种结局。
所以“失败了还扣钱”并不是额外罚款。被扣的是验证节点已经替你执行过的那段计算,只不过执行结果没有被保留。
先确认交易有没有上链:没上链的失败不扣 Gas
钱包弹出红字,不等于链上有一笔失败记录。以下几种情况都发生在交易进入区块之前:
- 签名前钱包提示余额不足,或者你在确认页点了取消,交易根本没有发出去;
- Gas 上限低于这类交易的最低要求。以太坊官方的 Gas 文档举的例子是:普通转账需要 21,000,若只给 20,000,交易在校验阶段就被拒绝,不会进区块,也不消耗 Gas;
- 交易发出后一直待处理,后来被同一 nonce(地址的交易序号)的另一笔替换或被节点丢弃。被替换掉的那一笔不会留下链上费用,真正扣费的是替换它的那一笔。
判断方法只有一个:拿交易哈希去区块浏览器查。查不到,或者显示被替换(Dropped & Replaced 一类提示),这笔就没有链上费用;查得到、有区块号、状态写着 Fail,才进入下面两节的计算。
合约回滚(Reverted)时,按停下前用掉的 Gas 收费
合约里写了检查条件——滑点超出、授权不足、活动已结束、余额不够——条件不满足时,合约会主动回滚。所有状态改动撤销,交易在 BscScan 上会显示为 Fail,常见附带错误文字 execution reverted,后面可能跟着合约开发者写的原因。
回滚时,执行到检查点之前消耗的 Gas 要付,剩下没用到的额度不收。看一个假设的例子(数字只为演算,不是某一笔真实交易,也不代表当前网络价格):
- Gas 上限:200,000
- 执行到第一个检查条件就回滚,Gas used:48,000
- Gas Price:0.1 gwei
费用 = 48,000 × 0.1 gwei = 4,800 gwei = 0.0000048 BNB。上限里剩下的 152,000 没有被消耗,自然也不计费。
如果检查条件写在合约很靠后的位置,回滚前已经做了大量计算,Gas used 就会接近上限。“回滚一定很便宜”同样不成立,要看那条检查在哪儿。
Gas 耗尽(Out of Gas)时,整笔上限都会被扣掉
另一种失败是给的 Gas 不够这笔交易跑完。以太坊官方文档的说法是:执行途中 Gas 用尽,虚拟机会撤销所有改动,但提供的 Gas 全部被视为已经消耗。BSC 沿用同一套 EVM 规则,BscScan 帮助页同样把 Out of Gas 解释为“设置的上限低于所需的计算量”。
还是 0.1 gwei 的假设价格。假设这笔合约调用实际需要 230,000 Gas,而你(或钱包的估算)只给了 200,000:
- 第一次:200,000 × 0.1 gwei = 20,000 gwei = 0.00002 BNB,全部扣除,交易失败;
- 把上限改成 260,000 重发,实际用掉 230,000:23,000 gwei = 0.000023 BNB,交易成功;
- 为同一件事一共付出 0.000043 BNB,比一次成功多花了将近一倍。
同一个上限,回滚的那笔只付了 0.0000048 BNB,耗尽的那笔付了 0.00002 BNB。失败的方式决定了账单。
在 BscScan 上看一笔失败交易,按这四栏读
打开交易详情页,不必从头读到尾,先找这几栏(英文标签以页面当时显示为准):
- Status:Success 还是 Fail;Fail 后面跟的错误文字,是 execution reverted 还是 out of gas,决定你看哪一节的算法。
- Gas Limit & Usage by Txn:上限和实际用量并排,后面有百分比。接近 100% 且状态是 Fail,基本可以判断是 Gas 耗尽;百分比明显偏低,多半是合约回滚。
- Gas Price:每单位 Gas 的价格,通常以 gwei 显示。
- Transaction Fee:浏览器已经算好的最终费用,以 BNB 显示。用前两栏相乘自己验一遍,能对上就说明你读懂了这笔记录。
Value 一栏的数字在失败交易里只是“想转的金额”,没有离开地址,不要把它和手续费加在一起记成损失。
BscScan 帮助页还列了 Bad Jump Destination、Bad Instruction 这类错误,属于合约代码本身的问题,只能联系合约开发方。普通用户能处理的主要就是回滚和耗尽这两类。
调高 Gas 上限,能避免下一次失败扣费吗
只对 Gas 耗尽有用。上一笔是 Out of Gas,把上限调到实际需要量之上再发,交易就有机会跑完。
对回滚没用。滑点不够、授权没给、活动已关,这些条件不会因为多给 Gas 而变成满足,重发只会在同一个检查点再停一次、再付一次。这时该改的是交易本身的参数,或者先确认条件是否还成立。
上限也不是越高越保险。按 EVM 的规则,成功执行时没用完的额度不收费,但一旦再次耗尽,扣掉的是整个更高的上限。钱包给出的估算一般基于当时的链上状态,状态变了(比如池子里的流动性动了),估算也会跟着失真。
已经扣掉的失败手续费能退吗
网络层面没有退还机制。费用在交易打包时就已经结算,区块浏览器不提供“申请退款”的按钮。
如果有人自称客服或“链上恢复服务”,要求你提供助记词、私钥或签一笔授权来“退回失败的 Gas”,可以直接判定为诈骗。失败费用只能在下一次操作时通过读懂原因来避免,不能事后追回。
交易失败的地点也要分清。如果失败发生在某个交易所或应用的内部账户里(比如平台显示提现失败),那不是你地址上的一笔链上交易,扣不扣费、退不退费,看的是平台自己的记录和规则;钱包 Gas 与平台账户余额那篇专门讲过这两种位置怎么区分。
opBNB 上的失败交易,别只算 Gas used × 单价
opBNB 是建在 BSC 之上的二层网络,费用除了执行部分,还有一块与把交易数据提交到下层链有关。只拿 Gas used 乘 Gas Price,算出来的数会比浏览器上的最终费用小。失败交易同样要直接读它的完整费用栏,再对照 opBNB 官方文档里的费用说明,而不是套用上面 BSC 的两步乘法。
做 BNB Gas 预算时,失败交易怎么记
失败的费用是真实支出,应当和成功交易一样记进网络费用,但最好单独标一列“失败”。理由很实际:如果某类操作(比如在行情剧烈时做兑换)失败得多,这一列会把真实的单次成本拉高,只看成功记录会低估。
假设你一个月在 BSC 上做 20 次合约调用,其中 2 次失败:1 次合约回滚,1 次 Gas 耗尽。按上面的例子,耗尽那一次扣满了上限,回滚那一次只付到检查点为止。把它们分开记,下个月就能看出问题集中在哪一类,而不是笼统地觉得“手续费变贵了”。
原生 BNB 余额要留出重试的余量。Gas 只能用地址上的原生 BNB 支付,WBNB 或交易所账户里的 BNB 都不能直接顶上(原因见WBNB 为什么不能直接支付 Gas)。余额刚好够一次成功调用时,一旦失败,连重发的费用都可能不够。平台交易手续费的备用金是另一本账,按BNB 手续费备用金那篇的方法单独算,不要和链上 Gas 混在一起。
BNB 的币价会变化,同样 0.00002 BNB 的失败费用,折成法币的金额会随行情上下,也可能大幅缩水。预算里先记 BNB 数量,折算金额另记,并写明折算时的价格和日期。