Extranonce 是额外的可变数据,挖矿软件通常将它放在 coinbase 中。Coinbase 是区块中用于分配挖矿奖励的特殊首笔交易。改变这些数据,会改变区块头里汇总交易的指纹,从而产生新的搜索输入。区块头内独立的 nonce 字段并不会因此变长。
区块头是区块数据的简要摘要,其中包括一个 32 位的 nonce 字段。一个比特表示零或一;八个比特组成一个字节。在其他数据不变时,这个 nonce 字段提供 2^32 个值。再次计算相同区块头和相同 nonce,只会得到相同的哈希和结果。Extranonce 并不延长这个字段,而是改变其他数据,由此准备新的区块头。阿莱娜可以将其理解为换了一份任务,计数器便可以重新遍历。实际挖矿中,只要符合规则,区块头的其他部分也可能变化。 [1] [5]
这里的 coinbase 指每个区块的首笔交易,而不是交易所。软件改变其 extranonce 后,交易的编码数据和 TXID,也就是计算得到的交易标识符,都会变化。交易指纹通过逐层合并的树状结构,最终形成 Merkle root,即保存在区块头中的交易汇总指纹。软件必须重新计算受影响的分支。其他交易可以保持原样,却不能直接沿用旧的根。正是这条计算链,让新区块头获得不同的挖矿输入。 [1]
用一个简化模型来看:固定其他所有数据,允许两个 extranonce 字节完全自由变化。它们提供 2^16 种变化,与 32 位 nonce 结合,便有 2^48 种输入组合。这是可能尝试的数量,不是找到区块的数量。阿莱娜并没有获得更容易的条件,也不能确信这一组组合中一定有成功结果。它的实际价值在于还有新的空间可供搜索。增加可用空间本身也不会加快机器,计算仍要由机器逐一完成。 [1]
Extranonce 的空间不是一张毫无规则的空白表格。Bitcoin 的具体规则 BIP 34 要求,在 coinbase 输入中名为 scriptSig 的数据字段开头,放入正确编码的区块高度,也就是区块在链中的位置。100 字节的上限针对整个 coinbase scriptSig,而不只是 extranonce。软件必须为必填数据留出空间,并保持格式有效。如果阿莱娜覆盖了这些数据,后续计算就会在为一个无效区块寻找结果。 [3] [4]
在矿池中协同挖矿时,不同机器最好搜索不同的变化。Stratum V2 是分发挖矿任务的协议,它也通过划分 extranonce 来帮助实现这一点。上级服务器称为 upstream,会分配固定的 extranonce_prefix,即这些数据的起始部分。本地中间节点可以再为自己的客户端预留一部分,其余部分向下游 downstream 传递。这些方向相对于具体连接而言。拿到前缀并不意味着末端矿工可以随意修改它;保持它不变,有助于把参与者的工作分开。 [2]
在 Stratum V2 的扩展通道上,SubmitSharesExtended 会随结果一并提交可变字节。Coinbase 按以下顺序拼接:coinbase_tx_prefix、extranonce_prefix、extranonce、coinbase_tx_suffix。这些名称标识挖矿软件之间交换的数据部分。extranonce 字段必须具有约定的长度。即使较短的写法看起来代表同一个数字,不同的字节序列仍可能构成另一笔交易。计算机比较的是精确数据,而不是人对其大致含义的理解。 [2]
Stratum V2 中的 Standard Job 是 Merkle root 固定的任务。末端设备只能修改 version、nonce 和 nTime 中允许变化的部分,分别对应区块头的版本、计数器和时间。因此,它不会像扩展通道那样提交自己的 extranonce。上级软件可以准备新的 coinbase 和根,再提供另一份任务。阿莱娜的设备可能没有 extranonce 设置项,即使整套系统确实在使用这一机制。 [2]
假设旧任务的结果还在处理,新前缀就到了。Stratum V2 的 SetExtranoncePrefix 适用于该消息之后在相应通道,也就是对应挖矿会话中发送的任务。结果必须继续关联正确的 job_id,即任务标识符,以及该任务分配的空间。到处换成最新前缀,可能改变旧结果所依据的数据。Extranonce 的作用是创建不同的尝试并保持可追溯的任务关系,而不是事后改写任务。 [2]
要获得更完整的理解,请将本词条与以下词条结合阅读: Nonce, Merkle Tree, Mining Share, Block Template, Bitcoin. 反向关联还来自: ASIC Miner, Stratum V1, Stratum V2, Block Template.