跳转到正文
buybitcoinsmart

术语表 /挖矿与共识

随机数(Nonce)

随机数(Nonce)是什么?
随机数(nonce)是区块头中的四字节计数器,矿工在寻找低于目标值的哈希时不断递增它,每个区块头仅提供4,294,967,296次尝试。

规定于 BIP-320。

该词是 "number used once"(只使用一次的数字)的缩写,在比特币中,它指区块头里唯一专为被反复更改而存在的字段。四字节在2009年看起来绰绰有余,如今却微不足道:一台现代矿机在不到一秒内就能耗尽整个取值范围。因此矿工也会改动区块头的其他部分,而随机数只是搜索中最内层的循环。

运作方式

随机数占据80字节区块头的最后四个字节,挖矿就是遍历它的取值。

矿工先组装一个候选区块头,用 SHA-256对其做两次哈希,并将结果与目标值比较。如果结果过大,计数器递增,再对区块头重新哈希。其他内容无须改变,这使循环成本很低:SHA-256以64字节为一块进行处理,因此区块头的前64字节只需处理一次,即可在每次尝试中重复使用。

问题在于取值范围。四个字节只能容纳4,294,967,296个不同的值,而额定算力为200 TH/s 的 ASIC 矿机遍历全部取值大约只需21微秒。因此搜索还有三层外循环。矿工可以滚动额外随机数(extra nonce),即 coinbase 交易输入脚本中的几个空闲字节,这会改变该笔交易,进而改变默克尔根,从而得到一个全新的区块头可供搜索。矿工还可以在规则允许的范围内向前调整时间戳。并且自 BIP320 起,矿工可以滚动版本字段中的十六位,使用掩码0x1fffe000,这样无须触动交易列表,就能把搜索空间再扩大65,536倍。

中本聪自己的搜索留下了记录。创世区块头中的值为2083236893,由 CPU 在2009年找到,当时没有滚动额外随机数,也没有使用版本位。

在哪里会遇到它

每个区块浏览器的每个区块页面都会显示获胜的随机数,而这个数字几乎说明不了什么。

由于矿机以不可预测的顺序遍历取值空间,也由于如今大部分实际变化来自额外随机数和版本滚动,已挖出区块中的这个数字近乎随机。从数值偏低或偏高中解读出意义,是初学者常犯的错误。这个字段对固件开发者更为重要:Stratum 为每台已连接的矿机分配额外随机数中各自的一段,使同一矿池中的两个工作节点不会重复劳动,而 Stratum V2 围绕同一个协调问题重新设计了任务协商机制。

您也会在与挖矿无关的地方遇到这个词。加密方案用随机数避免两条消息产生相同的密文,以太坊用账户随机数作为交易计数器,网页登录则用它来阻止重放攻击。这些都不是区块头字段,而这个共用的词造成的本可避免的混淆,比比特币中任何其他借用术语都多。

常见问题

区块的随机数为什么只有四个字节?

在2009年,它已经够用,当时没有任何机器能快速测试四十亿次哈希。现代矿机会瞬间耗尽这一范围,并在 coinbase 交易的额外随机数和版本滚动中找到额外的搜索空间。

什么是额外随机数(extra nonce)?

它是 coinbase 交易输入脚本中的空闲字节,区块头随机数用尽时,矿工会改动这些字节。改动它们会改变默克尔根,从而产生一个带有全新随机数范围的全新区块头。

相关术语

挖矿与共识中的更多术语

阅读本页英文版