2021 年 4 月 07 日查看所有帖子


特别感谢 Dankrad Feist 和 Aditya Asgaonkar 的审阅

分片是以太坊可扩展性的未来,它将是帮助生态系统每秒支持数千笔交易并允许世界上大部分地区以可承受的成本定期使用该平台的关键。然而,它也是以太坊生态系统和更广泛的区块链生态系统中更容易被误解的概念之一。它指的是具有非常具体属性的一组非常具体的想法,但它经常与具有非常不同且通常较弱的安全属性的技术混为一谈。这篇文章的目的将是解释什么分片特定的属性提供,它被其他技术的区别不是分片,什么牺牲一个分片系统,使实现这些特性。

 以太坊分片版本的众多描述之一。原图由 Hsiao-wei Wang 设计,Quantstamp 设计。

可扩展性三难困境

描述分片的最佳方式从形成和启发解决方案的问题陈述开始:可扩展性三难问题

 

 

可扩展性三难问题说区块链试图拥有三个属性,如果你坚持“简单”的技术,你只能得到这三个中的两个。这三个属性是:

  • 可扩展性:该链可以处理比单个常规节点(想想:消费者笔记本电脑)可以验证的交易更多的交易。
  • 去中心化:链可以运行,而无需依赖一小组大型中心化参与者。这通常被解释为意味着不应该对您无法仅使用消费类笔记本电脑加入的一组节点存在任何信任(甚至诚实多数假设)。
  • 安全性:链可以抵抗很大比例的参与节点试图对其进行攻击(理想情况下为 50%;任何高于 25% 的都可以,5% 绝对不行)。

现在我们可以看看三类“简单解决方案”,它们只能得到三者中的两个:

  • 传统区块链- 包括比特币、PoS 前/分片以太坊、莱特币和其他类似链。它们依赖于运行完整节点的每个参与者来验证每笔交易,因此它们具有去中心化和安全性,但没有可扩展性。
  • 高 TPS 链- 包括 DPoS 系列以及许多其他。这些依赖于少数节点(通常是 10-100 个)在它们之间保持共识,用户必须信任这些节点中的大多数。这是可扩展和安全的(使用上面的定义),但它不是分散的。
  • 多链生态系统——这是指通过让不同的应用程序存在于不同的链上并使用跨链通信协议在它们之间进行通信来“横向扩展”的一般概念。这是去中心化和可扩展的,但它不安全,因为攻击者只需要在众多链之一(通常<整个生态系统的 1%)中获得多数共识节点即可破坏该链并可能引起连锁反应,从而导致对其他链中的应用程序造成极大损害。

分片是一种技术,可以让您同时拥有三者。分片区块链是:

  • 可扩展:它可以处理比单个节点多得多的事务)
  • 去中心化:它可以完全在消费类笔记本电脑上生存,完全不依赖“超级节点”
  • 安全:攻击者不能用少量资源攻击系统的一小部分;他们只能试图支配和攻击整个事物

这篇文章的其余部分将描述分片区块链如何做到这一点。

通过随机抽样分片

最容易理解的分片版本是通过随机抽样进行分片。通过随机抽样的分片比我们在以太坊生态系统中构建的分片形式具有更弱的信任属性,但它使用更简单的技术。

核心思想如下。假设您有一个包含大量(例如 10000 个)验证者的权益证明链,并且您有大量(例如 100 个)需要验证的区块。没有一台计算机足够强大,可以在下一组块出现之前验证所有这些块。

因此,我们所做的是随机拆分验证工作。我们随机打乱验证者列表,并分配打乱列表中的前 100 个验证者来验证第一个区块,分配到随机列表中的后 100 个验证者以验证第二个区块,依此类推。 随机选择的一组验证者被分配到验证区块(或执行其他任务)称为委员会

 



当验证者验证一个区块时,他们会发布一个签名来证明他们这样做了。其他人,而不是验证 100 个完整的块,现在只验证 10000 个签名——工作量要小得多,尤其是使用BLS 签名聚合。不是每个区块都通过同一个 P2P 网络广播,每个区块都在不同的子网络上广播,节点只需要加入与它们负责(或出于其他原因感兴趣)的区块对应的子网。

考虑如果每个节点的计算能力增加 2 倍会发生什么。由于每个节点现在可以安全地验证 2 倍以上的签名,因此您可以减少最小抵押存款规模以支持 2 倍以上的验证者,因此您可以创建 200 个委员会而不是 100 个。因此,您可以在每个插槽中验证 200 个区块而不是 100 个。此外,每个单独的块都可以大 2 倍。因此,您拥有 2 倍大小的 2 倍区块,或总共 4 倍的链容量。

