北京大学肖臻老师《区块链技术与应用》ETH笔记 - 8.0 ETH挖矿难度的调整

8.0 ETH挖矿难度的调整

比特币是每隔2016个区块来调整挖矿的难度,目标是维持出块时间平均在10分钟左右,以太坊是每个区块都有可能调整挖矿难度,调整的方法也比较复杂,而且还改过好几个版本,包括以太坊的黄皮书和实际代码也有一些出入,我们这部分以代码为准。

8.1 区块难度公式

H:指当前一个区块。Hi:当前区块的序号。D(H):当前区块的难度。

max括号里的第一部分我们叫基础部分,为了维持出块时间大约在15s左右,后面跟着的espilon为第二部分,也叫做难度炸弹,目的是未来向权益证明过度。

我们先来看第一部分,是在父区块难度的基础上进行调整。第一部分的D0是难度下线,无论怎么调整最小也不会低于这个难度。

这里的x是调整的力度,是父区块的难度除以2048,无论是上调还是下调都是按照这个x整数进行调整的。

下面一个公式是和两个因素有关,一个是出块时间,另一个是有没有叔父区块(就是当前挖矿的前一个父区块,它有没有叔父区块)。因为如果当前挖的区块的前一个区块包括了叔父区块,那货币的发行量增多了,所以当前挖的区块的难度就要提高一个档次。max括号中的前面一部分有可能正的有可能负的,如果负的话难度要往下调,最多一次性下调整99个单位。每个单位是父区块难度的2048分之一。所以一次性下调难度最多是2048分之99。

y:有叔父区块的话y=2,没用叔父区块的话y=1。所以y一定是常数。后面的部分比y大的话,减出来是负的,难度要下调。相反,后面这一项比前面要小的话,减出来就是正的,难度上调。

Hs是当前区块的时间戳,P(H)Hs是父区块的时间戳。这两块相减就是出块时间的时间间隔。

假设出块时间在1到8秒之间,除以9再向下取整,等于0,假设y=1,最终答案等于1。说明难度要上调一个单位。

假设出块时间在9到17秒之间,除以9再向下取整,等于1,假设y=1,最终答案等于0。说明难度不变。

假设出块时间在18到26秒之间,除以9再向下取整,等于2,假设y=1,最终答案等于-1。说明难度要下调一个单位。

如果出块时间非常非常长,那最终一次性下调难度也不会大于99个单位。

8.2 难度炸弹

以太坊在设计之初就计划要逐步从POW(工作量证明)转向POS(权益证明),而权益证明不需要挖矿,这就带来一个问题——已经在挖矿设备上投入大量资金的矿工会不会联合起来抵制这个转换,从POW转向POS需要通过硬分叉来实现,这样就可能导致社区分裂,以太坊可能分裂成两条平行的链。 在以太坊早期时,区块号较小,难度炸弹计算所得值较小,难度调整级别基本上通过难度调整中的自适应难度调整部分决定,而随着越来越多区块被挖出,难度炸弹的威力开始显露出来,这也就使得挖矿变得越来越难,从而迫使矿工愿意转入POS。

8.3 难度炸弹的调整

因为开发者低估了POS的设计难度,导致其迟迟没有设计出来,但是难度炸弹的威力已经开始显现出来,系统的出块时间已经开始逐渐变长,本来要15秒出块的,后来变长到了30秒,但矿工还需要继续挖矿。最后在EIP当中决定回退难度炸弹中的区块号,因此我们可以看到,上图中第二项的fake block number(假的区块号),该数对当前区块编号减去了三百万,也就是相当于将区块编号回退了三百万个。从而降低了出块的难度。当然,为了保持公平,也将出块奖励从5个以太币减少到了3个以太币。 下图显示了难度调整对难度炸弹难度影响的结果:

img

8.4 以太坊发展的四个阶段

降低难度炸弹同时也降低了ETH奖励,因为回调是突然的,不调整奖励的话对调整前的矿工来说是不公平的。本来挖的很辛苦只得到了5个ETH,突然下调难度了,别人轻轻松松也挖到5个,那是不公平的。同时也维持了货币的总供应量。

8.5 具体的代码实现

难度计算公式

bigTime:当前区块的时间戳。bigParentTime:父区块的时间戳。

基础部分的计算

难度炸弹的计算

为什么减去的是2999999,假如当前的区块号正好是3百万,那么父区块的序号是2999999,它这里判断的是父区块的序号,如果满足条件,则让父区块的序号减去2999999。则父区块的序号为0(区块号其实是从1开始的,逻辑上父区块的序号变成了0),当前的区块序号就变成了1。

8.6 以太坊实际统计数据(截止2018年)

挖矿难度变化曲线 断崖式下跌是难度炸弹的调整,下跌前难度的增长像是曲线。

出块时间

早期稳定在15秒左右,大概在17年中旬5、6月的时候,出块时间开始大幅增长,最高到达了30秒左右。最后挖矿难度虽然回到了之前的水平,但是出块的时间还是在15秒左右,说明难度变大的同时,算力也增强了。

实际区块例子

最长合法链对于以太坊来说也叫作最难合法链。总难度最大的合法链,每个区块的难度反应的是挖出这个区块所需要的工作量,总难度最大就是挖出这条链的总的工作量最大,一般来说靠后的区块挖出来的工作量是比较大的。

猜你喜欢

转载自blog.csdn.net/qq_40503872/article/details/124199503