区块链学习笔记17——GHOST协议

十七、GHOST协议

以太坊中的共识机制GHOST协议,以太坊把出块时间降到了十几秒,这对于提高系统的throughput(吞吐量)和降低反应时间来说,都是很有帮助的,跟比特币的10分钟的出块时间相比,以太坊的出块速度相当于提高到了40倍,但是这样大幅度降低出块时间之后也带来一些新的问题,前面讲过比特币和以太坊都是运行在应用层的共识协议,底层是一个P2P的Overlay Network,这个Overlay Network本身传输的时间是比较长的,因为他的拓扑协议做flooding的时候没有考虑实际的拓扑结构,就带来一个问题,发布一个区块的时候,这个区块在网络上传到其他节点可能需要十几秒的时间,对于比特币来说,10分钟的出块时间相当于600秒,足够让新发布的区块传播到网上的其他节点,即使这样,但因为挖矿是个概率的过程,仍然有可能有两个矿工同时获得记账权,同时发布区块,会带来临时性的分叉,对于以太坊来说,这种临时性的分叉会变成常态,而且分叉的数目也会变得更多,因为十几秒的出块时间很有可能别的节点没有来得及收到发布的区块,还是沿着原来的区块链往下挖,可能等到收到发布的区块的时候,他自己已经挖到了区块,那对于共识协议来说,有什么挑战呢?比特币只有在最长合法链上的那些区块,里面所包含的出块奖励才是真正有用的,其他的一些分叉的链上的出块奖励其实最后是作废的,可以画一个例子

比如说下图是个区块链,分了三个叉,差不多是同一个时间取得了记账权,最后有一个会胜出成为最长合法链,比如说中间这个,那么上面和下面的这个区块叫做orphan block,stale block,就是挖到这个区块的矿工在里面有一个铸币交易,能够得到一定数量的比特币,但这个实际上是没有用的,因为不在最长合法链上,所以得到的出块奖励最后等于作废了,对于比特币来说,因为出现这种临时性的分叉不是很多,所以这么规定还是可以接受的,但是对于以太坊也这样处理的话,那么意味着这个矿工挖到的区块有很大概率是白挖了,对于个体矿工特别明显,大型矿池会出现mining centralization(挖矿集中化),从过去的经验来看,大型矿池所在的分叉更有可能成为最长合法链,这就促使别的矿工沿着最长合法链继续挖,因为沿着别的链去挖的话,很有可能就白挖了,这样就使大型矿池出现恶性循环,越是大型矿池得到的收益越大,mining centralization更严重,有时候叫centralization bias,就中心化带来的不成比例的优势,如果以太坊按照比特币的共识机制就会有一定的问题

区块链学习笔记17——GHOST协议_第1张图片

那怎么办呢?

以太坊中采用一个基于GHOST协议的共识机制,这个并不是以太坊发明的,在以太坊出现以前已经有GHOST协议了,以太坊对这个协议做一些修改

核心思想

挖到的矿发布一个区块,这个区块最后作废了,你挺伤心的,会给你一些安慰,一些奖励,这个时候也能得到一些出块奖励,作废的区块起了一个好听的名字叫做uncle block,因为相对于最长合法链的当前区块来说,是他的叔父区块,最长合法链的下一个区块在发布的时候可以把叔父区块包含进来,这样的话,叔父区块可以得到八分之七的出块奖励,以太坊的出块奖励,刚开始的时候是5个以太币,17年下半年的时候改成3个以太币,所以出块奖励是(7/8)*3个以太币,所以挖到矿最后虽然没有被认可但也可以得到一定的好处,那个包含叔父区块的区块可以得到额外的(1/32) *3个以太币的奖励,加起来一共可以得到((1/32) *3+3)个以太币的奖励,一个区块最多可以包括两个叔父区块,所以这个例子当中上下两个叔父区块都可以被包含进去,那么包含了两个叔父区块的区块的得到的奖励还要乘以2,就是(2 *(1/32) *3+3)个以太币。

