Extranonce 是通常插入 coinbase 交易输入的可变数据。改变它会为 Merkle root 和区块头哈希提供新输入,而不会扩大区块头的 32 位 nonce 字段。
nonce 字段为 32 位,在其余部分相同的区块头下提供 2^32 个值。Extranonce 不会延长这个字段,而是改变其他数据,让矿工构建新的区块头并再次尝试 nonce 值。 [Bitcoin Developer Guide — Mining and nonce space]
改变 coinbase 中的 extranonce 会改变其序列化内容和 TXID,随后重新计算对应的 Merkle 树分支及区块头中的 Merkle root。其他交易不必改变,但不能不经重算就保留旧的 Merkle root。 [Bitcoin Developer Guide — Mining and nonce space]
两个完全可用的字节提供 2^16 种变体。在 32 位 nonce 及其他数据固定的模型中,共有 2^48 种输入组合。这是不同尝试的空间,并非找到的区块数量,也不保证遍历后成功。 [Bitcoin Developer Guide — Mining and nonce space]
BIP 34 要求 coinbase 的 scriptSig 以正确编码的区块高度开头。100 字节限制适用于整个 coinbase scriptSig,而不只是 extranonce。可变区域不能覆盖高度或破坏交易格式。 [BIP 34 — Height in coinbase] [Bitcoin Developer Reference — Coinbase input]
Stratum V2 将 extended extranonce 分为固定的 upstream 前缀、本地保留部分和 downstream 空间。这样的划分可避免浪费在重叠搜索上。分配的 extranonce_prefix 并不自动成为终端矿工可任意修改的区域。 [Stratum V2 — Extended extranonce and jobs]
在 SubmitSharesExtended 中,coinbase 按 coinbase_tx_prefix、extranonce_prefix、extranonce、coinbase_tx_suffix 的顺序组装。提交的 extranonce 字节必须符合协商长度。同一数字使用更短的字节串编码,未必得到同一交易。 [Stratum V2 — Extended extranonce and jobs]
Stratum V2 的 Standard Job 使用固定的 Merkle root,只允许改变 version、nonce 和 nTime 中获准的部分。因此标准设备不会像 extended 通道那样自行提交 extranonce。上级节点可在准备新任务时处理 coinbase 的变化。 [Stratum V2 — Extended extranonce and jobs]
Stratum V2 的 SetExtranoncePrefix 适用于指定通道中在该消息之后发送的任务。结果必须与正确的 job_id 和分配空间保持关联。最新前缀不能代替旧结果所属任务的记录。 [Stratum V2 — Extended extranonce and jobs]
要获得更完整的理解,请将本词条与以下词条结合阅读: Nonce, Merkle树, Mining Share, Block Template. 反向关联还来自: Block Template, getblocktemplate.