Nonce 是什么:英文原义、密码学含义与比特币挖矿中的随机数
Nonce 指「只用一次、用完即弃」的东西。在英语中它保留在固定短语 for the nonce 里;在密码学中它是防止重放攻击的一次性值;在比特币挖矿中,它是矿工不断变更、用来寻找有效区块哈希的 32 位字段。
有三个不同的领域都在用 nonce 这个词,而它们底层的含义其实是同一个:只用一次、用完即弃。这个词条依次讲清楚它的英文原义、词源、密码学含义、比特币挖矿中的含义(包括搜索如何进行、矿工为什么需要它、矿池和 ASIC 如何扩展搜索),以及以它命名的比特币矿场管理平台 Nonce。
名词、形容词。源自中古英语,约 1200 年。复数 nonces。
英文原义
指「这一次、当下这个场合或目的」。今天几乎只保留在固定短语 for the nonce 中,意为「暂且」「就这一次」「针对眼下这个目的」。
指「为一次性使用而造、并不打算长期存在的」。最典型的搭配是 nonce word:为某一次特定场合临时造出来、之后并未进入通用词汇的词。
形容词用法比名词晚得多。1884 年,James Murray 主编《新英语词典》(即后来的《牛津英语词典》)时,需要一个标签来标注那些看起来只被使用过一次的词,于是造出了 nonce-word。形容词用法就是从这条编辑惯例扩散开来的。
词源:一次将错就错的断词
nonce 是一个「错着错着就成真」的词。它最初的中古英语短语是 for then anes,意思是「为了这一个目的」,其中 then 是定冠词的屈折形式。后来读者逐渐把词与词之间的边界划错了位置,把 then anes 重新拆成了 the nanes,那个多出来的 n 就从冠词滑到了后一个词上,英语于是得到了 for the nonce。
这种断词错误在英语里被称为「重新划界」(rebracketing),并不是孤例:
| 原形 | 被错误重划为 | 结果 |
|---|---|---|
| for then anes | for the nanes | nonce |
| an ewt | a newt | newt |
| a nadder | an adder | adder |
| a napron | an apron | apron |
该短语约在 1200 年前后已有文献记录;乔叟在《坎特伯雷故事集》总引中使用了 for the nones——到那时它已经成了诗人们凑音节时顺手可用的填充语。
有一点需要澄清:nonce 不是 “number used once”(只用一次的数字)的缩写。那是后人根据密码学用法造出来的逆向缩写,好记,但不是词源。
密码学中的 nonce
指协议中只使用一次的任意值,用来让每一条消息、每一次会话都保持唯一。它的作用是阻止攻击者录下一段合法通信、之后原样重放来冒充合法方。
原理并不复杂:如果一条消息里包含一个接收方从未见过、并且此后永远不会再接受的值,那么这条消息的副本就无法被重复使用。没有 nonce,攻击者甚至不需要破解加密——直接把同一条加密订单再发十遍就够了。
nonce 在现代安全工程中随处可见:
- HTTP 摘要认证:每次返回
401质询时都下发新的 nonce,使每个响应只在一次交互中有效。 - AEAD 加密算法:AES-GCM、ChaCha20-Poly1305 等把 nonce 与密钥配对,确保同一把密钥不会两次产生相同的密钥流。在这里重复使用 nonce 是灾难性的。
- 以太坊账户:每个账户都有一个随交易递增的 nonce,用于固定交易顺序,并防止同一笔交易被打包两次。
- 签名 API 请求:通常会同时携带 nonce 与时间戳,使被截获的请求无法重新提交。
这一术语于 1978 年由 Needham 与 Schroeder 关于大型网络认证的研究引入安全文献。同一「只用一次」的含义,也见于 NIST 术语表 和 Wikipedia 的 cryptographic nonce 词条。
比特币挖矿中的 nonce
指比特币区块头末尾的那个 4 字节字段。矿工不断变更它,以寻找一个小于或等于难度目标值的哈希。能满足条件的那个 nonce,本身就 是工作量证明。
每个比特币区块都以一个 80 字节的区块头开始,由六个字段构成。其中五个由网络规则和区块内容决定,只有第六个是自由的:
nonce 是一个 32 位无符号整数(uint32_t),取值范围是 0 到 4,294,967,295。挖矿时参与哈希计算的只有这个区块头,而不是全部交易数据;交易通过默克尔根间接进入哈希。
挖矿的搜索过程
- 挖矿软件组装一个候选区块,构造出它的 80 字节区块头,再把区块头和目标值交给 ASIC。
- ASIC 用双重 SHA-256 计算哈希:
SHA256(SHA256(区块头))。 - 把结果与
Bits字段所编码的难度目标值作比较。 - 如果哈希大于目标值,就改变 nonce,重新计算。
- 如果小于或等于目标值,ASIC 把这份区块头返回给软件,这个区块就是有效的。矿工向全网广播,其他节点只需算一次哈希即可完成验证。
- 如果 nonce 区间先用完,软件会构造一个新的区块头(通常带有新的默克尔根),开始下一轮搜索。

