分片的现状

本文详细分析了分片技术在区块链中的现状,探讨了当前的研究、技术和安全性问题,介绍了如以太坊2.0和Zilliqa等项目对分片模型的实验性实现。分片被视为提高区块链交易速度的潜在解决方案,但仍面临多个技术挑战,包括跨片通信和状态验证。

这篇文章详细分析了分片的当前状态——对当前分片研究的简要描述,简单的分片模型用于说明技术和安全问题,这些问题仍未解决或在不同项目(以太坊2.0、Zilliqa、MultiVAC)中进行了实验性实现。

分片网络的目标是能够通过减少计算和存储冗余来快速处理交易并达到最终确认,同时确保网络具有足够的安全保证。

分片旨在通过将矿工划分为不同的组(称为“shard”)来解决这个问题,这些组并行处理不冲突的交易,然后在对不同的shard运行共识后更新全局状态。

这加快了交易的速度,因为:

  1. 这减少了单个交易运行计算的次数,使得交易能够线性扩展而不影响速度;
  2. 每个shard的大小仅为整个区块链的一定比例,这意味着随着节点运营商的存储需求大幅降低到矿工所处的shard的大小(理论上),这降低了成为节点的门槛,减少了矿工中心化的可能性。

为什么选择分片?简史

在传统的数据库结构中,分片是一种数据分区(水平分区)的形式,它允许来自单一数据库的数据存储在多个服务器上。

分片超越了简单的水平分区(例如,只是按照逻辑规则如ZIPCODES_WEST和ZIPCODES_EAST将数据库条目存储到不同表中,这样查询时间减少了一半)。在水平分区中,即使数据被分为不同的表,它仍然存储在一个逻辑服务器上,这限制了基于逻辑服务器的存储容量的总扩展潜力。

另一方面,分片使得数据库可以存储在多个逻辑服务器上,从而减少了中央服务器故障的关键影响。

在区块链中,分片是一种减少每个矿工验证、下载和存储所有交易负担的方式,直到某个时间区块。然而,每个分片区块链的限制因素仍然是“每个节点”能够存储和验证的最大数据吞吐量。假设C是单个节点的存储和计算能力,则限制因素可以说是O(C)。

分片的“hello world”

下面是一个基本的区块链分片模型:

  • 网络中有100个节点运营商。
  • 假设有10个shard( 显示 上图 中的4个shard),每个shard都有其自己的区块链历史。每个shard指派10个验证交易的节点运营商。
  • 为了简单起见,假设每个shard上的交易都是不冲突的(shard A上的交易不会影响shard B上的任何账户余额),并且不同shard上的节点不需要互相通信。
  • 每个shard将处理和验证其自己的交易集合, 在其非同步的区块链中。

听起来似乎太简单,实际上,这样一个天真、基本的分片网络所带来的最大权衡是安全性。这意味着分片网络内的攻击面线性增加,增幅为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成为节点的门槛降低而增加。

当前技术挑战

可以说,上述天真的分片实现存在许多问题。

以下是这些问题的概要以及项目计划如何解决这些问题。

1. 状态分片 vs. 网络分片

目前,没有任何区块链成功实现超过测试网和学术论文的状态分片。Zilliqa作为最早的分片项目之一,仅能实现网络和交易分片,但不包括状态分片。

这是什么意思? 状态分片意味着整个网络的状态(即:全局状态,之前的历史)被分割在节点运营商和shards之间,这允许节点无冲突地相互通信。这意味着每个节点将保存其当前所处shard的状态。

而交易(或网络)分片则意味着交易在不同的shards内并行处理,而没有对全局状态进行分片。这意味着每个节点仍然存储全区块链的本地副本,即使交易是并行化的,而且仍在每个shard上进行共识运行。

网络分片的问题在于,尽管交易显著加快,但这里的主要瓶颈在于存储——每个节点的存储能力是实现真正线性扩展的限制因素,因为每个shard的大小不可避免地会增加。

