交易已经上链、区块浏览器也显示它被打包进了某个区块,回执状态却写着"失败"——这并不矛盾。上链只代表这笔交易被矿工或验证者收进了区块,执行结果由 EVM 在运行时决定;执行过程中触发了回滚条件,状态就会标记为失败,但交易本身仍然消耗了 Gas、占据了区块空间。
"上链"和"执行成功"是两件事
以太坊的交易生命周期里,有两个独立的判断节点。
第一个节点是是否被打包。你签名的交易广播到网络后,进入待处理池,矿工或验证者选择把它放进一个区块。一旦区块被确认,这笔交易就"上链"了,你可以在 Etherscan 上搜到它的 TxID,看到它所在的区块高度。这一步只看交易是否被收录,不看它执行后产生了什么效果。
第二个节点是顶层调用是否成功。交易上链后,EVM 会执行它携带的指令。如果执行过程中遇到 REVERT 操作码、Gas 耗尽、或者无效指令,状态变更会被回滚,回执里的状态码被置为 0(失败)。这个状态码是 2017 年 EIP-658 引入的,目的正是让调用方能够区分"交易上链了"和"交易执行成功了"。
所以,你看到的现象在协议层面完全合法:交易被打包了(上链),执行失败了(回执状态为 0)。
失败的回执里,什么被回滚了、什么没有
被回滚的是状态变更。如果你发起的是代币转账,代币余额不会变动;如果是合约交互,合约内部的存储修改、事件日志都会被撤销。从结果上看,这笔交易"什么都没做成"。
没有被回滚的是 Gas 消耗。失败交易消耗的计算资源是真实的,验证者已经为执行这些指令付出了成本。OKX 的一篇技术说明把这一点讲得很直接:交易上链后节点仍然按顺序执行指令,直到遇到回滚条件或 Gas 耗尽,已经消耗的资源无法撤销,相应费用仍由发送方承担;退回的只是未使用的 Gas,不是整笔手续费。MetaMask 的帮助中心也写明交易费无法退款。
换句话说,失败交易让你损失了 Gas,但没有完成你想要的转账或合约操作。
为什么会有回执状态码这个东西
在 EIP-658 之前,回执里放的是中间状态根,普通用户很难从中判断交易到底成功还是失败。更麻烦的是,REVERT 操作码(EIP-140)引入后,交易失败不一定耗尽所有 Gas,仅靠"Gas 是否用完"来推断成败已经不可靠。
EIP-658 把回执中的中间状态根替换成一个简单的状态码:1 表示成功,0 表示失败(由于任何导致交易或顶层调用回滚的操作)。你看到的"失败",就是这个 0 被区块浏览器翻译成了人类可读的标签。
常见问题
回执失败,但我在钱包里看到 Gas 被扣了,这正常吗?
正常。失败交易消耗的 Gas 不会退回。你可以在区块浏览器上查看这笔交易的 Gas Used 和实际支付的费用,确认扣款金额与链上记录一致。
交易上链了但回执失败,这笔交易会被"撤销"吗?
不会。失败本身已经是最终结果。状态回滚发生在执行时,回执状态 0 就是这笔交易的最终结局。不存在"过一段时间失败变成功"的情况。如果还需要完成原本的操作,需要重新发起一笔交易。
为什么有些交易显示"成功",但代币没到账?
那是另一个方向的问题。回执状态为 1(成功)只说明顶层调用没有回滚。合约内部可能有失败的子调用,或者你交互的合约逻辑本身就没有执行转账。状态码告诉你的是"交易执行没有整体失败",不是"你的余额一定按预期变动了"。
参考资料
- Ethereum Improvement Proposals·EIP-658: Embedding transaction status code in receipts,日期:2026-11-11
- Ethereum Improvement Proposals·EIP-140: REVERT instruction,日期:2026-11-11
- OKX·Transaction failed, Gas will not be refunded,日期:2026-11-11
- MetaMask Help Center·Refunding gas fees,日期:2026-11-11
- CoinMarketCap·Explorer Says Success: Why Did the Tokens Not Arrive?,日期:2026-11-11



