叔块
叔块
叔块(Uncle Block)的概念,目前只有以太坊中有。
如上图,根据最优链选择规则,在把造成分叉链的区块4抛弃后,它就成为了孤块
。
孤块在比特币区块链中也是存在的,因为比特币公链也有分叉的情况,但是在比特币区块链中,挖出孤块的矿工节点是得不到BTC奖励的,也就是没有任何奖励。而以太坊区块链不是这样的,以太坊区块链中挖出孤块的矿工也有获得ETH奖励的可能性,这是两者的差异。
孤块在以太坊区块链中是有机会成为叔块的,当一个孤块被另一个符合层级限制内的区块采纳为叔块的时候,挖出这个孤块的矿工就会获得以太坊ETH奖励,此时的孤块也就变成了叔块。
那么为什么称为叔
而不是其他名称呢?这里实际上是类比了人类的亲戚关系。
如下图所示,主链中的区块4和变成了叔块的区块4拥有相同的区块高度,就是高度4,因为分叉的原因,导致叔块4最终变成了主链区块4的附属块,对于区块5来说,主链的区块4才是它的父区块,而由于同级关系,相对于区块5来说,区块4的附属块都是它的叔叔
级别的块,故称为叔块
。
打包规则
假设要将分叉区块A打包成为区块B的叔块,在代码层面就是在区块B的Header中,将区块A的数据绑定到区块B的Uncle变量字段中,叔块打包的规则如下。
区块A必须是区块B的第X层祖先的同层级高度的分叉区块,2<=X<=7,
区块A必须有合法的
Block Header
(区块头部)。区块A必须还没成为过别的区块的叔块。
区块B已经打包了的叔块必须还没有达到2个的数量,即一个区块最多只能有2个叔块。
区块A一旦成为叔块,当它作为分叉区块时,打包了的交易会重新回到节点的交易池中,等待重新被打包到区块内。
奖励规则
叔块的奖励规则是由以太坊的Ghost协议
(也称为幽灵协议)制定的,挖出叔块的矿工可以获得奖励。挖出叔块的矿工的奖励机制,它的奖励计算公式如下:
(uncleNumer + 8 - headerNumber) X blockReward / 8
上述公式中的3个变量说明如下:
- uncleNumber:代表当前叔块的高度,也就是它的区块号。
- headerNumber:代表当前正在被打包的区块的高度。
- blockReward:代表矿工挖出区块时的基础奖励值,现在是3ETH(君士坦丁堡版本后是2ETH),曾经是5ETH。
满足关系:headerNumber - 6 < uncleNumber < headerNumber - 1
假设 headerNumber = 17,那么 uncleNumber 的高度范围是 11 < uncleNumber < 16,奖励公式的取值范围是 ( 2/8 ~ 7/8 ) * blockReward。
由于这个规则,导致了叔块的奖励也有对应的层级,当基础奖励值 blockReward 是 3ETH 的时候,它的奖励层级表如下表所示。
间隔层数 | 报酬比例 | 报酬(Eth) |
---|---|---|
1 | 7/8 | 2.625 |
2 | 6/8 | 2.25 |
3 | 5/8 | 1.875 |
4 | 4/8 | 1.5 |
5 | 3/8 | 1.125 |
6 | 2/8 | 0.75 |
叔块存在的意义有二:一是基于挖矿节点奖励回馈,二是保持生态发展平衡。
以太坊为了将出块时间缩短,导致了软分叉的出现更加频繁,叔块被产生的概率就比较高,如果类似比特币的设计,对产生叔块的矿工不给予奖励,就会有很多矿工因为产生了叔块而获取不到任何奖励,积极性降低,不利于以太坊生态的发展,所以以太坊团队引入了叔块的概念。