GHOST 协议
1 背景
1.1 以太坊出块时间缩短带来的影响
- 利:提高系统吞吐量,降低反应时间。
- 弊:出块速度快,加上底层overlay network传输时间长,使以太坊中容易产生很多的临时性分叉。
1.2 BTC出块奖励机制不再适用于ETH
- BTC出块奖励机制
BTC
□ (orphan block、 still block) no reward
↙
← □ ← □ ← □ ← □ (longest valid chain) block reward 以及 tx fee
↖
□ (orphan block、 still block) no reward
如果出现了分叉,只有成为最长合法链的区块能够获得block reward 以及 tx fee,没成为最长合法链的区块的出块奖励会作废。
- BTC出块奖励机制不适用于ETH的原因
- 以太坊分叉太容易产生,按BTC这样处理导致矿工挖到的区块很大概率是白挖的,对挖到区块的矿工尤其个体矿工,是不公平的。
- 大型矿池的趋势导致mining centralization,这种中心化会给矿池带来不成比例的优势centralization bias,恶性循环。
2 以太坊GHOST协议演进
2.1 核心思想
矿工挖到、发布的区块即使作废了,也能得到出块奖励。
2.2 初版协议
- 内容
- 叔父区块定义:以太坊将BTC中的orphan block、still block称为uncle block。当前区块发布时,可以包含叔父区块中的交易。
- 叔父区块奖励:若被当前区块包含,叔父区块会得到7/8出块奖励。
- 当前区块奖励:在获得出块奖励之外,每包含1个叔父区块,会额外获得1/32的出块奖励。一个区块最多可以包括两个叔父区块。
- 缺陷
- 只有2个区块能被认为是叔父区块,若存在其他区块,它们无法获得奖励。
- 如果发布了区块后,才发现了可作为叔父的区块,这个区块无法获得叔父区块奖励。
- 矿池有竞争关系,出于商业利益,故意不包含某个区块。
- Q & A
- Q 如果在挖下个区块的时候,又多出现了1个叔父区块,如何将其包含进来?
A 通过修改block header中的字段,包含2个叔父区块。这种修改对于挖矿没有损失,因为挖矿过程是unmemorable 无记忆的,修改完接着挖和从一开始就设定好参数是一样的,并不吃亏。 - Q 为什么只能包含2个区块?
A 若被认为是叔父区块,则能得到7/8的出块奖励,是很高的。如果不加以限制,可以认100个叔父,那以太币太不值钱了。
- Q 如果在挖下个区块的时候,又多出现了1个叔父区块,如何将其包含进来?
2.3 协议改进
- 改进点
拓展了叔父区块的定义,即不一定是当代叔父,可以是隔几代的叔父。 - 目的
解决了初版协议存在的缺陷,解决系统中出现的临时分叉,鼓励分叉合并。 - 协议内容
- 叔父区块定义为:在距离当前区块7代以内有共同祖先的区块。
- 叔父区块奖励: 只有6代叔父区块能够获得出块奖励,随辈分增大从7/8递减至2/8。
- 当前区块奖励:不管包含了哪一辈分的叔父,包含1个叔父区块额外得到的奖励都是1/32。
- 合法的叔父只有6个辈份的设计原因:
- 减少全节点要维护的状态。
- 设置了7代且出块奖励逐渐递减,有利于鼓励出现分叉之后尽早进行合并。一出现分叉就进行合并,得到的出块奖励是最多的,代数越多出块奖励就越来越少了。
- 协议的主要目的是解决临时性分叉而非硬分叉。通过规定最长合法链胜出原则,防止交易不容易篡改,提供了临时性分叉合并机制。如果分叉是别的原因造成,出于对运行的区块链协议有不同建议,这种方法是解决不了:
- 比特币脚本 checkmultisig 检查多个签名的合法性,会从堆栈里多弹出一个元素,正常操作检查无法通过,为了应付一个bug,要先往里面压一个多余的没用的元素。为什么不改这个bug呢?改完之后版本不一样了,一修改会出现硬分叉。
- 互相认为对方的链是包含了非法交易,用这种方法是合并不了。
ETH
|←------at most 7 generation------→|
← □ ← □ ← □ ← □ ← □ ← □ ← □ ← □ ← □
↖ ↖ ↖ ↖ ↖ ↖ ↖
□ □ □ □ □ □ □ (uncle block)
0 2/8 3/8 4/8 5/8 6/8 7/8 block reward
- 比特币与以太坊出块奖励对比
- 比特币发布一个区块:
- 可以得到block reward(也称为static reward)、transaction fee(执行交易才能得到tx fee,称为动态奖励)。
- block reward定期减半,为了人为制造稀缺性。
- tx fee大概占了出块奖励的1/100。
- 比作数字黄金,是用来储值的。
- 以太坊发布一个区块:
- 可以得到block reward(固定的和包含叔父区块额外的、动态奖励为gas fee(区块里包含了智能合约,执行智能合约可以得到汽油费)。
- 叔父区块得到7/8 block reward奖励,叔父区块得不到gas fee。gas fee所占比例很小,大部分是静态的出块奖励,和比特币情况类似。
- 以太坊未规定定期block reward减半。以太坊block reward调整,不是人为制造稀缺性,是为了调整挖矿难度,为了维护公平性以及以太币的总供给量不出现剧烈变化。这种调整只是一次性,以后不会不断下调。
- 比作石油,用来消耗执行智能合约。比喻不是完全恰当,因为石油是花完之后就没了,以太坊执行合约只是gas从一个账户转到另一个账户,发布合约付出gas fee,执行智能合约矿工得到gas fee。
- 比特币发布一个区块:
- Q & A
-
Q 叔父区块包含进来时,叔父区块里的交易要不要执行?
A 不应该执行,以太坊、比特币是交易驱动的状态机。链上每次发布一个新的区块,都会使当前状态,转移至下一个状态。主链和叔父区块的交易有可能有冲突。以太坊是通过账户余额,预防双花攻击,两个不一样的交易可能有冲突。若执行叔父区块的交易,可能有些交易变成了非法交易。叔父区块本身不一定非法,执行父区块后在执行叔父区块,可能就非法了。 -
Q 有没有可能检查下叔父区块里哪些是合法的交易,仅执行合法的交易呢?
A 为确保沿着主链交易,叔父区块的交易,当前区块是不执行的,而且不检查叔父区块交易的合法性。当前区块会通过查block header,查叔父区块是否是合法发布的,是否符合挖矿难度。 -
Q 如何检测有多少个叔父区块呢?
A 监听到一个就查一下。每个发布区块得说明父区块,可检测叔父区块和我当前区块是否有共同祖先 -
Q 如果分叉之后后面还跟着一串区块,是否将整条链当作叔父区块,给他们奖励,鼓励合并上去?
A 只有第一个块有奖励,后面都没有奖励,forking attack的成本太低了。如果整链给奖励,分叉攻击成功,交易回滚,否则也能得到出块奖励,那么分叉攻击的成本就大幅度下降了。
-
ETH
|←------at most 7 generation------→|
← □ ← □ ← □ ← □ ← □ ← □ ← □ ← □ ← □
↖
□ ← □ ← □ ← □ ← □ ← □ ← □
reward 0 0 0 0 0 0