0%

区块链技术与应用(6 BTC - 挖矿难度)

区块链技术与应用(6 BTC - 挖矿难度)

北京大学肖臻老师公开课《区块链技术与应用》,可以直接点击查看视频。

比特币的挖矿难度调整

目标预值越小,挖矿的难度越大。调整挖矿的难度就是调整目标空间在整个输出空间中所占的比例。

比特币用的哈希算法是 SHA-256,这个产生的哈希值是 256 位。所以整个输出空间是 2 的 256 次方。调整这个比例,即目标空间占输出空间的比例,通俗的说,就是哈希值前面要有多少个 0。比如说 256 位的哈希值,要是合法的区块,要求算出来的哈希,前面至少有 70 个 0。当然这只是通俗的说法,因为这个目标预值,并不是说前面都是 0,从某一个位置开始,后面都变成了 1。

挖矿的难度跟目标预值是成反比的,公式是:difficulty=difficulty 1 target /target。上面是指挖矿难度等于 1 的时候所对应的目标预值,挖矿难度最小就是 1,这个时候对应的目标预值是个非常大的数。

即 target 越大,挖矿是越容易的。所以公式里很大的一个数,除以当前的目标预值,得到的就是当前的挖矿难度。所以 difficulty 和 target 大小是成反比的。

为什么要调整挖矿难度呢?如果不调会有什么问题呢?系统里的总算力越来越强,挖矿难度保持不变的话,出块时间是越来越短的。

出块时间越来越短,会有什么问题吗?
比如说不到一秒就出一个区块,区块在网络上传播的时间可能需要几十秒,底层的比特币网络可能需要几十秒才能让其他节点都收到。别的节点没有收到这个区块之前还是继续沿着已有的区块链往下扩展。如果有两个节点同时都发布一个区块,这个时候就会出现分岔。

出块时间如果越来越短的话,这种分岔会成为常态,而且不仅会出现二分岔,可能会出现很多的分岔。比如 10 个区块同时被挖出来,系统可能会出现 10 分岔。

分岔如果过多,对于系统达成共识是没有好处的,而且危害了系统的安全性。比特币协议是假设大部分算力掌握在诚实的矿工手里。系统当中的总算力越强,安全性就越好,因为有恶意的节点想掌控 51% 的算力就越难。如果掌握了 51% 的算力,它就可以干很多坏事,比如分叉攻击。

如果后面分岔多的话,前面某个区块里的某个交易,很可能就遭受分叉攻击,恶意节点会试图回滚。因为后面分岔多,算力就会分散,恶意节点得逞的概率更大。这个时候恶意节点就不需要 51% 的算力了,可能 10% 的算力就够了,因此出块时间不是越短越好。

那 10 分钟的出块时间是不是最优的呢?不一定。改成其他值也可以,有间隔只是说应该有个常数范围。以太坊系统出块时间就降低到了 15s,所以以太坊的出块速度是比特币的 40 倍。

出块时间大幅度下降之后,以太坊就要设计新的协议,叫 ghost。在该协议中,这些分叉,产生的 orphan block (即产生最长合法链后另一个要被丢弃的区块) 就不能丢弃掉了,而是也要给它们一些奖励,这叫 uncle reward。以太坊也要调整挖矿难度,使出块时间保持在 15s。

讲完了为什么要调整挖矿难度,现在讲一下怎么调整挖矿难度。比特币协议中规定,每 2016 个区块后就要调整目标预值,这大概是每两个星期调整一次。

具体的调整公式:target =target×(actual time/expected time)。actual time 指产生 2016 个区块实际花费的时间,expected time 指产生 2016 个区块应用的时间,即 2016×10min。

如果实际花费时间超过了两周,即平均出块时间超过了 10min。那么这时候挖矿难度要调的低一点,应该让出块更容易。因此该公式算出来的 target 会变大,则难度会下降。

实际上,上调和下调都有四倍的限制。假如实际时间超过了 8 个星期,那么我们计算公式时也只能按 4 倍算,目标预值增大最多只能增大 4 倍。

那怎么才能让所有的矿工同时调整目标预值呢?计算 target 的方法写在比特币系统的代码里,每挖到 2016 个区块会自动进行调整。如果有有恶意的节点故意不调,会怎么样?

如果一个节点不调,将区块发布出去,诚实的节点是不会认的。nBits 是 target 一个编码的版本,在 block header 里没有直接存储 target 的域,因为 target 的域是 256 位,直接存 target 的话要 32 个字节。nBits 在 header 里只有四个字节,所以可以认为是它的一个压缩编码。

如果遇到有恶意的矿工,该调的时候不调,这时检查区块的合法性就通不过。因为每个节点要独立的验证发布的区块的合法性。检查的内容就包括:nBits,目标预值设的对不对。如果投机取巧设计一个过大的目标预值,使得你自己挖矿容易了,但这个区块是不会被接受的。

image-20211214102327803

显示的是比特币系统中总算力的变化情况。在比特币没有流行前,有很长一段时间,算力没有太明显的增长,前面这些年的hash rate几乎是0。其实这些年算力也是增长的,只是后面这些年算力增长的太快了,所以前面部分看上去像是一条直线。去年是涨得非常猛的一年,这也体现在了hash rate 的增长上,算力呈现出指数级的增长。即使在这段黄金时期,算力也不是单调递增的,中间也是有很多波动。

image-20211214102441228

如图 (第七节视频 第 27 分钟) 是挖矿难度的变化情况,跟算力的增长基本上是同步的,这也符合难度调整的设计目标。通过调整挖矿难度,使得出块时间保持稳定。注意这个图显示的是挖矿难度,不是目标预值。

image-20211214102503624

如图 (第七节视频 第 27 分第 27 秒) 是最近半年的难度调整曲线,可以看出很明显是一段一段的。每隔两个星期,难度上一个台阶,说明挖矿的人越来越多,用的设备越来越先进,反应出大家对比特币的热情越来越高。如果出现相反的情况,比如某个加密货币的挖矿难度越调越小,说明挖矿变得越来越容易了。但这不是好事,说明大家对币的热情是逐渐减小的。持续出现这种情况说明这个币将被淘汰。

image-20211214102616901

如图 (第七节视频 第 28 分第 13 秒) 显示的是每天的出块时间。可以看出,总的来说出块时间稳定在 10 分钟上下振动。

image-20211214102631539

如图 (第七节视频 第 28 分第 36 秒) 显示最近半年的出块时间,也是维持在 10 分钟左右。

image-20211214102657812

挖矿难度的公式:下一个难度 = 前一个难度*两周 / 挖前 2016 个区块用的时间 (注意:前面的公式是目标预值的公式,不要混淆了)

参考笔记:

  1. 区块链笔记在我主页
  2. sam_nau