酸饼博客
关注区块链技术应用与数字货币

区块链入门100问(5):如何理解比特币系统挖矿的目标值?

比特币的挖矿是怎么样的一个过程?》这一篇中说到,比特币挖矿的过程就是找到一个随机数跟区块头的其他字段一起取哈希,得到的哈希值小于或者等于目标值。

目标值越大,取值范围就越大,挖矿的难度就越低;反之,目标值越小,取值范围就越小,挖矿的难度就越大。

在比特币的早期,算力小,如果这个目标值设置得太小,以当时的算力可能几年都算不出来,也即是几年都出不了一个块,这样的话比特币系统就崩溃了。因此,在初期,这个目标值不能太小。

假设这个目标值一直不变的话,那么随着参与挖矿的人数增加和算力的提高,原先需要10分钟才能算出合适的哈希值,那么过一段时间之后,不用一分钟可能就算出来了。且不说造成挖矿速度过快、比特币过早挖完,更严重的是,由于数据的打包、点对点网络中消息的传播,都需要一定的时间,那么在这一分钟内,有很多的挖矿节点同时出块,造成分叉过多,诚实节点的算力被分散,作恶节点的攻击难度下降,比特币系统的安全就得不到保障。

因此,比特币挖矿的目标值在初期不能太大,而且后面要随着算力的变化进行动态的调整。通过对目标值的调整,控制比特币的出块时间。

在比特币系统中,出块时间设计为平均每10分钟的的速度生成一个区块。至于为什么要设计为10分钟,也许是经过深思熟虑,也许只是拍脑袋的一个决定,真相如何,只有中本聪知道了。但无论如何,从结果来看,这个设定还算是很成功的。

那么比特币系统中,具体是怎么样调整区块头哈希的目标值的呢?

首先是设定为每2016个区块调整一次目标值。平均10分钟产生一个区块,2016个区块所需要的时间是:
2016*10(分钟)/60/24=14天

所需时间大约是14天,即两个星期。当然,这个时间只是平均时间,有时会快一点,有时会慢一点。

新的目标值,是根据过去的2016个区块产生所需要的实际时间跟所期望的时间,两者的比例,再乘以当前的目标值。上面说过,比特币系统设计为10分钟出一个块,2016个块所期望的出块总时间是:
2016*10=20160(分钟)

因此,新目标值的计算公式是:
new_target = current_target * actual_time / expected_time

比特币系统的前面2016个区块的挖矿目标值是:
0x00000000ffff0000000000000000000000000000000000000000000000000000

随后,新的2016个区块的目标值,根据上面的公式进行计算,并在每个区块里,将当前区块的目标值写在区块头的nBits字段里。nBits是一个32位的字段,我们之前说过,目标值是一个256位的二进制数,因此目标值不是直接写进nBits字段,而是经过压缩。32位的二进制数,用十六进制表示就是8位,其中前面两位为幂,后面6位位系数。其计算公式是:
target = coefficient * 256^(exponent – 3)

如创世区块的目标值为例,该值是十进制数:486604799。用十六进制表示是:0x1d00ffff,通过target计算公式得出:
target = 0xffff * 256 ** (0x1d – 3)= 0x00000000ffff0000000000000000000000000000000000000000000000000000

由上可知,比特币系统中,挖矿的目标值,每2016个区块调整一次。新的目标值,是用当前的目标值,乘以过去2016个区块的实际产生时间(分钟),再除以20160(2016个区块所期望的时间),得到未来2016个区块的目标值。目标值用压缩的方法存储再区块头的nBits字段里面。比特币系统通过对目标值的调整,把比特币的出块时间控制在10分钟左右。

未经允许不得转载:酸饼 » 区块链入门100问(5):如何理解比特币系统挖矿的目标值?
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

留言联系关于酸饼