区块链学习笔记19——以太坊的挖矿难度调整

区块链 专栏收录该内容
20 篇文章 7 订阅

十九、以太坊的挖矿难度调整

比特币是每隔2016个区块会调整一下挖矿难度,目的是维持出块时间在十分钟左右,以太坊是每个区块都有可能调整挖矿难度,调整的方法也比较复杂也改过好几个版本,网上的一些资料,像论坛,博客对这些介绍也有很多不一致的地方包括以太坊的黄皮书和实际代码也有一些出入,我们遵循以代码为准的原则,从以太坊的代码当中找到了这部分的内容,把他们总结了一个ppt。

这是难度调整的公式,这里的H是指当前这个区块,Hi是这个区块的序号,D(H)是这个区块当前的难度,那么这个难度调整的公式有两部分,这个max括号里的是第一部分,管它叫基础部分,目的是为了维持出块时间大概在十五秒左右,后面跟的是第二部分,也称为难度炸弹,主要是为了向权益证明过渡,将来的以太坊想把共识机制从工作量证明逐步转入权益证明。

第一部分调整的方法是在父区块的难度基础上,加上一些自调整的部分,这个P(H)就是红框里的父区块的难度

在这里插入图片描述

所谓的父区块就是当前区块链的最后一个区块,对于我们正在挖的这个区块来说,他是这个区块的父区块。

第一部分的难度调整有一个下限,就是这里的D0,131072,这一部分无论你去怎么调整,最小不能低于这个难度,这是为了保证挖矿有一个最低的难度。

在这里插入图片描述

后面的红框里的就是难度炸弹部分

在这里插入图片描述

先看一下第一部分,这个x是调整的力度,是父区块的难度除以2048,所以调整难度时,无论上调下调,都是按照这个力度的整数倍进行调整的,按照父区块的难度的1/2048作为调整的一个单位。

在这里插入图片描述

下面那个奇怪的符号是y-后面的一项,奇怪符号的取值跟两个因素有关,一个是出块时间,另外一个是有没有叔父区块,就是父区块有没有叔父区块,那么为什么要跟叔父区块相关呢?
因为如果是当前区块的最后一个区块,它包含有一个叔父区块的话,这个时候,系统中的货币总供应量是增加的,因为叔父区块要得到出块奖励,那么包含叔父区块的这个父区块也有得到一定的奖励,所以这两个合在一起就会使货币的总供应量增加,那么他为了维持系统中的总供应量的稳定,一种平衡,所以挖这个区块的难度就要提高一个单元,

在这里插入图片描述

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

在这里插入图片描述

仔细看一下这个公式,这个y就是我们说的取决于有没有叔父区块,有叔父区块的话,y=2,没有叔父区块的话,y=1,那么不论是哪种情况,都是常数,所以都是常数减去后面这一项,但如果后面这一项比前面这个常数大的话,减出来是个负数,说明这个难度是要下调的。相反,如果后面那一项比前面那一项要小的话,减出来就是个正数,说明难度要上调。

在这里插入图片描述

看几个具体的例子,这个Hs是当前区块的时间戳

在这里插入图片描述

P(H)是父区块的时间戳,这两项相减,就是当前区块的出块间隔,这个出块间隔除以9,然后向下取整

在这里插入图片描述

为什么要这么设计?

比如说,我们当前这个区块的出块时间是在18s之间,这个时候,后面往下取整的那一部分算出来是0对吧,那么y-0=y,假设没有叔父区块,那么y是等于1的,那么这整个就是等于是1,说明这种情况下,难度要上调一个单位,这个也是可以的,因为我们希望保证稳定的出块时间是在15秒,现在的出块时间变成了18s,说明出块速度有点太快了,把难度上调一个单位维持下平衡。相反如果出块时间是在917s之间,后面是1,前面也是1,1-1=0,说明这个时候出块时间是符合要求的,希望是15s,他是917s之间,这个时候可以不用调,光考虑基础部分,不考虑难度炸弹的话,就是基本上可以不用调。最后一项,如果出块时间是在18~26s之间,那么后面那项算出来是2,变成了1-2=-1,说明难度要下调一个单位,如果出块时间更长呢,比26s更长,那么下调的幅度也会更大

在这里插入图片描述

但是不要忘了,上面那个公式里max的第二项有一个-99,如果单次的出块时间非常非常长,你可能前面算出来是个负的很厉害的数,但是你一次性下调也不能超过99个单位,这是为了防止一些系统中出现的异常情况,像一些黑天鹅事件,正常情况下,不能出现这个幅度的下调,前面又讲完了第一部分,基础部分。

在这里插入图片描述