我们可以介绍一些数学术语来谈论正在发生的事情。使用Big O 表示法,我们使用“ O(C) ”来指代单个节点的计算能力。传统的区块链可以处理大小为O(C) 的块。如上所述的分片链可以并行处理O(C)个块(记住,每个节点间接验证每个块的成本是O(1),因为每个节点只需要验证固定数量的签名),并且每个块具有O(C)容量,因此分片链的总容量为O(C 2 )。这就是为什么我们称这种类型的分片为二次分片,这种效应是我们认为从长远来看,分片是扩展区块链的最佳方式的一个关键原因。

常见问题:拆分为 100 个委员会与拆分为 100 个独立的链有何不同?

有两个主要区别:

  1. 随机抽样可以防止攻击者将他们的权力集中在一个分片上。在一个 100 条链的多链生态系统中,攻击者只需要总股份的 0.5% 左右就可以造成严重破坏:他们可以专注于 51% 的攻击单链。在分片区块链中,攻击者必须拥有近 30-40% 的全部股权才能这样做(换句话说,该链具有共享安全性)。当然,他们可以等到幸运时,在一个分片中随机获得 51% 的股份,尽管他们的股份不到总股份的 50%,但对于远低于 51% 的攻击者来说,这变得更加困难。如果攻击者拥有不到约 30%,那几乎是不可能的。
  2. 紧耦合:即使一个分片出现坏块,整个链都会重组以避免它。有一个社会契约(在本文档的后面部分,我们描述了一些在技术上强制执行这一点的方法),即使一个分片中甚至有一个坏块的链都是不可接受的,一旦发现就应该将其丢弃。这确保了从链应用的角度来看,有完美的安全性:合约 A 可以依赖合约 B,因为如果合约 B 由于链上的攻击而行为不端,整个历史都会恢复,包括其中的交易由于合约 B 中的故障而导致合约 A 行为不端。

这两种差异都确保分片为应用程序创建了一个环境,该环境保留了单链环境的关键安全属性,而多链生态系统根本不会这样做。

使用更好的安全模型改进分片

比特币圈子中的一个普遍观点,我完全同意,是像比特币(或以太坊)这样的区块链并不完全依赖诚实的多数假设。如果对这样的区块链进行 51% 攻击,那么攻击者可以做一些令人讨厌的事情,例如还原或审查交易,但他们不能插入无效交易。即使他们确实恢复或审查了交易,运行常规节点的用户也可以轻松检测到这种行为,因此如果社区希望协调解决攻击,分叉会夺走攻击者的权力,他们可以很快做到。

缺乏这种额外的安全性是更中心化的高 TPS 链的一个关键弱点。这样的链没有,也不可能有普通用户运行节点的文化,因此主要节点和生态系统参与者可以更容易地聚在一起并强加社区非常不喜欢的协议更改。更糟糕的是,用户的节点默认会接受它。一段时间后,用户会注意到,但到那时,强制协议更改将成为既成事实:协调负担将落在用户身上以拒绝更改,并且他们将不得不做出痛苦的决定,以恢复一天的价值或更多每个人都认为已经完成的活动。

理想情况下,我们希望有一种分片形式,避免 51% 的有效性信任假设,并保留传统区块链从全面验证中获得的强大安全堡垒。这正是我们在过去几年中进行的大部分研究。

计算的可扩展验证

我们可以将 51%-attack-proof 可扩展验证问题分解为两种情况:

  • 验证计算:检查某些计算是否正确完成,假设您拥有计算的所有输入
  • 验证数据可用性:检查计算本身的输入是否以某种形式存储,如果确实需要,您可以下载它们;应该在实际下载整个输入本身的情况下执行此检查(因为数据可能太大而无法为每个块下载)

验证区块链中的区块涉及计算和数据可用性检查:你需要确信区块中的交易是有效的,并且区块中声明的新状态根哈希是执行这些交易的正确结果,但你也需要确信来自区块的足够数据实际上已发布,以便下载该数据的用户可以计算状态并继续处理区块链。第二部分是一个非常微妙但重要的概念,称为数据可用性问题;稍后会详细介绍。

可扩展验证计算相对容易;有两大类技术:欺诈证明ZK-SNARKs

 