Zilliqa目前致力于在其主网中仅通过交易分片区块链进行运营,主网已于2019年1月底启动,将实施网络分片和交易分片。状态分片(在不让每个节点存储完整状态的情况下验证全局真实有效性)仍是Zilliqa未来的研究。状态分片目前仍处于实验阶段,矿工的存储需求并没有在起初快速增长。例如,以太坊的区块链用了大约五年的时间才达到了10GB的规模。尽管Zilliqa应该因首次上线而受到赞扬,但需要指出的是,从交易分片网络“转变”到状态分片网络并不是一项简单的任务。

MultiVAC正通过隔离区块验证者和存储节点构建一个状态分片网络。验证者可以通过验证存储节点提供的证明来验证区块,而存储节点则保存每个shard的完整副本。这降低了区块验证者的存储负担,允许更多的“见证者”可以在不必存储完整副本的情况下验证区块。从理论上讲,这意味着虽然状态是与交易分片分开进行,但这也带来了附加的对手风险问题。

2. 跨shard通信与原子性

本质上,如果智能合约托管在不同的shard上,跨shard通信要快速达成最终性(无论是异步还是同步)将变得困难。最简单的例子是需要将本地交换媒介代币从shard A转移到托管在shard B上的其他智能合约以交换代币。

如何确保这笔交易在两个链上都是原子的(即:如果shard A的交易发生,则shard B的交易也必须发生)?如果双方链上的矿工合谋将shard A的代币双重消费,而又没有从shard A的相同账户余额中扣除呢?

火车与酒店问题是一个广泛讨论的分片问题,详细描述了一个情境,一个人必须以原子的方式(要么同时进行,要么都不进行)预定火车和酒店票。如果“智能合约”对于酒店和票据托管在同一共同的shard上时,这个问题易于解决,但如果它们托管在不同的shards,异步通信机制则非常棘手。

大多数分片协议仅允许shard之间进行异步通信,这意味着交易不会在不同shards之间同时被最终确认。

让我们看看关键项目如何处理这种跨shard情况:

Zilliqa的跨shard通信方案根据发生的交易类型分开。任何区块链网络接收到的交易可以被分类为以下三种类型之一:

  • 类型1:用户账户向其他账户转帐一些资金
  • 类型2:用户调用另一个智能合约,而不调用其他智能合约
  • 类型3:用户调用另一个智能合约,可以引发一系列其他智能合约。例如,Bob贡献于一个众筹合约(C1),而它又调用其他的可替代代币合约(C2)将他的代币转账到众筹合约(C1)。

类型(1)和(2)交易被视为shard内交易,因为它们可以由被分配的shard处理。这两个交易类别无需进行跨shard通信。交易的分配由查找节点进行。如需了解交易分配的更多信息,请参考他们的博客文章这里

需要跨shard通信的交易将被转发到目录服务(DS)委员会。DS委员会可以被视为“信标链”,因为它协调网络中的所有shards。它结合由各块提交的微事务区块,并在交易epoch结束时向所有shards返回全局一致的状态。DS委员会处理特定的类型(2)交易,这些交易需要跨shard通信,以及所有类型(3)交易。由于跨shard通信更为复杂,可能需要其他shards的验证,因此这些交易将被转发至DS委员会。一个潜在的问题是,如果类型III的付款不断被激发,DS委员会上的负担将大幅增加,可能会抑制网络速度。关于交易分配优化的研究正为Zilliqa的研究路线图。

MultiVAC同样使用一种交易分类方案,采用与节点类型(存储节点和验证节点)分开的两阶段提交协议(2PC)。一个例子:

  • Alice向shard A的存储节点广播交易。shard A的存储节点将根据交易生成证明,然后将证明和交易广播给shard A的矿工。(注意,它们是独立的节点池)
  • shard A的矿工不持有完整的账本,仅持有账本的主Merkle根,但他们可以使用Merkle根来验证交易和证明,然后验证从shard A的存储节点中检索到的区块。
  • shard A上的一个用户账户最初将其交易提交给shard B,这触发了对shard B上用户账户的调用。shard A上的交易和证明被广播给shard B的矿工。
  • shard B的节点通过shard A的回执确认在A上确实发生了交易。之后,将头部回执添加到shard B中的一个区块中,以确认来自A的交易已被添加到shard B。如果交易已在shard B中被添加确认,则在shard A中也确认。如果没有,则交易被中止。