这个协议的核心思想是你最后挖到了矿,但是没有得到认可的那些矿工给予一种安慰,虽然你挖的区块没有成为最长合法链上的区块,但是仍然可以得到大部分的区块奖励,这样设计有利于鼓励系统中出现分叉之后及时进行合并,相当于最长合法链上面的区块把另外两个分叉链给招安过来了,就是给你一点好处,然后把他们两个招安过来,这是GHOST协议最初的版本。最初的版本也有缺陷

区块链学习笔记17——GHOST协议_第2张图片

缺陷:

区块链学习笔记17——GHOST协议_第3张图片

  1. uncle block只能包含两个,如果出现第三个,第三个就不开心了,设计GHOST的目的是如果你给uncle block一点好处的话,它们不愿意合并过来,因为一旦放弃自己所在的分叉就什么好处都没有了,所以要给点好处,把他们招安过来,但是只能招安两个,如果出现第三个uncle block就没办法了。其实,只能包含两个也是有道理的,因为叔父区块得到八分之七的出块奖励是很高的,要是不限制的话,那么以太坊中的以太币就太不值钱了。

区块链学习笔记17——GHOST协议_第4张图片

  1. 这个区块把红线指的叔父区块作为叔父区块的前提是,在挖这个区块的时候已经知道叔父区块的存在了,如果已经发布了这个区块,然后才知道叔父区块,这时候已经来不及了,叔父区块就变成什么好处都没有了。
  2. 如果这个矿工比较自私的话,矿池嘛,都是有竞争关系的,出于商业目的,有可能故意不包含叔父区块,就是挖的时候知道这个叔父区块,但是就是不包含,这样的话,对叔父区块来说,八分之七的出块奖励是得不到的,对于他自己来说,三十二分之一的出块奖励是得不到了,好像是损人不利己,但要从商业竞争的角度讲,这么做对这个矿工的损失是比较小的,对挖出叔父区块的矿工的损失是比较大的

把协议改一改

区块链学习笔记17——GHOST协议_第5张图片

白色箭头指的区块如果没有包含叔父区块,往下再有一个区块,按道理来说有阴影的区块就不是往下那个区块的叔父区块了,因为他跟他爷爷来说是一辈的,但是以太坊规定不能论资排辈,阴影区块还可以当中白色箭头后面区块的叔父区块,如果再往下挖一个,那就更不对了,阴影区块就是他的曾祖父的那一辈了,但以太坊不管,他还是他的叔父区块。

区块链学习笔记17——GHOST协议_第6张图片

这么规定的好处,如果某个矿池(白色箭头指的区块)出于竞争关系故意不把这个叔父区块包含进去,比如第一个有阴影的区块,你不包含没关系,别人可以包含,下一个区块可能不是你挖出来的,不可能最长合法链上都是你挖出来的吧,甚至有可能下一个区块是跟那个第一个阴影区块是一家的。就是挖出第一行阴影区块的矿工看到最长合法链之后会切换到这里来挖,然后把它自己给包含进去。

区块链学习笔记17——GHOST协议_第7张图片

这样的话,出现第三个叔父区块也可以解决了。

本质就是为了改进最初版本的GHOST协议存在的一些问题,所以把叔父的定义扩展了,不一定是当代叔父,可能是隔着几代的叔父,问题就在于隔多少代呢,是不是可以隔100代,隔1000代行不行,就在很久很久以前,挖矿难度比较低的时候不断地产生叔父区块,期待着被包含,所以以太坊中怎么规定呢?

假设下图是最长合法链,末尾一个是最近挖出来地区块,是当前区块

在这里插入图片描述

如果在下图位置分个叉,下面分叉地区块是当前区块的真正的叔父,那么以太坊规定,这个时候叔父区块可以得到八分之七的出块奖励

区块链学习笔记17——GHOST协议_第8张图片

如果往前推一代呢,那么就得到八分之六的出块奖励

区块链学习笔记17——GHOST协议_第9张图片

再往上推一代就得到八分之五的出块奖励,以此类推,如下图所示,只有这六个是叔父区块,再往前就不是叔父区块了

区块链学习笔记17——GHOST协议_第10张图片

叔父区块的定义是必须跟当前区块在7代以内有共同的祖先才行,超过七代就不认了,换句话说,合法的叔父只有6个辈分
区块链学习笔记17——GHOST协议_第11张图片

