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