本文详细分析了分片技术在区块链中的现状,探讨了当前的研究、技术和安全性问题,介绍了如以太坊2.0和Zilliqa等项目对分片模型的实验性实现。分片被视为提高区块链交易速度的潜在解决方案,但仍面临多个技术挑战,包括跨片通信和状态验证。
这篇文章详细分析了分片的当前状态——对当前分片研究的简要描述,简单的分片模型用于说明技术和安全问题,这些问题仍未解决或在不同项目(以太坊2.0、Zilliqa、MultiVAC)中进行了实验性实现。
分片网络的目标是能够通过减少计算和存储冗余来快速处理交易并达到最终确认,同时确保网络具有足够的安全保证。
分片旨在通过将矿工划分为不同的组(称为“shard”)来解决这个问题,这些组并行处理不冲突的交易,然后在对不同的shard运行共识后更新全局状态。
这加快了交易的速度,因为:
在传统的数据库结构中,分片是一种数据分区(水平分区)的形式,它允许来自单一数据库的数据存储在多个服务器上。
分片超越了简单的水平分区(例如,只是按照逻辑规则如ZIPCODES_WEST和ZIPCODES_EAST将数据库条目存储到不同表中,这样查询时间减少了一半)。在水平分区中,即使数据被分为不同的表,它仍然存储在一个逻辑服务器上,这限制了基于逻辑服务器的存储容量的总扩展潜力。
另一方面,分片使得数据库可以存储在多个逻辑服务器上,从而减少了中央服务器故障的关键影响。
在区块链中,分片是一种减少每个矿工验证、下载和存储所有交易负担的方式,直到某个时间区块。然而,每个分片区块链的限制因素仍然是“每个节点”能够存储和验证的最大数据吞吐量。假设C是单个节点的存储和计算能力,则限制因素可以说是O(C)。
下面是一个基本的区块链分片模型:
听起来似乎太简单,实际上,这样一个天真、基本的分片网络所带来的最大权衡是安全性。这意味着分片网络内的攻击面线性增加,增幅为O(N),其中N是网络中shard的数量。
在这个“hello world”的例子中,当你有100个shards时,攻击的概率也线性增加100,因为每个shard将有自己的一组矿工且各自的区块历史。如果腐败的矿工被分配到某一个shard,并决定通过生成无效区块(即通过发起双重消费攻击)来腐败区块链,当所有shards最终同步在一起时,将会与其他shards的交易历史产生冲突。
想象一下:执行一次单shard攻击表明,如果网络有1000个shards,攻击其中一个shard的成本要显著低于攻击整个网络的成本。
随着shard数量的增加,在安全性方面的主要解决方案是使用可证明的随机抽样,如VRFs(可验证随机函数),以太坊2.0计划在其分片模型中使用这一技术,MultiVAC也利用它在每个epoch之后动态重新分配矿工至不同的shard。动态重新分配矿工到shards,并对齐充足的Sybil攻击保护,也使得任何shard中腐败矿工的聚集变得更加困难。
在维护安全性方面,网络上shard的数量选择也至关重要。尽管增加shard的数量在技术上应该提高交易速度,但如果每个shard的矿工数量过少,那么拜占庭攻击的概率也会随着进入shard成为节点的门槛降低而增加。
可以说,上述天真的分片实现存在许多问题。
以下是这些问题的概要以及项目计划如何解决这些问题。
目前,没有任何区块链成功实现超过测试网和学术论文的状态分片。Zilliqa作为最早的分片项目之一,仅能实现网络和交易分片,但不包括状态分片。
这是什么意思? 状态分片意味着整个网络的状态(即:全局状态,之前的历史)被分割在节点运营商和shards之间,这允许节点无冲突地相互通信。这意味着每个节点将保存其当前所处shard的状态。
而交易(或网络)分片则意味着交易在不同的shards内并行处理,而没有对全局状态进行分片。这意味着每个节点仍然存储全区块链的本地副本,即使交易是并行化的,而且仍在每个shard上进行共识运行。
网络分片的问题在于,尽管交易显著加快,但这里的主要瓶颈在于存储——每个节点的存储能力是实现真正线性扩展的限制因素,因为每个shard的大小不可避免地会增加。
Zilliqa目前致力于在其主网中仅通过交易分片区块链进行运营,主网已于2019年1月底启动,将实施网络分片和交易分片。状态分片(在不让每个节点存储完整状态的情况下验证全局真实有效性)仍是Zilliqa未来的研究。状态分片目前仍处于实验阶段,矿工的存储需求并没有在起初快速增长。例如,以太坊的区块链用了大约五年的时间才达到了10GB的规模。尽管Zilliqa应该因首次上线而受到赞扬,但需要指出的是,从交易分片网络“转变”到状态分片网络并不是一项简单的任务。
MultiVAC正通过隔离区块验证者和存储节点构建一个状态分片网络。验证者可以通过验证存储节点提供的证明来验证区块,而存储节点则保存每个shard的完整副本。这降低了区块验证者的存储负担,允许更多的“见证者”可以在不必存储完整副本的情况下验证区块。从理论上讲,这意味着虽然状态是与交易分片分开进行,但这也带来了附加的对手风险问题。
本质上,如果智能合约托管在不同的shard上,跨shard通信要快速达成最终性(无论是异步还是同步)将变得困难。最简单的例子是需要将本地交换媒介代币从shard A转移到托管在shard B上的其他智能合约以交换代币。
如何确保这笔交易在两个链上都是原子的(即:如果shard A的交易发生,则shard B的交易也必须发生)?如果双方链上的矿工合谋将shard A的代币双重消费,而又没有从shard A的相同账户余额中扣除呢?
火车与酒店问题是一个广泛讨论的分片问题,详细描述了一个情境,一个人必须以原子的方式(要么同时进行,要么都不进行)预定火车和酒店票。如果“智能合约”对于酒店和票据托管在同一共同的shard上时,这个问题易于解决,但如果它们托管在不同的shards,异步通信机制则非常棘手。
大多数分片协议仅允许shard之间进行异步通信,这意味着交易不会在不同shards之间同时被最终确认。
让我们看看关键项目如何处理这种跨shard情况:
Zilliqa的跨shard通信方案根据发生的交易类型分开。任何区块链网络接收到的交易可以被分类为以下三种类型之一:
类型(1)和(2)交易被视为shard内交易,因为它们可以由被分配的shard处理。这两个交易类别无需进行跨shard通信。交易的分配由查找节点进行。如需了解交易分配的更多信息,请参考他们的博客文章这里。
需要跨shard通信的交易将被转发到目录服务(DS)委员会。DS委员会可以被视为“信标链”,因为它协调网络中的所有shards。它结合由各块提交的微事务区块,并在交易epoch结束时向所有shards返回全局一致的状态。DS委员会处理特定的类型(2)交易,这些交易需要跨shard通信,以及所有类型(3)交易。由于跨shard通信更为复杂,可能需要其他shards的验证,因此这些交易将被转发至DS委员会。一个潜在的问题是,如果类型III的付款不断被激发,DS委员会上的负担将大幅增加,可能会抑制网络速度。关于交易分配优化的研究正为Zilliqa的研究路线图。
MultiVAC同样使用一种交易分类方案,采用与节点类型(存储节点和验证节点)分开的两阶段提交协议(2PC)。一个例子:
解决“火车与酒店”问题的一种建议但未经过测试的方案是通过shard锁定和“yanking”实现,其中在由shard A发起跨shard交易的时刻,shard上的智能合约状态被“锁定”,然后“转移”到托管该智能合约的shard B。
我们在第一点中讨论了状态分片。
在一个跨shard通信频繁发生的分片区块链中,验证跨链交易时,必须满足以下任一条件:
完整数据验证的第一种解决方案(拥有全局真相)意味着每个节点的存储需求保持较高,这否定了分片的一般必要性,回归到当前无分片区块链所面临的同样问题。此外,这种方法在恶意节点验证全局主链交易的情况下会集中风险,如果它们决定义务合谋。
而第二种解决方案,虽然使用加密证明方法验证区块的有效性,对于异步的跨shard通信和状态分片来说都很有用,但运行零知识证明方法如zk-SNARKS的成本仍然非常高。在以太坊的Ropsten测试网中,一次ZCash的zk-SNARKS验证大约需要10美元。它的速度极慢,并且此时依赖于高度实验性加密原语。
为了总结上述技术挑战,在评估分片协议的可行性时,有若干核心问题需探讨:
上述设计考虑因素在评估分片网络实现时可提供帮助。
总的来说,一旦以太坊推出其分片网络,分片将成为区块链的一个关键链上可扩展机制——尽管将区块链从无分片网络迁移到分片网络将不是一项简单的任务,因为整个数据基础设施需要迁移,并要求节点运营商和矿工的参与——如果Zilliqa、MultiVAC或NEAR Protocol等项目能够证明分片网络可以在不牺牲极端安全性的情况下提高dApp的采用率,我们非常期待技术的发展,同时关注新的解决方案来应对以上挑战。
—
特别感谢Edison Lim @ Zilliqa, Nick White @ Harmony.one, Shawn Ying @ MultiVAC和我的合作伙伴David @ 256的反馈!
- 原文链接: medium.com/@cindy_50972/...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!