0%

ETH七---以太坊难度调整

难度调整

​ 比特币是每隔2016个区块会调整一下挖矿难度,目标是维持出块时间十分钟左右,以太坊是每个区块都有可能调整挖矿难度,调整的方法也比较复杂,而且改过好几个版本,我们遵循以代码的原则。

难度调整算法

​ 上图中的H指的是当前区块,Hi是当前区块的序号D(H)是当前区块的难度,难度调整的公式由两部分,max中的是第一部分,ε指的是“难度炸弹”,主要是为了向权益证明过渡,将来的以太坊想把共识机制从工作量证明逐步转入权益证明,第一部分调整的方法,是在父区块难度基础上加上一些自调整的部分,P(H)就是父区块的难度(所谓的父区块就是当前区块链的最后一个区块,对于我们正在挖的这个区块来说,他是这个区块的父区块),第一部分的难度调整有一个下限,就是这里的D0,这一部分,不论你怎么样调整,最小不能低于这个难度(这是为了保证挖矿有个最低的难度)

​ x是调整的力度,是父区块的难度除以2048,所以调整难度的时候,不论是上调还是下调,都是按照这个力度的整数倍进行调整的,按照父区块的1/2048作为调整的一个单位,下面这个奇怪的符号叫做ε,ε的取值和两个因素有关,一个是出块时间,另外一个就是有没有叔父区块(就是父区块有没有叔父区块),那么为什么要和叔父区块相关呢?

因为如果是当前区块的最后一个区块,它包含有叔父区块的话,那么这个时候系统的货币总供应量是增加的,因为叔父区块要得到叔父奖励,包含叔父区块的这个父区块也要得到一部分的奖励,所以这两个合在一起就会使总供应量增加,它为了维持系统的总供应量的稳定,所以当前正在挖的这个区块的难度就要提高一个单位

​ 后面这个-99,是说难度调整这个系数部分有一个下限,就是说,max前面这个部分,有可能是正的,也有可能是负的,如果是负的话,说明难度要往下调,那么最多一次性只能调整99个单位,每个单位是刚才说的父区块的1/2048,所以一次性下调难度最多是99/2048。

​ y取决于又没哟叔父区块,如果有的话,y = 2,没有的话,y = 1,不论是那种情况,y都是一个常数减去后面这一项,如果后面这一项比前面这个大的话,减出来是个负数,说明难度是要下调的,相反,上调

​ 如果出块时间更长,下调的幅度就要更大,但是不要忘了那个-99,如果单次出块时间非常非常长,也不能下调大于99个单位。

​ 以太坊的工作机制要从工作量证明逐步转入权益证明,而权益证明是不挖矿的,这就带来一个问题:那些已经在挖矿设备上投入了大量资金的矿工,会不会联合起来抵制这个转换,本来工作量证明转向权益证明就是经过硬分叉来实现的(相当于你改了共识协议了),如果有人因为不愿意抛弃矿机,那么以太坊可能会分裂成两条链。

为了避免这种情况,所以以太坊在设计难度调整公式的时候加了一个难度炸弹。

当初设计难度炸弹的时候,是没有第二行的(Hi’ = max(Hi - 3000000,0)),当前的区块号除以十万向下取整,然后作为2的指数,也就是说难度炸弹这部分的取值是呈指数形式成长的,那么指数函数的特点是什么呢?

早期的时候,以太坊刚刚上线不久的时候,区块号都比较小,那么难度炸弹这部分算出的值,是很小的,基本上可以忽略不计,难度调整主要是由刚才讲完的第一部分来决定的,或者说是由系统中的出块时间来决定的,然而随着时间的推移,区块号变得越来越大,这个时候难度炸弹的威力主键显现出来,指数函数增长到后期,速度是非常恐怖的,所以当初设计的思想是,等到这个难度炸弹的威力开始发挥出来的时候,也正好是以太坊需要从工作量证明,转入权益证明的时候,那个时候,因为挖矿变的越来越难了,所以大家也就愿意转入权益证明了,因为你不转的话,挖出矿来,就太费劲了。这是当初设计以太坊的一个“如意算盘”,但实际情况怎么样?

基于权益证明的共识机制实际设计出来有很多问题要解决,远远没有当初想象的那么顺利,这样造成的结果就是,转入权益证明的时间点被一再推迟,然后出现的情况,是挖矿已经变的越来越难了,因为难度炸弹的威力已经显现出来了,但是大家还是得继续挖,因为没有别的方法可以达成共识。(现在是希望大家转,但是现在得情况是,你想转也转不了),这个情况在2017年的四五月份到中旬的时候,就已经很明显了,出块时间就逐渐地开始增长了,原来是说要稳定在15秒,那个时候就已经不断地增加了,最后增加到了30秒左右,如果不采取措施还会继续增长上去。

那么怎么办呢?

可以看到上面的公式是将区块号回退了,用真实地区块号减去三百万计算出来一个假的区块号,然后用这个假的区块号去计算难度炸弹,这给权益证明的上线争取了一些时间,那么这样做的结果怎么样?

前半部分按照原来的算法计算的,呈指数形式上升,到达最高的位置就是以太坊决定回调这个难度炸弹的区块号的时候,所以一下就掉下来了。(前面那个部分其实也在增长,但是因为“尖峰太高了”,所以不太明显)

以太坊的发展

​ BIP:BitCoin Improvement Proposal。

​ 为什么在回调区块的同时,还要把block reward降低?

因为如果不这么调的话,对之前的矿工是不公平的(这个回调是突然进行的,一夜之间突然降低,对之前挖矿的矿工就不太公平,而且也要维护系统中供应量的稳定)

​ 需要注意的是:比特币出块奖励每过一段时间减半的操作,在以太坊中是没有的,5个以太币降为3个是一次性的,并不是说定期都会这么做。

上图是“拜占庭”阶段调整挖矿难度的代码,输入时父区块的时间戳和父区块的难度,计算出当前正在挖的这个区块的难度,难度计算公式和前文所讲的是一样的。(括号里面是第一部分,后面是难度炸弹)

bigTime:当前区块的时间戳,bigParentTime:夫区块的时间戳

最后那个“if”是指最低不能小于那个D0

上图难度炸弹的计算之所以不减三百万,是因为判断的是父区块的序号,而我当前正在挖的区块,区号要大1

x是算出来的基础部分的值。

上图是以太坊挖矿难度的变化曲线,在以太坊的早期,挖矿难度的变化是不明显的,当时以太坊市值很小,谁也没有想到以太坊会成为一个主流的加密货币,从2017年开始,挖矿难度的增长就比较明显了,尤其是难度炸弹这一部分。

上图是出块时间的变化,如果不考虑一些小的波动的话,总体来说,出块时间稳定在15秒上下,有了很长的时间,说明在早期的时候,挖矿难度的调整,主要是以稳定出块时间为主的。

难度炸弹回调之后,总的挖矿难度主键又恢复到了原来的水平,这个是因为,挖矿变容易之后,有更多的矿工加入,竞争更激烈了,而这个图从出块时间的角度来看,并没有受到影响。

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