解决“火车与酒店”问题的一种建议但未经过测试的方案是通过shard锁定和“yanking”实现,其中在由shard A发起跨shard交易的时刻,shard上的智能合约状态被“锁定”,然后“转移”到托管该智能合约的shard B。

3. 完整数据验证

我们在第一点中讨论了状态分片。

在一个跨shard通信频繁发生的分片区块链中,验证跨链交易时,必须满足以下任一条件:

  • 1) 可靠的“全局真相”,可以在其他shards中证明账户余额(以全局主链或“信标”链的形式,所有shards同步),或者
  • 2) 一种加密证明方法,可以可预测地证明其他链上的交易历史而无需存储来自过去链的数据(例如,使用zk-SNARKS)。

完整数据验证的第一种解决方案(拥有全局真相)意味着每个节点的存储需求保持较高,这否定了分片的一般必要性,回归到当前无分片区块链所面临的同样问题。此外,这种方法在恶意节点验证全局主链交易的情况下会集中风险,如果它们决定义务合谋。

而第二种解决方案,虽然使用加密证明方法验证区块的有效性,对于异步的跨shard通信和状态分片来说都很有用,但运行零知识证明方法如zk-SNARKS的成本仍然非常高。在以太坊的Ropsten测试网中,一次ZCash的zk-SNARKS验证大约需要10美元。它的速度极慢,并且此时依赖于高度实验性加密原语。

设计考虑因素

为了总结上述技术挑战,在评估分片协议的可行性时,有若干核心问题需探讨:

  1. 防止Sybil攻击:矿工如何被允许进入网络和每个shard,以防止Sybil攻击?如果矿工被允许进入网络的成本过低,“无事可做”攻击将可在低机会成本下轻易实施。
  2. 交易分类:跨shard和shard内交易是否被分开处理?是否有不同类别的交易由网络以不同方式处理?
  3. 随机选择shard:矿工如何被分配到shards?随机性如何证明?矿工是否允许参与多个shards(例如:通过消除编码)?他们多久切换一次shard?这可以帮助我们参数化拜占庭攻击的可能性。
  4. 共识:每个shard使用哪种共识算法?每个shard是否有最低矿工数量,以减少拜占庭攻击的概率?
  5. 存储结构:是否存在一个主链(或根链),shards与之同步,象征着链上Plasma?如果存在主链保存完整区块链的副本(包括所有shards),那么这将不是一个完整的状态分片网络,因为需要跟主区块链检查来自每个shard的事务以维护和验证正确的账户余额。
  6. 跨Shard Communication:每个shard中有多少节点?节点如何在shards之间进行通信?
  7. 智能合约功能:设计如何考虑交易分片、账户(或智能合约)分片和传输分片?

上述设计考虑因素在评估分片网络实现时可提供帮助。

总的来说,一旦以太坊推出其分片网络,分片将成为区块链的一个关键链上可扩展机制——尽管将区块链从无分片网络迁移到分片网络将不是一项简单的任务,因为整个数据基础设施需要迁移,并要求节点运营商和矿工的参与——如果Zilliqa、MultiVAC或NEAR Protocol等项目能够证明分片网络可以在不牺牲极端安全性的情况下提高dApp的采用率,我们非常期待技术的发展,同时关注新的解决方案来应对以上挑战。

特别感谢Edison Lim @ Zilliqa, Nick White @ Harmony.one, Shawn Ying @ MultiVAC和我的合作伙伴David @ 256的反馈!

  • 原文链接: medium.com/@cindy_50972/...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
cindy_50972
cindy_50972
江湖只有他的大名,没有他的介绍。