什么是加密货币中的随机数(Nonce)?比特币挖矿、以太坊、密码学

什么是加密货币中的随机数(Nonce)?比特币挖矿、以太坊、密码学

2010年12月,在柏林举行的混沌通信大会上,一个名为fail0verflow的小团队宣布他们已经提取出了索尼PlayStation 3的主签名密钥。该漏洞利用并非破解256位椭圆曲线,也并非破解AES加密,而是利用了索尼代码签名系统对每个签名都使用同一个随机数这一特性。

同一个词“nonce”出现在加密货币世界的三个几乎毫无关联的地方。它是比特币矿工每秒循环数万亿次以寻找有效区块哈希的变量。它是以太坊钱包用来对出站交易进行排序的计数器,也是导致阻塞交易会阻塞后续所有签名交易的原因。它是AES-GCM加密算法防止两条加密信息相互泄露内容的唯一值。一个词,三种用途,而且彼此不可互换。新手之所以会误读“nonce值过低”的错误信息,矿工之所以会设计出不可能完成的挖矿程序,以及像PS3这样的系统为何会失去信任根源,都是因为混淆了这三个词。

一个名为“仅使用一次的数字”的 32 位 nonce:来源

反向缩写词随处可见。“Nonce 代表一次性使用的数字。”大致正确,但历史错误。英语单词“nonce”比密码学早了大约750年。“For the nonce”出现在13世纪左右的中古英语手稿中,意思是“为了这个特殊场合”。

密码学在 1978 年的 Needham-Schroeder 认证协议中借用了“nonce”一词。该协议的定义属性并非随机性,而是特定范围内的唯一性。维基百科则根据实际应用将 nonce 定义为“一个只能在加密通信中使用一次的任意数字”。计数器、时间戳、随机值或三者的任意组合都符合条件。关键在于,在系统内部,同一个 nonce 永远不会与相同的密钥或相同的上下文再次出现。

一个词就能完成工作,而这项工作被分成三份。比特币的挖矿随机数(nonce)会不断变化,直到区块哈希值低于难度目标值。以太坊的账户随机数(acount nonce)是一个计数器,网络不允许重复使用。对称加密中的加密随机数(nonce)是一个与密钥配对的值,重复使用一次就会破坏加密。

这个词本身含义宽泛,但其语境却并非如此。

加密中的随机数

比特币挖矿中 nonce 的工作原理

在比特币中,随机数(nonce)位于80字节区块头中的一个32位字段内。总共四个字节。其取值范围从0到4,294,967,295。接近43亿个可能的数字,这在当初中村编写协议时听起来非常庞大,而现在一台桌面大小的ASIC芯片只需几微秒就能将其全部用完。

挖矿是一场竞赛,目的是在区块头中找到一个能生成有效区块哈希值的值。取 80 字节的区块头,将其输入比特币区块链运行所用的加密哈希函数 SHA-256 两次,得到一个 256 位的数字。将该数字与网络难度目标(驱动工作量证明的共识机制)设定的目标哈希值进行比较。如果低于目标值,则区块有效,矿工获胜。如果高于目标值,则将 nonce 值加 1 并重新哈希。比特币矿工不断循环这个过程,直到找到有效的 nonce 值,并将新区块添加到区块链中。

为什么如此庞大的任务需要如此小的字段?这是结构性原因。nonce 是矿工可以修改的区块头中最便宜的部分。其他所有字段都存在依赖关系。默克尔根概括了区块的交易,因此更改它会导致整个交易树在尝试新的哈希值之前重新计算。nonce 则避免了所有这些问题。每次哈希尝试都是独立的。递增 nonce 值与随机选择一个值并不会比递增 nonce 值带来任何进展。这本质上是一种披着共识外衣的暴力破解。

这种设计大约维持了一年。然后ASIC矿机打破了它的垄断。现代矿机只需几微秒,而不是几秒,就能耗尽全部43亿个nonce值。比特大陆蚂蚁矿机S21 Pro的算力为每秒234万亿次哈希。在该硬件上,耗尽全部nonce值大约只需18微秒。截至2026年5月,比特币网络的总算力接近每秒996万亿次哈希,挖矿难度为132.47万亿亿次。单台S21 Pro矿机每秒就能将所有可能的nonce值处理数万次。

因此,当32位空间耗尽时,中本聪的协议为矿工提供了两个干净的退出途径。第一个途径是“额外随机数”(extra nonce),它位于coinbase交易的scriptSig字段内,由BIP34编码。额外随机数的大小为2到100字节,由矿工控制。如果修改额外随机数,coinbase交易ID(TXID)就会改变,默克尔根需要重新计算,区块头也会改变,从而需要重新搜索32位随机数。第二个退出途径是在协议允许的范围内调整时间戳或旋转版本位。如今,矿池会在正常运行过程中循环使用这些参数。调整随机数的成本最低,调整额外随机数的成本次之。默克尔根和时间戳的旋转成本则依次递减,这是根据重新计算所需的工作量来排序的。

