截至 2026 年 10 月,大多数钱包错误可以分为两类。在交易被打包进区块之前出现的错误,例如“nonce too low”、“replacement transaction underpriced”、“insufficient funds for gas * price + value”,或 Solana 的“Transaction simulation failed: Blockhash not found”,意味着链上没有记录任何东西,也没有花掉网络手续费。被打包之后的失败,例如 EVM 交易回滚(reverted)或 gas 耗尽、Solana 交易带着错误上链,或 TON 的计算阶段失败,仍然会为已完成的工作消耗手续费。请在下面的表格中找到你的确切字符串,查看它的含义和修复方法。
失败的交易花了手续费吗?先检查这一条规则
失败的交易只有在失败之前已被打包进区块时,才会花掉网络手续费。
一笔交易可能在两个时刻失败:
- 被打包之前:钱包的模拟、RPC 节点或内存池(mempool)拒绝了它。没有任何东西进入区块,所以没有花掉网络手续费。
- 被打包之后:交易进入区块,它的代码运行并失败。已完成工作的手续费被花掉。Etherscan 表示,失败的交易仍会因所用的计算而扣除 gas,Solana 的手续费文档也表示,如果交易失败,手续费仍会被收取。
要分辨你属于哪种情况,请在区块浏览器上搜索交易哈希或签名。几分钟后仍无记录,通常意味着它从未上链,也没有花费任何东西;Pending 状态表示它尚未被打包。标记为 Failed 或 Reverted,或带有非零退出码的记录,则意味着它已上链且手续费已被花掉。
哪些 EVM 错误表示“nonce too low”、“underpriced”或“out of gas”?
这些是 go-ethereum 客户端源代码中的确切字符串,其中大多数意味着交易在进入区块之前就被拒绝了。
| 确切错误 | 含义 | 花了网络手续费? | 该怎么办 |
|---|---|---|---|
| “nonce too low” | 带有这个编号的交易已经确认;钱包状态已过期 | 否 | 重新同步钱包并查看区块浏览器;只有在你想做的操作尚未发生时才重新发送 |
| “replacement transaction underpriced” | 加速或取消时,手续费上调幅度太小 | 否 | 上调更多;Geth 默认要求 10% |
| “max fee per gas less than block base fee” | 你的最高手续费低于当前的 base fee | 否 | 提高最高手续费 |
| “insufficient funds for gas * price + value” | 原生币无法同时覆盖金额和最大 gas | 否 | 补充原生币;参见有代币却没有 gas 代币 |
| “already known” | 同一笔交易已经在内存池中 | 否 | 等待;它无害 |
| “out of gas” | 执行超出了 gas 上限;改动被撤销 | 是 | 用更高的 gas 上限重试 |
“execution reverted”是什么意思?
“Execution reverted”意味着智能合约拒绝了该操作,并撤销了它所做的每一项改动。它出现在两个时点,而手续费情况不同。
如果它出现在钱包发送前的预估阶段,则什么都没有发出,也没有花掉手续费。如果交易已经上链,Etherscan 会将其显示为 Fail 或 Reverted,而且按 Alchemy 的说法,发送方仍需为已用的 gas 付费。冒号后面的文字才是真正的原因。常见的有:
- “UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT”:从你签名到被打包之间,价格的变动超出了你的滑点上限。
- “ERC20: insufficient allowance”:代币授权额度小于要花费的数量。它的姊妹错误“ERC20: transfer amount exceeds balance”则意味着你持有的该代币少于你试图转移的数量。
这两个 ERC-20 字符串来自 OpenZeppelin v4 合约;较新的版本使用名称不同的自定义错误。
ERC-4337 的 AA 代码和 EIP-7702 错误是什么意思?
智能合约账户通过 bundler 发送一个 UserOperation,而不是普通交易,EIP-4337 规范规定,EntryPoint 的错误信息以 AA## 形式的代码开头。
| 代码 | 含义 | 花了网络手续费? |
|---|---|---|
| AA21 didn't pay prefund | 没有使用 paymaster,且账户在 EntryPoint 中的存款无法覆盖最大 gas | 否 |
| AA23 reverted | 账户的验证代码拒绝了该操作 | 否 |
| AA33 reverted | paymaster 的验证拒绝了该操作 | 否 |
| AA95 out of gas | 该 bundle 的 gas 上限对该操作或某个子调用来说太低 | 通常不会;handleOps 回滚 |
EIP-4337 规范规定,bundler 必须丢弃模拟时回滚的操作,因此验证失败(AA2x 和 AA3x)通常不会在链上留下任何东西。如果一个操作被打包,而它的主调用回滚了,gas 仍会由账户,或为其代付的 paymaster 在链上支付。Alchemy 指出,AA95 通常意味着 gas 上限设得太低;handleOps 回滚,所以请用更高的 gas 上限重试(这是 bundler 或 SDK 的设置)。
EIP-7702 增加了一个你可能从节点看到的错误:“in-flight transaction limit reached for delegated accounts”(Geth 的交易池对这样的账户只接受一笔待处理的可执行交易,所以请等待它完成)。链 ID 或 nonce 错误的授权会被静默跳过,因此交易可能成功,但委托并没有生效。如果你并没有主动委托过你的账户,请检查并撤销该委托:意外出现的委托是钱包盗取程序(drainer)的信号。
Solana 的“Blockhash not found”和“block height exceeded”是什么意思?
“Block height exceeded”意味着 blockhash 已过期,而“Blockhash not found”意味着节点不认识该 blockhash(通常是已过期,有时是节点滞后)。这两种情况下,交易通常都没有被处理。根据 Solana 的确认指南,blockhash 大约在 151 个区块内有效,约 60 到 90 秒,过期的交易无法再被处理。
| 确切错误 | 含义 | 花了网络手续费? | 该怎么办 |
|---|---|---|---|
| “Transaction simulation failed: Blockhash not found” | Blockhash 太旧,或模拟的节点还没见过它 | 否 | 重试以获取新的 blockhash |
| “block height exceeded”(TransactionExpiredBlockheightExceededError) | 它在 blockhash 过期之前没有上链 | 否,除非它恰好在过期前上链;请检查签名 | 在区块浏览器上检查签名,然后重试 |
| “Transaction simulation failed: Error processing Instruction N: custom program error: 0x...” | 程序预判会失败,例如兑换滑点 | 否,如果在发送前的模拟中被拦下;如果钱包或应用跳过模拟,交易可能以 Failed 状态上链,并花掉手续费 | 阅读原因;调整滑点或金额 |
| “Attempt to debit an account but found no record of a prior credit.” | 付款账户里完全没有 SOL | 否 | 用 SOL 为它充值 |
| “Transaction results in an account (0) with insufficient funds for rent” | 发送会让某个账户低于租金豁免的最低余额 | 否,如果在模拟中被拦下;如果跳过模拟,它可能以 Failed 状态上链并花掉手续费 | 少发一点;参见 Solana 租金 |
| 区块浏览器显示“Failed” | 它已上链,程序返回了错误 | 是 | 阅读区块浏览器上的日志,修复后重新发送 |
Solana 的手续费始终以 SOL 支付,所以“Insufficient funds for fee”和“insufficient funds for rent”意味着你需要 SOL。代币转账时出现单独的“insufficient funds”或“custom program error: 0x1”,意味着你持有的该代币少于你试图发送的数量。
应该在 Solana 上提高优先费(priority fee)吗?
只有当交易在拥堵期间不断过期时才提高优先费,出现模拟错误时则不用。
根据 solana.com 的手续费文档,Solana 的手续费由每个签名 5,000 lamports 的基础费(50% 销毁,50% 给验证者)加上可选的优先费构成:优先费是计算单元价格(以 micro-lamports 计)乘以计算单元上限,再除以 1,000,000 并向上取整到整数 lamports,全部归验证者。更高的优先费能提高繁忙的 leader 调度你交易的几率。它无法修复滑点、租金或缺少 SOL 的错误,而且如果交易上链后失败,它仍然会被收取。如果出现模拟错误,请修复其原因。
TON 的退出码和退回消息是什么意思?
一笔 TON 交易分阶段运行(存储、入账、计算、动作、退回),根据 docs.ton.org,退出码 0 和 1 表示成功,其他一律表示失败。如果计算阶段失败,动作阶段会被跳过,对于可退回的入站消息,会生成一条退回消息;手续费是逐阶段扣除的,所以较早阶段的费用已经花掉。手续费以 GRAM 支付(前身为 Toncoin;参见更名带来了什么变化)。
| 信号 | 含义 | 花了网络手续费? | 该怎么办 |
|---|---|---|---|
| 退出码 13 或 -14 | 计算阶段 gas 耗尽 | 是,按已用的 gas | 附带更多 GRAM |
| 退出码 9 | Cell underflow:合约试图读取的数据超过一个 cell 所含,通常是因为载荷与合约的预期不符 | 是 | 检查载荷或备注是否适合该合约 |
| 退出码 37 | 动作阶段:“Not enough GRAMs”,不足以发送出站消息 | 是 | 附带更多 GRAM |
| 计算阶段被跳过 | 该消息附带的 GRAM 太少,不足以支付执行 | 没有 gas;存储阶段仍会运行 | 附带更多 GRAM 再发送 |
| 退回的消息 | 目标失败或不存在 | 是,已扣除手续费 | 退回的价值需扣除消息费和 gas 费 |
WATS Wallet 与这些错误有什么关系
WATS Wallet 由 Alltoscan LLC 开发,是一款面向 EVM 网络、Solana 和 TON 的非托管钱包(Chrome 扩展和 iOS/Android 应用),你自己持有密钥和助记词。本指南中的错误信息是这些链所定义的网络层错误,而不是 WATS 特有的代码。
在 Solana 上,网络手续费以 SOL 支付,所以 Solana 的“insufficient funds”一行直接适用:保留少量 SOL 余额即可避免它。TON 的各行描述的是协议层面的错误;在 WATS Wallet 中,TON 上的手续费以 ATS 支付。在 EVM 网络上,WATS Wallet 通过 ERC-4337 paymaster,以 ATS 从 BNB Chain 上的一份 ATS 余额中计收网络手续费;ATS 手续费的运作方式另有专文说明。
常见问题
加密交易失败时我会亏钱吗?
这取决于它是在什么时候失败的。如果它在被打包之前被拒绝(模拟、节点或内存池错误,如“nonce too low”、“replacement transaction underpriced”或“Blockhash not found”),则没有任何东西上链,也没有花掉网络手续费。如果它上链后失败(EVM 回滚或 out of gas、Solana 区块浏览器上的“Failed”、TON 的非零退出码),已完成工作的手续费就被花掉了,但你试图发送的金额仍留在你的账户中,TON 的退回消息会退回扣除手续费后的价值。请在区块浏览器上查看哈希或签名,以确认属于哪种情况。
我没有待处理的交易,为什么钱包提示“nonce too low”?
nonce 是账户的交易计数器,“nonce too low”意味着带有该编号的交易已经确认。常见原因有:在另一个钱包应用或设备上使用了同一个账户、一笔“卡住”的交易其实已经确认,或者钱包缓存的状态已过期。请在区块浏览器上查看你想做的付款或操作是否已经完成;如果已完成,不要重新发送;如果没有,请重新同步钱包再发送。被拒绝的那次尝试本身没有花手续费。如果确实有一笔交易待处理,请参阅<a href="/blog/speed-up-or-cancel-stuck-transaction">如何加速或取消待处理的交易</a>。
在 Solana 上出现“block height exceeded”或“Blockhash not found”后重试安全吗?
通常安全。“Block height exceeded”意味着 blockhash 已过期(约 151 个区块,大约 60 到 90 秒),而“Blockhash not found”意味着节点不认识它,通常是因为它已过期。过期的交易无法再被处理,所以它之后不可能上链并与新的那笔重复;不过仍请先在 Solana 区块浏览器上查询签名,然后用新的 blockhash 重试。除非它在过期前上链(区块浏览器查询会显示这一点),否则过期的那次尝试不会被收取手续费;如果它在拥堵期间不断过期,适度提高优先费会有帮助。