欺诈证明是一种可扩展地验证计算的方法。

这两种技术可以简单描述如下:

  • 欺诈证明是一种接受计算结果的系统,您需要有抵押存款的人签署“我证明,如果您C使用输入进行计算X,您将获得输出Y”形式的消息。默认情况下,您信任这些消息,但您为其他持有质押存款的人提供了挑战的机会(签名消息说“我不同意,输出为 Z”)。只有当有挑战时,所有节点才运行计算。两方中的任何一方都将失去他们的存款,并且所有依赖于该计算结果的计算都将重新计算。
  • ZK-SNARKs是一种密码证明形式,它直接证明了“C对输入执行计算X给出输出Y”的说法。证据是加密的“声音”:如果C(x)确实相等Y,这是计算上不可行进行有效的证明。证明也可以快速验证,即使运行C本身需要大量时间。有关ZK-SNARK 的更多数学细节,请参阅这篇文章

基于欺诈证明的计算是可扩展的,因为“在正常情况下”您用验证单个签名代替了运行复杂的计算。有一种例外情况,你必须在链上验证计算,因为存在挑战,但这种例外情况非常罕见,因为触发它非常昂贵(原始索赔者或挑战者损失了大量存款)。ZK-SNARKs 在概念上更简单——它们只是用更便宜的证明验证代替计算——但它们工作原理背后的数学要复杂得多。

有一类半可扩展系统,它只对计算进行可扩展验证,同时仍然需要每个节点验证所有数据。通过使用一组压缩技巧将大多数数据替换为计算,这可以变得非常有效。这是rollups的领域。

数据可用性的可扩展验证更难

欺诈证明不能用于验证数据的可用性。计算的欺诈证明依赖于这样一个事实,即在提交原始索赔时,计算的输入已在链上发布,因此如果有人提出质疑,则挑战执行发生在与原始执行完全相同的“环境”中发生。在检查数据可用性的情况下,您不能这样做,因为问题恰恰在于要检查的数据太多无法在链上发布。因此,对于数据可用性运行到一个关键问题欺诈性验证方案:有人可能会要求“数据X可用”不发布,迫不及待地想挑战的,只有发布数据X,使挑战者出现在网络的其余部分不正确。

这在渔夫的困境中得到扩展:


 

核心思想是两个“世界”,一个是 V1 是邪恶的发布者,V2 是一个诚实的挑战者,另一个是 V1 是一个诚实的发布者,V2 是一个邪恶的挑战者,对于没有尝试下载的人来说是无法区分的当时的那个特定数据。当然,在一个可扩展的去中心化区块链中,每个单独的节点只能希望下载一小部分数据,所以只有一小部分节点会看到发生了什么,除了存在分歧这一事实。

无法区分谁对谁错的事实使得不可能有一个有效的数据可用性欺诈证明方案。

常见问题:如果某些数据不可用怎么办?使用 ZK-SNARK,您可以确定一切都是有效的,这还不够吗?

不幸的是,仅仅有效性不足以确保正确运行区块链。这是因为如果区块链有效但所有数据都不可用,那么用户将无法更新他们需要生成任何未来区块有效证明的数据。生成有效但不可用的块但随后消失的攻击者可以有效地阻止链。有人还可以扣留特定用户的帐户数据,直到用户支付赎金,因此问题不完全是活跃度问题。

有一些强有力的信息论论点认为这个问题是根本性的,并且没有聪明的技巧(例如,涉及加密累加器)可以绕过它。有关详细信息,请参阅本文

那么,如何在不实际尝试下载的情况下检查 1 MB 的数据是否可用?这听起来不可能!

关键是一种称为数据可用性采样的技术。数据可用性抽样的工作原理如下:

  1. 使用一种叫做纠删码的工具将一块有 N 个块的数据扩展为一块有 2N 个块的数据,这样这些块中的任何 N 个都可以恢复整个数据。
  2. 要检查的,而不是试图下载的可用性,整个数据,用户只需随机块中的选择位置的常数(如30位),并只接受该块时,他们已经成功地发现了块的块,在所有他们选择的职位。

 



纠删码将“检查 100% 可用性”(每条数据都可用)问题转化为“检查 50% 可用性”(至少有一半可用)问题。随机抽样解决了 50% 的可用性问题。如果不到 50% 的数据可用,那么至少有一项检查几乎肯定会失败,如果至少有 50% 的数据可用,那么一些节点可能无法将块识别为可用,这需要只有一个诚实的节点运行纠删码重建程序以带回剩余的 50% 的块。因此,无需下载 1 MB 来检查 1 MB 块的可用性,您只需要下载几千字节。这使得在每个块上运行数据可用性检查变得可行。 了解如何使用对等子网有效地实施此检查。

