226 / 691XNONCE

Extranonce

挖矿使用的附加可变数据

Extranonce 通过改变 coinbase 及其在区块头中的承诺来扩大搜索空间。它不是另一个独立的区块头字段,矿池也不会让每个矿工自由修改其中所有字节。

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.

DOC · 001Bitcoin Developer Guide — Mining and nonce space文档DOC · 002Stratum V2 — Extended extranonce and jobs规范DOC · 003BIP 34 — Height in coinbase规范DOC · 004Bitcoin Developer Reference — Coinbase input文档
来源优先 · 非投资建议