ETH-20难度调整

内容整理自 北京大学肖臻老师《区块链技术与应用》公开课 20-ETH-难度调整

 图片来源于视频

难度调整公式:

H是当前区块,Hi是这个区块的序号,D(H)是当前区块的难度。公式有两部分,基础部分为了维持出块时间大概在15秒左右;难度炸弹主要是为了向权益证明过渡。 

第一部分调整的方法是在父区块的难度基础上加上自调整部分。所谓父区块就是当前区块链的最后一个区块,对于正在挖的区块来说就是父区块。

 基础部分:

(43)是调整力度,父区块的难度除以2048,不管上调还是下调都是按照力度的整数倍进行调整,父区块难度的1/2048作为调整的一个单位。

(44)取值与两个因素有关,一个是出块时间,另外一个是父区块有没有叔父区块。

 y就是取决于有没有叔父区块,有的话等于2,没有的话等于1.无论哪种情况都是常数。如果后面比常数大,得到负数,说明难度要下调;相反后面比前面小得到正数说明难度要上调。

难度炸弹: 

以太坊的工作机制要从工作量证明转移到权益证明,而权益证明不挖矿,那么就带来一个问题,那些已经在挖矿设备上投入了大量资金的矿工联合抵制该转换,本来工作量证明转入到权益证明需要硬分叉来实现,相当于改了共识协议,为了避免以太坊出现两条并行的链的情况,所以以太坊在设计难度调整公式的时候加了一个难度炸弹。

开始设计难度炸弹的时候没有下面减3000000的部分,只有上面用当前区块号计算难度炸弹。当前区块号除以100000向下取整,然后作为2的指数。难度炸弹的取值是呈指数形式的增长的,指数函数的特点是早期以太坊刚刚上线不久的时候,区块号都比较小,所以难度炸弹这部分算出来的值是很小的,基本上可以忽略不计,难度主要还是由基础部分来决定,或者说是由系统中出块时间来决定。当区块号变大时,难度炸弹的威力显现,指数函数增长到后期速度是非常恐怖的。等到难度炸弹的威力开始发挥的时候,也正好是以太坊需要从工作量证明转入权益证明的时候。那时候挖矿越来越难,大家也就愿意转入权益证明,不转的话也很难挖出矿。

但是实际情况是基于权益证明的共识机制设计出来有很多问题要解决,这样就导致时间点一再推迟,然后出现的情况就是挖矿越来越难,因为难度炸弹的威力已经显现出来了,但是还是要继续挖矿,没有其他方式达成共识。最后以太坊在EIP中决定计算难度炸弹的时候要把区块号回退3000000个区块来计算。就是下面部分用真实的区块号减去3000000的值,然后算难度炸弹的时候用该值去算,给权益证明的上限争取一些时间。

早期区块号小的时候难度炸弹的威力恨不明显,可以忽略不计,难度调整主要是根据出块时间。图的前半部分是根据回调之前的公式算的,3700000区块左右难度开始上升直到顶点,顶点位置就是决定回调难度炸弹的时候,所以难度炸弹瞬间掉下来,后面趋于平稳。

以太坊的发展分为4个阶段:

之所以同时把出块奖励下调,是因为如果不调的话对于回调之前的矿工不公平。而且从系统中货币的总供应量来说,也要维护总供应量的稳定。现在挖矿相对容易了所以把出块奖励降低一些,和比特币定期把出块奖励降低不同。

具体代码实现:

拜占庭阶段挖矿难度调整的代码,输入是时间戳和父区块的难度,计算出当前正在挖的区块的难度。

bigtime是当前区块的时间戳

bigParentTime是父区块的时间戳

 基础部分的难度计算:

当前区块的时间戳减去父区块的时间戳算出出块时间,除以9,向下取整。

判断是否有叔父区块,有的话用2减前面的数,没有的话用1减前面的数。

与-99相比,就是往下调有个界限,不能比-99还小。

计算难度调整的力度,用父区块的难度除以2048,然后和前面算出的系数相乘,加到父区块的难度上面去。

基础部分难度调整有个下限,不能小于D0,131072.

  难度炸弹的计算:

假的区块号,就是H'。

父区块号与299999相比,大的话就减去299999。因为判断的事父区块的号,而当前挖的区块要比父区块多一号,所以父区块要减去299999而不是300000.

假的区块号除以100000然后向下取整,把结果当做2的指数部分,算出的是难度炸弹的取值,然后加到基础难度X上面。

以太坊实际统计情况(截止到2018):

以太坊挖矿难度变化曲线:

早期难度增长不明显,直到17年开始挖矿难度的增长比较明显,尤其是难度炸弹,指数型增长。到巅峰位置就是回滚3000000个区块,所以难度下降。之后逐步上升。

 开始出块时间稳定在15秒上下,说明早期难度调整是以稳定出块时间为主,达到了预期效果。直到17年五六月份的时候出块时间出现了大幅度增长,就是难度炸弹的效应,顶点时已经达到了30秒左右,随着炸弹回调又恢复到15秒。