paint-brush
揭开分片技术特性的神秘面纱:为什么它很棒经过@Vitalik
1,619 讀數
1,619 讀數

揭开分片技术特性的神秘面纱:为什么它很棒

经过 Vitalik Buterin19m2022/08/29
Read on Terminal Reader
Read this story w/o Javascript

太長; 讀書

分片是以太坊生态系统和更广泛的区块链生态系统中更容易被误解的概念之一。它指的是一组具有非常特定属性的非常特定的想法。它经常与具有非常不同且通常较弱的安全属性的技术混为一谈。描述分片的最佳方式从可扩展性三难困境开始。通过随机抽样进行的分片比我们在 ETH 生态系统中构建的分片形式具有更弱的信任属性,但它使用更简单的技术。这篇文章的其余部分将描述分片区块链如何做到这一点。

Coins Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - 揭开分片技术特性的神秘面纱:为什么它很棒
Vitalik Buterin HackerNoon profile picture


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


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


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

可扩展性三难困境

描述分片的最佳方式是从塑造和启发解决方案的问题陈述开始:可伸缩性三难困境


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


  • 可扩展性:链可以处理比单个常规节点(想想:消费笔记本电脑)可以验证的更多的交易。

  • 去中心:链可以在不依赖于一小群大型中心化参与者的情况下运行。这通常被解释为意味着不应该对仅使用消费类笔记本电脑无法加入的一组节点有任何信任(甚至诚实多数假设)。

  • 安全性:链可以抵抗很大比例的参与节点试图对其进行攻击(理想情况下为 50%;任何高于 25% 的都可以,5% 绝对不行)。


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


  • 传统区块链——包括比特币、pre-PoS/sharding Ethereum、Litecoin 和其他类似的链。这些依赖于每个参与者运行一个完整的节点来验证每笔交易,因此它们具有去中心化和安全性,但没有可扩展性。

  • 高 TPS 链- 包括 DPoS 系列以及许多其他链。这些依赖于少数节点(通常是 10-100 个)在它们之间保持共识,用户必须信任这些节点中的大多数。这是可扩展的和安全的(使用上面的定义),但它不是分散的。

  • 多链生态系统——这是指通过让不同的应用程序存在于不同的链上并使用跨链通信协议在它们之间进行通信来“横向扩展”的一般概念。这是去中心化和可扩展的,但它并不安全,因为攻击者只需要在众多链之一(通常小于整个生态系统的 1%)中获得多数共识节点即可破坏该链并可能引起连锁反应,从而导致对其他链上的应用造成很大的损害。


分片是一种让你三者皆有的技术。分片区块链是:


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


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

通过随机抽样进行分片

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


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


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


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


考虑一下如果每个节点的计算能力增加 2 倍会发生什么。因为每个节点现在可以安全地验证 2 倍以上的签名,所以您可以减少最低质押存款规模以支持 2 倍以上的验证者,因此您可以建立 200 个委员会而不是 100 个。

因此,您可以验证每个插槽 200 个块而不是 100 个。此外,每个单独的块可以大 2 倍。因此,您拥有 2 倍以上大小的 2 倍区块,或总共 4 倍以上的链容量。


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

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

有两个关键区别:


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


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

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

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


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


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

计算的可扩展验证

我们可以将 51% 的防攻击可扩展验证问题分解为两种情况:


  • 验证计算:检查某些计算是否正确完成,假设您拥有计算的所有输入。

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


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


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


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

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


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


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


有一类半可扩展系统可扩展地验证计算,同时仍要求每个节点验证所有数据。这可以通过使用一组压缩技巧来用计算替换大多数数据来非常有效。这是汇总的领域。

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

防欺诈不能用于验证数据的可用性。计算的欺诈证明依赖于这样一个事实,即计算的输入在提交原始声明的那一刻发布在链上,因此如果有人提出质疑,则质疑执行发生在与原始执行完全相同的“环境”中正在发生。在检查数据可用性的情况下,你不能这样做,因为问题恰恰是有太多数据需要检查以将其发布在链上。因此,数据可用性的防欺诈方案遇到了一个关键问题:有人可以声称“数据 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 (aka KZG) 承诺),它本质上是在一个简单的组件中完成擦除编码证明单个元素正确性验证 - 这就是以太坊分片所使用的。

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

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


  • 每个客户端对每个块执行数据可用性采样,验证每个块中的数据是否可用,同时每个块仅下载几千字节,即使整个块的大小为 1 兆字节或更大。客户端仅在其可用性挑战的所有数据都已正确响应时才接受块。

  • 现在我们已经验证了数据的可用性,验证正确性变得更加容易。有两种技术:

    • 我们可以使用欺诈证明:一些有抵押存款的参与者可以签署每个区块的正确性。其他节点,称为挑战者(或渔民)随机检查并尝试完全处理块。因为我们已经检查了数据的可用性,所以总是可以下载数据并完全处理任何特定的块。如果他们发现一个无效的块,他们会发布一个每个人都验证的挑战。如果该块被证明是坏的,那么该块以及依赖于该块的所有未来块都需要重新计算。
    • 我们可以使用ZK-SNARKs 。每个区块都会附带一个 ZK-SNARK 证明正确性。


  • 在上述任何一种情况下,无论区块有多大,每个客户端只需要对每个区块做少量的验证工作。在欺诈证明的情况下,有时区块需要在链上进行完全验证,但这应该非常罕见,因为即使触发一个挑战也是非常昂贵的。


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

分片系统的关键特性是什么,权衡取舍是什么?

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


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


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


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


  • 无效块无法通过,因为:

    • 欺诈证明会迅速捕捉到他们并通知整个网络该块的不正确性,并严重惩罚创建者,或
    • ZK-SNARK 证明了正确性,您不能为无效块制作有效的 ZK-SNARK。
  • 不可用的块无法通过,因为:

    • 如果一个区块的可用数据少于 50%,那么每个客户端至少有一次数据可用性抽样检查几乎肯定会失败,导致客户端拒绝该区块,
    • 如果一个区块至少有 50% 的数据可用,那么实际上整个区块都是可用的,因为只需要一个诚实的节点就可以重建区块的其余部分。


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


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


然而,分片系统的装甲有一些裂缝。尤其:


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


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


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

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

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


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


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


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


也在这里发布。