北京大学肖臻老师《区块链技术与应用》公开课笔记(十八):GHOST协议
BTC系统中出块时间为10min,而以太坊中出块时间被降低到15s左右,虽然有效提高了系统反应时间和吞吐率,却也导致系统临时性分叉变成常态,且分叉数目更多。这对于共识协议来说,就存在很大挑战。在BTC系统中,不在最长合法链上的节点最后都是作废的,但如果在以太坊系统中,如果这样处理,由于系统中经常性会出现分叉,则矿工挖到矿很大可能会被废弃,这会大大降低矿工挖矿积极性。而对于个人矿工来说,和大型矿池相比更是存在天然劣势,因为大型矿池更容易成为最长合法链,相应的其他矿工也就更愿意沿着大型矿池的链挖,mining centralization越严重,形成恶性循环,有时我们叫centralization bias(中心化带来的不成比例的优势)。所以建立一个合理的共识协议是很有必要的。
对此,以太坊设计了新的公式协议——GHOST协议(该协议并非原创,而是对原本就有的Ghost协议进行了改进)。
GHOST协议
最初版本
如果产生了分叉,那么长的区块可以在后续区块上写入叔父区块,图中花阴影区块就是最右区块的叔父区块,然后叔父区块获得7/8的出块奖励,写入叔父区块的区块获得1/32的出块奖励,且一个区块最多写入两个叔父区块,对双方都有利,类似于后面的区块把叔父区块招安,系统内部解决分叉的一种方法。
假定一个矿工挖出了B,此时他沿着其所在链继续挖,并且他知道A是和自己“同辈”,则可以将A包含进区块挖矿,若挖矿过程中又听到C也是“同辈”,则可以停止挖矿,将C包含进来重新组织成一个新区块重新挖矿,实际中,由于挖矿过程的
无记忆性
,之前花费在挖矿上的精力并没有浪费
那么这样其实存在问题:
- 如果分叉过多,比如有5个,而我只能写入2个,写入哪两个?
- 如果矿工自私,故意不包含叔父区块,导致叔父区块7/8出块奖励没了,而自己仅仅损失1/32。如果甲、乙两个大型矿池存在竞争关系,那么他们可以采用故意不包含对方的叔父区块,因为这样自己的损失是远远比对方小的。
新的版本
叔父区块不要求跟父节点同级,只要是他前面的节点就可以。如下图,B、C、G是D、E、F的叔父节点,所以D、E、F都可以写入B、C、G,这样完美解决了上面两个问题,分叉多可以多几代写入,而如果存在恶意不写入,比如D不想写入B,那么B可以在E或者F处加把劲自己挖出一个区块,然后把B给写入,因为大矿池也不能保证所有的区块都是自己挖出来的,这样自己相当于损失1/32的出块奖励。所以基本解决了上述两个问题
我们将“叔父”这个概念进行了扩展,但问题是:叔父”这一定义隔多少代才好呢?
显然是需要加以限制的,不然首先恶意节点可以在之前挖矿难度较低时挖出很多分支,然后赚取叔父节点的出块奖励,其次全节点要维护很多很多节点的叔父节点集,这样肯定是不合理的,以太坊中的限制是七代以内有共同祖先:
如图,七代以内有共同祖先的叔父节点都能得到叔父奖励,而且叔父奖励是递减的,写入叔父区块的区块的奖励还是1/32的出块奖励,还是最多写入两个叔父区块
这样,就方便了全节点进行记录,此外,也从协议上鼓励一旦出现分叉马上进行合并。
这个协议主要是为了解决系统中出现的临时性分叉,比如上面提到的这种state fork(对于区块链当前的状态产生了临时性的意见分歧)。而如果分叉是由于对运行的区块链协议有不同的意见,那么GHOST协议是无法解决的
以太坊中的奖励
BTC:静态奖励(出块奖励block reward)+动态奖励(交易费tx fee,占据比例很小,1%左右)
ETH:静态奖励(出块奖励block reward+包含叔父区块的奖励)+动态奖励(汽油费gas fee,占据比例很小,1%左右,叔父区块没有)
此外,BTC中为了人为制造稀缺性,比特币每隔一段时间出块奖励会降低,最终当出块奖励趋于0后会主要依赖于交易费运作。而以太坊中并没有人为规定每隔一段时间降低出块奖励,前些年从5降到3是因为17年10月份挖矿难度的计算公式:难度炸弹被回调了300W个区块,这样导致挖矿难度大幅度降低,为了维护总的以太币的供给量不会波动太大,才调整的出块奖励。
以太坊中包含了叔父区块,要不要包含叔父区块中的交易?
不应该,叔父区块和同辈的主链上区块有可能包含有冲突的交易。而且我们前文也提到,叔父区块是没有动态奖励的。因此,一个节点在收到一个叔父区块的时候,只检查区块合法性(指满足不满足挖矿难度)而不检查其中交易的合法性。
对于分叉后的堂哥区块怎么办?
我们之前的例子都是分叉的第一个区块,那么如果不止一个区块,那么只取分叉的第一个才给叔父奖励。如果规定将下面整条链作为一个整体,给予出块奖励,这一定程度上鼓励了分叉攻击(降低了分叉攻击的成本,因为即使攻击失败也有奖励获得)
以太坊真实数据
叔父区块:
block height代表是第几个区块,UncleNumber就是叔父区块的block height,两个数差几,就是差几辈儿,下方的叔父奖励可以对应一下
区块的详细信息: