图解丨区块链分片(Sharding)的原理、挑战和风险

 2023-10-01 10:37:35发布 2023-10-01 10:37:43更新

分片(Sharding)是一种数据库分区概念,用于提高数据库效率。区块链分片的基本思路是将区块链网络中的节点分成若干个相对独立的分片,单个分片处理规模较小的事务甚至只存储部分网络状态,多个分片并行处理事务,理论上整个网络的吞吐量将会提升。

什么是分片

分片也称为水平分区,即将一个大的数据库切分成很多小的、可处理的部分,从而提高性能,缩短响应时间。

分片并不是一个新的概念,早在 90 年代后期就出现在了传统的中心化数据库管理中。这个概念的流行,要归功于一个多玩家同时在线玩的角色扮演游戏 Ultima Online。在这个游戏中,开发者将玩家分配到不同的服务器来缓解流量压力(这意味着有很多个平行的“游戏世界”)。

商业上,一个普遍的分片案例就是将用户信息的数据库按照地理位置划分,同一个区域的用户信息放在一起,存到单独的服务器中。

区块链的分片

区块链就相当于一个数据库,每一个节点都相当于一个独立的服务器。正常情况下,这些节点每次只有一个节点能获得记账出块的权利,剩下没获得出块权的节点相当于做了“无用功”,白白浪费了算力。

如果将分片技术运用到区块链中,就相当于将区块链网络里的所有待处理任务(比如确认交易、运行 DApp 等)进行分解,全网的节点也进行分组,每一组同时处理一个分解后的任务(比如 150 笔待确认交易),这样就从原先单一节点处理全网的所有任务变成了多组节点同时并行处理。

举个例子,假设目前以太坊上有 8,000 个节点(矿工),全网待确认的交易是 15,000 笔。以太坊每秒能处理 7-15 笔交易,正常情况下至少需要 1000 秒才能处理完这些待确认的交易,当然处理的过程中又会有新的待确认交易产生。

如果采用分片技术,将 8,000 个节点分成 100 组,每组 80 个节点,这 15,000 笔待确认交易分成 100 个分区,每个分区 150 笔,那么,每组节点(80 个)可以并行处理各自分区里的待确认交易(150 笔),这样最快 10 秒钟就可以全部处理完那 15,000 笔待确认交易。

通过分片技术,可以大幅提高区块链的性能。

分片原理图示

分片原理图示

分片层级

区块链分片的层级由下到上分别为:

网络分片(Network Sharding)

网络按照一定规则选取节点形成分片。实施分片的第一步就是创建分片,因此网络分片是交易分片、计算分片和状态分片的基础。

交易分片(Transaction Sharding)

将交易按某种规则分配到不同分片。其思路为,按一定规则将交易分配到同一个分片处理,则既能够达到并行处理的目的又能避免双花问题的出现。在不同的记账方式下,对交易分片的要求有所区别。

目前区块链网络中存在两类记账方式,分别为UTXO模型和账户/余额模型,典型代表分别如BTC和ETH。

UTXO模型

在BTC交易中,每笔交易都会有一个或多个输出,UTXO指尚未花费的区块链交易的输出,可以作为新交易的输入,而已花费的交易输出不可再花费,类似纸币交易情况下的支付和找零,顾客将一张或多张纸币支付给店家,店家则将一张或多张纸币找零给顾客。

账户/余额模型

系统记录每个账户的余额,在进行交易时,系统检查账户是否有足够余额用于支付,类似于银行转账时,银行会记录每个账户的余额,只有账户余额大于所需转账金额时,交易才能够进行。

UTXO模型下,交易分片需要跨分片通信。在账户/余额模型下,由于一笔交易只有一个输入,因此只要将交易按照发送者地址进行分片,就可以保证同一个账户的多笔交易在同一个分片中处理,有效防止双花。

在UTXO模型下,一笔交易可能包括多个输入和多个输出,仅仅按照地址分片无法避免双花问题,分片之间不得不进行通信,如果限制跨分片交易将限制平台的可用性,而允许跨分片交易则不得不权衡跨分片通信的成本和性能提升带来的收益。

计算分片(Computational Sharding)

计算分片:只有网络的一个子集(如一个分片)执行计算,从而高效执行运算密集的任务。

状态分片(State Sharding)

状态分片:特定的分片只存储部分状态,而不是完整的区块链状态。状态分片能够减少状态储存冗余,状态分片是最为理想化的分片方式,但是面临着一系列挑战,如跨分片通信、数据有效性和数据可用性等。

区块链网络中验证节点的主要任务包括:

  1. 处理交易,随着处理交易量的不断增长,节点将需要更多的计算能力;
  2. 将已被验证的交易和已完成的区块中继给其他节点,随着需要中继的交易的数量不断增长,节点将需要更多的网络带宽;
  3. 存储整个网络的状态,随着状态的增多,节点将需要更多的存储空间,即便TPS不增加,节点的存储需求依然会不断增加。

这三项任务中的每一项都对验证节点提出了越来越高的要求,分片一方面能够降低验证节点的负载,网络分片、交易分片和计算分片可以很好地解决计算能力瓶颈,而状态分片则能够解决网络带宽和存储能力瓶颈,另一方面降低了需要验证事务的节点的数量。

分片的挑战

对区块链而言,分片是一个令人兴奋和充满希望的方向,但是分片在提升了效率的同时也带来了新的问题。

分片内的安全和效率问题

分片的第一步即网络分片,将网络中的节点按照某种规则分配到不同的分片,这里的问题是,单个分片的算力以及单个分片内的验证节点数量远低于分片之前的整个区块链网络,从而导致对采用PoW共识的单个分片发起51%攻击,或者对采用非PoW共识的分片发动女巫攻击(Sybil Attacks)的成本也极大地降低了。

