extraNonce 是什么?比特币挖矿中 Nonce 与 extraNonce 的区别

extraNonce 是矿工写入 coinbase 交易的数据,不是区块头字段。改变它会改变 coinbase 交易哈希和默克尔根,从而给 ASIC 一个新的 80 字节区块头,以及一套全新的 2³²(约 42.95 亿)个 nonce 搜索空间。

extraNonce 是挖矿术语,指矿工在 coinbase 交易中改变的额外数据,用来不断得到新的区块头进行哈希。它和区块头中的 nonce 配合工作,但并不是同一个东西,也不在同一个位置。一句话概括:nonce 是比特币区块头中正式存在的 4 字节字段,ASIC 会高速遍历它;extraNonce 通常写在 coinbase 交易的数据中,不属于区块头,而是通过改变默克尔根,给矿机生成一个新的区块头和一套新的 nonce 搜索空间。

extraNonce/ˈɛkstrə nɒns/ 英/ˈɛkstrə nɑːns/ 美

名词。比特币挖矿术语,也写作 ExtraNonce 或 extra nonce。在 Stratum 矿池挖矿中被拆分为 extranonce1 和 extranonce2。

1名词比特币

矿工写在 coinbase 交易(通常是 coinbase script)中的任意数据。改变它会改变 coinbase 交易哈希和默克尔根,进而改变区块头,打开一套全新的 2³² nonce 搜索空间。它不是 80 字节区块头中的字段。

ASIC 把区块头 nonce 全部试完后,挖矿软件更换 extraNonce、重新计算默克尔根,再下发新的区块头。
2名词矿池挖矿 · Stratum

Stratum 协议对 extraNonce 空间的划分:extranonce1 由矿池按连接或工作会话分配, extranonce2 由矿工端在矿池允许的长度内变化。

矿池给每个连接分配各自的 extranonce1,矿机端不断变换 extranonce2。

为什么只靠区块头 nonce 不够

比特币的工作量证明并不对整个区块反复哈希,而是对固定 80 字节的区块头做双重 SHA-256 哈希。区块头由六个字段组成:

区块头字段大小作用
版本号4 字节表示区块使用的规则版本
上一个区块哈希32 字节将当前区块与前一区块连接
默克尔根32 字节表示当前区块中的交易集合
时间戳4 字节表示区块时间
难度目标4 字节编码当前工作量证明目标
Nonce4 字节矿机高速改变的搜索变量

ASIC 反复执行的核心动作,就是更换 nonce,然后计算 SHA256(SHA256(Block Header))。如果哈希没有低于目标值,就换一个 nonce 再算,直到找到满足矿池 Share 难度的结果,或者极少数情况下满足比特币全网难度的结果。nonce 可以理解成 ASIC 在当前这份「区块头模板」里的高速计数器:nonce = 0、1、2……一直到 4,294,967,295。区块头和搜索过程的细节见 nonce 词条。

这个范围对现代 ASIC 来说太小了。nonce 只有 2³²,约 42.95 亿种可能。一台 200 TH/s 的矿机理论上每秒约进行 200 万亿次哈希,而今天的 ASIC 动辄数百 TH/s。所以单靠 32 位 nonce,远远不足以持续为现代 ASIC 提供新的搜索任务。矿工因此需要不断改变 extraNonce、时间戳、版本位等数据来制造新任务。在矿池挖矿体系中,extraNonce 是最重要的扩展搜索空间手段之一。比特币开发者文档也明确描述:区块头的 32 位 nonce 测试完后,挖矿软件可以修改 coinbase 交易,生成新的默克尔根,继续下一轮哈希计算。

extraNonce 在哪里

extraNonce 这个名字容易让人以为区块头里除了 nonce 还有一个叫 extraNonce 的字段。实际上没有。比特币协议规定的 80 字节区块头中只有 nonce,没有 extraNonce。

extraNonce 通常放在区块第一笔交易,也就是 coinbase 交易的 coinbase script 中。coinbase 交易不是用户之间的普通 BTC 转账,而是矿工创建的特殊交易,用来领取区块补贴和交易手续费,其中还有一部分可供矿工写入额外数据的空间。比特币开发者文档提到,矿工经常在 coinbase 字段中加入 extraNonce,以便更新区块头中的默克尔根。

由此得到定义 extraNonce 的关系链:

extraNonce 改变 → coinbase 交易改变 → coinbase 交易哈希改变 → 默克尔根改变 → 区块头改变 → 产生新的 nonce 搜索空间

extraNonce 从不作为区块头的一部分直接参与哈希,而是通过修改 coinbase 交易,间接改变区块头中的默克尔根。

换一个 extraNonce,为什么又多出 2³² 个 nonce

假设矿池准备好了一份区块候选数据,此时的默克尔根是 A,区块头为:

Version + Previous Block Hash + Merkle Root A + Time + Bits + Nonce

ASIC 开始遍历 nonce。如果约 42.95 亿个 nonce 全部跑完仍没有得到需要的哈希,再从 0 开始没有意义:同一个区块头加上相同的 nonce,一定产生相同的哈希。这时挖矿软件改变 extraNonce,例如从 extraNonce A 换成 extraNonce B。

