区块链扩容方案之——ELASTICO

  这篇文章为大家介绍的是一个安全的分片协议,叫做ELASTICO。它也是第一个为开放式区块链(公有链)设计的分片协议。我认为ELASTICO 的分片协议虽然存在一些缺陷,但是也有许多可取的点,是一个值得学习的分片协议。

一、ELASTICO核心思想

  我们都知道目前区块链的共识协议主要有三类,分别是PoW(工作量证明)、PoS(权益证明)和BFT(拜占庭容错),其他的共识协议要么是在这三种共识的基础上进行改进,要么是糅合了他们。然而,这三类共识都有他们各自的优点和缺陷。工作量证明相对安全但是不利于性能的扩展。拜占庭容错系列的协议有着强一致性,但是却受限于带宽和节点数,随着节点数增加,性能会大幅度降低,所以不适合作为公有链的共识协议。但是ELASTICO很好的结合了工作量证明和拜占庭容错协议。
在这里插入图片描述
  ELASTICO的分片方式是网络分片和交易分片,并没有进行状态分片(对于这三种分片方式不太了解,请参考区块链扩容方案之—分片(sharding))。ELASTICO的核心思想是把网络中的节点分成多个小的委员会,每个委员会会处理互不相交的交易集合。这些不相交的的交易集被成为shard(分片)。节点建立身份信息通过工作量证明,然后节点被随机分到各个委员会中,由于每个委员会中的节点数量足够小,所以委员会内部他们完全可以运行经典的拜占庭共识协议,并且他们完全是并行处理交易。所以ELASTICO几乎完成了对吞吐量的线性扩展。

二、ELASTICO 协议介绍

  ELASTICO把时间分成了很多时代(epoch)。在每个时代,处理器都执行下图中的五个步骤来参与协议。第一步是建立身份并组建委员会。第二步进行的是委员会配置。第三步进行的是委员会内部共识。第四部进行的是最终共识广播。最后一步进行的是时代随机源生成。
在这里插入图片描述

1. 建立身份并组建委员会

  在这一步,每一个处理器现在本地选择他们自己身份信息组(IP,PK),分别代表他们的IP地址和公钥。为了网络能接受他们的身份,每个处理器还必须找到一个PoW解决方案(nonce),这个解决方案必须和他们自己的选择的身份是对应的,并且系统中的每个人都可以验证这个nonce。利用这种方式可以很有效的避免sybil攻击。但是这样还不够,为了防止节点提前计算好nonce值然后在当前时代提交,系统还要引入一个epochRandomness变量,作为一个时代的随机源。这个随机源是在前一个时代的最后一步被生成后公布的。这样的话,在每个时代,每个节点的nonce值都不可能是提前算好的,因为他们无法提前或者这个时代的epochRandomness。

  换句话说,系统中的每一个节点必须在本地寻找一个可验证的nonce值满足下面的条件:

O = H(epochRandomness||IP||PK||nonce) ≤ 2^(r-D) .

  D是预先设置好的工作量证明难度。而最后计算得到的这个哈希值O也会被作为节点的ID。

  在Elastico 系统中,会创建2^s 个委员会,每个委员会拥有一个s位的ID。后续协议也会根据这s位的ID来随机地分配节点。前面说个哈希值O代表着节点的ID,那么根据这个ID的后s位,对应这委员会的ID则决定了每个节点属于哪个委员会。

  系统也会把交易集合分成2^s 个不相交的子集,每个委员会分别处理一个子集。委员会处理的子集也是根据子集的s位的ID决定的,原理和分配节点一样。所以我们可以看出来ELASTICO利用一个s位的ID巧妙的把委员会、节点和交易集合对应了起来。

  那么问题来了,为什么要把交易集合分成不相交的交易子集呢?如何才能做到这样呢?这部分的答案我会在第6点解答,让我们还是先以协议的内容为主。

