Nonce:为什么以太坊交易要排队

·阅读 4 分钟·作者:SSP Editorial Team
SSP Academy 封面:以太坊 nonce 详解

Nonce:为什么以太坊交易要排队

在 Bitcoin 上,同一个钱包发出的两笔互不相关的付款可以按任意顺序确认。在 Ethereum 上却不行:一个地址发出的每笔交易都带有一个编号,网络严格按顺序处理它们。这个编号就是 nonce,它能解释以太坊钱包中一些最令人困惑的时刻——一笔交易迟迟无法确认,随后的每一笔交易都卡在它后面。

什么是 nonce

对于普通的以太坊账户,nonce 是一个计数器:该地址已发送的交易数量。第一笔交易使用 nonce 0,下一笔使用 1,依此类推。你签名的每笔交易都包含它的 nonce,而网络只有在 nonce n − 1 被打包之后,才会接受 nonce n。

它承担两项职责:

  • 防重放保护。一笔已签名的交易不能被提交两次,因为一旦 nonce 5 被使用,该地址发出的任何其他 nonce 为 5 的交易都会失效。
  • 排序。同一账户的交易会严格按照你预期的顺序执行,当一笔交易依赖另一笔时,这一点非常重要——先授权,再兑换。

为什么一笔卡住的交易会阻塞其余交易

排序规则有一个副作用。如果 nonce 5 停留在内存池中,手续费低到没人愿意打包,那么 nonce 6、7、8 也都无法被打包——无论它们付多少手续费。它们只能在它后面排队等待。

这就是为什么一笔手续费过低的交易会让钱包看起来像是冻结了。什么都没有丢失;队列只是在某一个位置被堵住了。

疏通队列

由于每个 nonce 只能使用一次,解决卡住交易的办法就是替换它:

  • 加速:用相同的 nonce 和更高的手续费签名一笔新交易。节点会替换旧版本,哪一笔先被打包,哪一笔就生效。
  • 取消:用相同的 nonce 签名一笔向你自己转账零金额的交易,并附上更高的手续费。它一旦确认,原交易就永远无法再确认。

替换交易通常需要比原交易明显更高的手续费才会被接受。卡住的交易与手续费替换介绍了 Bitcoin 上的对应工具。

常见的 nonce 问题

  • “nonce 过低”(错误信息 nonce too low)。使用该 nonce 的交易已经存在——通常是因为另一个钱包或设备从同一地址发送过交易。
  • 空缺。当账户只到 7 时,一笔 nonce 为 9 的交易会一直等待,直到 7 和 8 出现。这通常说明有交易被丢弃,或者在别处签名过。
  • 两台设备,一个账户。如果两个应用同时从同一地址发送交易,它们可能选中同一个 nonce;其中一笔交易会失败。

其他链如何处理

  • Bitcoin 及其他 UTXO 链没有账户 nonce。每笔交易花费的是特定的币,而一枚币只能花费一次——这正是防止重放和双花的机制。
  • Solana 改用最近的区块哈希:一笔交易只在很短的时间窗口内有效。对于耗时较长的签名——例如在两台设备上收集批准——它提供存储在特殊账户中的持久 nonce。

智能账户同样有 nonce

基于 ERC-4337 构建的智能合约账户并不发送普通交易。它们签名的是用户操作,由打包器通过一个共享的 EntryPoint 合约提交。每个账户依然有一个由 EntryPoint 跟踪的 nonce,具有同样的防重放保护。该标准还允许每个账户拥有多个相互独立的 nonce 序列,因此互不相关的操作无需彼此等待。从基本原理理解账户抽象解释了更完整的全貌。

SSP 中的 nonce

在 Ethereum 以及 SSP 支持的其他 EVM 链上,你的 SSP 账户是一个由你的 2-of-2 多签控制的 ERC-4337 智能账户。每个操作都包含它的 nonce,SSP Wallet 和 SSP Key 都会对其签名——因此已批准的操作既不能被重放,也不能在你历史记录中的其他位置被重复使用。

一个实际影响是:你的账户合约会在你从该账户发出的第一个操作中部署。这第一次发送包含了部署过程,因此消耗的燃料费明显多于之后的发送。这是正常现象,每个账户在每条链上只会发生一次。

坦诚的总结

nonce 是一个计数器,它让每个以太坊账户对自己的交易只处理一次,并且按顺序处理。这能保护你免受重放攻击,并让相互依赖的交易保持正确顺序——代价是一笔手续费过低的交易可能拖住它后面的所有交易。

遇到这种情况时,不要在上面继续发送更多交易。用相同的 nonce 和更高的手续费替换卡住的那笔交易,或者取消它,队列就会恢复畅通。

分享本文

相关文章