因此,采用何种共识机制、如何划分分片大小以及如何为分片分配节点以防止恶意节点控制分片变得至关重要。

现有的分片设计主要通过某种随机性分配验证节点,降低作恶者控制单个分片的概率,针对恶意分叉问题可以通过将部分分片链上的区块连接到信标链,并将分叉选择规则设定为首选交叉连接到信标链的链。

对女巫攻击问题的解决方案包括要求节点提供抵押物或执行PoW等,以提升作恶成本。

攻击单个分片对比分片前的难度

攻击单个分片对比分片前的难度

接下来是交易分片,在UTXO模型下,一笔交易可能包括多个输入和多个输出,进行跨分片通信需要权衡通信导致的成本和性能提升带来的收益。另外跨分片交易往往不可避免,极端情况下,系统内的交易全部是跨分片交易,此时系统的性能将低于分片之前。

对跨分片交易问题的解决方案包括同步和异步两种方式,同步方式下,当跨分片交易发生时,各个分片的验证节点协作执行跨分片交易。

异步方式下,跨分片交易在各个分片中异步执行,即在有足够证据表明发送方所在的分片已执行其负责的任务后,接收方所在的分片处理其负责的任务,这种方式相对简单且容易协调,因此目前更为普遍。

通过分片理论上能够提升整个网络层面的性能,但是对于单个分片仍然可能存在单点过热问题,即单个分片内部仍然存在交易量过大导致拥堵的可能。

以上仅仅是进行网络分片和交易分片/计算分片面临的问题,没有实施状态分片的情况下,每个验证节点都存储有整个区块链网络的状态,可以自由地从区块链中读取任何数据,但一旦实施状态分片,分片内的验证节点只存储区块链网络的部分状态,从而引发了数据有效性和数据可用性等问题。

跨分片的安全和效率问题

数据有效性

数据有效性问题是关于如何识别无效区块,比如作恶者在分片1上创建无效区块B(导致甲的账户上凭空产生1000个通证),并且随后创建有效的区块C,继而发起跨片交易,将凭空产生的通证转移到乙的账户。

这种情况下,分片2的节点验证该笔交易之前的一个区块或N个区块都是徒劳的,因为作恶者总是可以在无效区块后创建N+1个有效块。

通过单个分片验证相邻的多个分片能够解决单个分片创造无效区块的问题,但是当多个分片合谋时,这种方式将不再有效。目前这一问题的解决方案包括

  • 渔夫(Fisherman)
  • SNARKs(简洁的非交互知识论证)

渔夫方案的思路是在链间传递区块头信息时设置质疑期,期间任何诚实节点都可以提供区块无效证明,该方案的第一个问题在于质疑期需要足够长,从而诚实节点能够下载区块、验证区块以及准备发起质疑。

第二个问题是质疑的存在为攻击者提供了新的攻击媒介,要求质疑者提供抵押一定程度上是有效的,但是攻击者提出无效质疑仍然可能是有利可图的,比如出于某种认定阻止诚实节点提出的质疑通过。

第二种解决方案是通过使用某种加密结构证明某个计算是正确执行的,其问题在于创建证明本身需要一定时间、系统设计更为复杂、可能出现无效证明以及无法用于图灵完备智能合约语言的协议。

分片数据有效性图示

分片数据有效性图示

数据可用性

数据可用性包括两个方面,一是特定分片由于某些原因脱机(如受到攻击),依赖于脱机分片的事务无法继续执行,这一问题可以通过备份网络状态解决,但是备份节点将不得不存储系统的整个状态并可能因此产生中心化的风险。

第二个方面是由于节点恶意删除历史数据等原因导致区块变得不再可用,针对这一问题目前有

  • 监护证明(Proof of Custody)
  • 纠删码(Erasure Codes)
  • SNARKs或STARKs等

监护证明的思路是让公证人在分片之间轮换,下载一个区块证明其可用性,为避免公证人始终选择证明能够下载区块,公证人需要提供相应证明或者抵押资产。

利用纠删码技术即使区块只有部分可用仍然能够恢复整个区块,因此轻节点收到区块时可以下载区块的部分内容,从而节点能够确认区块是可用的。

分片数据可用性图示

分片数据可用性图示

动态调整

分片并不是静态的,由于遭遇攻击或新节点加入等原因,分片需要进行动态调整。但在状态分片下,动态调整必须考虑可能导致的状态同步失败及系统中断等问题。

分片的优缺点

优点

分片减少了不断检查存储限制和计算机功能的问题,因为拆分数据库使设置更加灵活,关系数据库可以在不升级其计算机资源的情况下运行。

分片的数据库基础结构加快了查询响应时间,这是通过将分片数据库分为不同的表来实现的,从而使查询可以遍历更少的行以查找结果并更快地返回答案。

分片技术最显着的优势是,由于攻击者可能只针对一个分片,因此它可以缓解网络攻击和破坏。这可能导致数据库或应用程序的仅一部分受到破坏,从而减少了数据库或应用程序的整体破坏。

缺点

分片增加了实现共享数据库的复杂性,并且带来了相当大的风险。错误地实现共享数据库将使区块链面临漏洞和网络攻击。

将记录拆分到单独的数据库中后,很难恢复为未分片的数据库体系结构。这会影响事务记录的备份,并且数据可能会受到影响。垂直分片在将数据库拆分为不同的分片方面有一定的局限性。

只能根据服务器的功能或我们的云提供商为我们分配的内容来划分碎片,但是功能强大的服务器非常昂贵。

总的来说,区块链分片是一种有前途的解决方案,可用于分割记录并提高可伸缩性,减少延迟并在更短的时间内处理更多的交易记录。但是,它增加了区块链技术的复杂性,并突出了应用程序或数据库的潜在弱点。

推荐阅读