coinbase 交易随之改变,它的交易哈希也改变。coinbase 是默克尔树的一部分,所以默克尔根从 A 变成 B,区块头变成:

Version + Previous Block Hash + Merkle Root B + Time + Bits + Nonce

ASIC 又从 nonce 0 开始搜索,但 80 字节区块头已经不同,所以 nonce 0 配默克尔根 A 和 nonce 0 配默克尔根 B 得到的是两个完全不同的哈希。每一个新的 extraNonce,都相当于重新打开一套 2³² 的 nonce 搜索空间。比特币开发者文档对这一过程的描述相同:ASIC 遍历完当前区块头的 nonce 仍没有结果时,挖矿软件可以向 coinbase 中加入新的 extraNonce 数据,重新计算默克尔根,再把新的区块头发给 ASIC。

改变 extraNonce 会重新计算默克尔根并打开新的 nonce 搜索空间

nonce 与 extraNonce 对比

对比项NonceextraNonce
是否属于区块头是否
所在位置80 字节区块头通常位于 coinbase 交易数据中
是否属于比特币区块头标准字段是否
大小是否固定固定 4 字节没有一个统一的区块头固定长度
主要修改者ASIC 高速遍历挖矿软件、矿池协议与任务系统
修改后直接影响区块头哈希coinbase 交易及默克尔根
主要目的在当前区块头中搜索有效哈希创建新的区块头搜索空间
与 SHA-256 的关系直接改变被哈希的区块头先改变 coinbase 和默克尔根,再间接改变区块头

打个比方:nonce 像一本彩票册里的「号码」,ASIC 把这一册号码逐个尝试,但这一册只有约 42.95 亿张。extraNonce 的作用不是往这本册子后面加号码,而是重新印一本完全不同的彩票册。新册子里的 nonce 仍从 0 到 2³²−1,但默克尔根已经变了,每个组合的哈希都与上一册不同。nonce 负责在一个搜索空间里找,extraNonce 负责创造新的搜索空间。

extraNonce 不是「更大的 nonce」

一个常见误区是把 extraNonce 理解成把 32 位 nonce 扩展到 64 位或 128 位。并不是。区块头中的 nonce 始终只有 4 字节,两者处在不同层级:

  • nonce:Block Header → Nonce
  • extraNonce:Coinbase → extraNonce → Coinbase Hash → Merkle Root → Block Header

这也解释了为什么在区块浏览器里查看已挖出的区块时,能直接看到 nonce 数值,却看不到一个标准的「extraNonce」区块头字段:按照比特币共识规则,它本来就不是区块头的一部分。

矿池挖矿中的 extranonce1 与 extranonce2

研究矿池挖矿时还会遇到两个术语:extranonce1 和 extranonce2。它们来自矿池通过 Stratum 协议分发任务的实现方式,而不是比特币区块头新增了两个字段。

Stratum 矿池需要同时给大量矿工、矿机或代理服务器分配工作。如果所有设备使用完全相同的 coinbase 和相同的搜索范围,就会产生重复计算。因此矿池利用 extraNonce 给不同矿工划出不同的工作空间:

  • extranonce1 通常由矿池分配,用来区分不同的矿工连接或工作会话。
  • extranonce2 由矿工端在矿池允许的长度范围内变化,用来不断构造新的 coinbase 交易。

coinbase 大致可以理解成:

Coinbase Part 1 + extranonce1 + extranonce2 + Coinbase Part 2

extranonce2 改变后,coinbase 交易随之改变,矿工重新计算 coinbase 交易哈希和默克尔树,得到新的默克尔根,再构造新的区块头。比特币开发者文档在介绍 Stratum 挖矿时也指出:更新 coinbase 中的 extraNonce 后,矿工需要重新计算 coinbase 交易和默克尔树,生成新的默克尔根并更新区块头。

从任务分配的角度看,搜索空间可以粗略理解为 extranonce1 × extranonce2 × nonce,而不是一个孤立的 32 位 nonce。这也是现代矿池能为成千上万台高算力 ASIC 持续提供互不重复、或尽量避免重复的计算任务的原因。

时间戳滚动与版本滚动

extraNonce 是标准的外层计数器,但不是重置 nonce 区间的唯一办法。区块头里还有两个字段可以改变:

时间戳滚动(Timestamp rolling)

时间戳可以在共识规则允许的窗口内向前推进,每换一个取值就再获得一个完整的 nonce 区间。

版本滚动(Version rolling)

版本字段中未被使用的位可以拿来当作额外搜索空间。这正是 ASICBoost 所标准化、并通过 Stratum 协议协商的机制。

Bitcoin Developer Reference 同样指出:如果所有 32 位 nonce 值都已测试,可以更新时间,或者修改 coinbase 交易并重新计算默克尔根。