2. 委员会配置

  一旦节点的身份和他们对应的委员会信息已经被创建完成,每个委员会成员需要和相同委员会的其他成员进行点对点连接。一种简单的方式是要求每个节点广播自己的身份和所属委员会给网络中的每一个节点。但是如果网络中有n个节点,这种方式会造成O(n2) 的消息开销,很难进行扩展。所以并不是一个好的方式。ELASTICO为了降低通信复杂度,协议拥有特殊的委员会扮演者目录的身份(directories),和其他的委员会一样,目录委员会也有c个成员组成。确切的说,目录委员会就是最先建立身份加入系统的c个节点组成的委员会。所有的节点都可以通过联系目录委员会来得知他的其他委员会同伴,并和同伴们建立点对点连接。

  委员会配置的步骤:
  首先网络中的所有节点在第一步中尝试找到一个工作量证明答案,并且一旦某个节点找到了答案,他就会优先检查目前目录委员会的数量是否已满(人数到达c人)。如果人数少于c人,他会把他自己加到目录委员会中,并广播自己目录委员会成员身份到整个网络,接下来他就会执行他目录委员会成员的工作。反过来,如果他发现目录委员会成员已经达到了c个,那么他就把他自己的身份信息发给所有的目录委员会成员。
  与此同时,每个普通节点也得时刻更新目录委员会成员人数,当节点收到来自于其他节点的工作量证明答案,他也会检查目前目录委员会是否已满,如果未满,就把这个人加进列表,如果满了那就不用理会。
  接下来是目录委员会成员义务做的工作。首先目录成员持续获取各个节点发送过来的工作量证明答案,并且获取该节点递交哈希值的后s位,为了知道这个节点属于哪个委员会。然后目录成员检查这个节点所属的委员会人数是否达到c个了,如果未满,则把这个节点加入。最终如果所有的委员会都满员了,每一个目录委员会成员会广播每一个普通委员会的成员列表给相应的委员会成员。
  目录委员会中也有可能存在拜占庭节点,且拜占庭节点比例最多1/3。这些恶意节点要么选择不发送消息,要么选择发送虚假消息。所以对于普通委员会成员来说,每一个人将会收到最少2c/3个正确的成员列表。每一个委员会成员把他收到的所有身份做了一个并集,创建一个至少拥有c个委员会成员的视图。
  ELASTICO这样做的原因是为了降低节点间的通信复杂度,用这种方式消息复杂度会从O(n2) 降低到O(nc)。下面是实现委员会配置的伪代码。
在这里插入图片描述

3. 委员会内部共识

  一旦委员会配置完毕,委员会内部共识就可以沿用一些现存的拜占庭共识协议了,例如PBFT(实用拜占庭容错)。在第二步中,每一个委员会成员把他收到的所有身份做了一个并集,创建一个至少拥有c个委员会成员的视图。这个视图中最多有3c/2个成员,并且他们中最多有1/3是恶意的。

[注] 首先我们假设Xi=1代表委员会中第i个成员是诚实节点,而Xi=0则代表是恶意节点。X是从第一个成员到第n个成员的总和(Xi的总和)。我们可以得出下面的概率:
在这里插入图片描述
这个概率代表委员会中诚实成员占比小于2/3的概率,此处的f=1/4(工作量证明系统为了防止自私挖矿可以容忍的拜占庭节点比例小于1/4)。我们可以算出当n=c=100时这个概率是一个非常小的数字。所以可以认为有很高的概率可以当作每个委员会恶意节点比例小于1/3。而委员会中诚实节点数量是c,所占比例是2/3,所以可以得到委员会成员最多可以有3c/2个。

  最坏的情况下,我们假设每个委员会有3c/2个成员,并且他们中有最多有1/3是恶意的。所以我们能得出每个委员会中最多有c/2个恶意身份。每一个委员会成员会验证交易集中的每一个交易的有效性,如果没有问题他们会对集合进行签名,并把带着签名的交易集发送给最终委员会(final committee)。交易集必须被至少c/2+1个成员签名才算有效,这保证了至少有1个诚实的成员已经验证并接受了这个交易集合。这也符合PBFT的特性。
  所以最终委员会又是什么呢?最终委员会是从所有普通委员会中随机选出的一个委员会,又叫做共识委员会(consensus committee)。最终委员会的工作会在下一个部分详细介绍。

4. 最终共识广播

  在协议的这一步,每个最终委员会成员验证从各个委员会接收到的值是否被对应委员会的最少c/2+1个成员签名。然后把交易打包成区块,连接到链上去。为了给区块提供一个可信保证,最终委员会需要运行相同的委员会内部共识算法,网络中的所有成员可以通过验证区块是否被至少c/2+1个最终委员会成员签名来判断区块的有效性。
  最终委员会把最终结果广播到网络中,网络中每个成员验证无误后下载区块并更改自己的本地UTXOs(Unspent Transaction Outputs)。

5. 生成时代随机源

  在协议的最后一步,最终委员会生成随机字符串集合,这个随机字符串集会被用于下个时代。这也就是我刚刚在第一步提到的epochRandomness。

  随机源的生成分成两个阶段:

  • 在第一个阶段,每个最终委员会成员选择一个r位的随机字符串Ri,并且把哈希值H(Ri)发给委员会的其他成员。最终委员会的成员们针对这个哈希值集合S运行委员会内部共识协议达成一致。S集合必须包含至少2c/3个哈希值,这个集合会作为随机字符串集的验证。然后最终委员会在广播区块的同时也向全网广播哈希集S。
  • 在第二个阶段,最终委员会的每一个成员全网广播自己的随机字符串Ri。系统中的每一个节点会收到最少2c/3最多3c/2对Ri - H(Ri),因为最终委员会中的诚实节点会遵循协议,但是恶意节点会选择不发送或者发送虚假值。这是网络中的节点挑出不符合H(Ri)的所有随机字符串Ri。然后每一个节点从他收到的随机字符串Ri中挑出任意c/2+1个进行异或操作得到自己的epochRandomness。因为每个人结合了c/2+1个字符串Ri一定会包含至少一个诚实成员的Ri。并且这个值直到时代结束才被公布给网络中的节点。

  我们回忆一下这些随机串被用作下个时代PoW方案的随机源,所以为了别人可以验证PoW的有效性,节点发送nonce的同时也要把用到的c/2+1个串Ri发送出去。这样其他的节点就可以验证他的随机源是否和承诺哈希集S吻合。

