北大肖臻老师《区块链技术与应用》系列课程学习笔记[17]以太坊-GHOST协议

目录

一、以太坊的出块时间及可能带来的问题

        1.以太坊的出块时间

        2.以太坊与比特币系统的平均出块时间对比

        3.带来的问题

二、GHOST协议

        1.GHOST协议的核心思想

        2.GHOST协议的缺陷

        3.改进后的GHOST协议

        4.改进后的GHOST协议无法解决的问题

三、以太坊中的奖励

四、思考

五、以太坊中的真实情况

一、以太坊的出块时间及可能带来的问题

1.以太坊的出块时间

        以太坊将出块时间降到了十几秒提高了系统的吞吐量(Throughput)、降低了反应时间。与比特币系统出块时间的10分钟相比,以太坊的出块速度相当于提高到40倍,这样大幅度降低出块时间后也带来一些新的问题比特币和以太坊都是运行在应用层的共识协议,底层是一个P2P的Overlay Network,Overlay Network本身的传输时间比较长(其拓扑协议做flooding的时候没有考虑实际的拓扑结构)。带来一个问题:发布区块的时候,该区块在网络上传到其他节点可能需要十几秒,那么就有较大可能会有两个节点(甚至多个),同时获得记账权,从而造成临时性分叉

2.以太坊与比特币系统的平均出块时间对比

        对于比特币系统来说,平均出块时间是600秒,足够让新发布的区块传播到网上的其他节点,但由于挖矿是个概率的过程,仍有两个矿工同时获得记账权、同时发布区块的可能,会带来临时性的分叉。在以太坊中,这种临时性的分叉会变成常态,而且分叉的数目也会变得更多(十几秒的出块时间很有可能别的节点没有来得及收到发布的区块,还沿着原来的区块链往下挖,可能等到收到发布的区块的时候,他自己已经挖到了区块),这对于共识协议来说,是一个挑战。

图1-1

3.带来的问题

        比特币系统中,只有在最长合法链上的那些区块,所包含的出块奖励才是真正有用的,其他的一些分叉的链上的出块奖励其实是作废的,如图1-1所示。比如图中区块链,分了三个叉,差不多是同一个时间取得了记账权,最后有一个会胜出成为最长合法链,假定中间区块胜出,那么上面和下面的这个区块叫做Orphan Block或Stale Block挖到这类区块的矿工在里面有一个铸币交易,能够得到一定数量的比特币,但这个实际上是没有用的,因为不在最长合法链上,所以得到的出块奖励最后等于作废了。对于比特币来说,这种临时性的分叉不是很多,所以这么规定可以接受。

        对于以太坊来说,如果也将分叉区块的出块奖励作废的话,则意味着这个矿工挖到的区块有很大概率是白挖,对于个体矿工特别明显。按照常理,矿工的收益应该与算力成正比,矿池的收益也应当与矿池的总算力成正比。但大型矿池会出现Mining Centralization(挖矿集中化),即大型矿池所在的分叉更有可能成为最长合法链,这促使别的矿工沿着最长合法链继续挖(因为如果别的链去挖,很有可能白挖)。这样会使大型矿池出现恶性循环,越是大型矿池得到的收益越大,Mining Centralization更严重,有时候叫Centralization Bias,即中心化带来的不成比例的优势。如果以太坊按照比特币的共识机制就会有一定的问题

二、GHOST协议

        为解决以太坊如果按照比特币的共识机制产生的问题,采用一个基于GHOST协议的共识机制,这个协议并非以太坊发明的,以太坊只是对该协议做了一些修改。

1.GHOST协议的核心思想

        挖到矿的矿工发布一个区块,即便这个区块最后作废了,也会给予一些奖励,这个时候也能得到一些出块奖励,将作废的区块(上图1-1中的Orphan Block或Stale Block)称为Uncle Block。相对于最长合法链的当前区块来说,是他的叔父区块,最长合法链的下一个区块在发布的时候可以把叔父区块包含进来,如图2-1所示。

图2-1

         该协议的核心思想是:给予挖到矿但是没有成为最长合法链的那些矿工一种安慰。虽然挖的区块没有成为最长合法链上的区块,但仍可以得到大部分的区块奖励。这样有利于鼓励系统中出现分叉后及时合并,相当于最长合法链上面的区块将另外两个分叉链给招安过来,这是GHOST协议最初的版本。