这种不对称性正是工作量证明的意义所在:找到这个 nonce 需要全网做出以亿亿次计的尝试,而验证它只需要一次哈希。由于谁也无法预测哪一次尝试会成功,争夺出块权就变成了真实硬件、电力和时间的竞争。
SHA-256 属于 SHA-2 系列,由美国国家标准与技术研究院的安全哈希标准 FIPS 180-4规范,它把任意输入映射成固定的 256 位输出。对挖矿来说,重要的不是「加密」,而是哈希函数的三个特性:
- 输入相同,输出一定相同,所以任何人都能验证结果。
- 输入只要有微小变化,输出就完全不同,所以 nonce 加一得到的是一个毫不相关的哈希。
- 无法从输出反推输入,所以没有人能从目标值倒推出答案。
是搜索变量,不是随机数
中文里常把 nonce 译作「随机数」,这个译法在两方面容易造成误解。
第一,nonce 本身并不随机。ASIC 按固件设定的顺序遍历取值,也可以把不同区间分给不同芯片;很多介绍里「从 0、1、2 依次往上数」只是对这种调度的简化。真正表现出随机性的是哈希输出。唯一真正的要求,是不要重复计算完全相同的区块头,否则只会得到完全相同的哈希。
第二,并不存在一个等着被找到的「正确 nonce」。网络里没有保存任何答案。一个 nonce 只有和与它一起计算的另外五个字段放在一起才有意义:同一个 nonce 放进前块哈希、默克尔根或时间戳不同的区块头,哈希就完全不同,对旧区块头有效的 nonce 对新区块头几乎毫无意义。nonce 也不是奖励编号或隐藏的密码,它只是改动成本最低的那个输入。
所以矿工真正寻找的是一整份哈希满足目标值的区块头,nonce 只是其中变化最频繁的字段。
什么样的哈希才算有效
工作量证明比较的是数值。Bitcoin Core 从区块头的 Bits 字段(nBits)解码出目标值,再把区块头哈希当作 256 位整数与之比较:大于目标值即失败,小于或等于目标值即通过。示意图里的有效哈希常常以一长串 0 开头,是因为较小的 256 位整数写成十六进制时会有前导零,但真正的规则是数值比较,而不是数前面有几个零。
可以把它想象成抽奖。每算一次哈希,就相当于在 0 到 2²⁵⁶−1 之间重新抽一个数,而目标值只在这个区间的最底部划出极小的一块。绝大多数尝试都会落空,也没有办法提前知道哪个 nonce 会落进去。
nonce、算力与难度
挖矿中总是一起出现的这几个概念,描述的是同一场搜索的不同部分:
| 概念 | 本质 | 对搜索的影响 |
|---|---|---|
| Nonce | 区块头中的可变字段 | 每改变一次就提供一次新尝试 |
| 算力 | 每秒完成的哈希次数 | 决定矿机每秒能尝试多少次 |
| 目标值 | 区块头哈希不能超过的数值 | 决定单次哈希是否有效 |
| 难度 | 满足当前目标值有多困难 | 难度越高,平均需要的尝试越多 |
H/s、TH/s、PH/s、EH/s 这些算力单位衡量的是哈希速度,而不是比特币数量。一台 100 TH/s 的矿机每秒大约尝试 100 万亿次,200 TH/s 的矿机约 200 万亿次。
比特币的目标是平均约每 10 分钟产生一个区块,并会周期性调整难度来维持这个节奏。当更多 ASIC 加入、全网算力上升时,难度提高、目标值降低。这并不会让 nonce 本身变得更复杂,而是让满足条件的哈希更稀少,平均需要更多次尝试。同一台 ASIC 每秒的哈希次数大致不变,变化的只是单次尝试成功的概率;自身算力不变的矿机,在全网算力中的占比则会下降。
每一次哈希都是独立事件。连续失败十亿次,也不会让下一次更接近成功;nonce = 100 的结果,也不能说明 nonce = 101 会怎样。短期结果波动很大,观察时间拉长后,矿工的结果会逐渐贴近它在全网算力中的占比。这也是为什么矿工要综合考虑比特币价格、全网难度、Hashprice、电力成本、矿机能效和在线率,而不只是矿机数量。
nonce 跑完了怎么办
32 位字段一共有 4,294,967,296 个取值,约 43 亿个。这个数字听起来很大,实际上完全不够用——一台现代 ASIC 矿机在不到一秒内就能跑完整个区间,而全网平均每个区块需要 10²³ 量级的尝试。在 CPU、GPU 挖矿的年代,这个区间还算宽裕;到了 ASIC 时代,它只是一层很短的内循环。
因此矿工会改动区块头中的其他内容,从而重置整个 nonce 搜索空间:
写在 coinbase 交易里的任意数据。改动它会改变这笔交易,进而改变默克尔根、改变区块头,于是又获得全新的 43 亿个 nonce。这是标准的外层计数器。
时间戳字段可以在共识规则允许的窗口内合法地向前推进,每换一个取值就再获得一个完整的 nonce 区间。
版本字段中未被使用的位也可以拿来当作额外搜索空间。这正是 ASICBoost 所标准化、并通过 Stratum 协议协商的机制:BIP 310 定义了相应的 Stratum 扩展,允许矿机在矿池许可的位范围内滚动版本位。
调整打包哪些交易、或改变交易顺序,同样会改变默克尔根,从而得到新的区块头。
所以区块头 nonce 是内层计数器,extraNonce 是外层计数器。两者结合,矿工就拥有了实际上无限的搜索空间。而算力(每秒哈希数)衡量的,本质上就是一个矿场跑过 nonce 的速度。coinbase 一侧的细节见 extraNonce 词条。
随着 ASIC 算力继续上升,区块头层面的搜索空间压力也在增加。2026 年 4 月提出的 BIP 323 草案建议把区块头 nVersion 字段中的 24 位保留为通用 nonce 空间,以减少矿机控制器生成新工作的频率。它目前仍是草案,不是共识规则。
矿池中的 nonce
大多数矿机并不独立寻找区块。矿池负责组织工作:它向每台矿机下发构造区块头所需的数据,以及一个比网络目标更容易达到的份额目标。于是每一次哈希都会落入以下三种情况之一:
| 哈希结果 | 含义 | 后续处理 |
|---|---|---|
| 未达到矿池目标 | 普通失败哈希 | ASIC 继续计算,不上传 |
| 达到矿池目标,但未达到网络目标 | 有效 Share | 提交给矿池,证明完成的工作量 |
| 达到比特币网络目标 | 有效区块候选 | 矿池向比特币网络提交区块 |
绝大多数哈希根本不会离开矿机,否则通信量会大到无法承受。矿池根据一段时间内收到的有效 Share 估算每台矿机的实际算力。因此「每天提交很多 Share」和「找到一个区块」是两个层级的事情:Share 用来计量和分配工作量,只有低于网络目标的哈希才是新区块的工作量证明。
放到整个矿池来看,搜索是一个分层系统。矿池或节点准备候选区块工作;挖矿软件构造 coinbase 交易、默克尔根和区块头;ASIC 改变 nonce 并计算哈希。一个区块头的空间用完后,上层再改动 extraNonce、时间或其他可调数据,下发新的工作。每台矿机都必须分到足够大且互不重叠的搜索空间——两台矿机重复计算相同的数据只是在浪费电——extraNonce、不同的 coinbase 数据和不同的工作模板提供的正是这一点。规范矿池工作模板的 BIP 23 甚至专门设有 noncerange 字段,用来标明矿机可以搜索的 nonce 范围。
谁在执行搜索
比特币挖矿经历了从 CPU 到 GPU、再到 FPGA,最终到 ASIC 的演变。ASIC(专用集成电路)是只为执行 SHA-256 而设计的芯片。它不会预测哪个 nonce 能成功,只是比通用硬件更快地改变输入、计算哈希、检查结果、再来一次。它的两项优势是算力和能效,能效用 J/TH(每 TH 算力的能耗)衡量,每一代 ASIC 都在继续改进。
在这一层,运营人员既看不到也不需要输入 nonce,搜索完全在芯片和固件内部完成。运营人员可能损失的是搜索时间。一台标称 200 TH/s 的矿机如果因过热长期只跑到 160 TH/s,每秒的尝试次数就少了;离线一小时,这一小时的尝试次数就是零。矿机即使仍在通电,只要矿池连接失败、固件异常、算力板故障或网络中断,也无法有效挖矿。每损失一分钟,这一分钟本可完成的尝试都无法补回。
一条用法提醒
在英国和爱尔兰的俚语中,同样拼写的 nonce 还有一个完全无关、且带有强烈贬义的含义,约自 1970 年代中期开始被记录,指性犯罪者。它与上文所述的词在词源上毫无关系。如果你要在英国听众面前使用这个技术术语,值得事先知道这一点;本页其余内容与该义项无关。
Nonce:以它命名的比特币矿场管理平台
Nonce 是一款面向比特币矿场的管理平台——由矿工为矿工而做。产品名取自挖矿的工作单位本身:矿场算出的每一个哈希,都意味着又试了一个 nonce;每秒能跑过多少个 nonce,正是矿场真正被支付报酬的东西。
产品围绕三件事组织:
掌握每个场地、每台机器的运行状况,知道什么在正常工作、什么不正常,让问题被快速修复。
减少人工运维时间、让机器保持在线——扫描发现、批量开关机、固件升级、批量重启、定位灯、批量改矿池,可一次覆盖数千台矿机。
让数据驱动策略——挖矿模式、自动重启、快捷指令,把矿场推向更高的「每瓦特产出比特币」。
在使用上,它以工作区(workspace)组织矿场(farm),并在现场部署 Agent 来发现矿机并与之通信。支持网页、移动端与 Slack;通过 SOC 1 Type 2 审计;同时提供公开 API 与 MCP 服务,AI 助手可以直接查询并操作矿场。
这个平台工作在协议之上的一层。它不是替 ASIC 寻找 nonce 的挖矿算法,也不是矿池,而是让更多执行搜索的矿机保持在线、以应有的算力运行。协议中的 nonce 与这个平台的区别,详见 Nonce 挖矿软件词条。
- 产品官网 —— nonce.app
- 产品文档 —— docs.nonce.app
相关词条
- extraNonce:coinbase 交易中的外层计数器,以及它与区块头 nonce 的区别
- Nonce 挖矿软件:Nonce 矿场管理平台,以及「nonce 挖矿软件」指的是什么
- 比特币矿业数据:矿业公司的算力、BTC 产量、能效与单币成本
常见问题
Nonce 是什么?
Nonce 指「只用一次、用完即弃」的东西。在英语中它保留在固定短语 for the nonce 里;在密码学中它是防止重放攻击的一次性值;在比特币挖矿中,它是矿工不断变更、用来寻找有效区块哈希的 32 位字段。
Nonce 是什么意思?
Nonce 指「只用于某一次、某一个场合」的东西。作名词时意为「这一次、当下这个目的」,今天几乎只出现在固定短语 for the nonce(暂且、就这一次)中;作形容词时表示「为一次性使用而造的」,典型用法是 nonce word(临时造词)。现代技术英语借用了这个词:在密码学中,nonce 是一条消息或一次会话中只使用一次的值;在比特币挖矿中,它是矿工不断变更、用来寻找有效区块哈希的计数器。
Nonce 这个词是怎么来的?
它源于中古英语的一次「断词错误」。原短语是 for then anes,意为「为了这一个目的」,其中 then 是定冠词的一种屈折形式。后来读者把词的边界划错了位置,把 then anes 重新拆成 the nanes,多出来的 n 就滑到了后一个词上,于是产生了 nonce。英语里这类错误并不罕见:an ewt 变成了 a newt,a nadder 变成了 an adder。该短语约在 1200 年前后已有文献记录,乔叟在《坎特伯雷故事集》总引中就用过 for the nones。
Nonce 是 “number used once” 的缩写吗?
不是。“number used once”(只用一次的数字)是后造的逆向缩写。它之所以流行,是因为恰好非常贴切地描述了密码学里的用法,但它并不是这个词的真实词源——真正的来源是中古英语短语 for then anes。作为工程师的记忆口诀它很好用,作为词源解释则是错的。
Nonce 在今天的英语里还算常用词吗?
名词用法已经属于古语,除了固定短语 for the nonce 之外,日常英文中基本见不到。形容词用法反而比名词年轻得多:1884 年,James Murray 在编纂《新英语词典》(后来的《牛津英语词典》)时,需要一个标签来标注那些看起来只被使用过一次的词,于是造出了 nonce-word,形容词用法才从这一编辑惯例扩散到普通语境中。
密码学中的 nonce 是什么?
密码学中的 nonce 是协议中只使用一次的任意值,作用是让每一条消息或每一次会话都是唯一的,从而阻止重放攻击——攻击者即使截获了一段合法通信,也无法在之后重新发送一遍来冒充合法方。HTTP 摘要认证每次质询都会下发一个新的 nonce,正是出于这个原因;AES-GCM、ChaCha20-Poly1305 等 AEAD 算法则把 nonce 和密钥配对使用,确保同一把密钥不会产生两次相同的密钥流。这个术语于 1978 年由 Needham 与 Schroeder 引入安全领域文献。
比特币挖矿中的 nonce 是什么?
它是比特币 80 字节区块头末尾的一个 4 字节(32 位)无符号整数字段。挖矿本质上是一次搜索:矿工组装出一个候选区块头,用双重 SHA-256 计算哈希,再检查结果是否小于或等于难度目标值;如果大于目标值,就改变 nonce 再算一次。nonce 是区块头中改动成本最低的字段,因此它是整个搜索过程的最内层循环。能让哈希值小于或等于目标值的那个 nonce,就是使区块生效的工作量证明。
比特币矿工为什么需要 nonce?
工作量证明要求矿工找到一个小于或等于目标值的区块头哈希,而 SHA-256 的输出既无法预测、也无法反推,没有任何公式能直接算出一个有效的区块头。唯一的办法就是不断改动区块头、重新计算哈希。nonce 正是为此设置的字段:改动它就改变了 80 字节的区块头,每次改动都会得到一个完全不同的哈希。如果没有这样一个可以低成本改动的字段,矿工就没有快速产生新尝试的办法。
比特币的 nonce 是随机数吗?
不是通常意义上的随机数,尽管中文里常这么翻译。ASIC 矿机并不随机猜 nonce,而是按固件设定的顺序遍历 32 位区间,也可以把不同区间分给不同芯片。真正表现出随机性的是 SHA-256 的输出:输入稍有变化,结果就完全不同。网络里也不存在一个事先存好的「正确 nonce」:同一个 nonce 放进不同的区块头,得到的哈希完全不同,所以一个 nonce 只对与它一起计算的那份区块头有效。真正的要求只有一条:不要重复计算完全相同的区块头。
ASIC 矿机如何寻找 nonce?
靠穷举。挖矿软件构造候选区块和 80 字节区块头,把区块头和目标值交给 ASIC。ASIC 改变 nonce,对区块头执行两次 SHA-256,把得到的 256 位结果与目标值比较,然后重复。一旦某个哈希小于或等于目标值,就把这份区块头返回给软件;如果 nonce 区间先用完,软件会下发一个新的区块头(通常带有新的默克尔根),搜索重新开始。ASIC 并不比 CPU「猜得更聪明」,只是每秒能猜的次数多得多。
nonce 一共有多少个取值?用完了会怎样?
32 位字段共有 4,294,967,296 个取值,约 43 亿个。现代 ASIC 矿机在远不到一秒的时间里就能把这个区间跑完,所以仅靠 nonce 提供的搜索空间是完全不够的。当它溢出时,矿工会改变区块头里的其他内容,从而重新获得完整的 43 亿个 nonce:递增 coinbase 交易中的 extraNonce(这会改变默克尔根)、在共识规则允许的窗口内向前滚动时间戳、或者滚动版本字段中未使用的位。以上任一改动都会重置 nonce 的搜索空间。
nonce 和 extraNonce 有什么区别?
nonce 是区块头里真实存在的字段,4 字节,直接参与哈希计算。extraNonce 则完全不是区块头字段,它是矿工写在 coinbase 交易里的任意数据;改动它会改变这笔交易,进而改变默克尔根,最终改变区块头。因此 extraNonce 是外层计数器,区块头 nonce 是内层计数器。两者结合,矿工就获得了实际上无限的搜索空间。
nonce、算力和挖矿难度是什么关系?
它们是同一场搜索的三个部分。nonce 提供新的输入;算力是矿机每秒能做多少次这样的尝试(100 TH/s 约等于每秒 100 万亿次哈希,而不是每秒挖出多少比特币);难度对应的目标值决定什么样的哈希算成功。全网算力上升时,比特币会提高难度,使平均出块时间维持在约 10 分钟,有效哈希因此变得更稀少。每一次哈希都是独立的尝试:连续失败十亿次,也不会让下一次更接近成功,提高成功概率的唯一办法就是做更多次尝试。
加入矿池以后,矿机还需要寻找 nonce 吗?
需要。矿池改变的是工作分配和收益结算方式,而不是工作量证明的计算方式。矿池向每台矿机下发构造区块头所需的数据,以及一个比网络目标更容易达到的份额目标。达到矿池目标的哈希会作为 Share 提交,矿池据此估算每台矿机实际贡献的算力;其余哈希在本地直接丢弃。偶尔某个 Share 同时达到了比特币网络目标,这时矿池就真正找到了一个有效区块。
比特币矿场管理工具 Nonce 为什么叫这个名字?
因为 nonce 正是挖矿工作真正发生的地方。矿场算出的每一个哈希,都意味着又试了一个 nonce;每秒能跑过多少个 nonce,就是这个矿场的算力。Nonce 这款产品以这一「工作单位」命名:它负责监控、管理并自动化那些正在做搜索的机器,让矿场中更多的算力在更多的时间里产出有效工作。