以太坊Casper CBC协议的工作流程解析

区块链

579人已加入

描述

上周三,以太坊创始人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技术来替换链式机构来完成,其中每个区块都知道其分片的父级,以及其他分片中的的第十个最新和较旧的区块,并且期望验证者,仅完全验证尚未被足够大的验证者样本所验证的区块。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分