以太坊Casper CBC协议的工作流程解析
扫描二维码
随时随地手机看文章
上周三,以太坊创始人Vitalik Buterin在布拉格举行的Devcon4大会上,公布了以太坊发展路线(也被称为以太坊2.0)的最新信息,更新的内容包括新链将以Serenity为名(之前被称为Shasper,意指分片和Casper的结合),其包含了Casper、分片、EWASM以及其他一些协议,它会是一条新的区块链,并与当前的以太坊PoW链同时存在,且相互连接。
而在第一阶段,以太坊开发者们将交付基础beacon链,第二阶段则是推出分片数据链,第三阶段就是启用状态交易(EWASM),最后则是迭代、改进以及添加新技术。
而在本文当中,我们将探讨beacon链的Casper共识机制,Casper共识机制其实有两个大的版本,一个是Casper FFG(Vitalik版),而另一个则是本文要讲到的Casper CBC(Vlad版)。
以下内容译自Vitalik最新发布的帖子《Casper CBC lite via committees》
Casper CBC 的工作流程大致如下:
1.验证者发出消息;
2.每则消息指定验证者正在投票的区块,并且还指定了验证者从其他验证者处收到的最新消息。
3.验证者正在投票的区块,必须等于或继承自GHOST分叉选择规则的头部区块(使用其他验证者的最新消息作为输入)
4.唯一的削减条件是(i)上述规则,(ii)验证者不能生成具有相同序列号的两则消息,(iii)在后面的消息中,验证者不能引用具有(比早期消息中的验证者所引用的消息)更早序列号的消息;
5.最终确定性是内生的:在某些时候,当有多轮验证者对X的后代进行投票时,从数学上讲,如果没有大量验证者发出无效消息,头部就不可能切换到非X块;而少于这个量的限制,可使用各种启发式算法进行检测和测量。
下面是一个GHOST分叉选择规则的实例。 字母A,B,C,D,E代表着最近发生的5次投票。
第一个选择在绿色和黄色块之间。最后绿色块获胜了,这是因为有三张选票来自绿色块,而只有两张选票来自其竞争者黄色块。第二次选择是在红色块和蓝色块之间。而蓝色块以2:1的比分获胜,而蓝色块只有一个橙色的子块,所以橙色块是获胜者。
这样做而导致的效率问题是显而易见的:每则消息都需要引用它已经看到的所有其它消息,这可能会导致O(N^2)的数据复杂性;
本文探讨了一种缓解数据复杂性的特定策略,相较于每个验证者的投票,都是在每个其他验证者消息的GHOST分叉选择规则进行评估,其中验证者被明确地分配给m个其他验证者的私人委员会(可能是32≤m≤256),并且在他们的消息当中,必须包含对这些m个验证者签名的引用。
这种引用可以按序列号,或者通过这些签名已包含在链中的位置来完成。削减条件可简单地检查这些消息实际上是否代表GHOST分叉选择评估m则其他消息,并且计数器总是递增的。
更具体地说:
1.对于接受一则消息的链,要么 (i) 消息必须对链中的区块进行投票,要么(ii)该消息投票的链外(off-chain)区块必须被纳入一个叔块(uncle);
2.对于接受一个叔块的链,这个叔块的父块必须 (i)是该链的一部分,或者(ii)已经被纳入了链中,并作为一个叔块;
3.对于一条接受一则消息的链,引用其最新集的所有消息,都必须被接受;
4.每则消息都有一个序列号。对于一条接受带有序列号为n消息的链,它必须已接受了来自序列号为0.。..n−1验证者的消息;
5.验证者可以对具有相同序列号的两则消息进行削减处理,或者也可以削减一则投票x的消息,其中消息中包含的证据不能证明投票x;
如果委员会足够大,它们将接近整个验证者集。并且你可以试探性地确定验证者的数量。 下面是相关的代码:
github.com ethereum/research/blob/659f0b31f9337b3e7ee4bde45cdb93c0ed4fd390/graph_cbc/graph_cbc.py
import random
VALIDATORS = 5000
EDGES = 255
FINALITY = 4000
assert EDGES % 2 == 1
neighbors = list(range(VALIDATORS))
edgelist = neighbors * EDGES
random.shuffle(edgelist)
edges = [edgelist[i*EDGES:i*EDGES+EDGES] for i in range(VALIDATORS)]
last_votes = ‘1’ * FINALITY + ‘0’ * (VALIDATORS - FINALITY)
while 1:
new_zeroes = []
for i in range(VALIDATORS):
votes_for_0 = len([e for e in edges[i] if last_votes[e] == ‘0’])
if votes_for_0 * 2 》 EDGES:
注意,这部分代码是截取的,完整代码可访问:https://github.com/ethereum/research/blob/659f0b31f9337b3e7ee4bde45cdb93c0ed4fd390/graph_cbc/graph_cbc.py
结果就是m ≈ 256 ,容错率似乎接近20%,非常接近 Casper CBC两轮内最大的可能值25%。虽然我们失去了几个百分点的安全性,但我们获得了一个令人惊讶的简约协议表示,否则的话,就可能需要一些相当复杂的数据结构。
此外,请注意,这种Casper CBC的风格,基本上与Avalanche(雪崩协议)的工作方式非常相似,其中每个节点通过对其他节点委员会进行调查而获得共识。这里的主要区别在于,委员会是通过协议选择的,削减条件会强制执行合规性,而GHOST则被用作分叉选择规则,以扩展N元共识链,从而有效地实现经济安全。这表明可能存在着一个更为通用的框架,它可以有效地包含Casper CBC以及Avalanche;
进一步的工作:
1.Casper CBC的容错性,可通过增加的等待回合数,来提高到 (1/3-ϵ)。那么我们是否可以用一种类似的技术,将容错率提高到20%以上呢?
2.有没有办法,在这个设置当中让分片自然地发生呢?一般而言,这种目标,可用某种DAG技术来替换链式机构来完成,其中每个区块都知道其分片的父级,以及其他分片中的的第十个最新和较旧的区块,并且期望验证者,仅完全验证尚未被足够大的验证者样本所验证的区块。