6. 防止双花(double-spending)

  在第一步中我提到过这样的问题:为什么要把交易集合分成不相交的交易子集呢?如何才能做到这样呢?
  各个委员会并行验证交易集,并且各个委员会之间是没有通信的。所以很容易造成双花问题。一个委员会无法确认是否有和自己正在处理的交易冲突的其他交易正在被别的委员会处理。所以ELASTICO 需要一种外部处理方式来保证每个交易的有效性。
  所以为了阻止double-spending,ELASTICO像比特币一样实用了UTXO模型。在ELASTICO中,每个节点在本地维护一个UTXOs数据库,并且在每个时代结束要下载数据区块来更新数据库。为了避免两个委员会处理两个相同input的交易,ELASTICO的每个委员会处理一个不相交片的交易列表。例如,如果有4个委员会,他们将分别处理具有不同前缀00,01,10,11的输入ID的交易。因此,在一个时代内,所有分片都将包括不相交的事务集。

三、性能分析

  为了分析ELASTICO的性能,论文作者的团队对ELASTICO进行了测试。他们把PoW挖矿难度设定为平均花费600秒建立自己的身份。并且网络的节点数从100个分四次依次增加到1600个,委员会的大小c设定为100.
在这篇文章中,我只挑几个典型的数据进行说明。如下图:
在这里插入图片描述
  我们可以看出ELASTICO对于块的吞吐量几乎完成了线性扩展。每个时代生产的块随着网络节点数量线性增加。然而每个时代的时间很长(100个节点时600秒,1600个节点时711秒)。这是因为系统需要等待足够多的节点找到PoW方案并填满委员会。这会导致很高的交易确认延迟,这也是ELASTICO共识协议的一个致命缺陷。
  我们能观察到time to reach consensus(协议延迟)几乎是不变的,维持在100秒左右,不受网络大小影响,但是我们发现100秒的协议延迟是一个很高的延迟。
  这几个数据是我认为最重要性能参数,尽管其他的数据也一定程度的反应了系统的性能,但是分片方案作为对区块链系统的扩容方案,最关心的性能参数莫过于吞吐量和延迟。

四、系统优缺点分析与讨论

1. 优点

  • 首先,ELASTICO作为第一代分片扩容方案为接下来的研究提供了很多的指导思路。PoW(身份建立)+BFT(委员会内协议)的模式也被后续多个分片方案所选择。

  • 其次,他也很大程度的提高了区块链系统的吞吐量。他对于吞吐量的扩展近乎线性,几乎同委员会个数成正比。

  • 最后,协议将交易集合分成彼此不相交的交易子集的方式很有效,避免了大量的跨分片通讯,是网络分片和交易分片中处理交易的一个有效方案。

2. 缺陷与限制

  同时,系统还是存在非常大的缺陷的,16个分片的情况下,交易延迟高达700多秒,这是很难被接收的。我认为原因有以下几点:

  • 系统在等待解决PoW方案的节点填满委员会上花费了太多不必要的时间。系统完全没必要停下所有的工作等待节点解决工作量证明问题,委员会验证交易的工作和寻找PoW方案的过程完全可以并行进行,这样这600秒的延迟就可以被避免。

  • 委员会内部共识选择PBFT,PBFT协议拥有太多通信轮次,是一个通讯复杂度极高的协议,所以协议延迟高达100多秒。所以委员会内部共识可以选择其他通讯开销更低的共识协议。例如FBFT,SBFT和BBFT等。

  • 太过频繁委员会重组。每个委员会只进行一轮共识后就会被拆散重组,这导致很多的时间都被花费到了委员会重组上了。实际上这样频繁的重构是没有必要的,完全可以将一个时代分成多个轮次,进行多个轮次后再进行重组。

  • 委员会重组时没必要把节点完全打散重新组合,可以运行某种协议进行委员会内部的成员替换,替换掉恶意的或消极的节点,并把新加入的节点随机分配到各个委员会中。例如使用Cuckoo Rule等(Cuckoo Rule我会在下一篇文章中进行介绍)。

  • 最后一点是是附加的缺点。我认为系统使用工作量证明的方式来创建身份是低效并且浪费电力的,所以我认为最好能找到替代方案,能有效阻止sybil攻击的身份认证方式。我认为一个有效的方式是通过PoS+VRFs的方式,权益证明是一个不错的避免sybil攻击的身份验证方式,在加上VRFs进行随机筛选,是PoW方案的有效替代。


参考资料
ELASTICO 白皮书: https://www.bubifans.com/ueditor/php/upload/file/20181015/1539597837236127.pdf
网络、交易、状态分片对比:https://blog.csdn.net/gaohaoyang0123/article/details/96743105

写在最后:如果觉得作者分享的文章对学习有帮助,麻烦关注一下作者,作者后续还会不断更新有关于区块链技术的文章。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值