观点 | 反思分片和智能合约的制约因素

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

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


阿尔达姆定律

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

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

独立的原生货币交易

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

为分片设计的智能合约

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

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

  • 使用隔离在分片中的多个智能合约
  • 使用确定性的多线程智能合约,(又称 SIMD)

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

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

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

理论上来说,这项技术也能被应用到区块链的智能合约中。也就是说,智能合约可以被明确地编写为通过某种方式来支持交易的并行执行。至于这要如何实施,我并不太清楚。也许在这片领域里会涌现出一些创新的区块链研究。然而,可以预见的是,即便有了一个这样的解决方案,编写一个适合 SIMD 运行的智能合约也会变得相当复杂。

无论是使用隔离在分片中的多个智能合约,还是使用 SIMD 智能合约,都很难算作一个理想的解决方案,尽管它们都有可能提高可扩展性。

智能对象资产使分片成为可能

对于智能合约的分片来说,其主要的限制因素在于状态的分片和代码的执行。如果存在一种方法可以避免在单个智能合约状态和代码执行中的交易串行化,分片就可以通过增加吞吐量来提升扩展性。换言之, 如果存在一种多指令多数据流 (“MIMD”) 的执行方法,通过区块链分片来提升可扩展性的机会将显著提高

正如我们在 “反思区块链账户概念” [3] 这篇文章中所描述的那样,如果每个用户账户都有它自己的状态,而不是使用相互独立的智能合约的话,那么每个用户账户都能包含代表资产的对象,无论该对象是代币还是其他类型的实体。正如文章 “可扩展的智能对象资产、智能对象资产所有权及基于 DataGrid 区块链的扩展区块链对象模型的分数级智能对象资产所有权” [4] 所述,XOSA 和对 XSOA 的引用可以被用于在账户状态之间通过交易直接转移账户之间的所有权。

举例来说,假设有两组交易,其中每笔交易都介于不同的账户之间,也就是说:一笔交易从账户 A 发送到账户 B;另一笔交易从账户 C 发送到账户 D,那么这两笔交易可以在不同的分片中被同时执行。进一步来说,因为 XSOA 的代码独立于任何账户,且对于每笔交易来说,代码可能并不相同,因此我们可以使用一个 MIMD 模型实现分片。 在该模型中,每个分片中的代码和数据都各不相同

对于这个模型而言,限制其可扩展性的因素是不相交的账户组之间能同时发生的交易数量。我们可以预见的是,随着账户数量的增长,不相交的账户组之间发生任意一组交易的机会也会增加,这反过来将导致分片的机会也得到增加。

结论

作为一种已经假定可用的分片共识算法,一个突出的问题在于如何使用这些技术。智能合约天然地会将交易串行化,除非使用复杂的 SIMD 类型的解决方案,就只能通过使用多个隔离的智能合约来提供扩展性。即使使用这一方案,每个智能合约的吞吐量仍会受到单个分片的吞吐量限制。通过重新让用户账户来包含状态信息,并使用 XBOM 模型,DataGrid 区块链提供了一种提升分片可扩展性的解决方案——根据账户的数量和账户之间的不相交交易来进行扩展。除了支持继承和实时代码重用以外,我们认为这是一个对于区块链扩展性问题的重要的解决方案。

[1] https://en.wikipedia.org/wiki/Amdahl%27s_law

[2] 同上

[3] https://medium.com/@dbeberman/rethinking-the-blockchain-account-concept-6c94748f8021

[4] https://medium.com/@dbeberman/extensible-smart-object-assets-smart-object-asset-ownership-and-fractional-smart-object-asset-995c259a8508

原文链接: https://medium.com/swlh/rethinking-sharding-and-smart-contracts-for-maximizing-blockchain-throughput-acb7f5d32063#_ftn3

作者:Michael Holdmann

翻译&校对:曾汨& 阿剑