ZK-SNARK 可用于验证对一段数据的擦除编码是否正确完成,然后可以使用 Merkle 分支来验证单个块。或者,您可以使用多项式承诺(例如Kate(又名 KZG)承诺),它基本上在一个简单的组件中进行擦除编码证明单个元素正确性验证 - 这就是以太坊分片正在使用的。

回顾:我们如何确保一切再次正确?

假设您有 100 个区块,并且您希望在不依赖委员会的情况下有效地验证所有区块的正确性。我们需要做以下事情:

  • 每个客户端对每个块进行数据可用性采样,验证每个块中的数据是否可用,同时即使块作为一个整体大小为兆字节或更大,每个块也只下载几千字节。客户端仅在其可用性挑战的所有数据都得到正确响应时才接受块。
  • 现在我们已经验证了数据的可用性,验证正确性变得更加容易。有两种技术:
    • 我们可以使用欺诈证明:一些持有抵押存款的参与者可以签署每个区块的正确性。其他节点,称为挑战者(或渔民)随机检查并尝试完全处理块。因为我们已经检查了数据可用性,所以总是可以下载数据并完全处理任何特定块。如果他们发现无效区块,他们会发布一个所有人都验证的挑战。如果该块被证明是坏的,那么该块以及依赖于该块的所有未来块都需要重新计算。
    • 我们可以使用ZK-SNARKs。每个块都带有 ZK-SNARK 证明正确性。
  • 在上述任何一种情况下,无论区块有多大,每个客户端只需要对每个区块做少量的验证工作。在欺诈证明的情况下,偶尔需要在链上对区块进行完全验证,但这应该是非常罕见的,因为即使触发一个挑战也是非常昂贵的。

这就是全部!在以太坊分片的情况下,近期计划是使分片块用于数据;也就是说,分片纯粹是一个“数据可用性引擎”,第2 层汇总的工作是使用该安全数据空间,加上欺诈证明或 ZK-SNARK,以实现高吞吐量的安全交易处理能力。但是,完全可以创建这样一个内置系统来添加“本机”高吞吐量执行。

分片系统的关键属性是什么,权衡是什么?

分片的关键目标是尽可能接近复制传统(非分片)区块链最重要的安全属性,但不需要每个节点亲自验证每笔交易。

分片非常接近。在传统区块链中:

  • 无效块无法通过,因为验证节点注意到它们无效并忽略它们。
  • 不可用的块无法通过,因为验证节点无法下载它们并忽略它们。

在具有高级安全功能的分片区块链中:

  • 无效块无法通过,因为:
    • 欺诈证明迅速抓住了他们,并通知整个网络区块的错误,并严重惩罚创建者,或
    • ZK-SNARK 证明是正确的,您不能为无效块制作有效的 ZK-SNARK。
  • 不可用的块无法通过,因为:
    • 如果一个区块的可用数据少于 50%,则每个客户端至少有一次数据可用性样本检查几乎肯定会失败,从而导致客户端拒绝该区块,
    • 如果一个区块至少有 50% 的数据可用,那么实际上整个区块都是可用的,因为只需要一个诚实的节点来重建区块的其余部分。

没有分片的传统高 TPS 链无法提供这些保证。多链生态系统无法避免攻击者选择一条链进行攻击并轻松接管的问题(这些链可以共享安全性,但如果做得不好,它将变成事实上的传统高 TPS 链有它的所有缺点,如果做得好,它只是上述分片技术的更复杂的实现)。

侧链高度依赖于实现,但它们通常容易受到传统高 TPS 链的弱点(如果它们共享矿工/验证器)或多链生态系统的弱点(如果它们不共享矿工/验证器) )。分片链避免了这些问题。