下面讲难度炸弹,他的初衷是这样的,以太坊的共识机制要从工作量证明逐步转入权益证明,而权益证明是不挖矿的,这就带来一个问题,那些已经在挖矿设备上投入大量资金的矿工会不会联合起来抵制这个转换。比如说,我已经花了好多钱买这个矿机,现在被告知要搞权益证明了,那我这些挖矿设备都没用了,那我肯定有意见,所以以太坊就担心大家不愿意转入权益证明,本来从工作量证明转入权益证明就是要经过硬分叉来实现,相当于你改了这个共识协议了,如果因为这些挖矿设备有些人不原意转过来,造成社区的分裂,可能出现的情况是,以太坊可能出现两条平行的链,那怎么办呢,为了避免这种情况,所以以太坊在设计这个难度调整公式的时候就加了一个难度炸弹,看一下难度炸弹设计的特点

当初设计这个难度炸弹的时候,没有第二行,没有减去三百万这一行,第一行直接用的就是Hi,当前区块的序号,没有Hi一撇这一项。

当前的区块号除以10万,向下取整,然后作为2的指数,也就是说,难度炸弹这部分的取值,是从指数形式增长的,那么指数函数的特点是什么,早期的时候,以太坊刚刚上线不久的时候,区块号都比较小,所以难度炸弹这部分算出来的值是很小的,基本上可以忽略不计,那么难度调整主要还是由刚才讲完的第一部分,基础部分来决定的,或者是由系统中的出块时间来决定的,然而随着时间的推移,区块号变得越来越大,这个时候难度炸弹的威力开始显现出来,我们知道指数函数增长到后期,速度是非常恐怖的,所以当初设计的思想是等到这个难度炸弹的威力开始发挥出来的时候,也正是从以太坊需要从工作量证明转入权益证明的时候,那个时候因为挖矿变得越来越难了,所以大家也就原意转入权益证明了,因为如果不转的话,要挖出矿来,就太费劲了,这是当初设计以太坊时候的如意算盘,但实际情况,基于权益证明的共识机制实际设计出来有很多问题要解决,远远没有当初想象的那么顺利,这样造成的结果就是,转入权益证明的时间点被一再的推迟,然后出现的情况就是挖矿已经变得越来越难了,因为难度炸弹的威力已经显现出来了,但是大家还是得继续挖,因为没有别的方法可以达成共识。

原来是担心大家不愿意转,现在变成了想转也没法转,因为权益证明的共识机制还没有开发出来,这个情况到2017年四五月份中旬的时候就已经很明显了,就出块时间已经逐渐开始增长了,原来是说要稳定在15秒,那个时候就不断的变成了从15秒不断地增加,从十五秒,十六秒,十七秒,最后增加到三十秒左右,而且如果不采取措施,还会继续增长上去,那怎么办呢

以太坊最后在一个EIP当中,决定计算难度炸弹地时候,要把区块号,回退三百万个区块来计算,就这个公式中,把真实的区块号减去三百万,算出Hi一撇,这个可以看成是假的区块号,然后算难度炸弹的时候是用这个假的区块号算的。这个给权益证明的上限争取了一些时间。

在这里插入图片描述

那么这样做的结果怎么样呢

y轴是难度炸弹的取值,x轴是区块号,是以10万为单位,可以看到早期的时候,区块号比较小的时候,这个难度炸弹的作用是很不明显的,基本可以忽略不计,难度调整基本上是根据系统中的出块时间进行调整的,然后,这个图的前半部分是按照原来那个公式算的,就是在没有决定回调之间的原始公式算的,直接用正常的区块号算,大概是370万个区块左右,这个难度炸弹的威力开始指数上升,到上面这个尖峰,这个尖峰的位置就是以太坊决定回调这个难度炸弹的时候,减了三百万个区块,所以他一下就掉下来了,这个难度炸弹的取值一下就掉下来了,后面看上去好像是个平的直线,其实也是在增长,只不过是因为那个尖峰的位置太高了,所以看上去好像是直线,前面这个部分其实也是在增长,也是因为这个尖峰太高了,所以看不出来

在这里插入图片描述

以太坊的发展被分成了四个阶段,Frontier,Homestead,Metropolis,Serenity,其中Metropolis又分为两个阶段,Byzantium和Constantinople,我们处于Byzantium阶段,难度炸弹的回调就是在Byzantium阶段进行的

在这里插入图片描述

EIP:Ethereum Improvement Proposal,BIP:BitCoin Improvement Proposal

