当前位置:   金科网 > 区块链 > 正文

如何通过分片来增强区块链的可扩展性

现在有很多研究致力于如何通过分片来增强区块链的可扩展性。而据我所知,这些研究主要的想法是在不牺牲区块链(包括其所有的分片)的不可篡改性和安全性的前提下,使在相互独立的分片中并行执行多个交易成为可能。我能找到的绝大部分研究都聚焦在分片的共识算法上。尽管所有这些研究看起来都很有前景,但我想通过一个不一样的视角来看待分片。

首先,为了论证我的观点,让我们一起来讨论一下现有分片设计中的共识算法。更准确地来说,是讨论当下正在开放的免信任型区块链上运行且可用的共识算法。尽管这些算法是可用的,并且已经在运行了,可是我们真的通过分片获得了希望中的可扩展性么?让我们快速了解一下阿尔达姆定律吧 [1] ,这样你更能体会到我的困惑:

如何通过分片来增强区块链的可扩展性

上述定律表明,在理论上,执行所有任务的速度会随着系统资源的提升而加快,然而,无论提升的幅度有多大,理论速度总是受限于无法从改进中受益的那部分任务的执行速度 [2]。这带来了一个根本性的难题 —— 一旦所有可并行化部分的吞吐量都达到最大时,串行化部分的吞吐量将成为系统吞吐量的天花板。

对于区块链的分片来说,这就意味着吞吐量的潜在增长受限于当前可以在隔离的分片中同时执行的交易数量。也就是说,如果分片中的一笔交易需要来自其它分片的数据,它就不得不从其它分片中同步该数据的转移。这就是一种串行化事务,根据阿尔达姆定律,一大堆分片的存在限制了吞吐量。

独立的原生货币交易

如果两个账户之间的交易被明确地限制为仅在这两个账户之间转移货币余额,比如在两个账户之间发送货币, 那就不需要任何其它账户中的数据。因此,如果两个账户的数据同处于一个特定的分片中是可用的,那么这笔交易和其它账户的交易就可以被异步地执行。当分片数量以及账户对之间不相关的交易数量上升时,网络吞吐量就扩展了。随着账户数量的增长,可以预见的是,对独立交易进行分片的可能性也会增加。在上述限制条件下,吞吐量的大小由执行单笔交易所需花费的时间决定,因为同一时间我们可以执行非常多的交易。这正是我们在考虑提高区块链吞吐量时想象到的理想情形。

为分片设计智能合约

但对于智能合约而言,情况不会有想象中那么顺利。智能合约是作为一个单独的账本账户被部署在区块链上的,账户中除了数据状态还有它的程序代码。代码上运行的每一笔交易都在改变智能合约中的数据状态。每一个改变都被记录在区块链上,并通过一个代表状态的哈希值进行验证。为了保持区块链状态的确定性和连续性,每个智能合约每次只能在一个分片中执行,除非智能合约账户本身的状态也能被分片。总之,这使得对于所有往智能合约发送交易的账户而言,智能合约账户的执行成为了限制因素。由于智能合约被用于发行代币,因此随着特定代币流通量的增加,无论存在多少分片,其智能合约很有可能成为吞吐量的瓶颈,正如阿尔达姆定律所预测的那样。

就目前有关智能合约的分片实现来看,我只能看到两种可能通过分片提升扩展性的方式:

· 使用隔离在分片中的多个智能合约

· 使用确定性的多线程智能合约,(又称 SIMD)

使用多个智能合约可以充分发挥分片的优势。举例来说,如果每个智能合约(代表一个代币)都被分配到一个单独的分片中执行,那么对于一个特定的代币而言,其交易不会对其它代币的交易造成影响。尽管每种独立代币的交易都受限于它所在的特定分片中智能合约的吞吐量,但分片的数量可以随着大量且不断增长的代币而线性增长。这并没有解决单个智能合约的吞吐量问题,但是对于一个所有合约都在一条链上、没有分片的区块链而言,它是一个改进方案。

不过,即便使用这种方法,只要一个用户账户的状态被分散在不同分片间、又同时被需要(例如,使用原生货币来支付交易),问题还是会出现。

一种来自超级计算的叫做矢量化(vectorization)的技术使得程序能够并行地执行其部分代码。这就是为人熟知的的单指令多数据流(“SIMD”)。针对 SIMD 编写的程序都是确定性的。从本质上来说,SIMD 机器(也就是如今的通用型 GPU(“GUGPU”))是通过一系列的处理器来对其数据进行分片的。这对于某些类型的应用来说非常有效,诸如图形以及类似的矩阵运算。