2.GHOST协议的缺陷

(1)Uncle Block的个数不能超过两个

        Uncle Block只能包含两个,如果出现第三个Uncle Block,如下图2-2所示,设计GHOST的目的是给Uncle Block一点好处,把它们合并过来,但是只能招安两个,如果出现第三个Uncle Block就没办法了。其实,只能包含两个Uncle Block也是有道理的,因为叔父区块得到八分之七的出块奖励是很高的,要是不限制的话,那么以太币就太不值钱了。

图2-2

(2)区块传播存在延迟

        区块D把区块A作为叔父区块的前提是:在挖这个区块D的时候已经知道区块A这个叔父区块的存在了,如果已经发布了D这个区块,然后才知道叔父区块,这时候已经来不及了,叔父区块就变成什么好处都没有了。

(3)受矿工主观影响

        如果这个矿工比较自私的话,出于商业目的,有可能故意不包含叔父区块,就是挖的时候知道这个叔父区块,但是就是不包含,这样的话,对叔父区块来说,7/8的出块奖励是得不到的,对于他自己来说,1/32的出块奖励是得不到了,好像是损人不利己,但要从商业竞争的角度讲,这么做对这个矿工的损失是比较小的,对挖出叔父区块的矿工的损失是比较大的。

3.改进后的GHOST协议

        改进后的GHOST协议如图2-3所示。这么规定解决了矿池出于竞争关系故意不把某个叔父区块包含进去的问题。比如区块D故意不包含区块A,但是区块E仍然可以包含区块A。甚至有可能出现一个情况:挖到区块A的矿工发现自己不在最长合法链上,就沿着区块D挖出了区块E,然后就可以把自己的区块A包含进去。

图2-3

        这样的话,也解决了出现第三个叔父区块的问题。改进的GHOST协议的本质就是为了改进最初版本的GHOST协议存在的一些问题,所以把叔父的定义扩展了,不一定是当代叔父,可能是隔着几代的叔父。以太坊规定,叔父区块可以得到7/8的出块奖励。如果往前推一代,叔父区块得到6/8的出块奖励。以此类推,只有这六个是叔父区块,再往前就不是叔父区块了,如图2-4所示。叔父区块的定义是必须跟当前区块在7代以内有共同的祖先才行,超过七代就不认了,换句话说,合法的叔父只有6个辈分。

图2-4

为什么设定合法的叔父必须在当前区块在七代以内且有共同的祖先

(1)如果你不限制叔父的辈分,那么实现起来,全节点则需要维护非常多的状态(可能要记着隔着100代以前有哪些叔父区块),新发布的区块包含的叔父区块,其他节点同样也需要验证;

(2)设计最多隔着7代,并且这7代以内,出块奖励是逐渐递减的,有利于鼓励出现分叉之后,尽早合并,一出现分叉就马上合并的时候能得到的出块奖励是最多的,如果隔好几代之后,出块奖励就越来越少了,隔得代数太多了就得不到任何出块奖励了。

        叔父区块的奖励叫做Uncle Reward,当前区块包含一个叔父区块,就会得到1/32的出块奖励,不论包含的是哪一个辈分的叔父。

4.改进后的GHOST协议无法解决的问题

        设计这个协议主要是为了解决系统中出现的临时性分叉,包括比特币、以太坊,规定最长合法链的原则的目的是防止篡改,其实也是为了解决临时性分叉。最长合法链提供一个出现临时性分叉(State Fork)之后进行合并的一种机制。如果这个分叉是别的原因造成的,比如由于对运行的区块链协议有不同的意见,那么这种方法是解决不了的,也就是说,改进后的GHOST协议仍然无法解决硬分叉

        例如,学习比特币脚本的时候,学过的CHECKMULTISIG(用来检查多重签名的合法性),这个过程中有一个bug,检查的时候会从堆栈里多弹出一个元素,那如果正常操作的话,检查是通不过的,得先往里面压一个没用的多余的元素,就为了抵消这个Bug。这里不将这个BUG改掉就是因为:改完之后版本不一样了。比特币系统跟中心化的系统不一样(中心化的系统发布一个新版本很容易),去中心化系统如果修改的话,会出现硬分叉。图2-4的那两条链如果不是因为对当前状态有意见分歧,而是互相认为对方是非法的,认为对方的区块是包含非法交易的,那么用这种方法是合并不了的。如果有矿工将这样的区块包含进来,其他矿工会认为这条链是非法的,包含进来还是不会沿着这条链继续挖,还是沿着别的分叉链去挖,因为:即使主链最长,但是包含非法交易。

