区块链扩容方案之——分片(sharding)

分片背景

  这篇文章介绍的区块链扩容方案是分片技术(sharding)。目前区块链扩容领域中的扩容方案有很多,目前看来sharding是这些扩容方案中最有效的。在传统不分片的区块链中,通常在一段时间里只产生一个块,全网所有的矿工竞争唯一的挖矿权,或者针对一个块达成共识。为了提高吞吐量和延迟,通常只能通过提高区块生产速度或者增加区块的大小来完成扩容。然而我在之前的文章也提到过,这两种方式都存在缺点(频繁分叉或者网络延迟)。随后开发者开始把视线集中在了分片上。分片是通过改变网络中验证块的方式来增加吞吐量的。

分片思想:分而治之

  区块链分片是受传统数据库分片概念的启发,数据库分割为多个部分并放置在不同的服务器上。在分片网络中,节点被分到不同的分片中,网络中的交易也会被分到不同的分片中。因此,每个节点只处理一小部分传入交易,并且它将与网络上的其他节点并行执行。这样将网络分成碎片将导致更多事务被同时处理和验证,原本只能验证一个区块的时间内,可以同时验证多个区块,从而完成对吞吐量的扩展。分片的最大优势在于它可以真正做到线性扩展。吞吐量的大小同分片的数量线性相关。
我们可以想象现有的区块链就像一条只有一个收费站的繁忙的高速公路。这样一定会导致交通堵塞,因为人们排长队等待并通过收费站。引入分片的区块链就像在高速公路上增加15或20个收费站。它将大大提高车辆通过的速度。分片会对交易的处理速度有非常大的提升。

分片策略(分类)

  分片只是一个基本的概念。在实际的实现过程中可能有很多种方式。目前主流的分片实现方式可以分为以下三类:网络分片(network sharding),交易分片(transaction sharding)和状态分片(state sharding)。网络分片和交易分片更早被提出,网络中的节点被分到不同的分片中,每个分片针对不同的交易子集进行处理、验证并达成共识。这样不同的交易子集可以被并行处理,各个分片之间也不必进行频繁的通讯。
另一方面,在如今的公共区块链系统中,节点为了可以验证交易的有效性,需要存储系统所有的历史交易区块和UTXOs(Unspent Transaction Outputs)。如果我们把区块链的吞吐量扩展到了Visa级别,简单的计算可以算出每年增长的存储消耗会高达21.5 TB,如下图。
在这里插入图片描述
  这样的存储空间消耗会给节点造成很大的压力,存储全部区块的全节点会越来越少。随之,系统的安全性也会越来越差。所以为了解决这样的问题,状态分片的方式被提出了。这种分片思想的核心是,把网络和交易进行分片的同时,把存储状态也进行分片,让每个分片中的节点存储不同的部分。因此,每个节点只负责存储自己分片的数据,而不是完整的区块链状态。这样的话,如果我们把网络和存储状态分成20个碎片,那么每个分片一年增长的存储消耗就会变成1TB这样可以接受的范围。

在这里插入图片描述

潜在挑战:

  前面整体上介绍了三类分片方案。很直观的体现了他们彼此的不同。不同的分片方式存在他们自己独特的优势,一般来说,网络和交易分片更容易实现,而状态分片更加复杂。同时在网络和交易分片中,每个节点存储着系统的全部状态,所以各个分片之间不需要频繁的交流去确认其他分片的状态。对于状态分片,显然最大的优势是他解决的日益庞大的存储问题。但是同时他们各自也存在很多潜在的挑战,有些挑战很容易克服,而有些挑战却很难克服。下面,我会讨论不同的分片机制存在的一些挑战和他们的可行性。

1.网络分片(Network sharding)

  网络分片的第一个也是最重要的挑战是分片的创建。需要开发一种机制来确定哪些节点以安全的方式驻留在哪个碎片中,以避免有人可能通过对特定碎片的大量节点进行控制的方式对系统进行攻击。
  击败对手的最佳方法(至少在大多数情况下)是通过随机性。通过利用随机性,网络应该可以随机地对节点进行分配从而形成分片。随机抽样可防止恶意节点过多地填充单个分片。
  但是,仅使用随机机制将节点分配给分片是不够的。还必须确保分片中的所有成员都是获得系统认后加入的。例如,可以通过工作证明(Proof of Work)来实现对节点身份的验证。
  例如在Elastico中,节点用自己的IP地址和公钥做为身份的认证,在加上上一个时代结束时生成的随机数,进行工作量证明运算。只有能提供工作量证明的身份才能加入网络。