当有人挖到低于目标值的哈希值时——矿工称之为“黄金随机数”——新区块就会在点对点网络中传播开来,每个竞争对手都会放弃当前的搜索,重新开始下一轮。

ASIC模型哈希率是时候耗尽 32 位 nonce 了。效率
蚂蚁矿机 S21 200 TH/s约21微秒17.5 焦耳/小时
蚂蚁矿机 S21 Pro 234 TH/s约18微秒15 J/TH
蚂蚁矿机 S21 XP 270 TH/s约16微秒13.5 焦耳/小时

一个真实的近期案例为这种抽象概念提供了佐证。2026年初挖出的第948,000个区块,其区块哈希值为`00000000000000000001b01841afc366a4f999b291c8563ee0d0db956fc2db44`,对应的随机数(nonce)值为2,582,463,598 。这个整数与区块头的其他信息结合,生成了一个足够小的哈希值,从而被添加到区块链中。该矿工在那一轮尝试的所有其他随机数都过大。

从机械角度来说,这就是工作量证明的本质。它并非谜语意义上的难题,而是寻找一个有效的随机数,以电力作为报酬。

哈希 nonce 与账户 nonce:同一个词,不同的作用

“nonce”这个词在加密货币领域还有另一个用途,而这种重叠正是新手最容易感到困惑的地方。比特币的挖矿 nonce 是一个搜索变量,以太坊的账户 nonce 则是一个计数器。它们名称相同,但除此之外几乎没有其他区别。

哈希 nonce(比特币)账户随机数(以太坊)
工作在目标下方搜索有效的哈希值按账户对出站交易进行排序
它居住的地方块头(32 位)账户状态(整数,从 0 开始)
谁使其发生变异矿工,以硬件形式,每秒挖矿数十亿次钱包会自动生成,每次发送一个。
“错误”是什么意思彩票失败,请尝试下一个随机数。交易被拒绝或卡住
与共识挂钩?是的,这是工作证明。不,这是回放保护。

哈希 nonce 是矿工丢弃的临时数字。账户 nonce 则是永久状态,记录在网络对你的地址的描述中。人们常常将两者混淆——把比特币区块的区块链 nonce 当作序列计数器——导致以太坊出现“nonce 值过低”的错误,并误以为自己的挖矿设备出了问题。不同的区块链,不同的任务,却用了同一个词。即使在同一个生态系统中,nonce 在区块链运行中的作用也完全取决于你关注的是共识层还是账户层。

以太坊账户随机数和卡住交易问题

以太坊上每个外部账户都有自己的随机数(nonce)。该计数器从零开始,代表地址首次发送交易。之后,每笔交易被打包进区块,随机数就加一。当你发送交易时,你的钱包会向网络请求当前值,附加下一个随机数,并进行签名。网络严格按照顺序接收出站队列中的交易。随机数依次为:0、1、2,不允许出现空位。

正是这种严格的顺序机制赋予了以太坊防重放攻击能力。已签名的交易绑定到一个特定的 nonce 值,并且自 EIP-155 版本起,还绑定到一个特定的 chainID。攻击者无法将已执行的旧交易重新广播为新交易。当重新广播到达时,账户 nonce 值已经更新。chainID 机制也同时杜绝了跨链重放攻击。在同一条链上,已确认的交易在某个时间点上的计数可能已经更新。

同样的僵化排序机制导致了新以太坊钱包不断遇到的痛点。当一笔交易的验证费过低时,验证者会直接跳过它,内存池会将其从优先级队列中移除。这笔交易现在处于一种悬而未决的状态——既没有被确认,也没有被失败,只是被搁置了。更糟糕的是,同一地址之后签署的每一笔交易都会获得更高的随机数。在被搁置的交易被确认或被替换之前,网络拒绝处理任何后续交易。一笔缓慢的交易就可能导致整个队列停滞。

修复方案在于一种名为“费用替换”(replace-by-fee)的机制。你的钱包会在与阻塞交易相同的nonce 值下重新广播一笔新交易,但这次会增加 gas 费用。以太坊自 2021 年 8 月伦敦升级以来一直沿用的 gas 定价模型 EIP-1559 规定:新交易的 `maxFeePerGas` 和 `maxPriorityFeePerGas` 都必须比原交易高出至少 10%。如果想要直接终止阻塞交易而不是替换它,可以在阻塞的 nonce 值下发送一笔零 ETH 的自转账,并支付更高的费用。这样,该交易槽位就会被消耗掉,队列中后续的所有交易都会被解除阻塞。