这么设计的原因:
首先如果你不限制叔父的辈分,不限制隔多少代的话,那么实现起来,对于全节点来说,他要维护的状态的就太多了,因为可能要记着隔着100代以前有哪些叔父区块,你发的这个区块包含的叔父区块,其他节点同样也是要验证一下的,另外一个问题,设计最多隔着7代,并且这7代以内,出块奖励是逐渐递减的,有利于鼓励出现分叉之后,尽早进行合并,一出现分叉就马上合并的时候能得到的出块奖励是最多的,是八分之七,如果隔着好几代之后,出块奖励就越来越少了,隔得代数太多了就得不到任何出块奖励了,鼓励出现分叉之后及早合并。

叔父区块的奖励叫做uncle reward,当前区块包含一个叔父区块,就会得到三十二分之一的出块奖励,不管包含的是哪一个辈分的叔父。

如果在红色箭头的位置加一个区块会怎么样?这个区块算什么?什么也不算,他跟当前区块是兄弟关系。

区块链学习笔记17——GHOST协议_第12张图片

另外设计这个协议主要是为了解决系统中出现的临时性分叉,包括比特币,以太坊,为什么规定最长合法链的原则,为了防止篡改,使得交易不容易被篡改,其实也是为了解决临时性分叉,最长合法链提供一个出现临时性分叉之后,进行合并的一种机制,最长链会胜出,如果这个分叉是别的原因造成的,比如说是出于对运行的区块链协议有不同的意见,那么这种方法是解决不了的,前面讲的例子中都说过,这个叫state fork,对于区块链当前的状态产生了临时性的意见分歧,想办法把它合并,如果是别的原因,像以前讲比特币脚本的时候,CHECKMULTISIG,检查多重签名的合法性,这个操作在实现上有一个bug,检查的时候会从堆栈里多弹出一个元素,实际上如果正常操作的话,检查是通不过的,得先往里面压一个没用的多余的元素,就为了应付这个bug,可是为什么不把这个Bug改掉呢,改完之后版本不一样了,他跟中心化的系统不一样,中心化的系统发布一个新版本很容易,去中心化系统这么一改的话,会出现硬分叉,上图的那两条链如果不是因为对当前状态有意见分歧,而是互相认为对方是非法的,因为对方的区块是包含非法交易的,那么用这种方法是合并不了的,包含进来可以,但是如果这个矿工认为这条链是非法的,包含进来还是不会沿着你继续挖,还是沿着他的分叉链去挖,因为他认为你那个主链虽然最长,但是是非法的。

比特币发布一个区块,实际上得到的是两部分奖励,一部分叫做block reward(static reward静态奖励),一部分叫做tx fee(动态奖励:因为要执行交易才能得到),以太坊中也是类似的,也有一个静态的block reward,就是那3个以太币,动态奖励叫gas fee(汽油费),区块里包含的智能合约,执行智能合约的时候可以得到汽油费,讲的叔父区块得到八分之七的奖励只限于block reward,就是八分之七乘以三个以太币,汽油费是得不到的,叔父区块是得不到汽油费的,但是这个问d题其实也不大,汽油费所占的比例是非常小的,大部分是出块奖励,跟比特币的情况是类似的,比特币也是说tx fee占很小一部分,之前看的n那个例子,tx fee大概是占了出块奖励的百分之一,以太坊中没有规定定期要把出块奖励减半,比特币那么规定是为了人为制造稀缺性,以太坊中五个以太币降为三个以太币,不是为了认为制造稀缺性,实际上跟挖矿难度调整有关,17年出现了,挖矿难度计算公式,那个难度炸弹被回调了300万个区块,这样导致挖矿难度大幅度下降,为了维护公平性,也是为了总共以太币的供给量不要出现剧烈变化,所以降到了三个以太币,这是一次性的,并没有说以后会不断地下调。

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

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

