00:00
好,那接下来我们来看一下,好,这部分就已经讲到这个区块难度了,大家看好我们跳过这个序列化的这一部分,因为序列化的话大家知道就是把一堆这个元素结合在一起,然后用RLP去做一个编码序列化,对吧?所以这个东西我们就不讲了,然后我们讲一下这个区块头验证。区块头验证的时候,它是要去怎么去验证呢?大家可以看到,呃,这里边它首先它是要验证,就是这个区块号要等于它的负区块号加一。这肯定是要验证的一个,对吧,然后他还要去验证它的难度。大家可以看到一个区块头H的权威难度值定为定义为DH,然后它最后呢,是就是大家可以看到这个这个很复杂的这个定义啊。
01:00
这一串定义贷款什么意思呢?帝陵。然后这后面是什么pph的HD对吧。他应该是max,应该是括号括在这里啊,这个应该有问题对吧。哦,不是,它是,它是要max d0和后面整个这一串来做一个max是吧?啊所以是这样啊,刚才我说错了,这个D0指的是初始块的难度,大家看下面定义,D0等于131072,这个直接就定义了。然后下面的这个max,那是说。在D0和后边这个表达式里边去做一个选择对吧,就是看如果要是后边这个比初始块的难度大的话,那就选后面这个,如果他还不如初始块难度大,那就选初始块的难度。是这样一个定义啊,那后面这个大家可能一下子这么看,有点有点完全看不懂是吧,那我们用这个PPT来给大家讲一下吧。
02:05
我们讲一下这个以太坊的难度调整,呃,以太坊的难度调整,讲到这个的话,那我们就首先要来说一下什么是难度,那难度这个词大家都不陌生,它来源是来源于就是比特币了,对吧?比特币里边它主要是用难度来度量挖一个块。平均需要的运算次数啊,这个是我们所说的难度,也就是说如果难度值越高的话,我去挖一个块,需要做的运算就越多,也就代表着出块的时间就会越长,对吧?这大家都是有这样的基本概念的,那下面就说了,挖矿本质上其实就是在求写一个谜题,一个一个算术题对吧?数学题不同的电子币,这电子电子货币就是数字货币啊,设置了不同的谜题,比如比特币,它用的是上256,莱特币呢,用的是script。
03:03
以太坊它的这个算这个pow的算法,它是1T1T har。那所以这样一个谜题的解,所有可能的取值就被称为是解的空间,挖矿呢,就是在解空间里边想要去寻求一个可行的解,这就是挖矿的一个数学解释啊,那这个东西其实没多大意思啊,那这个谜题所有的这些数学难题,它有什么样的特点呢?都有这样的一个共同特点,首先第一个。没有别的好方法,就是运算,没有比穷取更好的计算方法。第二,它的解呢,在空间当中是均匀分布的,所以你每一次重举能够找到一个解的概率基本上一致。就是几乎完全均匀分布,那这样的一个谜题,这样的一个数学问题,就特别适合当我们这个QW的难度计算。
04:00
另外还有一个就是解的空间得足够大,你得保证我们算半天之后一定能把这个解找出来,你不要说那个到最后这个解就就那么唯一的一个解对吧,然后大家算半天,最后怎么样都算不出来,这肯定是不行的。好,那已经知道这些就是挖矿的这个本质是这些,那我们现在就是说什么是难度呢?那其实就是为这样一个算数题设置一个参数,叫做difficulty,那difficulty是什么东西呢?它就是说要让这个算术题变成求解某个解空间里边符合我的解X。要小于这个difficulty,所以其实就是这样的一个一个要求,对吧,那这个参数difficulty就是所谓的难度,大家之前都已经实现过,区块链肯定知道啊,自己当时肯定是设过这个值的,对吧?那难度呢,它会通过控制合格的解在空间中的数量,来控制平均求签所需要的次数。
05:04
因为我们知道难度就代表求解的次数嘛,那也就可以间接控制除号时间,这就是难度的一个意义所在,那如果说我们把难度能够保持在一个比较合理的方式,呃,合理的这个范围内,而且它又能够随着我们整个全网的算力去做动态调整的话,那整个我们的这个出画速度,出画时间就可以维持在一个合理稳定的区间,所以这也就是说我们为什么要做难度调整,因为我们整个网络当中的算力是在不停变化的,如果难度一致的话,就是难度一直都保持一个一个数的话,那可能有一段时间就会出现这个出牌速度非常的不均匀。比特币有时候其实之前是出现过这样问题的,对吧,就是有一段时期突然有这种大量的算力涌入,和这个当时就是特别是那个比特现金就是分叉出来的时候,呃,就是所谓这个BCH跟比特币分道扬镳之后,有一些矿工,它的矿机,它的算力其实是可以在比特币和比特现金之间去切换。
06:13
就我可以这会儿挖比特币,也可以过一会儿去挖比特现金,对吧,所以这种情况会带来什么什么事情了,就是比方说突然比特现金那边出了一个什么事情,比特比特现金涨得特别快,矿工觉得挖比特现金更有利可图的时候,大量矿工的算力就会突然切换到比特现金去。那这个时候比特币这边突然一下,就是整个全网的算力就会大幅的衰减。那这个时候如果你还是难度还保持原来的这个状态的话,大家知道两周调整一次嘛,那这个反应时间是很慢的,那这段时间大家就会比较痛苦,那个除块就会很慢了,对吧?所以之前是遇到过这样的问题的,呃,所以这也就是说为什么以太坊把这个难度调整就做的非常的灵活,非常的动态,直接就让我们每一个数块的时候都可以去做难度调整。
07:07
呃,那这里边就还有一个关于difficulty跟这个,呃,挖矿时间的一个简单的一个关系的说明,就是挖矿的人很多,那其实就是说算力很大了,对吧,全网算力很很多,那么单位时间能尝试的东西就会更多,那么难度就应该要增大。对吧,算力大了之后,难度也应该增大,如果我们要保持出板时间一样的话,那如果要是挖矿的人小了之后,算力少了,那么单位时间能尝试的次数就少了,难度就应该降低。所以这就是我们通过。降低和提高难度来保证出块时间,保持一定的稳定性。好,那接下来我们就讲一下这个以太坊里边的难度计算,以太坊里边首先啊,就说一下这个计算的规则,以太坊里边到目前为止啊,主要是有三种难度计算的规则。
08:06
分别对应以太坊里边三个不同的阶段,就是frontier前沿、homestead家园,还有这个大都会。那现在的方法呢,用的叫做这个方法,大家去源码里面可以看到啊,叫做呃,Cap,那就calculate对吧,计算difficulty。拜占庭对吧?对,所以他其实整个大都会阶段的算法其实是一致的,但是拜占庭和君士坦丁堡两个阶段又不一样。它是不一样在哪里呢?只是调用同样一个方法的时候,传进一个不同的参数。是什么参数呢?等一会儿我们再说,所以现在我们用的这个方法对应的就是大都会的拜占庭阶段的这样一个难度计算的规则,所以大家可以看到就是以太网在升级之后,到军事产品跑之后,难度计算规则又会调整,所以这个也是不停的更新,大家看源码的话,也能看到它的这个发展历程,那计算要计算一个难度区块难度,其实这个就是结合着源码,大家其实就是一看就明白,但是我在这里这么说的话,大家可能就是还是有点。
09:15
就看起来有点有点生涩对吧,那计算一个区块难度需要什么东西呢?它需要的是。两个时间戳,一个是副区块的时间戳parent time step,还有一个是自己的时间戳block time step。另外还需要副区块的难度parent Di。另外还有一个就是当前区块的序号block number。那这四个参数到底它有什么用,怎么样能计算出这个难度来呢?那其实就是后面这里写的,我们先大概看一下啊,当前区块难度怎么算?当前区块难度等于负区块的难度加上一个难度调整的值,再加难度炸弹的一个东西。
10:07
啊,这个大家不知道听说过没有啊,就以太坊里边有这个难度炸弹黄皮书里边,其实就是我们刚刚没有讲到下边这里啊。有这个定义的啊,就是这个效果,就是所谓的难度炸弹difficulty ball,或者叫冰河时期ice age,不知道大家有没有听过,这个冰河时期和南度炸弹说的是一回事,那他说的是什么东西呢?他说的是他这里边引入了一个if对吧,有一个这个加的这个小小符号。这个符号。呃,他说这个是home set版本里边引入的这个符号,它会越来越快的,是难度值缓慢增长,也为向POS的切换增加了时间压力。看他这个说法,完全搞不懂什么意思,对吧?这完全搞不懂,然后他说这个东西就叫做所谓的难度炸弹或者冰河时期,好,那么我们就在这个PPT里面再给大家解释一下什么叫难度炸弹,冰河17,我们先看前面这个吧,先看前面这个难度调整,难度调整指的是什么东西呢?难度调整指的是我们要根据上一个区块para Di,对吧,根据上一个区块。
11:29
的难度以及。当前时间戳和上一个时间戳,上一个区块时间戳之间的差值,然后来进行难度调整。所以大家可能直观的能够想象的到,他为什么要有时间戳呢?时间说相减代表的是什么二啊对,其实就是出发时间嘛,所以他要调整难度,其实目的就是要调整出发时间对吧,所以他其实这里我们就能想到,肯定就是出画出的太快了,那难度调大一点。
12:08
出块出的慢了,那就难度调低一点,所以肯定是这样的一个算法对吧,那具体我们来看一下啊,这个稍微有一点有一点复杂啊,就是这个东西有点多,我们先不要管,就是后面那一坨,我们先看前面。前面就是负区块的难度系数,难度难度值除以2048对吧。所以就是负区块的1/2048,然后咱们可以认为后边的整个乘的这一块全是一个系数。那这个系数是个什么东西呢?是一个max计算的前边这么多一部分,这么大的一块。都是max的第一个元素,第二个元素是负99,这也就是说我们是要在负99和前面这么一大堆东西里边找一个大的比较大的值。
13:06
那我们先不管前面这一坨,我们就想,假如说它就是负99。那整个的这个难度调整,它就会调整成什么呢。它就变成了负区块的难度除以2048乘以负99对吧,所以是相当于它就要减难度对不对。减的幅度大概是2048是两千九十九,大概是一百两千分之一百大概1/20,所以就是大概把之前负区块的难度减1/20对吧,所以假如说我们前面给的这一串这么一大堆。比90负99还小的话,也就是他负的更多的情况下,用负99把它的难度调低,对吧,是这样的一个做法,那现在我们就看整个这一坨到底是什么东西了,哎哟。
14:02
一大坨是吧,大家可以看到前面的这个定义呢,大家其实可以不管它,这个其实是一个就是相当于语义上理解的,对吧,前面这一部分是说。是二什么情况下呢?如果它的负节点有ons的时候,这里取二。或者呢,如果要是没有uncle没有数块的话,就是一,所以前面这个数就是不是二就是一,简单理解就是这样对吧,不是二就是一,然后它要减一个数,哎呀,我这怎么一动就点到啊,减的这个数是什么呢?它是前后两个区块的时间戳相减,也就是出块时间时间差对吧?然后除以九。局长。所以大家可以想到,那这个时间戳,其实大家知道都是以秒计的,对吧,时间戳是以秒计的,那如果说我们这里直接就是后面这个块比之前那一块是晚了九秒钟,隔了九秒出来的话,那后面这里就是一对吧。
15:11
对,那如果这里是一的话,前面假如还没有书块的话,那是不是直接这一部分就是零了。啊,所以那如果要这样的话,零比负99大,那相当于就是难度不调整对吧,所以他会认为是什么呢?什么情况下难度就正好就不调整呢?假如你的出画时间是九秒。然后副块。还没有熟块的情况下。在书块就是副块,没有书块的情况下,我隔了九秒钟出下一个块,哦,那你这个难度还行,前面永远前面永远都比后面大是吗?你觉得是永远都比后面大是吗?你又不是二。你你觉得这个要么是二,要么是一是吧。
16:01
那假如说我现在这个时间比,假如说现在以太坊非常的拥堵,呃,不能说拥堵啊,就是现在以太坊上的算力大幅下降了,所以大家挖矿就挖的挖不出来了,对吧。隔了很久才出来一个块。隔了五分钟出来一个块。那么五分钟就是600秒对吧?所以这里的两个时间戳相减是不是就变成600了。600除以九。啊,那应该是大概50多六六十多对吧?啊60多这个还不够不够给力,那那我们直接说对,假如说我们是隔了几十分钟才出来一个块,刚才我们说五分五分钟,现在我们直接过了50分钟才出来一个块,有点夸张啊。快一个小时出一个块,50分钟的话是6000秒,6000秒除以九,那大概就是500多吧,600多对吧,600多,那么前面一减,那你前面一还是二都无所谓了,对吧,一减肯定是负的500多600多。
17:15
那负600多远远比负99要小,对吧。啊,那这种情况下,他说你既然啊,总是要把这个难度调低的,但是你别一下子调调低那么大,对吧,他给一个负99给一个上限,你调整的时候不能超过这个上限。那当然了,大家可以想象得到,本身它是不是还可以增加难度还可以增加对吧?什么情况下会增加前面这一部分,如果是正数的话,肯定就增加了,对吧?那什么情况下是正数呢?前面如果是二的话。这是不是就是最大了,如果是二后面这个是零,那其实这就最大了,对吧,我我后面这是马上出块,这不能再小了,后面不可能是负了,对吧?所以二是最大的,那即使是最大的二。
18:02
也就是除以2048乘以二,那也就是千分之一增加千分之一的难度,对吧,所以它相当于是有这样的一个控制的,就是上下浮动范围不能太大,就做了这样的一些,但是具体的这个系数,它为什么取这些系数,呃,那这个就就可能会有一些真实各种各样的考量了,可能要有很多实验来去实验数据去支撑了,那我们只要知道现在这个它到底是怎么来出的就可以了,所以大家可以看到它的要求就是当前出块的这个时间。除以九之后的这个数,然后被二或者一减一下,所以大家可以想到正常情况,我们说一般情况是十几秒一个块吧,那后面这个情况大部分都是一秒对吧。大部分都是一,所以大家看到前面如果也是一的话,就是没有数块的话,所以大部分节点的难度是可以不调整的。
19:01
这也就是为什么大家如果到eer sc上去查的话,很多区块会发现它的难度是差不多的,或者说就没变过,但是个别的那个难度还真的变了。啊,所以就是它的引用的这个区块和它这个出块的时间都对这个有影响。好,这是难度调整的这个值,那大家可以想象得到,就是我这里的这个出画时间,假如说隔得越久,我现在这个time step减这个越大,那整个这个难度调整会会越怎么样?朝着哪个方向去走,难度调整越小是吗?啊,其实大家应该这里还得还得考虑它到底正的负的对吧,朝哪个方向调,还得这样考虑,所以大家可以看到,如果说我这里的这个time step1减,减的这个出汗时间越大的话。那前面的这个二或者一要减,它是不是就就越小,或者说负的越大,对吧。那这样的话。
20:02
取这个最大值之后,然后再乘,就相当于难度调整,很可能是要减,而且如果我们这个time step这个隔的时间越长的话,减的幅度就越大,对吧,往下减的幅度就越大,这是这个time step就是难度就是这样的,所以这跟我们直观印象也是一样的,你出块越慢,那现在就说明大家这个算力越低嘛,难度太高了,所以我要往往下减的再多一点,那如果你要是出块太快的话,那我肯定要往上涨的更多一点,对吧。好,那接下来我们再说一个,这个除了难度调整之外,它还得加一个难度炸弹,难度调整呢,大家已经看到了,它这个东西肯定是肯定是,呃,就是难度调整是可增可减的,对吧?它其实就是一个动动态平衡的一个过程,你如果之前的难度太高了,下一个块肯定出的就比较慢了,那之后下一个块是不是就又把它又拉回来了,对吧?所以这个其实就是以太坊里边突然的一下这种这种冲击式的难度变化,其实是影响不大的。
21:06
只是可能那么一两个块有影响之后,慢慢的就把它消化掉了,那我们再看一下这个难度炸弹,难度炸弹是个什么东西呢?它的定义是这样的啊,二的。后面这一坨是二的多少次方对吧?对,后面这个全是这个二的指数,那这个指数是个什么东西呢?是负区块的区块高度。减掉一个叫做炸弹低位。也就是说炸弹延迟对吧,这是一个延时炸弹,一个定时炸弹是这样一个东西,它减掉这个延迟的这个值之后。然后除以10万。最后得到的这个整数值再减去二。这样算到的。这是一个什么概念呢?这简单的说,大家可以认为这个Bo delay,这简单的认为它是一个设定好的一个区块高度,就是比比这么高的区块高度高之后,然后才能够去生效,对吧,难度炸弹才能生效,但大家知道如果前面我们这个数算出来是负的话,那它会是什么影响。
22:18
假如说这个这个就是这个炸弹的这个delay的这个值非常的大,我们区块高度比较小,减了之后是负的,那会有什么影响?其实没什么影响对吧,大家知道它是指数嘛,二的负140。那其实它是二的一百四分之一对不对,那你在难度上呢,几乎就没加,所以说这个其实就没什么影响,所以大家可以看到就是如果是负的话,它就没什么影响,只有在前面这个part number高度比这个。就是炸弹迪delay的这个值远远高出去的时候,它的这个影响才会体现出来,对吧?那那这个后面给的这个包delay到底是一个什么值呢?当前的拜占庭阶段给的值是300万。
23:06
那大家知道,可能现在我们这个以太坊上的区块高度基本上是600多万了,对吧。那600多万,如果按照这个标准的话,减去300万。也就是大概。300多万对吧,300多万要除以10万。也就是大概30几的样子。30几减去二。那可能也就是20几30几的样子,对吧,二的正多次方。也不小的一个数对吧?好,那我们大概来就是大家来算一算吧,就看看就是当前我们这个东西到底是怎么算出来的,对吧,我们看一看这个东西怎么算,我们打开STEM看一下。哎呀,我现在的这个网络都不确定这个伊森干好不好使啊,诶伊森斯干看起来还反应比较快。
24:03
好,我们看一下当前哦,已经是663万个块了,对吧,瞄眼。来看一下这个里边它的难度值是这个数。对吧,这是它的难度值,呃,那它的。呃,我们简单的看一下,就是这个难度是大家大概有个印象是吧,294多少,我们看一下它跟它的负区块比起来是大了还是小了,咱们做一个验证吧,它跟它的负区块咱们来做一个验证,哎呀,这个不好记是吧,这个这个数确实是这样吧,我们开两个框好了。它的负区块has。好,我们看一下它是2942245是吧。
25:03
2943699。所以这个难度是提升了,对吧?难度是提升了,那我们照着这个计算公式来算一算,看一看,看看它是不是这么玩的,那呃,大家还记得我们怎么算吗?首先它是在负区块的基础上调整的,对吧,在这个基础上调整。然后还要什么东西来着。还有一个难度调整的那个值,对吧?难度调整的值是怎么算的呢?是它除以2048,再乘以这么一坨,取一个最大值,那我们首先就得算这个对吧?Time step2个这个时间去减,我们先看一下这两个时间,我们看看隔了几秒啊。Time step在哪上面,哎哟,他这个只有后面的这个啊,我们看一下它是。呃,08:19零零啊。
26:02
这边是08:19零一,差一秒吗。哇,差一秒。差一秒的话,那大家能想到这个难度肯定是要增加很多的,对吧,这个感觉怎么这么夸张啊,一秒钟就出一个块。一个射手。不是。51秒吗八。081901。081900是的对吧。差一秒钟啊什么?呃,最多也就降降那个前面那个二对吧,好,我们看一下吧,就按咱们就按一秒来算吧,如果这里真的是一秒的话,那一除以九去取整,那其实就是零了,对吧,然后我们看一下有没有数块。呃,这个是它的副块,副区块它的uncles,我们要看它下面的那个uncle reward有没有没有对吧,没有的话那应该是一了,对吧?所以这里是一和负99比起来,那肯定是一大了,所以整个这个就取的是一对不对,这个后面整个max这个值取的是一对吧。
27:24
所以这个要调整,调整的是要加上它的1/2048。对吧,是这个值,好我们算一下吧,哎哟,这个真是计算器打开啊,科学啊。哪个是负循环,这个是吧,把它拿过来,这个应该能直接复制除以。2048。好,再加上。这个还能再复制一遍吗?好。
28:01
等于大家可以看到现在是2943681对吧,我们看看跟现在这个还差多少,2943699已经差的不多了,对吧,还差一个东西,差什么东西呢?差难度炸弹对吧?难度炸弹我们的定义是当前的这个负区块高度要减去这个我们的这个300万。然后除以10万,然后再减二,好吧,算一下。我们这里的副区块高度是这个数,好负区块高度。哎哟,刚才那个是不是我们应该把它保存下的,这里这里的历史应该在哪里点这里有是吧。我先把它存下来。这个存不了呢。嗯,复制。好,我们在这里存一下啊,这是我们刚才算的这个数。
29:03
然后我们在这里去把这个数再copy过来,他要减300万的对吧。嗯,这个什么情况。先把它清掉吧。然后除以10万。所以大家可以看到最后得到的值应该是一个36对吧?对36减二,三十四二的三十四次方。是这么多好,那么他要再加上我们刚才保存的这个值对吧,这个我们就应该只取整数了。好,我们看一下。
30:02
我们看一下啊,跟他比一下2329436992943699077270856。是不是完全一致对吧,所以大家看到呃,这个整个的区块计算的这个过程当中,就是完完全严格的按照我们的黄皮书和整个代码里边规范定义出来的,所以说即使我们在这里手动去计算一遍,发现这么大的数字算出来还是完全一样的,呃,大家如果感兴趣的话,可以自己去试一试啊,再再选一个别的区块来看一看,是不是算出来这个难度调整之后就是这样的一个数,呃,校验一下是不是我们这样的一个一个算法。
我来说两句