Skip to content

Latest commit

 

History

History
59 lines (32 loc) · 5.89 KB

File metadata and controls

59 lines (32 loc) · 5.89 KB

以太坊Ghost协议

在比特币中,每个区块的出块时间被设置为10分钟,一般来说在不改变区块容量的前提下出块间隔越短,可以打包的交易就越多,整个区块系统的吞吐率也就越高。想要提高出块速度就需要降低挖矿难度,而降低挖矿难度会导致满足条件的区块更有可能会被网络�中不同的矿工同时挖出, 假设这样一种场景;

当挖矿难度降低以后,最新区块有可能被多个矿工同时挖出,比如上图中的A,B,C,D,E区块可能被网络中的不同矿工同时挖出,当A被挖出的时候,还没广播到其余矿工,其余矿工还在基于区块4继续挖矿,这样就会产生区块B,C,D,E。

由于其余矿工接收到最长高区块后,就不会再接收同一高度的区块了,同时产生的最新区块相当于将区块链网络进行了分区,分为了5个区域A,B,C,D,E,在每个�网络分区中的矿工都会按照自己接收到的最长链进行挖矿,这样原本集中于最长主链的算力就被分成了五份。

这个时候不需要全网51%的算力,只需要21%的算力就可以快速挖出最长链,严重的威胁到了整个区块链网络的安全性。可见降低挖矿难度,提高出块速度后链更容易产生分叉,一定程度上浪费了算力,也降低了链的安全性。甚至在更坏的情况下,频繁出现分叉,在分叉上继续出现分叉导致整个链不可用。

以太坊中的出块间隔时间被缩短为了15s,意味着比特币中长出块时间所解决的问题都将在以太坊中暴露出来。在图二中,假如区块A由矿池挖出,后续矿池的挖矿算力都会基于区块A继续挖掘,而其他节点可能基于B,C挖掘但是由于矿池网络更好,连接了更多的节点,新区块的广播更快的传播到网络中其它节点,因为这些优势,矿池的区块更可能成为最长链,而其余的的分叉区块将得不到挖矿奖励,显然不利于个人矿工或者小矿池。

假设一个大型矿池A打包了区块A,继续在A的基础上挖A1,而挖出区块B的矿工为了自己挖出的区块不被丢弃,保护自己的利益就需要继续挖B1希望能成最长链,这显然不是以太坊所希望的。

聚焦一下问题;

  • 出块速度快导致链频繁分叉,难以确定最长链;
  • 矿池因为网络,算力优势具备了不对称的优势;

为了解决这两个问题,以太坊引入了Ghost协议来解决这些问题。

以太坊中出现了频繁分叉,为了尽快确定最长链就需要尽早的合并这些分叉,为此以太坊创造了一个新的名词叔块(Uncle block),如下图所示;

对高度4的区块来说,3号区块是他的父区块,两个叔块是3号区块的兄弟区块,是4号区块的叔叔,于是,叔块就是这么得名的。

虚线部分仅仅用来陈述关系,不表示有实际连接

在Ghost协议中,当区块4被挖出的时候可以包含一个叔块,叔块获得7/8的出块奖励,而区块4可以得到1/32的额外奖励。在这样的设计下,每一个新产生的区块都更有动力去包含叔块,在整合以太坊区块链分叉的同时获得更多的奖励。对于叔块来说相较于被主链抛弃来说被包含还可以获得不菲的奖励也乐见被其它区块包含。

需要注意的是一个区块最多包含两个叔父区块。

但是这样做有几个问题;

  • 叔父区块可能不只两个,这样一次就可能不能包含全部区块;
  • 可能区块4被挖出的时候,还没有感知到叔父区块,这样到只能到挖出区块5的时候才能在包含区块4的叔父区块;
  • 可能区块4由于某些原因就是不包含叔父区块,比如和挖出叔父区块的节点有竞争关系;

如果一个区块允许包含过多的叔块,就会导致以太坊的产出过多,币价贬值,但是又为了保护矿工利益和尽快合并临时分叉,ghost协议放宽了叔父区块的限制,比如区块5也是可以包含区块4的叔父区块。

为了避免无限制的包含叔父区块,以太坊又加了这样一条限制,每一个区块只能包含自己前7个区块的叔块奖励,而且每离自己远一个区块,那个叔父区块获得的奖励就减小1/8。如下图所示;

叔块获得最少区块的奖励是2/8

通过这样的方式就解决了上面的前两个问题,第三个问题也很好解决,因为一个矿工很难连续挖出区块,所以也可以解决。

往前推7个区块是为了避免实现的复杂性,因为既要保存区块,又要记录同一高度区块的大量区块会导致状态非常复杂。

还要注意的一点是包含的叔父区中的交易并不会执行,叔父区块的交易不一定是非法的,但是如果执行则可能造成主链上交易变成非法交易,所以并不需要执行。

包含的叔块只能是单个区块,如果在叔块后还有区块则不包含,这个也很好理解,如果是分叉的第一个区块可以理解为是巧合或者网络传播太慢,但是当感知到这个不是最长链的时候,还基于分叉挖矿则可以认为是恶意节点。