在难度回调的同时,把出块奖励从五个以太币降到了三个以太币,因为如果不这么调的话,对于回调之前的矿工是不公平的,他这个回调是突然进行的,昨天挖矿的时候挖的很辛苦,得到的是五个以太币,结果今天一夜之间难度降低了,你挖矿也是得了五个以太币,那对我来说就不公平,而且从系统当中获益的总供应量来说要维护总供应量的稳定,现在变得是挖矿要容易了,所以就相应的把出块奖励减少一些,这里说明一点,比特币当中每隔一段时间出块奖励减半的做法在以太坊中是没有的,像这个把五个以太币降低三个就是一次性的,并不是说以后定期都这么做。

在这里插入图片描述

下面看一下具体的代码实现

这个是Byzantium阶段,挖矿难度调整的代码,输入时父区块的时间戳和父区块的难度,计算出当前挖的这个区块的难度,这里面的注释给出了难度计算公式,也是分成两部分,括号里面是第一部分是难度调整的基础部分,后面加上2的periodCount-2次方,这就是难度炸弹,基础部分是在parent_diff的基础上加上后面那一项,后面那一项就是前面这个难度调整的力度,parent_diff/2048乘以后面的系数,后面max的前面那一串就是前面ppt公式的那个y,如果有叔父区块是2,没有的话是1,减去后面这个就是出块间隔除以9向下取整,后面这个-99也是难度调整的下限。

下面这几行代码,这个BigTime就是当前区块的时间戳,bigParentTime就是父区块的时间戳

在这里插入图片描述

这一页的代码主要是计算基础部分的难度调整,第一行就是把当前时间戳减去父区块的时间戳算出出块时间,然后第二行除以9向下取整。

下面这个if.else就是判断一下是不是有叔父区块,有的话,是用2减去前面这个数x,没有的话用1减去前面这个数x,然后接下来跟负的99相比,往下调有一个节限,不能比-99还要小,接下来算的是难度调整的力度,父区块的难度除以这个DifficultyBoundDivisor实际上就是2048,然后跟前面算出的系数相乘,加到父区块的难度上面去,基础部分的难度调整有一个下限,难度再小也不能小于那个D0,这个MinimumDifficulty就是那个D0,131072

在这里插入图片描述

下一页就是难度炸弹的计算,fakeBlockNumber假的区块号就是前面讲的Hi一撇。下面这个if的判断跟2999999相比,比她大的话,就要减掉2999999,为什么不减3000000,前面的公式不是减三百万吗,其实是因为,这里判断的是父区块的序号,而我当前挖的这个区块,比父区块要多一个,所以按照父区块的序号算的话,就正好差一个

在这里插入图片描述

下面看一下以太坊中实际统计情况

这个就是以太坊中的难度统计

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

在这里插入图片描述

看到这一部分的曲线,看上去像是指数形状,到尖峰的位置就是以太坊决定回滚难度炸弹,回滚三百万个区块,所以挖矿难度一下就掉下来了,就好像从悬崖中掉下来了,之后又震荡一会,之后又逐步上升,2018年以太坊的挖矿难度已经恢复到了以前的水平,而且还略有些增加,从图上看出,目前以太坊的挖矿难度基本上是区域稳定的

在这里插入图片描述

这个图显示的是出块时间,不考虑个别波动,总体来说,出块时间稳定在十五秒上下有了很长时间,说明以太坊在早期的时候,挖矿难度额调整主要是以稳定出块时间为主的,达到这个预期的效果,同样是在2017年中旬5,6月份的时候,出块时间出现了大幅度增长,就是这个难度炸弹的效应

在这里插入图片描述

到这个地方,可以看到出块时间达到了 三十秒左右,然后是难度炸弹的回调,一下子断崖似的下降,又恢复到了十五秒,而且一直维持到现在,这个图跟前一个图对比,前一个图显示的是难度炸弹回调之后总的挖矿难度逐渐又恢复到了原来的水平,这个是因为挖矿变容易之后,有更多的矿工加入,竞争更激烈了,而我们这个图显示呢,从出块角度来讲并没有收到影响,出块时间一直到现在还算是维持的比较好的15秒左右

在这里插入图片描述

最后这个图显示的之前看过的两个区块,讲GHOST协议的时候看过的两个区块

在这里插入图片描述

主要看这两行

Difficulty就是当前区块的难度,Total Difficulty是把当前这个区块所在的这条链上的所有区块的难度加在一起,也就是这条链的总难度,所以之前讲的最长合法链对于以太坊来说,其实应该叫做最难合法链,就是总难度最大额合法链,每个区块的难度,反应的是挖出这个区块所需要的工作量,而总难度最大,就是挖出这条链上的所有区块需要的总工作量最大,一般来说,靠后的区块,他挖出来需要的工作量也是比较大的

在这里插入图片描述

  • 0
    点赞
  • 2
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值