特别感谢 Dankrad Feist 和 Aditya Asgaonkar 的审阅
分片是以太坊可扩展性的未来,它将是帮助生态系统每秒支持数千笔交易并允许世界上大部分地区以可承受的成本定期使用该平台的关键。然而,它也是以太坊生态系统和更广泛的区块链生态系统中更容易被误解的概念之一。它指的是一组具有非常特定属性的非常特定的想法,但它经常与具有非常不同且通常更弱的安全属性的技术混为一谈。这篇文章的目的是准确解释分片提供了哪些特定属性,它与其他非分片技术有何不同,以及分片系统必须做出哪些牺牲才能实现这些属性。
描述分片的最佳方式是从塑造和启发解决方案的问题陈述开始:可伸缩性三难困境。
可扩展性三难困境说,区块链试图拥有三个属性,如果你坚持“简单”的技术,你只能得到这三个中的两个。这三个属性是:
可扩展性:链可以处理比单个常规节点(想想:消费笔记本电脑)可以验证的更多的交易。
去中心化:链可以在不依赖于一小群大型中心化参与者的情况下运行。这通常被解释为意味着不应该对仅使用消费类笔记本电脑无法加入的一组节点有任何信任(甚至诚实多数假设)。
安全性:链可以抵抗很大比例的参与节点试图对其进行攻击(理想情况下为 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) 。这就是为什么我们将这种分片称为二次分片,而这种效应是我们认为从长远来看,分片是扩展区块链的最佳方式的一个关键原因。
有两个关键区别:
这两种差异确保了分片为应用程序创建了一个环境,该环境保留了单链环境的关键安全属性,而多链生态系统根本没有。
比特币圈子中的一个常见问题,我完全同意的一个问题是,像比特币(或以太坊)这样的区块链并不完全依赖于诚实的多数假设。如果对这样的区块链进行 51% 攻击,那么攻击者可以做一些讨厌的事情,比如还原或审查交易,但他们不能插入无效交易。即使他们确实恢复或审查交易,运行常规节点的用户也可以轻松检测到这种行为,因此,如果社区希望通过分叉来协调解决攻击,从而消除攻击者的权力,他们可以迅速做到这一点。
缺乏这种额外的安全性是更中心化的高 TPS 链的一个关键弱点。这样的链没有也不能拥有普通用户运行节点的文化,因此主要节点和生态系统参与者可以更容易地聚集在一起并实施社区非常不喜欢的协议更改。更糟糕的是,用户的节点默认会接受它。一段时间后,用户会注意到,但到那时强制协议更改将是既成事实:协调负担将落在用户拒绝更改,他们将不得不做出痛苦的决定来恢复一天或更多的价值每个人都认为的活动已经完成。
理想情况下,我们希望有一种分片形式,可以避免 51% 的有效性信任假设,并保留传统区块链从全面验证中获得的强大安全堡垒。这正是我们在过去几年中所做的大部分研究。
我们可以将 51% 的防攻击可扩展验证问题分解为两种情况:
验证计算:检查某些计算是否正确完成,假设您拥有计算的所有输入。
验证数据可用性:检查计算本身的输入是否以某种形式存储,如果你真的需要,你可以下载它们;应该在不实际下载整个输入本身的情况下执行此检查(因为数据可能太大而无法为每个块下载)。
验证区块链中的块涉及计算和数据可用性检查:您需要确信块中的交易是有效的,并且块中声明的新状态根哈希是执行这些交易的正确结果,但您也需要确信来自该块的足够数据实际上已发布,以便下载该数据的用户可以计算状态并继续处理区块链。第二部分是一个非常微妙但重要的概念,称为数据可用性问题;稍后会详细介绍。
可扩展地验证计算相对容易;有两类技术:欺诈证明和ZK-SNARKs 。
这两种技术可以简单描述如下:
X
进行计算C
,您将得到输出Y
”的消息。默认情况下,您信任这些消息,但您为其他持有质押押金的人提供挑战的机会(签名消息说“我不同意,输出为 Z”)。只有当存在挑战时,所有节点才会运行计算。两方中的任何一方出错都会失去他们的押金,并且所有依赖于该计算结果的计算都将被重新计算。X
执行计算C
得到输出Y
”这一主张。证明在密码学上是“合理的”:如果C(x)
不等于Y
,则在计算上做出有效证明是不可行的。即使运行C
本身需要大量时间,证明也可以快速验证。有关 ZK-SNARK 的更多数学细节,请参阅这篇文章。
基于欺诈证明的计算是可扩展的,因为“在正常情况下”,您将运行复杂的计算替换为验证单个签名。有一个例外情况,你必须在链上验证计算,因为存在挑战,但例外情况非常罕见,因为触发它非常昂贵(原始索赔者或挑战者损失大笔存款)。 ZK-SNARK 在概念上更简单——它们只是用更便宜的证明验证代替计算——但它们工作原理背后的数学要复杂得多。
有一类半可扩展系统仅可扩展地验证计算,同时仍要求每个节点验证所有数据。这可以通过使用一组压缩技巧来用计算替换大多数数据来非常有效。这是汇总的领域。
防欺诈不能用于验证数据的可用性。计算的欺诈证明依赖于这样一个事实,即计算的输入在提交原始声明的那一刻发布在链上,因此如果有人提出质疑,则质疑执行发生在与原始执行完全相同的“环境”中正在发生。在检查数据可用性的情况下,你不能这样做,因为问题恰恰是有太多数据需要检查以将其发布在链上。因此,数据可用性的防欺诈方案遇到了一个关键问题:有人可以声称“数据 X 可用”而不发布它,等待受到挑战,然后才发布数据 X 并使挑战者出现在其他人面前。网络不正确。
这在渔人困境中得到了扩展:
核心思想是两个“世界”,一个是 V1 是一个邪恶的发布者,V2 是一个诚实的挑战者,另一个是 V1 是一个诚实的发布者,V2 是一个邪恶的挑战者,对于没有尝试下载的人来说是无法区分的当时的特定数据。当然,在可扩展的去中心化区块链中,每个单独的节点只能希望下载一小部分数据,因此只有一小部分节点会看到发生的任何事情,除了存在分歧的事实。
无法区分谁对谁错的事实使得不可能有一个有效的数据可用性防欺诈方案。
不幸的是,仅仅有效性不足以确保正确运行的区块链。这是因为如果区块链有效但所有数据都不可用,那么用户无法更新他们需要生成任何未来区块有效证明的数据。生成有效但不可用的块但随后消失的攻击者可以有效地停止链。有人还可以在用户支付赎金之前扣留特定用户的帐户数据,因此问题不仅仅是一个活跃度问题。
有一些强有力的信息论论据认为这个问题是根本问题,并且没有巧妙的技巧(例如涉及密码累加器)可以解决它。有关详细信息,请参阅本文。
关键是一种称为数据可用性抽样的技术。数据可用性抽样工作如下:
纠删码将“检查 100% 可用性”(每条数据都可用)问题转换为“检查 50% 可用性”(至少有一半数据可用)问题。随机抽样解决了 50% 的可用性问题。如果少于 50% 的数据可用,那么至少其中一项检查几乎肯定会失败,如果至少 50% 的数据可用,那么虽然一些节点可能无法识别一个块是可用的,但它需要只有一个诚实的节点运行纠删码重建程序以带回剩余的 50% 块。因此,您不需要下载 1 MB 来检查 1 MB 块的可用性,而只需下载几千字节。这使得在每个块上运行数据可用性检查变得可行。请参阅这篇文章,了解如何使用对等子网有效地实施这种检查。
ZK-SNARK 可用于验证一条数据上的纠删码是否正确完成,然后可以使用 Merkle 分支来验证各个块。或者,您可以使用多项式承诺(例如Kate (aka KZG) 承诺),它本质上是在一个简单的组件中完成擦除编码和证明单个元素和正确性验证 - 这就是以太坊分片所使用的。
假设您有 100 个区块,并且您想在不依赖委员会的情况下有效地验证所有区块的正确性。我们需要做以下事情:
每个客户端对每个块执行数据可用性采样,验证每个块中的数据是否可用,同时每个块仅下载几千字节,即使整个块的大小为 1 兆字节或更大。客户端仅在其可用性挑战的所有数据都已正确响应时才接受块。
现在我们已经验证了数据的可用性,验证正确性变得更加容易。有两种技术:
在上述任何一种情况下,无论区块有多大,每个客户端只需要对每个区块做少量的验证工作。在欺诈证明的情况下,有时区块需要在链上进行完全验证,但这应该非常罕见,因为即使触发一个挑战也是非常昂贵的。
这就是它的全部!在以太坊分片的情况下,近期计划是使分片块仅数据;也就是说,分片纯粹是一个“数据可用性引擎”,使用该安全数据空间以及欺诈证明或 ZK-SNARK 来实现高吞吐量安全事务处理能力是第 2 层汇总的工作。但是,完全有可能创建这样一个内置系统来添加“本机”高吞吐量执行。
分片的关键目标是尽可能接近复制传统(非分片)区块链最重要的安全属性,但不需要每个节点亲自验证每笔交易。
分片非常接近。在传统区块链中:
在具有高级安全功能的分片区块链中:
无效块无法通过,因为:
不可用的块无法通过,因为:
没有分片的传统高 TPS 链无法提供这些保证。多链生态系统无法避免攻击者选择一条链进行攻击并轻松接管它的问题(这些链可以共享安全性,但如果做得不好,它将变成事实上的传统高 TPS 链有它的所有缺点,如果做得好,它只是上述分片技术的更复杂的实现)。
侧链高度依赖于实现,但它们通常容易受到传统高 TPS 链的弱点(如果它们共享矿工/验证器)或多链生态系统的弱点(如果它们不共享矿工/验证器)的影响)。分片链避免了这些问题。
然而,分片系统的装甲有一些裂缝。尤其:
这些都是有道理的担忧,尽管在我们看来,它们远远超过了通过允许更多应用程序在链上运行而不是通过集中式第 2 层服务来减少用户级集中化。也就是说,这些问题,尤其是最后两个问题,实际上是限制将分片链的吞吐量提高到某个点以上的真正限制因素。二次分片的二次性是有限制的。
顺便说一句,如果分片区块链的吞吐量变得太高,则其安全风险会越来越大,这也是为什么扩展到超二次分片的努力在很大程度上被放弃的关键原因;看起来保持二次分片只是二次真的是快乐的媒介。
经常提出的一种分片替代方案是拥有一个结构类似于集中式高 TPS 链的链,除了它使用数据可用性采样和顶部分片来验证有效性和可用性。
这改进了当今存在的集中式高 TPS 链,但它仍然比分片系统弱得多。这有几个原因:
适当的分片系统作为基础层更好。给定一个分片的基础层,您始终可以通过将其构建为汇总来创建一个集中式生产系统(例如,因为您想要一个具有 同步可组合性的高吞吐量域 defi )。但是如果你有一个依赖于集中式区块生产的基础层,你就不能在上面构建一个更加分散的第 2 层。
也在这里发布。