答案是不应该执行,最长合法链上的父区块和他的叔父区块包含的交易可能是冲突的,如果它们包含不同的交易,不同交易有可能是不能都执行的,就像比特币一样是个有冲突的交易,比特币要做double spending attack,要检测是不是双花攻击,双花攻击是通过账户余额,花两次减两次,但是有可能一个交易花了之后,另一个交易就没法花了,所以这么包含的话,要执行叔父区块的交易,可能有些交易就包含了非法交易,他的叔父区块本身不一定是非法的,执行完父区块的交易,再去执行叔父区块的交易可能就变成非法的,以太坊中只有在最长合法链上,叔父区块这些交易,当前区块是不执行的,而且根本就不检查叔父区块交易的合法性,只检查一个东西,检查他是不是一个合法发布的区块,换句话说,这个区块是不是符合挖矿难度,这个是要查的,如果不查的话,你可能根本没有获得记账权,就发布一个东西出去,也不要求在主链上,把我当成叔父就行了。

叔父区块共同特点:同时分叉之后第一个区块。如果分叉之后后面还跟着一串,哪些怎么办?

上面是最长合法链,下面是分叉链

区块链学习笔记17——GHOST协议_第13张图片

比如说白色箭头指向的区块,算不算是红色箭头指向的区块的叔父区块?

按辈分是算,那为什么不能设立一个协议,把下面分叉链当作叔父区块,给他们每个一点奖励,鼓励他合并上去,相当于以前招安的时候是单个招安,现在已经拉出一个队伍来,把整个队伍招安过来,这么规定会出现一个问题,分叉攻击就变得太便宜了。

区块链学习笔记17——GHOST协议_第14张图片

分叉攻击:比如说在下图位置的区块上有一笔很大的转账交易A->B,然后等了六个确认,认为这个交易肯定没有问题了,然后A发动分叉攻击,把钱转给他自己,这个分叉攻击要成功,需要下面这条链比上面这条链要长,这个代价是比较大的,因为风险很高,如果不能变得比上面链长,那这一长串的区块都白挖了,这就是分叉攻击的代价,但是如果把GHOST协议改了,把下面链认作叔父区块,每个给一点奖励,让他整体合并上来的话,那样,分叉攻击的风险就大幅度下降了,反正就先分叉攻击你,攻击成功就把交易回滚了,攻击失败那我招安过去,也能得到区块奖励,所以以太坊中规定,只有分叉后的第一个区块可以得到uncle reward,后面的都不行。

区块链学习笔记17——GHOST协议_第15张图片

下面看一下以太坊中真实情况

大家知道Etherscan的这个网站可以实时查看以太坊的当前状态,右边这个曲线显示的是过去两个星期的交易历史,这个是五月底截的图,左下方显示的是最新挖出的区块,右下方显示的是最新的交易

区块链学习笔记17——GHOST协议_第16张图片

这个显示的是叔父区块的几种情况,这里的每一行对应一个叔父区块,第一列的Block Height就是区块的序号,也就是Block Number,图中第一个红框,这个区块的序号要比这个区块本身小两个,说明是一个距离为2的叔父区块,应该得到八分之六的奖励,乘以三个以太币的话,就是2.25个以太币,接下来的两行都属于这种情况的叔父,再往下一行就到了第二个红框这一行,叔父区块的需要只比他小一个,说明是当代叔父,应该得到八分之七的奖励,乘以三个以太币的话,就是2.625个以太币,接下来这几行要么属于当代叔父,要么属于上一代的叔父,说明实际系统中都很大的得到了合并,下面这一行叔父区块的序号,比这个区块小三个,应该得到八分之五的奖励,乘以三个以太币的话,就是1.875个以太币,

下面的表格给出了不同辈分的叔父得到的uncle reward的数目

区块链学习笔记17——GHOST协议_第17张图片

下面看两个区块的具体例子,左边这个区块包含了一个叔父区块,倒数第二行uncle reward是2.25,应该是距离为2的叔父,这个区块得到的奖励,倒数第三行有三个部分,第一是固定的三个以太币的出块奖励,第二是汽油费,第三是包含叔父区块得到的三十二分之一的出块奖励。

右边区块包含了两个叔父区块,一个是距离为1的当代叔父,一个是距离为2的上一代叔父,倒数第二行就是2.25+2.625=4.875,这个区块得到的奖励,倒数第三行,其中第三部分,比左边的区块恰好多了一倍,因为引入的是两个叔父,所以乘以2。

区块链学习笔记17——GHOST协议_第18张图片

你可能感兴趣的:(区块链,以太坊)