以太坊设计与实现

 主页   资讯   文章   代码   电子书 

title: "叔块" menuTitle: "叔块" date: 2019-09-05T22:58:46+08:00 draft: false weight: 20304

什么是叔块

是指没能成为区块链最长链的一部分的区块(陈旧的区块),但被后续区块收录时,这些区块称之为“叔块”。

它是针对区块而言的,是指被区块收录的陈旧的祖先孤块,它没能成为区块链最长链的一部分而被收录。

是针对当前区块所的而已的叔辈区块,一个区块最多可以记录 7 个叔块。叔块也是数据合法的区块,只是它所在的区块链分支没有成功成为主链的一部分。

如上图所示,新区块 E,它可以收录两个绿色的孤块B和C,但是灰色的区块不能被收录,因为他们的父区块并不在新区块所在的区块链上。而黄色区块和红色新区块是同辈区块,不能被新区块作为叔块收录。

为什么要设计叔块

在比特币中,因临时分叉(软分叉),没能成为最长合法链上的区块的区块,称之为孤块,孤块是没有区块奖励的。研究发现, 比特币的全网需要12.6秒一个新的区块才能传播到全网95%的节点。比特币系统,是平均10分钟才出一个区块,有足够的时间将新区块广播到全网其他节点,这种临时性的分叉几率就相当小。根据历史数据,大概平均3000多个区块,才会出现一次临时性分叉,相当于20多天出现一次这种临时性分叉,属于比较“罕见”的情况。

但是以太坊的出块时间已经缩短到12 到14 秒一个区块。更短的时间意味着,临时分叉的几率大幅提升。这是因为当矿工A挖出一个新区块后,需要向全网广播,广播的过程需要时间的。 由于以太坊出块时间短,其他节点可能还没有收到矿工A发布的区块,就已经挖出了同一高度的区块,这就造成了临时分叉。在以太坊网络中,临时性分叉发生的几率在 6.6% 左右。

image-20200603214439404

上图数据来源于 https://etherchain.org/ (2020年06月03日),当前以太坊叔块率为 6.6%。意味着在以太坊网络中,每 100 个区块,大约有 7 个叔块产生。如果按照平均 13.5 秒的出块时间计算,一个小时内有约 17.6 次临时分叉。

以太坊系统出现临时性分叉是一种普遍现象,如果采取和比特币一样处理方式,只有最长链上的区块才有出块奖励,对于那些挖到区块而最终不在最长链上的矿工来说,就很不公平,而且这种“不公平”将是一个普遍情况。这会影响矿工们挖矿的积极性,甚至可能削弱以太坊网络的系统安全,也是对算力的一种浪费。因此,以太坊系统对不在最长链上的叔块,设置了叔块奖励。

区块如何收录叔块

当节点不断接受到区块时,特别是同一高度的多个区块,会让以太坊陷入短期的软分叉中,或者在多个软分叉分支中来回切换。一旦出现软分叉,那么意味着有一个区块没能成为最长链的一部分。

image-20200603201027475

比如上图中,挖矿依次接收到 A、B 、C ,会在本地校验和存储这些区块,但根据最长链规则最终会切换到分支B上。那么在此刻,A和C 暂时成为了孤块。矿工会基于 B 挖取下一个新区块D。

image-20200603201246239

此时,D 就可以将本地还暂存的孤块 A 和 C 作为它的叔块而收录到区块 D 中。当然 D 不仅可以收录第一代祖先,还可以收录七代内的孤块。但有一些限制条件,以下图新区块 N 为例:

image-20200603202326762

  • N 不能收录 A :因 A 不在七代祖先内(区间要求);
  • N 不能收录 M:因 M 不是 N 的祖先,是兄弟而已;
  • N 不能收录 E、G、K、L :因它们的父区块并不在 N 所在的区块分支上,但 B 可以;
  • N 不能同时收录 D、C 和 B:因为一个区块最多能收录两个叔块,做多是三选二;
  • 当 D 被 F 收录后,N 是不能重复收录 D 的;
  • N 不收录 F 或 H: 因为 F 和 H 不是孤块;

矿工在开挖新区块,准备区块头信息时,矿工将从本地节点存储中获取七代内的所有家族区块,根据上述规则选择最多两个叔块。另外,在选择时本地叔块优先选择。

叔块奖励分配

叔块的奖励分为两部分:奖励收录叔块的矿工和奖励叔块创建者。具体的奖励分配如下:

奖励叔块的创建者

叔块创建者的奖励根据“近远”关系而不同,和当前区块隔得越远,奖励越少。 $$ \text{叔块奖励}=\frac{8-(当前区块高度-叔块高度)}{8} * \text{当前区块挖矿奖励} $$

叔块 奖励 按挖矿奖励 2 ETH计算
第一代 7/8 1.75 ETH
第二代 6/8 1.5 ETH
第三代 5/8 1.25 ETH
第四代 4/8 1 ETH
第五代 3/8 0.75 ETH
第六代 2/8 0.5 ETH
第七代 1/8 0.25 ETH

注意叔块中所产生的交易费是不返给创建者的,毕竟叔块中的交易是不能作数的。

收录叔块的矿工

该矿工即为当前新区块的矿工,他处理获得原本的区块挖矿奖励(2 ETH)和交易手续费外,还能获得收录叔块奖励,每收录一个区块将得到多得 1/32 的区块挖矿奖励。

以区块 10192970 为例:

image-20200603211230598

该区块矿工 2Miners:SOLO 总共获得了 2.385338652682918613 ETH奖励,其中:

  1. 2 ETH 是挖矿奖励;
  2. 0.322838652682918613 ETH 是交易手续费;
  3. 0.0625 ETH 是收录了一个叔块的奖励,是 2 ETH的挖矿奖励的 1/32。

而收录的一个叔块是第 1代叔块,奖励 2 ETH 的 7 /8。

叔块是如何收录在区块中的

新区块收录的叔块是只记录叔块区块头的,叔块区块头信息记录在新区块体中,新区块头中记录了叔块集合的默克尔哈希值。

image-20200603212358122