分片的原理
分片其实是一种传统数据库技术,它将大型数据库分成更小、更快、更容易管理的部分,这些部分叫做数据碎片。
在公链中,它是通过使用多个网络设备来获得平行处理转账的功能,从而分散那些转账验证的工作量。这样会自动地把网络分成很多更小的部分,或者说进行“分片”处理,从而每一个小网络只需要运行一个更小范围的共识协议。网络上的交易将被分成不同的碎片,其由网络上的不同节点组成。
因此,每个节点只需处理一小部分传入的交易,并且通过与网络上的其他节点并行处理就能完成大量的验证工作。将网络分割为碎片会使得更多的交易同时被处理和验证。
所以,分片技术使用的是平行处理的方式,有越多的节点加入,网络中批准的速度也会加快。简单来说,分片的就是将一个大任务拆分为多个可以并行处理的小任务,从而提升性能。
图中,我们把以太坊的网络分为两部分,左边一部分L1为现有的以太坊主链,右边一部分L2为各个分片,他们各自是一个独立的账户空间。每个分片有专门的节点来维护,就相当于一个个独立的区块链,每个分片将自己的记录汇总发给主链。主链收集各个分片的摘要,然后生成主链区块(N+1)。但是主链收集的是摘要而不是具体的交易细节。
分片方案带来的主要好处是,网络节点进行的冗余计算量大大减少,每个节点只需对自己分片内的交易进行验证,不需要验证分片外的交易。如此可节约大量的时间与网络资源,进而完成更多的交易的处理。
区块链与分片技术
分片技术的层级
目前主流的分片技术分为网络分片、交易分片和状态分片等三个层级,其技术难度也随之依次递增。主要的核心在于分片内节点需要达到一致,并且防止被恶意攻击者控制,而分片之间需要信息传递机制,保证交易及智能合约的状态在不同分片间达到一致。
1.网络分片
利用随机性,网络可以用VRF方法随机抽取节点形成分片,用以防止恶意节点占据某个分片。分片内节点之间的共识可以通过pBFT等共识机制来实现。
2.交易分片
1)账本分片:在一个基于UTXO的系统内,系统可以根据发送者的地址分配一个分片。这确保了两笔双花交易将在相同的分片中得到验证,因此系统可以很容易地检测到双花交易,而不需要进行任何跨片的通信。
2)跨账本分片:在一个非UTXO的系统里,为了防止双花问题,在验证过程中,分片间将不得不进行相互通信。事实上,由于双花交易可能会在任何分片中出现,因此特定分片所接收到的交易将不得不与其它的所有分片进行通信。这种相互之间的高昂通信成本可能会破坏交易分片的最初目的。
3.状态分片
这一技术的关键是将整个存储区分开,让不同的碎片存储不同的部分;每个节点只负责托管自己的分片数据,而不是存储完整的区块链状态。状态分片一经提出,就伴随着挑战。
在一个状态分片的区块链中,一个特定的分片只会保留一部分状态。假设其中一个账户创建了一笔交易,它将支付另一个账户一笔钱。这笔交易将由第一个分片进行处理,一旦该笔交易被验证,关于第一个账户的新余额的信息就必须与它所在的分片进行共享。如果两个帐户由不同的分片进行处理,那么这可能需要进行频繁的跨片通信和状态交换。确保跨片通信不会超过状态分片的性能收益仍然是一个值得公开的研究问题。
状态分片的第二个挑战是数据的可用性。比如由于某种原因,一些特定的分片遭到了攻击而导致其脱机。由于分片并没有复制系统的全部状态,所以网络不能再验证那些依赖于脱机分片的交易。因此,在这样的情况下区块链基本上是无法使用的。
解决此问题的方法是维护存档或进行节点备份,这样就能帮助系统进行故障修复以及恢复那些不可用的数据。但是,这样就使得节点将不得不存储系统的整个状态,因此这还可能会引发一些中心化的风险。
任何分片机制需要确保分片在抵御攻击和失败时是具有弹性的;网络必须接受新的节点并以随机的方式将这些分配给不同的分片。然而,在状态分片的情况下,重新分配节点是非常棘手的。在一次重新调整网络的过程中,在同步完成前可能会出现导致使整个系统失效的问题。
为了防止系统的中断,我们必须对网络进行逐步调整,以确保每个分片在所有节点被清空前仍有足够多的旧节点。类似地,一旦一个新节点加入了一个分片中,系统就必须确保该节点有足够的时间与分片状态进行同步。