北京大学肖臻老师《区块链技术与应用》公开课笔记(七):BTC挖矿难度调整
之前有提到过,在比特币系统中,区块链的出块时间保持在平均10min左右。毫无疑问的是,伴随着参与挖矿的人增多,系统总算力不断增强,挖矿的难度绝对不能一成不变。实际上,在比特币系统开发过程中,中本聪便考虑到了这个问题,并设计了一个相应的难度调整算法。这一篇,便了解一下比特币系统中的挖矿难度调整算法。
为什么要调整挖矿难度
之前已经提过,挖矿本质上就是不断调整block header中的nonce值,使整个block header的哈希值小于等于给定的目标阈值。即:H(block header)<=target.(target便是目标阈值,target越小,目标难度就越大)对于挖矿难度的调整,可以视为调整目标空间在整个输出空间中所占比例大小。
比特币系统采用的哈希算法为SHA-256,所以整个输出空间大小为2^256,调整目标空间所占比例,简单的说需要目标值前需要多少个0。如下图,挖矿难度和target是成反比的,挖矿难度最小等于1
如果不调整挖矿难度会怎么样?
系统总算力越来越强,若挖矿难度保持不变,则出块时间会越来越短。
出块时间越来越短是好事吗?
出块时间缩短,那么交易可以很快便被写入区块链,并且提高了系统响应时间,增加了区块链系统效率。但是,出块时间并不是越短越好。出块时间太短,也会造成一定的问题。首先,区块在网络上传播具有时延,假如出块时间为1秒,但网络传播需要10秒,则会使得系统中节点经常性处于不一致的状态,增加了系统不稳定性,且系统经常性位于分叉状态(不仅二分叉,乃至多分叉)。分叉过多,则不利于系统达成共识,且会造成算力分散,使得黑客攻击成本大大降低(不再需要整个系统51%的算力)。比如下图,恶意节点想要回滚A->B的交易,由于系统中分叉较多,导致算力分散,恶意节点可以集中算力挖下面那一条链的矿,导致其实不需要51%的算力即可成为最长合法链,使得分叉攻击门槛变得越来越低。
10min的出块间隔是最优吗?
当然不是,但可以确定的是,系统出块时间需要维持在一个定值附近。后续文章中会介绍以太坊,以太坊中平均出块时间仅为15秒左右,但同样在以太坊中也有相应难度调整算法维持其平均出块时间,当然15s的时间明显会产生经常性的分叉,所以以太坊设计了新的共识协议Ghost。
当然,对于一个交易系统来说,10min这样一个交易时间是比较长的。但对于跨国交易来说,这个时间反而大大缩短了交易时间,减少了相应成本。
BTC系统如何调整挖矿难度
在BTC协议中规定,每隔2016个区块需要调整一次难度,根据10min产生一个新区块可以得到,大概需要14天的时间。具体调整公式如下:
所以会根据actual time 动态的调整tartget,而且有一个约束:单次调整幅度不超过四倍:也就是单次最多将target扩大四倍或者缩小四倍
如何让所有矿工都愿意调整这个挖矿难度呢?
这一调整算法在代码中已经写入,如果有恶意节点故意不调,其所产生的区块不会被大多数诚实的节点承认。
在block header中有一个nbits的域,它是对target的编码存储(target为256位,nbits为32位,也就是说block header并未直接存储target),其他节点在进行合法性验证时候会验证nbits域是否合法,不合法则对该区块不予以承认。
在比特币之前大概有20年的加密货币研究,但基本都是失败的,比特币成功并不是因为他更实用,从某种意义上来说是他更不实用。以前加密货币设计都是想着作为现实货币的电子版本,所以有所局限。
你可能会有疑问,为什么一个区块最大1M,为什么出块时间也设置成10min,为什么每隔2016个区块就要调整一次target,这些数字是怎么来的,这个只能我们自己猜测,不过从现实来看,比特币的这些参数设置是比较合理的,同时比特币的设计总的来说是比较保守的,所以会出现以太坊等新的加密货币
其他
比特币系统总算力变化
需要注意的是,之前一段并非直线,而是之后增长太猛导致之前增长趋势看上去太低。之后也不是一直增长,会有下降,但是总体是增长的
挖矿难度变化
可以看到,和系统算力变化情况基本同步(符合难度调整预期目标)
挖矿难度变低是好事吗?
对于矿工来说,挖矿难度变低,挖矿变得更容易,这也说明大多数人对该币种不再看好,这个币种的价值也会大跳水,这对矿工来说可是一个坏消息。
出块时间变化
可见基本维持在10min左右上下波动,达到预期设计目标