块头中的随机数是搜索空间的公共 uint32 坐标,而不是秘密或加密签名随机数。一个固定标头只有 2^32 个值,因此现代 ASIC 很快就会耗尽这一空间。因此,挖矿软件还会更改 coinbase 交易中的 extranonce、Merkle 根、nTime,有时还更改允许的版本位。 (Merkle root)
比特币区块头有 80 个字节:版本、前一个区块的哈希值、Merkle 根、时间、nBits 和一个四字节的随机数。 Nonce 是一个无符号 32 位整数。更改它会更改序列化标头,从而更改双 SHA-256,而不会更改事务列表本身。
SHA-256 对于输入的微小变化没有给出有用的指示。随机数加 1 会创建一个几乎不相关的 256 位哈希,因此每次试验都是另一个概率试验。获胜值不能通过梯度进行。
四字节随机数为单个固定标头提供了 4,294,967,296 种可能性。当前的 ASIC 每秒会多次经过此范围,因此仅标头随机数对于现代挖矿来说是不够的。
矿池和挖矿软件在 coinbase 交易中使用 extranonce。尽管有这个名字,它并不是另一个块头字段。更改 extranonce 会更改 coinbase txid,然后更改 Merkle 根,这会创建一个全新的标头,其中包含 2^32 nonce 值的新空间。
Coinbase 交易是 Merkle 树叶。一旦其 txid 发生更改,更改就会通过树传播到标头中的 Merkle 根。因此,矿工收到一个新的标头,该标头具有相同的前一个块哈希值和几乎相同的块内容。
可以通过在允许的限制内更改 nTime 并滚动允许的版本位来获得额外的空间。 BIP320 描述了所选 nVersion 位的通用用途。这些都不会改变共识:生成的标头哈希必须仍然满足目标。
在矿池挖矿中,矿池或作业谈判者为工作人员分配唯一的 coinbase/extranonce 和其他参数,以便设备不会散列相同的值。 BIP23 还适用于随机数范围; Stratum 协议更有效地在大量 ASIC 之间分配搜索空间。
随机数本身的数值既不好也不坏。全节点对整个特定标头进行哈希处理,并将结果与从 nBits 派生的目标进行比较。低随机数不能证明什么;工作量证明只是整个标头的足够低的哈希值。
“随机数”一词也用在签名中,它可以是一个秘密的一次性标量,并且它的重复可能会危及私钥。另一方面,挖掘随机数是块头中的公共信息,不需要任何保密。这两个含义一定不能混淆。
Bitcoin Core 通过 getblockheader 返回区块的随机数、位和时间等。对于独立验证,可以精确地序列化 80 字节标头,执行双 SHA-256,并验证结果数值是否满足目标。
要获得更完整的理解,请将本词条与以下词条结合阅读: 区块头, 挖矿, Proof of Work, Mining Target, Coinbase交易, Bitcoin. 反向关联还来自: 区块头, Coinbase交易, Mining Target, Extranonce.