三、以太坊中的奖励

        区块链和以太坊发布一个区块能得到的奖励如下图3-1所示,实际上得到的是两部分奖励,叔父区块得到八分之七的奖励只限于Block Reward,即7/8×3ETH。叔父区块是得不到汽油费的,但汽油费所占的比例是非常小的,大部分是出块奖励,跟比特币的情况是类似的。

图3-1

        以太坊中没有规定定期要把出块奖励减半,比特币那么规定是为了人为制造稀缺性,以太坊中五个以太币降为三个以太币,不是为了认为制造稀缺性,实际上跟挖矿难度调整有关,2017年,挖矿难度炸弹被回调了300万个区块,导致挖矿难度大幅度下降,为了维护公平性,也是为了使以太币的供给量不要出现剧烈变化,所以降到了三个以太币,这是一次性的,并没有说以后会不断地下调。

        比特币一般当作数字黄金,是用来储值的;以太币被比喻成石油,它是用来花的,用来消耗,然后可以执行智能合约的。这个比喻不是完全的恰当,因为石油花完之后就没了,而以太坊中执行智能合约要消耗的gas,只是从一个账户转移到另外一个账户,发布智能合约的时候,要付出gas费,执行这个智能合约的矿工可以得到这个gas费,所以这个比喻也不完全恰当。

四、思考

1.把叔父区块包含进来的时候,叔父区块的交易要不要执行?以太坊是一个交易驱动的状态机,比特币也一样,所以在最长合法链上每次发布一个新的区块都会使当前状态转移到下一个状态,现在引入了叔父区块,要不要执行叔父区块的交易呢?

        不应该执行,最长合法链上的父区块和他的叔父区块包含的交易可能是冲突的,如果它们包含不同的交易,不同交易有可能不能都执行。对于比特币系统,对于有冲突的交易,比特币要做Double Spending Attack,要检测是不是双花攻击。在以太坊中,双花攻击花两次减两次,但是有可能一个交易花了之后,另一个交易就没法花了。所以叔父区块的交易,可能有些交易就变成了非法交易,叔父区块本身不一定是非法的,但执行完父区块的交易,再去执行叔父区块的交易可能就变成非法的。

        以太坊中只执行在最长合法链上的交易,叔父区块这些交易,当前区块是不执行的。而且根本就不检查叔父区块交易的合法性,只检查叔父区块是不是一个合法发布的区块,即这个区块是不是符合挖矿难度,也就是有没有获得记账权。

2.叔父区块能不能广义化?

        叔父区块都是分叉之后第一个区块。如果分叉之后后面还跟着一串,如图4-1所示,这些不能被认为是叔父区块。假定,将这些区块认为是叔父区块,会造成一个后果:分叉攻击的代价过低。正常意义上的分叉攻击需要使分叉链长度大于原来最长合法链长度才算成功,否则这些用来分叉攻击的区块会作废,原本的出块奖励也没有了。如果将分叉链上的区块认为使叔父区块的话,分叉攻击不成还能作为叔父区块获得一些奖励。所以以太坊中规定,只有分叉后的第一个区块可以得到Uncle Reward,后面的都不行。

图4-1

五、以太坊中的真实情况

        Etherscan.io可以实时查看以太坊的当前状态,右边这个曲线显示的是过去两周的交易历史,下面还包含最新挖出的区块和最新的交易,如下图5-1所示。

图5-1

        下图5-2所示为叔父区块的几种情况,这里的每一行对应一个叔父区块,第一列的Block Height就是区块的序号,也就是Block Number,与表中不同辈分的叔父得到的Uncle Reward的数目相对应。

图5-2

        下图5-3是两个区块的具体例子,左边这个区块包含了一个叔父区块,倒数第二行uncle reward是2.25,应该是距离为2的叔父。这个区块得到的奖励,在倒数第三行,有三个部分组成,即3ETH出块奖励、汽油费和包含叔父区块得到的三十二分之一的出块奖励。

猜你喜欢

转载自blog.csdn.net/YSL_Lsy_/article/details/126443249