
区块哈希目标值是由所有比特币客户端共享的256位数字。区块如果想要被网络所接受,那么该区块的区块头的双SHA-256哈希必须小于或等于当前区块哈希目标值。区块哈希目标值越低,生成区块就越困难。
重要的是,要意识到区块的生成不是长期的、固定的过程(比如做一百万次哈希),而更像是买彩票。每个哈希值都是介于0和256位数字的最大值(2^256-1)之间的随机数。如果哈希值低于区块哈希目标值,则节点获胜。如果不是,则增加nonce(完全更改哈希)并重试。
比特币网络试图保证平均每十分钟产生一个区块。但挖矿算力是随着时间变化的,比特币网络通过改变区块哈希目标值来实现这一目标。
从历史上看(在2017年8月从BTC分叉之前),比特币网络每产生2016个区块,就更改一次区块哈希目标值(如果完美地保持10分钟产生一个区块,则恰好两周改变一次难度)。区块哈希目标值的这种变化被称为“难度调整”。在原有的难度调整范式下,在调整区块哈希目标值时,每个比特币客户端将生成2016个区块的实际时间与目标时间——两周进行比较,并通过百分比差异修改区块哈希目标值。单次区块哈希目标值向下调整(即难度上升)的幅度永远不会超过原有目标值的4倍,向上调整(即难度下降)的幅度也永远不会低于原有目标值的1/4。这可以防止难度的剧烈变化。
2017年8月的硬分叉过后,比特币将原来的难度调整算法改为紧急难度调整(Emergency Difficulty Adjustment,EDA)算法。EDA可以在每次发现新区块时(而不是每2016个区块)更新区块哈希目标值,同时,目标仍然是平均10分钟生成一个区块。EDA于2017年11月17日被更改为难度调整算法(Difficulty Adjustment Algorithm,DAA),以解决与EDA相关的不稳定性问题。DAA使用最后144个区块的移动平均值来确定区块哈希目标值应当如何变化,与EDA一样,区块哈希目标值在每次发现新区块都会改变。单次DAA哈希目标值向下调整(即难度上升)的幅度永远不会超过原有目标值的4倍,向上调整(即难度下降)的幅度。这为难度调整设置了最大限度。
之所以需要实施EDA(以及后来的DAA),原因是竞争性BTC网络的创立,该网络有望获得比比特币(当时称为比特币现金,即Bitcoin Cash)更多的哈希算力。由于采取了这些措施,矿工能够在不同网络之间即时重新分配算力,使得区块的生产可以保持相对稳定的速率。
有人提议,在未来,比特币回归到最初的(比特币核心——BTC仍在使用的)难度调整算法。
区块哈希目标值如何存储在区块中?
每个区块在其区块头中存储着它的实际十六进制区块哈希目标值的压缩表示(称为Bits)。区块哈希目标值可以通过预定义的公式从Bits中推演出来。例如,如果区块中打包的区块哈希目标值为0x1b0404cb,则十六进制的区块哈希目标值为:
0x0404cb * 2**(8*(0x1b - 3)) = 0x00000000000404CB000000000000000000000000000000000000000000000000
注意,0x0404cb在这种格式下是有一个符号的整数。该字段合法的最大值为0x7fffff。要获得更大的值,必须将其下移一个完整字节。此外,0x008000是最小的正有效值。
目前的区块哈希目标值是什么?
区块哈希目标的最大值是什么?
SHA256矿机使用的区块哈希目标的最大值是:
0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
由于比特币将区块哈希目标值存储为浮点类型,因此它被截断为:
0x00000000FFFF0000000000000000000000000000000000000000000000000000
区块哈希目标的最大值是创世区块中使用的区块哈希目标值,表示难度为1。其压缩表示,也就是Bits为0x1d00ffff。
由于区块哈希目标值较小时,生成比特币更加困难,因此区块哈希目标的最大值是生成区块的最低难度。