最近在做区块链的扩展性优化方面的研究学习,总结一下当前的主流区块链扩展性技术。
区块链技术提高了数据的安全性与可靠性,但实际使用中存在可扩展性差的显著问题,出现了很多提升区块链扩展性的方案。
当前的区块链扩容方案可以分为三层,分别是第0层扩容,链上扩容和链下扩容。这里要解释一下扩容这个词,之前我认为扩容只是“扩大容量”这个字面意思,但随着深入学习,说的区块链扩容实际上就是提高区块链的扩展性,这是等价的,扩容的英文原文是scaling或expansion,只是中文翻译的不一样,我觉得翻译成扩容或扩展都行。
我对这三层扩容方案做了一个思维导图,包括了主流的区块链扩展性技术,下面分别来介绍每层的具体路线。
第0层扩容主要是优化互联网的数据传输协议,通过减少传播延迟来提升区块链性能。主要有覆盖网络和快速UDP互联网连接协议这2种技术路线。
0层扩容提升区块链扩展性的切入点是:
矿工创建新的区块 要广播给其它节点,全网接受区块后,给矿工的奖励才是有效的。矿工想最大的限度缩短区块的传播时间,所以需要一个网络来加快数据的传播,这个网络就叫中继网络。中继网络的节点具有低延迟和高带宽的特点,它们分布在全球各地,矿工可以连接到离他们最近的中继节点,通过中继网络传播区块,这比P2P网络要快得多。
CDN bloXroute(BDN)
在中继网络的基础上,提出了BDN。关于BDN,首先介绍一下CDN,CDN使用最靠近用户的服务器,来提供高性能的网络传输,提升了用户的响应速度。具体实现是在现有的互联网上再构建一层虚拟网络,在全网各地部署服务器,对网络状况、节点负载、节点到用户的距离以及响应时间这些要素进行综合考虑后,尽可能选择稳定快速的线路,为用户分配最高效的服务节点。
BDN基于CDN的思想,能够快速发送交易和区块。典型项目是bloXroute。它是一个基于BDN和P2P的网络,可以提升区块的传播效率,在保证去中心化和安全性的基础上提升可扩展性。如图,server服务器代表P2P网络的节点传播块,它们在传播块的时候不知道块中的交易、涉及的地址、产生块的矿工,也不知道创建块的实际来源。也就是说,它不会偏向或歧视特定的节点,只能公平地将所有块传播到其它所有网关,这种特点称为可证明的中立性。这个优势可以促使更多节点加入它,在BDN网络高效性的作用下,节点间区块的传播速度将逐渐提升。
QUIC快速UDP互联网连接,是Google 提出的,基于UDP进行并发传输的网络协议。它整合了TCP协议的可靠性和UDP协议的高效性,加快了数据传输速度。它更像一个基础设施,不仅可以应用于区块链,也可以应用于其他领域,在Harmony 区块链项目中应用了该优化协议以提升数据传输的可靠性和高效性。
下面介绍Layer1扩容,也叫链上扩容,是对区块链自身的协议、体系结构进行改进,来提升扩展性。链上扩容主要有数据层扩容、网络层扩容、共识层扩容。
数据层扩容主要是对区块进行修改,增加区块容纳的交易数量,根据修改方式的不同,目前主要有区块扩容、频率扩容、隔离见证、存储扩展和有向无环图这几种技术路线。
首先,区块扩容通过提高区块大小,来增加可以被“写入”区块的交易数量。
那么该扩容多少,根据什么指标进行扩容呢?以比特币为例,与区块扩容相关的提议有9个,可以分为三类:
第一类是以算力为中心:包括100、101、105、109,它们是由矿工投票,来决定区块容量的调整方案;
第二类是以交易量为中心:包括104、106、107,它们的共同特点是根据前一阶段的区块大小调整区块容量;
第三类是随时间递增:包括102、103、107,共同特点是预估比特币交易的需求量,按年度来调整区块容量.
提高区块容量这种方法,可以说是最为直接的扩容方案,但是区块容量增大后,区块在网络中的传播速率会受到影响。比如,原来1M的区块需要10分钟就可到达全网95%以上的节点,但8M的区块可能在10分钟内不能到达全网的节点,这会增加孤块产生的风险,孤块造成的分叉会导致算力分散,增加链的维护难度,同时也降低了算力攻击的难度。所以这种方法只能在一定程度上缓解扩展性的问题,不能从根本上解决。
数据层扩容的第二种方法是频率扩容,指提高区块生成频率,从而增加单位时间内生成区块的数量。实现方式主要有两种:
第一种是降低难度,以pow共识为例,通过调整难度,控制区块生成的间隔在10分钟左右。降低难度可以很容易地缩短区块生成间隔。但这种方式会增加孤块出现的频率,造成计算资源的浪费。随着区块生成频率的增加,节点之间需要进行更多的通信,这也增加了网络带宽的压力。所以单纯的降低难度来提升频率不是一个很优雅的扩容方式。
第二种方式是Bitcoin-NG共识,它将 选举记账节点的流程 与 打包区块的流程分开。如图,区块被分成了两种,分别是主块和微块。矿工们对区块的操作也被分成了两个阶段,分别是选举领导者和打包交易。
Bitcoin-NG将时间分为多个epoch,一个epoch的时间是10分钟,每个epoch要选出一个领导者,选举领导的过程与比特币的挖矿过程相同,通过pow共识进行算力竞争,胜出者作为这个epoch的领导者并生成主块。主块并不包含具体的交易数据,而是包含对上一个区块的引用、时间以及nonce这些可以证明自己是领导者的信息。同时在主块中要公布自己的公钥,用于后续微块的认证。
微块记录交易信息,它的生成不需要消耗算力,生成速度可以很快,通过大量的微块来提升区块容量。同时,由于微块之间的间隔比较短,还可以减少部分交易的确认时间。
这种方法显著提高了比特币的吞吐量,但记账节点频繁地发布微块也会造成网络阻塞,另外也容易受到与比特币相同的攻击,比如51%攻击。
隔离见证是比特币的一个升级,修改了区块的存储结构。原来区块中的交易包含了用来验证有效性的信息,占用整个交易存储空间的近70%。通过减少验证信息的占用空间,可以在区块中存储更多的交易,间接达到扩容的目的。具体实现是删除每笔交易的签名数据,释放区块中的存储空间,将更多交易存储在比特币 1M 的区块中,隔离出来的见证数据放到了区块末尾。
块压缩采取类似的思路,通过压缩块内交易的存储大小,使得单个区块能容纳更多的交易数量。这两种方法虽然充分挖掘区块的存储空间,但是仍受制于区块大小,没有从根本上解决性能可扩展性问题。比如Compact Block Relay。Compact Block Relay改变了比特币中原始区块的结构,只包含区块头和一些短的TXID,这些TXID将用于匹配已经存在于验证节点交易池中的交易。Txilm是基于Compact Block Relay的协议,该协议利用TXID的短哈希表示交易,但是使用短哈希时可能会发生哈希碰撞。因此,利用Txilm协议计算TXID的哈希值时,结合规范交易排序的规则(如CTOR算法)来优化该协议以降低哈希冲突的可能性,并通过“哈希加盐”(如添加CRC32- Merkle根)来防止系统受到碰撞攻击。基于Txilm,在模拟实验中实现了80倍的数据缩减,提高了区块链的吞吐量。
存储扩展考虑的是,如何减轻节点的存储压力,但是不会影响区块链整体数据的完整性和安全性。总结如下:
在DAG 中,每笔新的交易都可以单独作为区块提交。共识机制也不是传统的广播数据验证,而是根据规则传递前一个区块的hash值,数据的记录存储是并行的,打破了链式串行存储结构,提升了区块链网络的吞吐量。DAG 允许每笔交易独立记账,理论上不存在性能瓶颈,但是最后一笔交易却需要等待 新生成交易的节点进行验证,这段等待时间将会带来新的安全性问题。
DAG代表项目:IOTA、Byteball、Nano
单纯研究区块链的网络结构这个领域比较少,一般是与共识算法相结合。区块链采用的P2P网络结构主要有三类:非结构化网络、结构化网络和混合式网络。
非结构化网络采用随机图的组织方式,构成网状网络,适合节点波动比较大的系统,但存在网络开销大的缺点。
结构化网络采用DHT技术管理网络中的结点,将节点按照环状或树状等不同结构进行组织,它提升了对节点的管理和通信效率,但维护网络结构的代价会提升。
混合式网络是P2P与C/S模式结合的产物,似乎是在走回头路,但是由于P2P技术的不完善,需要在一定程度上借鉴C/S结构的优点,它引入了超级节点的概念,综合了集中式网络快速查找和非结构化网络去中心化的优势,但是超级节点容易成为恶意节点的攻击目标。目前对于p2p网络结构的改进主要集中在结构化网络和混合式网络。
当前网络层的扩容方案主要是分片技术,它是借鉴数据库的分片思想,在网络层将节点进行分片,每个分片网络各自进行共识,并行的处理交易,以此来提升区块链的吞吐量。
根据分片对象的不同,可分为网络分片、交易分片和状态分片。
网络分片是交易分片和状态分片的前提,是最基础的一种分片方式,就是将整个区块链网络划分成多个子网络,一个子网络也就是一个分片。
交易分片:在网络分片的基础上,将全网的交易划分到不同的分片中进行分区域共识,每个分片网络可以同时进行共识、验证交易数据,事务由串行处理改为并行处理,提升了区块链网络的整体性能。
状态分片同样建立在网络分片的基础上,区别是每个分片不再存储链的全部信息,而是只存储部分账本信息,减少了部分传输和存储的开销,提升了系统效率。相比于交易分片只能有限提升区块链性能,状态分片能从本质上解决区块链性能扩展问题。但是实现难度较大,它将完整的系统划分治理,也会带来一定的安全风险。
分片在提升效率的同时也带来了新的问题,主要是分片内部的安全和效率问题, 分片的第一步是网络分片,将网络中的节点按照规则分配到不同的子网络,这里的问题是,单个分片的算力以及验证节点的数量 远低于分片之前的整个网络,这稀释了算力,容易造成算力集中在单个分片中实施51%攻击。还有分片间需要克服双花攻击、跨链交易原子性、跨片交易的DDoS攻击等问题。
这里介绍一个分片方案Monoxide,它在经典分片技术的基础上,还提出了连弩挖矿共识,解决了分片算力分散的问题。
首先,它将原来的区块链网络划分成多个组,组之间相互独立,并行的挖矿。每个组有独立的账本状态、区块、交易、数据广播网络以及全节点。矿工可以自由选择参与一个或多个共识组,进行挖矿,来获得每一个共识组中的出块奖励。正常情况下,矿工会优先选择参与当前算力较低的共识组,以获得更高的挖矿成功率,从而导致各个共识组会收敛到一致的挖矿算力和出块难度。
它提出了一种新的共识算法,叫做连弩挖矿,允许矿工同时参与多个编号连续的共识组,同时收集多个组中的交易数据,只需解决一次难题就可以打包多个组中的交易数据,有了这个规则,在一个组中挖矿跟同时在多个组中挖矿所需要的算力资源差不多,但是却能够获得更多的回报,因此能够鼓励矿工同时为多个组挖矿。为什么要鼓励一个矿工可以在多个组中挖矿呢?如果所有的矿工都为多个组挖矿的话,那么矿工之间的算力竞争就上升为全网算力的竞争。这样就缓解了攻击者集中算力在一个组中实施51%攻击的问题。
这里需要提一下联合挖矿,在允许矿工同时参与多条链挖矿这一点上,是很类似的。但是连弩挖矿的设计初衷与联合挖矿完全不同,连弩挖矿是为了放大有效算力,并强制放大后的算力 均匀分布在各个共识组,防止算力集中攻击特定分片。而联合挖矿是为了借用大算力的链,来保证小算力链的安全。
目前区块链的共识协议主要有三类,分别是PoW、PoS和BFT类,其他的共识协议要么是在这三种共识的基础上改进,要么是混合了他们。然而,这三类共识都有他们各自的优点和缺陷。
工作量证明相对安全但是不利于性能的扩展。权益证明类容易形成垄断。拜占庭容错系列的共识有着强一致性,但是却受限于带宽和节点数,随着节点数增加,性能会大幅度降低,不适合作为公有链的共识协议。
关于共识的改进很多,这方面的研究非常活跃,眼花缭乱,我也不敢保证看到了全部,难以涵盖,这里大家根据自己对哪类共识感兴趣自行学习。
最后是第2层扩容,也叫链下扩容,它不改变区块链的基本协议,通过链下改进提升扩展性。 链下扩容允许用户 在没有链上安全的环境中进行交易, 安全性由链上支持 ,具体技术包括 状态通道、链下计算和侧链 。
状态通道的思路是将部分交易转移到链下,只将通道开启和关闭时的状态记录在链上。这样大大降低了链上的交易量,间接提升了系统整体的交易处理能力,并相应的降低了交易手续费。代表技术是闪电网络和雷电网络,之前写文章对这两种技术进行过详细介绍:
闪电网络(Lightning Network)学习总结_CNFINITE的博客-CSDN博客_闪电网络
区块链隐私保护(二): 网络层的隐私保护机制_CNFINITE的博客-CSDN博客_区块链隐私问题
链下计算最初是针对以太坊提出的,由于以太坊存在GasLimit,计算量大的交易消耗gas多,将导致链上拥堵,链下计算的思路是将复杂的交易放到链下执行,结果提交回链上,链上只作数据验证,以此间接提升区块链处理交易的速度,但是也要保证高水准的隐私性和安全性。实现的方法有三类:
链下TEE 计算(TEE, Trusted Execution Environment):第一类是将链下的计算放在可信执行环境中进行,TEE提供基于硬件的计算安全性,Intel芯片的SGX和ARM芯片的TrustZone都可以用于链下TEE计算。
链下安全多方计算:第二类是通过安全多方计算来实现数据可用不可见,类似TEE提供硬件的加密安全,安全多方计算提供基于密码学的软件安全,比如混淆电路、秘密共享、同态加密这些算法,可以实现在各方均不知道完整数据的情况下,通过联合它们对部分数据的计算结果,得到最终结果。
链下激励驱动:第三类是采用激励机制,处理计算任务的求解者和检验结果的验证者,完成相应职责可获得奖励,反之受到惩罚。
链下计算这类扩展方案比较新颖,还在不断发展,距离大规模应用的落地还有距离。
实现链下扩容的最后一个技术是侧链,它最早源于比特币,目的是让比特币 安全地在比特币主链和其他区块链间互相转移。在后来的应用中,侧链的技术也被应用为区块链扩展技术。
侧链是一个独立的链,通过主链资产的双向锚定进行数据交互,侧链依赖于主链,但是独立于主链处理事务,侧链相对主链缺少完备的生态体系,容易成为攻击者的目标,给主链带来可用性和安全性风险。根据主侧链间 资产锁定与解锁方式的不同,可以分为四种模式:
托管模式有单一托管和联盟托管两种,单一托管是选取主链上的单一中间方 作为资产锁定与解锁的管理者,联盟托管则是选取多个托管方组成联盟,采用多重签名的方式对侧链进行资产管理。托管模式实现简单,不需要改变链的基础协议,但是增加了人为参与的中心化风险。
简单支付验证模式是将主链资产锁定到一个地址中,生成SPV证明,用于主侧链间信息的相互验证,也就是SPV证明作为托管方 管理主侧链资产。但是,采用SPV证明进行资产锁定的同时,也是对主链进行了临时的软分叉操作,解锁时,主链的软分叉结束,又对侧链进行了软分叉,给主侧链带来了安全风险。
驱动链模式是将矿工作为托管方,验证主侧链间的数据交互,受利益驱动的矿工作为公正的托管方,监管主侧链资产的锁定与解锁需求,这个模式与SPV模式一样,会带来软分叉的安全风险。 由于主链与侧链在实现机制上存在本质的不同,所以对称的双向锚定模型可能是不够完善的。混合模式是主链和侧链使用不同的解锁方法,例如在侧链上使用SPV模式,在主链网络上则使用驱动链模式。同样,混合模式也需要对主链进行软分叉。
根据前面的介绍,现在来总结一下三层扩容方案:
第0层扩容是对计算机网络体系结构的优化,可能有的改进方案与区块链没有那么强的相关性,基于互联网的系统都能从中得到性能提升。而且在小规模网络中起不到很明显的效果,所以当前第0层扩容方案的研究相较于其它两层不够活跃。比较有名的并且已经落地的是 比特币中继网络和BDN这两类技术路线。
链下扩容的状态通道和侧链源于比特币和以太坊对自身缺陷的改进,已得到较多项目的部署并逐渐推广,而链下计算方案在实施验证方面少于前两者。
相比于链下扩容,链上扩容更能从根本上解决区块链的性能瓶颈,但是其技术难度也相对要高很多,并且对链本身的修改会对链的稳定性和安全性造成未知的风险,尤其是大的改动 用户们会有所顾虑,需要长时间的测试与证明,这也是链上扩容在实施部署方面落后于链下扩容的原因。
虽然对扩容技术按照类别分层,但这3层扩容方案并不是互斥的,可以同时采用链上、链下和第0层扩容方案。不过,目前某些扩容技术还处在探索阶段,同时部署多种扩容方案也会带来更多的潜在风险和不可预测隐患。