2026年5月的数据可供参考。平均优先小费约为1.875 Gwei。在风平浪静的日子里,取消一次21,000加仑的订单大约需要0.05美元,而在交通拥堵时,费用则会降至几美元。每个人都会最终通过惨痛的教训明白一个道理:永远要先替换最低的待处理随机数。如果前一笔交易仍然处于待处理状态,那么在后续交易中提高手续费是没有任何意义的。

账户抽象化稍微改变了这种局面。ERC-4337 智能账户使用二维 nonce,将整数拆分为 192 位“密钥”和 64 位序列。不同的密钥形成并行的交易流。一个密钥上的交易批次停滞不会阻塞另一个密钥上的交易。账户 nonce 终于不再是单一的线性计数器了。

最后一个值得澄清的误解。以太坊在 2022 年 9 月的合并中过渡到权益证明机制,并没有移除账户 nonce。消失的是区块头中的挖矿nonce,因为验证者现在是按槽位而非哈希谜题来选择的。账户 nonce 仍然保留在它原本的位置,即账户状态树中。

加密中的加密随机数:灾难版本

脱离区块链,加密随机数的作用就更加显著。一旦出错,后果不堪设想。

所有现代认证密码都将密钥与每个消息的随机数配对。TLS 1.3 的核心算法 AES-GCM 使用 96 位随机数。NIST SP 800-38D 编写了该规范。另一种算法 ChaCha20-Poly1305(在 RFC 8439(2018 年 6 月)中定义)复制了相同的 96 位随机数长度,并将其与 256 位密钥配对。简而言之,这两种算法的共同规则是:每个(密钥,随机数)对都只能使用一次。重复使用并非小幅降级,而是断崖式下降。

悬崖是什么样的?假设在 AES-GCM 中使用同一个密钥重复使用 nonce。假设攻击者捕获了两个密文。他们将两者进行异或运算。结果泄露了两个底层明文的异或结果。机密性瞬间丧失殆尽。更糟糕的是,GCM 的认证模式会泄露其内部认证子密钥——该密钥用于签署所有使用该密钥的密文。攻击者掌握了子密钥后,可以编写新的认证密文,而合法的接收者会将其视为真实。即使是最先进的密码算法,仅仅因为一个错误的 nonce,其安全性也会低于凯撒移位。

以上并非假设。2016 年 USENIX WOOT 会议论文《不尊重随机数规则的攻击者》扫描了生产环境中的 HTTPS 端点,发现 184 台服务器重复使用 GCM 随机数。这些存在漏洞的版本包含特定的 Cisco IOS XE 镜像和 Radware ADC 固件。CVE-2016-0270 及多个相关 CVE 漏洞均与此有关。

2010年12月索尼PS3的漏洞利用了同样的漏洞,只不过使用的是另一种加密算法:ECDSA。每个ECDSA签名都需要一个唯一且保密的签名值,记为k 。索尼的签名代码省略了唯一性这一步骤,而是硬编码了一个常量k ,并在每个签名中重复使用。如果攻击者获得两个具有相同k值的ECDSA签名(分别针对不同的消息),他们就得到了两个关于两个未知数的线性方程。解方程,就能得到私钥,而且是以闭式形式存在的。fail0verflow在柏林举行的第27届混沌通信大会上对此进行了详细讲解。索尼的主签名密钥在几个小时内就泄露到了互联网上。所有PS3主机瞬间失去了信任链。

2013 年在 RFC 6979 中定义的确定性修复方案,将随机数生成器从处理过程中移除。k由消息和私钥的 HMAC 计算得出。相同的消息、相同的密钥、相同的k 值——无需担心随机数生成器被破坏。现代比特币库默认使用确定性 ECDSA。

这两个例子引出了两个推论,它们常常让开发者感到困惑。对于 AEAD 加密算法(AES-GCM、ChaCha20-Poly1305),可预测的 nonce 值是可以接受的,可以使用计数器。唯一性是全部要求。但对于 ECDSA 和 Schnorr 签名,规则则截然相反。可预测的k 值会带来灾难性的后果。签名 nonce 必须同时满足唯一性、不可预测性和保密性三个条件。正是由于混用了这两种规则,自定义钱包代码中才会不断出现 nonce 重用漏洞。Kopia 备份项目的 2024 年审计报告记录了长期密钥存在随机 GCM nonce 碰撞风险,而针对新版 SDK 的渗透测试报告也每月都提出了类似的发现。

随机抽取、盐注射和静脉注射:避免三者混淆

人们在安全文档中经常把三个词混用,好像它们意思一样:Salt(盐)、Nonce(随机数)、IV(IV)。它们并非同义词。

