潘业达 ,陈恭亮 ,郭乃网
(1.上海交通大学,上海 200240;2.国网上海电科院,上海 200232)
随着数字货币的火热,区块链技术逐步进入公众的视野,并引起了广泛的讨论和研究。目前,虽然区块链各个方面的研究火热,但是距离真正投入使用、影响并改变人类现有的生活生产方式还很长的路需要探索。影响区块链投入使用的一个重要原因在于目前的区块链系统性能无法满足日常生产生活需求,其中最重要的瓶颈在于其低下的吞吐率。因此,本文分析限制区块链吞吐率的因素,分别举例说明如何突破这些瓶颈以提升区块链吞吐率,以期区块链更早投入生产。
区块链技术是中本聪[1]构建比特币系统的底层技术,随着密码货币市场的火热,逐渐被学术界所关注和研究。区块链技术是集分布式系统、点对点网络、密码学于一体的新兴技术,主要解决了在没有引入可信第三方的基础上,在相互不信任的节点之间达成共识的问题。突出贡献在于,能够在拥有大量参与者的情况下(比特币十几万个节点),无准入且可以随时退出的情况下达成共识。这相较于传统的基于投票的BA类共识协议有了巨大的突破(在PBFT中,参与节点不能超过100个,且所有的节点需要引入可信第三方对节点身份进行认证,同时在协议开始运行后不能有新的节点加入)。
同时,区块链通过使用Hash函数、Merkle Tree、数字签名等密码学方法,构造出了一条证据链,使得上链的数据在经过有限的时间等待后无法被篡改,在各个节点之间形成一个公共的账本。区块链技术通过其开创性的共识协议,为互不信任的节点提供了一种信任机制,即由对传统意义上人、企业、政府等实体的信任,转移到对点对点网络、密码学等技术的信任,可能带来下一次的信息技术等革命。
虽然区块链技术的前景十分广阔,但目前技术发展并不成熟,无法支撑现阶段业务的正常运行,其中区块链的低扩吞吐率是最大的瓶颈。相较于比特币理论上的7 TPS和以太坊的15 TPS,日常系统可能每秒转账(交易)量需要上千上万。如此低的吞吐率,在实际应用中杯水车薪。
如图1所示,区块链可以根据功能由低到高划分为密码基础层、网络层、共识层和应用层四个层次,分别对应于数字签名、Merkle树等密码算法,点对点网络,POW、POS、PBFT等共识协议,智能合约等上层应用。其中,密码基础层对于区块链的性能等影响主要体现在签名和验签过程,可以使用更加轻便的签名算法如BLS短签名;网络层性能瓶颈主要在于点对点网络的性能瓶颈,其突破需要点对点网络的进一步发展;应用层是构建在底层区块链网络上的具体应用,因此暂时不予考虑其对吞吐率的影响;而相较于其他三层,共识层是目前吞吐率的短板,限制了区块链性能的提升。因此,本文在主要讨论共识层提高吞吐率的模型,并举例分析如何实现吞吐率的提升。
图1 区块链层次结构
共识层中,限制区块链吞吐率的主要因素是其链状的结构,因为只有被记录到区块链上的交易才是有效交易。决定交易吞吐量的因素有三点——出块速率、块的大小以及是否可以通过并行提高系统的吞吐率。因此,如果想要提高区块链的扩展性,要从这三个方面入手。但是,由于区块链的安全性限制,如果过度提高出块的速率或者区块的大小,会导致安全性的下降。同时,由于区块链的链式结构,通过并行来提高吞吐率十分困难。后续章节中,本文分析了限制上述三点的主要因素,提出了可能的解决办法,并且通过例举现存项目分析比较其优缺点。
由于区块链的链式结构,如果出块速率过快,会导致产生过多分叉,进而影响系统的安全性,如图2所示。从直觉上看,如果两个区块之间的时间间隔短于整个网络的网络延迟,会出现这种情况。假设将所有的节点进行线性排列,当第一个节点在高度i发出一个区块,然后逐个向后面的区块进行传递。如果在到达所有节点前,最后一个节点在同一高度也产生了一个区块,并且向前传播。这样前一部分节点在高度i的区块为,剩余的节点在高度i的区块为,区块链产生了分叉。此外,随着出块速率的提高,分叉的可能性也在提高,其安全性呈指数下降,无法提供50%的安全性,攻击者可以用更少的资源攻陷区块链系统。如图2所示,随着出块速率的增加,安全系数呈指数下降,这在文献[2]中有具体说明。
如果想要提高出块速率而不影响吞吐率,则需要解决分叉问题。这里主要提出两种解决分叉的方法:一是通过改进传统的拜占庭共识协议,二是通过改变区块链的结构,从传统的链式结构转换为有向无环图结构(DAG)[3]。
图2 安全性与出快速率关系
首先,区块链产生分叉的原因在于,节点可以在区块链的任意位置向后延伸,即在区块链的同一高度可以产生多个区块,而哪一个区块被最终确认是概率性事件。如果在区块链的相同高度只能产生一个区块,那么就不会产生分叉。而传统的共识协议对于一个事件的共识只有达成共识和不达成共识两种状态,因此如果使用基于传统拜占庭共识协议,并不会因为出块速率的提高而导致分叉的产生。但是,传统的共识协议并不支持大规模共识。例如,PBFT[4]参与的节点数理论上不能超过100,这在公链系统要求全网参与的情况下杯水车薪。因此,基于拜占庭共识的协议通常做法是通过某种算法,均匀采样产生一个委员会和一个备选区块。在委员会中对备选区块进行投票,如果投票成功产生区块,如果投票失败,这一轮不产生区块。需要注意的是,为了委员会中好人占的比例大致同整个网络中好人的比例相等,要求委员会的大小不能太小,需要远大于100,这样传统的拜占庭共识协议无法满足需求,需要对现有的拜占庭类协议进行改进,以支持更大的参与者。这类协议中较优秀的是Micali教授提出的Algorand[5]算法,通过VRF[6]随机产生备选区块和委员会,并通过一个其称为BA*的二元输出的拜占庭共识产生一个一致的输出。Algorand算法的公平性体现在每一轮都会产生一个新的委员会,以保证委员会的代表性。
Algorand在实验环境下50 000个节点参与,区块大小为2 MB的情况下,出块的时间间隔约为12 s,吞吐率约为327 MB/h,相较于比特币的6 MB/h提升了50倍以上。同时,实验表明,区块的大小在Algorand中对确认时间几乎没有影响,因此可以通过提高区块的大小进一步提高吞吐率。例如,在区块大小为10 MB的情况下,Algorand的吞吐率大约为750 MB/h,是比特币吞吐率的125倍。
通过使用改进的拜占庭共识的问题在于,为了使委员会中的坏人比例大致等于全网中的坏人,委员会的大小需要得到保证。在Algorand实验中,委员会的大小为5 000个节点,在委员会中需要进行多轮投票,导致网络会产生大量的投票信息而出现网络拥塞。
传统的区块链中,同时有多个参与者在区块链的不同位置向后扩展,但是最终只有一条链会被接受,即从全局来看,全网生成的是一棵树状的结构,但为了能够为其中的区块提供一个不可篡改的顺序,即抽象出一个公共账本,区块链选择只接受其中一条链,其余分支将被舍弃。因此,不管用何种方法选取这条链,都会不断产生分叉。如果分叉的速率和数量太多,会影响系统的安全性。DAG(有向无环图)的思想是,如果将网络中的所有的区块全部包含到最终的状态图中,那么将不存在分叉。此外,还可以从两个方面提高系统的扩展性。第一,出块的速率可以更高,因为系统存在分叉,出块速率的加快不会带来安全性的降低。第二,在链式结构中,部分产生的区块被忽略了。在DAG结构中,所有的合法区块最终都会被包含在最终的系统中,所有参与者对于打包交易的贡献最终会体现在最后的系统状态中,实现了某种意义上的并行。
有向无环图同传统链式结构的主要区别在于,每个区块中不仅包含一个父区块的Hash值。有向无环图应当包含多个区块的Hash值,从而构成一个有向无环图的结构,且其包含的区块的Hash值应为在其本地视图下最新的没有子区块的区块。DAG的结构如图3所示。
图3 DAG结构
如果使用DAG结构,其主要的挑战在于如何在一个有向无环图中提取出一个公共账本,或者说如何比较任意两个区块之间的先后顺序。目前,有两种方式。一种方式是对任意两个区块,通过直接或者间接连接到或被其连接的区块进行投票,获得票数多的区块被认为顺序更靠前。这里,计票过程在各个节点根据本地的视图中进行的。投票的原则在SPECTRE[7]中有具体描述,这里不再赘述。第二种方式是,在DAG中通过某种方法提取一条主链来为全视图中所有的区块给出一个唯一的序列号,进而构造出一个公共账本。这种方式在文献[3]中提出,假设有一个算法能够在DAG的视图中提取出一条主链,这条链需要满足区块链的安全属性,即链的增长性,公共前缀和链的质量[8]。通过这条主链为全视图中的所有区块提供一个全视图唯一的序列号。目前,较为可行的办法是通过Ghost[9]方法进行主链的选择Conflux[10]。Conflux在构造有向无环图时,将连接前向区块分为父节点和叔节点,连接父节点的边为主边,连接叔节点的边为从边,父节点的选择是根据Ghost中的最重链原则进行选择。首先,去掉所有的从边,将视图从一个图退化成一棵树,在这棵树中使用GHOST算法,选择出一条主链。在Conflux中,在网络节点个数为20 000、区块大小为4 MB、出块速率为0.4个/s、网络带宽为40 Mb/s的情况下,吞吐率为6 400 TPS。
需要注意,目前DAG还处于基于POW阶段,使用POS的协议多存在安全性隐患,失去了区块链去中心化的意义。同时,由于POS的DAG不需要消耗资源,它可以在DAG的任何节点后产生区块,并且最终都会被包含在所有参与者的视图中,这样DAG的视图可能无法收敛。因此,目前DAG并不适合使用POS一类的不需要消耗资源的协议选取主链。同时,由于所有的合法区块都会被包含,区块中的数据有大量重复,造成了大量的数据冗余,其对扩展性的提高无法达到预期效果,且增大了存储负载。
一昧地扩大块的大小会带来两种问题。一是随着块的增大,其广播到全网中所有节点的时间(网络延迟)会线性增长,如图4所示。出块速率是相对于网络延迟而言的,在出块速率不变的前提下,增加网络延迟变相地提高了出块速率,导致了更加频繁的分叉,进而影响了系统的安全性。二是当区块大小增大,则出块的节点所拥有的权利(打包交易的数量)随之增大,会导致某种意义上的中心化。可以想像,如果块大小无限大,那么这就是一个中心化系统。单纯提高区块的大小,会导致网络延迟的增加,因此可以将一个大区块拆分成许多小区块。小区块的确认独立于大区块,即小区块的接收可以随时停止,且全网都会同步到相同的小区块上。在现有的协议中,康奈尔大学博士后Ittay Eyal等人提出的bitcoin-ng[11]协议最具代表性。
图4 区块大小同网络时延关系
图5 bitcoin-ng结构
Bitcoin-ng将区块分为主区块和微区块两种角色。主区块中包含工作量证明信息,微区块中包含具体交易信息和产生主区块的节点签名。主区块之间的时间间隔需足够长,防止出现过多的分叉。从创世区块开始,所有的节点基于创世区块进行POW。成功算出POW的nonce值的节点首先产生一个主区块,其中包含POW的验证信息和自己的签名,广播到整个网络中。收到这个主区块的其他节点停止基于创世区块的POW工作。产生主区块的节点不断打包网络中的交易成为一个个微区块,将微区块广播到网络中去;其他的节点选择基于某个微区块进行下一轮的POW,产生新的主区块,结构图如图5所示。
理论上,bitcoin-ng的吞吐率只受单个节点处理速度的限制,因为高的吞吐率不会产生分叉。虽然微区块之间的时间间隔可以远小于主区块,但是其时间间隔不能够无限小。微区块的出块速率非常快时,会导致在主区块出块附近出现非常多的分叉,分散了算力,严重影响系统的安全性。
另一种拆分区块的方法是首先选出一个领导者,领导者不断打包交易直到产生新的领导者。这种协议中具有代表性的是康奈尔大学的Elaine教授提出的Thunderella[12]协议,主要过程为:
(1)选出一个加速节点;
(2)选出一个委员会;
(3)加速节点收集网络中的交易信息,将交易的信息进行排序后签名发送给委员会;
(4)委员会对交易进行投票,如果一条交易收到的票数超过了3/4,那么这笔交易就被确认;
(5)否则,交易进入底层的区块链系统,等待足够长的时间,进行确认。
相较于bitcoin-ng在微区块之间需要有一定的时间间隔,Thunderella中的领导者在两个交易之间不需要等待,可以连续向委员会发送交易,这样在领导者为诚实的且委员会中超过3/4是诚实的情况下,系统的性能瓶颈被限制在领导者的单节点处理速度和委员会投票的通信复杂度上。同Algorand一样,这种使用投票的共识协议会大大增加网络中路由交易信息的数量,造成网络拥塞。
区块链单条链的结构使得打包交易过程只能够串行进行,串行的模式导致难以通过并行提升效率。在串行模式下,吞吐率的上界被单节点的网络速度和处理性能从物理上被限制,且随着网络规模的增大,系统的性能不能同比上升,甚至会有所下降。为了使得区块链能够实现并行,可以有两种方法。一是将区块链系统分层,底层是区块链网络,只存储关键信息,上层负责具体交易的处理,上层之间相互独立,可以并行处理数据;二是借助分片技术,拆分系统中的资源,各个分片单独处理各自的交易。
区块链的主要优势在于能够在互不信任的网络中提供一个较可信的环境,并且将所有的交互信息进行存储。但是,在实际的生产生活中,交易完整的处理过程不需要都在可信环境下,所有的数据也无需无差别存贮。事实上,只要在交易的重要过程能够提供一个安全环境,且对关键数据进行存储,就可以满足日常生产生活的需求。分层的思想是关键的交易和信息在底层的区块链执行和存储,非关键交易的具体执行和中间结果由参与方线下执行,线下的交易可以并行处理。从全局来看,这大大提高了系统吞吐率。
在分层的解决方案中,较具代表性的是闪电网络[13]。在闪电网络中,需要进行交易的双方需要向区块链提交一个智能合约来创建交易通道,在智能合约中需要将一定量的代币锁定。在创建好支付通道后,交易双方在线下进行交易,交易的安全性通过多方签名来保证。交易结束后,将最后的状态提交到主链上,并且释放通道关闭交易。主要流程如图6所示。
图6 闪电网络交易过程
虽然闪电网络将多个交易简化成了两个交易,但是其使用范围十分受限。在闪电网络中,线下交易只能在已有直接或者间接通道的用户之间进行,同时只有在交易频率较高的情况下才能够体现出其优势。但是,在网络中存在大量的一次性交易,即A向B发送一笔交易后,后续长时间内A和B之间不会发送交易。在这种情况下,单笔交易会被扩展为两笔交易,得不偿失。
分片技术是一种应用于数据库分片的传统扩容技术。它将数据库分割成多个碎片,并将这些碎片放置在不同的服务器上。在区块链情境中,网络上的交易将被分成不同的碎片,由网络上的不同节点单独处理。每个节点只需处理一小部分传入的交易,并且通过与网络上的其他节点并行运算,可以同时完成对交易的验证和处理。因此,随着网络规模的增长,区块链同步提升将成为可能,这种属性也称为水平扩容。
在区块链中,通过将参与者分片,每个分片单独处理,存储不同的交易信息。可以将每个分片想象成一个子链,所有的子链构成了完整的区块链。区块链中,分片的技术难点在于保证跨分片交易的原子性。一笔交易如果被接受,在所有的分片中都会被接受;如果不被接受,所有的分片都会拒绝这比交易。即状态的改变是原子性的,全网中的状态是相同的,如何实现在文献[14-15]中有具体的描述。同时,在分布式系统中,分片由中心节点来决定。但是,在区块链系统中,没有一个中心的系统来进行分片。要保证分片的随机性,需要有一个随机源来产生随机数进行分片。庆幸的是,区块链所要解决的问题是随机选取一个节点来打包交易完成出块,因此在现存的一些共识算法中可以提供这样一个随机源。例如,Algorand中通过VRF产生随机数,或者通过POW产生的符合要求的nonce值(虽然这不是一个随机数,但是也是一个不可预测的值)。
本文总结了限制区块链吞吐率提升的主要因素,抽离出提升区块链吞吐率的架构,并从三个方面描述了提高区块链吞吐率的模型,举例进行了具体分析。在同一协议中可能会使用其中一种或多种,表1中例举比较了各个协议中提高吞吐率的情况。其中,Y表示该协议拥有该特性,N表示没有。
表1 提升吞吐率协议对比
相信随着技术的发展,当吞吐率不再是限制区块链实用的主要影响因素时,区块链作为可能的下一代信息革命的优势将真正展现出来。