ASIC 挖矿时 nonce 与 extraNonce 如何配合

  1. 矿池创建挖矿任务,包含上一个区块哈希、交易信息、难度目标,以及构造 coinbase 所需的数据。
  2. 挖矿软件用 coinbase 和交易数据计算默克尔根,再生成 80 字节区块头。
  3. ASIC 拿到区块头后并不会不停修改 extraNonce,而是先在芯片内部高速遍历 nonce,每换一次 nonce 就得到一个不同的区块头哈希。
  4. 满足矿池难度的结果形成 Share 提交给矿池;如果这个哈希碰巧也低于比特币网络目标,它就是一个有效新区块。
  5. 当前任务的 nonce 空间不够用时,挖矿软件改变 extraNonce,coinbase 随之变化,生成新的默克尔根和区块头,ASIC 开始下一轮 nonce 搜索。

ASIC 挖矿时 nonce 与 extraNonce 的配合流程

概括来说,nonce 决定矿机当前在「哪里找」,extraNonce 决定矿机接下来「换一片地方继续找」。正是这种分工,让只有 32 位 nonce 的比特币区块头,仍然能支撑今天全球规模庞大的 ASIC 算力持续进行工作量证明。

对矿场运营的意义

矿工不需要人工设置 nonce 或 extraNonce,这些底层工作由矿池协议、矿机固件和 ASIC 自动完成。但这两个概念能说明,现代比特币挖矿并不是「机器随机猜数字」:每台 ASIC 背后都有完整的任务生成和分发体系。矿池生成任务,挖矿软件和协议构造 coinbase 与默克尔根,ASIC 拿到区块头后执行大规模 SHA-256 运算,再把符合要求的 Share 返回矿池。nonce 是芯片最直接、最高频改变的变量,extraNonce 则帮助整个系统不断创建新的计算任务。

对大型矿场来说,运营层关注的通常不是某个 nonce 的具体数值,而是矿机有没有持续获得有效任务、算力是否正常输出、与矿池的连接是否稳定、Share 是否正常提交,以及是否存在大量拒绝或掉线。矿场管理平台 Nonce 的名字也来自这个概念:ASIC 的核心工作,就是在巨大的可能性空间中持续寻找满足目标的有效哈希。

常见问题

比特币挖矿中的 extraNonce 是什么?

extraNonce 是矿工写入 coinbase 交易的数据,通常位于 coinbase script 中,并不是 80 字节区块头的字段。改变它会改变 coinbase 交易及其哈希,进而改变默克尔根,最终改变区块头。因此每换一个 extraNonce,ASIC 就得到一个新的区块头和一套全新的 2³²(约 42.95 亿)个 nonce 搜索空间。

nonce 和 extraNonce 有什么区别?

nonce 是比特币区块头中固定 4 字节的标准字段,由 ASIC 高速遍历,直接改变被哈希的区块头。extraNonce 位于 coinbase 交易中,没有统一的区块头固定长度,由挖矿软件、矿池协议和任务系统修改,只能通过默克尔根间接改变区块头。nonce 负责在一个搜索空间里找,extraNonce 负责创造新的搜索空间。

区块头里已经有 nonce,为什么还需要 extraNonce?

32 位的区块头 nonce 只有 2³²,约 42.95 亿种取值。一台 200 TH/s 的矿机每秒约进行 200 万亿次哈希,几乎瞬间就能跑完。用同一个区块头从 nonce 0 重新开始没有意义,因为同一个区块头加上相同的 nonce 一定得到相同的哈希。改变 extraNonce 会得到不同的默克尔根和不同的区块头,同样的 nonce 取值就会产生不同的哈希。

extranonce1 和 extranonce2 是什么?

它们来自矿池通过 Stratum 协议分发任务的方式,而不是区块头新增的字段。extranonce1 通常由矿池分配,用来区分不同的矿工连接或工作会话;extranonce2 由矿工端在矿池允许的长度内变化,用来不断构造新的 coinbase 交易。coinbase 大致是 Coinbase Part 1 + extranonce1 + extranonce2 + Coinbase Part 2,搜索空间大致可以理解为 extranonce1 × extranonce2 × nonce。

extraNonce 是「更大的 nonce」吗?

不是。extraNonce 并不是把 32 位区块头 nonce 扩展成 64 位或 128 位,区块头中的 nonce 始终只有 4 字节。extraNonce 处在另一个层级:它先改变 coinbase 交易,再改变默克尔根,最后才改变区块头。所以在区块浏览器里能直接看到已挖出区块的 nonce,却看不到标准的 extraNonce 区块头字段。

除了 extraNonce,矿工还能怎样获得新的 nonce 搜索空间?

矿工还可以改变时间戳和版本位。时间戳可以在共识规则允许的窗口内向前推进;版本字段中未使用的位也可以滚动,这是 ASICBoost 所标准化、并通过 Stratum 协商的机制。每一种改动都会形成新的区块头,再获得一个完整的 nonce 区间。在矿池挖矿中,extraNonce 是其中最重要的手段之一。

矿场运营人员需要管理 extraNonce 吗?

不需要。nonce 和 extraNonce 的变化由矿池协议、矿机固件和 ASIC 自动完成。大型矿场的运营层关注的是矿机有没有持续获得有效任务、算力是否正常输出、与矿池的连接是否稳定、Share 是否正常提交,以及是否存在大量拒绝或掉线。