2.交易分片(transaction sharding)

  交易分片并不像听起来那么简单。考虑在类似比特币的系统中引入交易分片(没有智能合约),系统的状态是使用UTXO定义的。让我们假设网络已经由分片组成,并且用户发出了一笔交易。这笔交易有两个输入和一个输出。现在,该如何将此事务分配给分片?
最直观的方法是根据交易哈希值的最后几位来决定被分到哪个分片。例如,假设我们有四个分片,哈希值的后两位为00,01,10,11的交易会被分别分配给第一,二,三,四个分片。这样做最大的好处在于交易可以在单个分片中被验证,不需要跨分片通讯。但是,如果用户是恶意的,他可能会使用相同的输入创建两笔不同的交易,从而造成了双重花费(double-spending)。如果两笔交易被分到了不同的分片,那么两个分片都会认为自己手中的交易是有效的,从而造成了双花攻击。
  为了防止双重花费,在验证过程中,分片必须相互通信。事实上,由于双花交易可能落在任何分片中,因此接收交易的碎片必须与每个其他分片都进行通信。事实上,通信开销可能会破坏交易分片的扩容效果。
  事实上,当我们拥有基于帐户(Account-based)的系统时,问题会更容易解决。每个交易都将具有发件人的地址,然后可以根据发件人的地址将其分配给对应的分片。这确保了造成双花的两笔交易将在同一个分片中得到验证,这样,双重花费可以在没有任何跨分片通信的情况下轻松被发现。

3.状态分片(state sharding)

  事实上,状态分片是迄今为止所有分片提案中最具挑战性的。状态分片遇到的第一个挑战就是频繁的跨分片通信和状态交换。由于每个分片只存储系统的部分状态,分片之间不得不通过大量的通信来获取存储在其他分片中的信息,只有这样才能验证交易是否有效。例如,在一个UTXO模型的区块链系统中,某一笔交易可能有多个输入(input),而这些输入可能存在与其他的分片中,输出分片必须要和所有的输入分片通信确认用户提供的输入是否有效,这会造成大量的通信成本。那么在一个基于账户的系统中也同样需要大量的跨分片通信。所以如何确保跨分片通信成本不会超过状态分片的所获的的性能增益仍然是一个值得深入研究的问题。个人认为,对于跨分片交易(cross-shard transaction)的解决方案目前有三种值得探讨,他们分别是OmniLedger, Rapidchain和Harmony。他们提出的解决方案各不相同,有各自的优点,同时也各自存在问题,我会在以后的文章中详细介绍本文提到的这四个分片方案(包括Elastico)。
  状态分片的第二个挑战是数据可用性。考虑一种情况,由于某种原因,某个分片可能受到攻击而导致脱机。由于系统的状态没有在所有分片中复制,因此网络一旦有交易的输入是来自脱机的分片,那么这笔交易将无法得到验证。这样,区块链很有可能变得不可用。这个问题的解决方案是维护存档或备份节点,以帮助网络进行故障排除并从数据不可用中恢复。然而,那些节点将必须存储系统的整个状态,因此可能引入集中化风险。

  最后,在任何分片机制中都要考虑的另一个挑战(不是特指状态分片)是为了确保分片不是静态的,为了抵御攻击和故障,网络必须接受新节点并以随机方式将它们分配给不同的分片,并且随机驱逐旧的不活跃节点。换句话说,每隔一段时间网络必须重新洗牌。

  然而,在状态分片的情况下分片的重新配置更加棘手。由于每个分片只维护一部分状态,因此一次性重新洗牌可能会导致整个系统不可用,直到某些同步完成。为了防止中断,必须逐步重新调整网络,以确保在逐出节点之前每个分片都有足够的旧节点。类似地,一旦新节点加入分片,就必须确保节点有足够的时间与分片的状态同步,否则新加入的节点将完全拒绝每一个交易。在介绍Rapidchain分片协议的文章中我会重点介绍一个委员会重组方案,叫做有界的布谷鸟原则(Bounded Cuckoo Rule),它可以更加高效的进行分片委员会重构,并且同时可以防止恶意节点控制某个分片的行为发生。

总结

  三种分片方式都有各自的优缺点,目前也都存在局限性,没有一种分片方案是完胜的。目前来看很难做到完全的优点,只能根据系统的应用场景和系统重视的方面的不同在各种方案之间权衡利弊。

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

  • 14
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值