但是,分片系统的装甲中存在一些缝隙。尤其:

  • 依赖委员会的分片链容易受到适应性对手的攻击,并且问责制较弱。也就是说,如果对手有能力实时入侵(或只是关闭)他们选择的任何一组节点,那么他们只需要攻击少量节点即可破坏单个委员会。此外,如果对手(无论是自适应对手还是拥有 50% 总股份的攻击者)确实破坏了一个委员会,则只有少数节点(该委员会中的节点)可以公开确认参与该委员会攻击,因此只有少量的股份会受到惩罚。这是数据可用性抽样与欺诈证明或 ZK-SNARK 一起成为随机抽样技术的重要补充的另一个关键原因。
  • 数据可用性采样只有在有足够数量的在线客户端,它们共同发出足够多的数据可用性采样请求,响应几乎总是重叠以包含至少 50% 的块时才是安全的。在实践中,这意味着必须有几百个客户端在线(并且这个数字增加了系统容量与单个节点容量的比率越高)。这是一个N 中少数信任模型——通常非常值得信赖,但肯定不如非分片链中节点对可用性的 0 中 N 信任那么健壮。
  • 如果分片链依赖于欺诈证明,那么它依赖于时间假设;如果网络太慢,节点可以在欺诈证明出现之前接受一个最终确定的块,表明它是错误的。幸运的是,如果你遵循一个严格的规则,一旦发现无效就恢复所有无效块,这个阈值是一个用户设置的参数:每个用户选择他们等待多久直到最终确定,如果他们不想太久,那么就受苦,但更细心的用户是安全的。即便如此,这也削弱了用户体验。使用 ZK-SNARKs 来验证有效性解决了这个问题。
  • 需要传递的原始数据量要大得多,这增加了极端网络条件下出现故障的风险。与大量数据相比,少量数据更容易发送(并且更容易安全隐藏,如果一个强大的政府试图审查链条)。区块浏览器如果想要持有整个链,就需要存储更多的数据。
  • 分片区块链依赖于分片的点对点网络,每个单独的 p2p“子网”更容易受到攻击,因为它的节点较少用于数据可用性采样子网模型缓解了这种情况,因为子网之间存在一些冗余,但即使如此,仍然存在风险。

这些都是合理的担忧,尽管在我们看来,通过允许更多的应用程序在链上运行而不是通过集中的第 2 层服务来减少用户级集中化,这远远超过了这些担忧。也就是说,这些问题,尤其是最后两个问题,实际上是将分片链的吞吐量增加到某个点以上的真正限制因素。二次分片的二次性是有限制的。

顺便说一句,如果吞吐量变得过高,分片区块链的安全风险会越来越大,这也是扩展到超二次分片的努力在很大程度上被放弃的关键原因;看起来保持二次分片只是二次真的是快乐的媒介。

为什么不集中生产和分片验证?

一种经常被提议的分片替代方案是拥有一个像集中式高 TPS 链一样结构的链,除了它使用数据可用性采样和分片来验证有效性和可用性。

这改进了今天存在的集中式高 TPS 链,但它仍然比分片系统弱得多。这是出于以下几个原因:

  1. 在高 TPS 链中检测区块生产者的审查要困难得多。审查检测要求 (i) 能够查看每笔交易并验证没有明显值得进入的交易却莫名其妙地无法进入,或者 (ii) 在区块生产者中具有 1-of-N 信任模型和验证没有区块无法进入。在中心化的高 TPS 链中,(i)是不可能的,并且(ii)更难,因为小节点数使得即使是 N 中的 1 信任模型也更有可能被破坏,并且如果链的出块时间对于 DAS 来说太快(就像大多数中心化的高 TPS 链那样),则很难证明节点的块没有被拒绝,因为它们都发布得太慢了。
  2. 如果大多数区块生产者和生态系统成员试图强行通过不受欢迎的协议更改,用户的客户肯定会检测到它,但社区更难反抗和分叉,因为他们需要启动一组新的非常昂贵的高吞吐量节点来维护保持旧规则的链。
  3. 集中式基础设施更容易受到外部参与者强加的审查。出块节点的高吞吐量使它们非常易于检测并且更容易关闭。审查专用的高性能计算在政治和逻辑上也比审查个人用户的笔记本电脑更容易。
  4. 高性能计算向中心化云服务转移的压力更大,增加了整个链将在 1-3 家公司的云服务中运行的风险,从而增加了链的风险,因为许多区块生产者同时失败. 具有在自己的硬件上运行验证器文化的分片链再次不太容易受到这种影响。

正确分片的系统更适合作为基础层。给定一个分片基础层,您始终可以通过将其构建为汇总来创建一个集中式生产系统(例如,因为您想要一个具有同步可组合性的高吞吐量域defi)在顶部分层。但是如果你有一个依赖于集中式区块生产的基础层,你就不能在上面构建一个更分散的第 2 层。