盐值是密码哈希算法的一部分。你为每个用户生成一个随机值,并将其混入哈希值中,这样一来,预先计算好的针对“password123”的彩虹表就无法再用于破解你的数据库了。盐值以明文形式与哈希值并列存储,无人会隐藏。两个用户共享同一个盐值会造成问题;这意味着攻击者如果破解了其中一个用户的密码,也能破解另一个用户的密码。但这并非世界末日。

随机数(Nonce)与消息传递和签名密切相关。在对称加密中,每个消息都有一个随机数;在 ECDSA 中,每个签名都有一个随机数。像 AES-GCM 这样的 AEAD 密码会将随机数明文公开,就像哈希值旁边有盐值一样。ECDSA 则将其隐藏,视作秘密,并要求每次都生成新的随机数。无论哪种方式,碰撞都不是小事,而是致命的。所有保证都将不复存在。

IV(初始化向量)是旧规范中“nonce”(随机数)一词的旧称。CBC 和 CTR 模式多年来一直使用这个词。现代 AEAD 文档改用了“vector”(向量)一词,主要是因为“vector”听起来像数学作业,而且人们经常重复使用它。“nonce”则更强调规则性。

需要一条能写在便签上的规则吗?盐可以保护你保守的秘密。随机数可以保护你发送的秘密。

加密中的随机数

为什么 nonce 值除了比特币挖矿的琐事之外还很重要

nonce 是一个很小的元素。在比特币中是 32 位,在以太坊中是一个计数器,在 AES-GCM 中是 12 字节。它虽然体积小,却承载着不成比例的重要性。对于普通用户而言,每一笔卡住的以太坊交易、每一次与银行网站的 TLS 握手、硬件钱包生成的每一个签名都依赖于 nonce 的正确处理。对于开发者而言,nonce 处理不当是自定义加密代码中出现灾难性漏洞的最常见入口。PS3 事件是一个极端案例,但同样的故障模式不断出现在新的钱包 SDK 和备份工具中。对于比特币的经济体系而言,正是 32 位 nonce 以及额外的 nonce 机制,使得 ASIC 挖矿成为一种公平的抽奖机会。这是中本聪最重要的设计选择之一,它就隐藏在一个不起眼的头部字段中。

nonce 代表着某件事只发生过一次,而且是以这种顺序、这种方式发生的。一旦移除 nonce,所有依赖唯一性的系统都会崩溃,攻击者可以轻易地重建它。共识机制失效,重放保护消失,加密泄露,签名伪造。

任何问题?

是的,两者都有,但方式不同。Solana 保留账户级别的 nonce,并添加持久 nonce 账户用于离线签名。以太坊的权益证明机制在 2022 年 9 月合并后保留了账户 nonce,但从区块头中删除了挖矿 nonce,因为验证者现在是按槽位而不是按哈希谜题选择的。

在以太坊上,唯一的办法是使用“费用替换”(replace-by-fee),即通过支付更高的 gas 费,将一个未确认的交易替换为另一个具有相同 nonce 值的交易。确认后,同一账户上的两个交易永远不能共享 nonce 值。在采用单密钥的 AES-GCM 算法中,共享 nonce 值是被完全禁止的。这种重复使用会同时破坏机密性和身份验证。

执行按手续费替换操作。提交一笔与卡住的交易使用相同 nonce 的新交易,并将 `maxFeePerGas` 和 `maxPriorityFeePerGas` 的值提高 10% 或更多。要取消而不是替换,请在卡住的交易 nonce 值下向您自己的地址发送一笔零值转账,并支付更高的手续费。始终优先替换最低的待处理 nonce 值。

三种用途,同一个核心理念。随机数(nonce)确保唯一性,防止重复操作。它用于对基于账户的账本中的交易进行排序。同时,它也是矿工在工作量证明(PoW)机制中寻找有效哈希值时调整的搜索变量。不同的机制,相同的目标:确保每个事件都与其他事件截然不同。

该短语通常指的是账户级别的或身份验证 nonce。可以将其想象成一个与会话、交易或 API 请求绑定的一次性值,因此该请求无法被重放。这里的“令牌”并非 ERC-20 意义上的令牌。OAuth 和 OpenID Connect 在其身份验证流程中都依赖于 nonce 令牌。

“nonce”一词指的是在特定加密范围内仅使用一次的数字。比特币将其用作矿工循环搜索以找到有效哈希值的32位搜索字段。以太坊将其用作对单个账户的出站交易进行排序的计数器。加密技术将其用作每条消息的随机值,该值与密钥配对后绝不能重复。

Ready to Get Started?

Create an account and start accepting payments – no contracts or KYC required. Or, contact us to design a custom package for your business.

Make first step

Always know what you pay

Integrated per-transaction pricing with no hidden fees

Start your integration

Set up Plisio swiftly in just 10 minutes.