您的位置 首页 Defi-NFT

V神:详解以太坊上的分片技术

分片是以太坊可扩展性的未来,它将是帮助生态系统支持每秒数千笔交易的关键,它还允许世界上的大部分地区可以以负担得起的成本定期使用该平台。

原文:《Demystifying the Technical Properties of Sharding: Why it is Great》by Vitalik Buterin
编译:去中心化金融社区

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

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

可扩展性三难困境

描述分片的最佳方式应该是从计划并启发解决方案的问题陈述开始:可扩展性三难困境。

可扩展性三难困境表示区块链试图拥有三个属性,如果坚持使用“简单”技术,那么我们只能获得这三个中的两个。这三个属性分别是:

– 可扩展性:比起单个普通节点验证的交易数量,链可以处理更多的交易。

– 去中心化:链可以在不依赖于一小群大型中心化参与者的情况下运行。这通常被解释为当我们不能用一个普通笔记本电脑加入到一组节点时,就不应该对该节点有任何信任。

– 安全性:链可以抵抗大部分对参与节点的攻击。(理想情况是50%;超过25%就还好,5%绝对不行)。

现在我们来看看这三类“简单解决方案”,通常只能得到其中的两个:

– 传统区块链:包括比特币、pre-PoS/分片以太坊、莱特币和其他类似的链。它们依赖于每个参与者运行一个完整的节点来验证每个交易,因此它们具有去中心化和安全性,但没有可扩展性。

– 高TPS链:包括DPoS家族,也包括许多其他类似的。它们依赖于少数节点(通常是10-100个)来维持彼此之间的共识,用户必须信任其中的大多数节点。这是具有可扩展性和安全性的,但它不是去中心化的。

– 多链生态系统:这是指“横向扩展”的一般概念,通过在不同的链上运行不同的应用程序,并使用跨链通信协议在它们之间进行通信。这是去中心化和可扩展的,但它并不安全,因为攻击者只需要在众多链中的一个里获得多数共识节点即可破坏该链并可能引起连锁反应,对其他链中的应用程序也会造成巨大损害。

分片是一种可以同时满足这三种需求的技术。一个分片区块链是:

– 可扩展:它可以处理比单个节点多得多的交易。

– 去中心化:它完全可以在普通笔记本电脑上“生存”,不依赖任何“超级节点”。

– 安全:攻击者无法以少量资源攻击系统的一小部分;他们只能试图控制和攻击整个事物。

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

通过随机抽样进行分片

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

其核心思想如下。假设我们有一个包含大量(例如 10000 个)验证者的权益证明链,并且同时有大量(例如 100 个)需要验证的区块。没有一台计算机能够强大到在下一组区块进入之前验证所有这些区块。

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

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

试想一下,如果每个节点的计算能力都增加了2倍会发生什么?因为每个节点现在可以安全地多验证2倍的签名,所以我们可以减少最低质押存款规模,以支持2倍多的验证者,届时,我们就可以建立200个委员会,而不是100个。同时,每个slot可以验证200个区块,而不是100个。此外,每个单独的区块可以是原来的两倍大。因此,我们将拥有2倍大小的2倍区块,或多于4倍的链容量。

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

常见问题:分成100个委员会和分成100个独立的链有什么不同?

有两个关键的区别:

随机抽样可以防止攻击者将他们的火力集中在一个分片上。在100条链的多链生态系统中,攻击者只需占总质押的大约0.5%就能造成破坏。在一个分片区块链中,攻击者必须拥有接近整个质押的30-40%才能完成同样的操作(换句话说,链具有共享安全性)。当然,他们可以等待,直到他们幸运地在一个分片中随机获得51%,尽管他们拥有少于总质押的50%,但对于拥有远低于 51% 的攻击者来说,这将成倍增加。如果攻击者的低于 30%,那这件事几乎是不可能的。

紧密耦合:即使一个分片出现一个坏区块,整个链也会重组以避开它。有一种社会合约(在本文档后面的章节中,我们将描述一些技术上实施这种合约的方法),就是一个分片中有一个坏区块的链都是不可接受的,应该在发现它时立即丢弃它。从链内应用程序的角度来看,这确保了完美的安全性:合约A可以依赖于合约B,因为如果合约B由于链上的攻击而行为不当,整个历史都将被恢复,包括合约A中由于合约B的故障而行为不当的交易。

这两种差异都确保了分片为应用程序创建了一个环境,该环境保持单链环境的关键安全特性,而多链生态系统根本无法做到这一点。

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

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

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

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

计算的可扩展验证

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

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

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

在区块链中验证一个区块时,其中包括计算和数据可用性检查:我们需要确信区块中的交易是有效的,并且区块中声明的新状态根哈希是执行这些交易的正确结果,但是我们还需要确信区块中已经发布了足够的数据,以便下载该数据的用户可以计算状态并继续处理区块链。第二部分是一个非常微妙但非常重要的概念,称为数据可用性问题;稍后再详细说明。

可扩展的验证计算相对容易;具体有两类技术:欺诈证明和ZK-SNARK。

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

欺诈证明是一个接受计算结果的系统,需要一个有质押存款的人签署一个消息,内容为“我证明,如果你用输入X进行计算C,你会得到输出Y”。在默认情况下,我们信任这些消息,但我们也为其他已质押存款的人提供了挑战的机会(带有签名的消息表示“我不同意,输出是Z”)。只在有挑战时,所有节点才会运行计算。双方中任何一方的错误都将失去他们的存款,并且所有的计算都取决于该计算的结果将被重新计算。

ZK-SNARK是一种加密证明形式,它直接证明了“对输入X执行计算C会得到输出Y”的说法。这个证明在密码学上是“合理的”:如果C(x)不等于Y,在计算上就不可能做出有效的证明。即使运行C本身需要大量时间,证明也可以快速验证。

基于欺诈证明的计算是可扩展的,因为“在正常情况下”,我们可以用验证单个签名来取代运行复杂的计算。有一种例外情况,由于存在挑战,我们必须链上验证计算,但这种例外情况非常罕见,因为触发它非常昂贵。ZK-SNARK在概念上更简单——它们只是用更便宜的证明验证取代了计算——但它们工作原理背后的数学原理要复杂得多。

有一类半可扩展系统,它只对计算进行可扩展的验证,同时仍需要每个节点对所有数据进行验证。这可以通过使用一组压缩技巧来实现计算代替大多数数据。这是rollup的领域。

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

欺诈证明不能用于验证数据的可用性。计算的欺诈证明依赖于这样一个事实:在提交原始诉求的那一刻,计算的输入就在链上发布了,因此,如果有人质疑,质疑执行发生在与原始执行发生的完全相同的“环境”中。在检查数据可用性的情况下,我们不能这样做,因为问题恰恰在于需要检查的数据太多,无法将其发布到链上。因此,数据可用性的防欺诈方案遇到了一个关键问题:有人可以声称“数据X是可用的”,但不发布它,等待挑战,然后发布数据X,使挑战者在网络的其他部分看来是不正确的。

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

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

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

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

令人遗憾的是,有效性不足以确保正确运行区块链。这是因为如果区块链是有效的,但所有数据都不可用,那么用户就没有办法更新他们需要的数据,来生成任何未来区块是有效的证明。攻击者生成一个有效但不可用的区块,然后消失,这可以有效地停止链。某些人还可以扣留特定用户的帐户数据,直到用户支付赎金,所以这个问题不仅仅是活跃度问题。

有一些强有力的信息理论论据认为,这个问题是根本的,没有什么巧妙的可用技巧可以解决它。

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

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

– 使用一种名为erasure coding的工具,将一个有N个块的数据扩展为有2N个块的数据,这样其中的任何N个区块都可以恢复整个数据。

– 检查可用性,不用试图下载整个数据,用户只需在区块中随机选择一个固定数量的位置(例如30个位置),只有当他们成功地在他们选择的所有位置找到区块中的块时,才会接受区块。

纠删码将“检查100%可用性”(每一个数据片段都可用)问题转换为“检查50%可用性”(至少一半数据片段可用)问题。随机抽样解决了50%的可用性问题。如果可用的数据少于50%,那么几乎可以肯定至少有一个检查会失败,如果至少50%的数据可用,那么尽管一些节点可能无法识别一个区块是否可用,但只需要一个诚实的节点运行纠删码重构过程就可以恢复剩余的50%的区块。因此,不需要下载1MB来检查1MB区块的可用性,只需要下载几千字节。这使得在每个区块上进行数据可用性检查变得可行。

ZK-SNARK可以用来验证数据上的erasure coding是否正确,然后可以用Merkle分支来验证单个块。或者,也可以使用多项式承诺(例如:Kate(又名KZG)承诺),其本质上是在一个简单的组件中进行erasure coding、证明单个元素和正确性验证——这就是以太坊分片所使用的。

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

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

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

既然我们已经验证了数据的可用性,那么验证正确性就变得更容易了。有两种方法:

1. 我们可以用ZK-SNARK。每个区块都有一个ZK-SNARK来证明正确性。

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

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

就以太坊分片而言,近期的计划是让分片区块只包含数据;也就是说,分片纯粹是一个“数据可用性引擎”,使用该安全数据空间以及欺诈证明或 ZK-SNARK 来实现高吞吐量安全交易处理能力是第 2 层rollup的工作。但是,完全可以创建这样一个内置系统来添加“本地”高吞吐量执行。

分片系统的关键特性是什么?折衷方案是什么?

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

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

无效的区块无法通过,因为验证节点会注意到它们是无效的,并忽略它们。

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

在一个具有高级安全特性的分片区块链中:

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

1. 欺诈证明会迅速捕捉他们,并告知整个网络该区块的不正确性,并严惩创建者;

2. ZK-SNARK证明了正确性,我们不能为一个无效的区块创建一个有效的ZK-SNARK。

不可用的区块无法通过,因为:

1. 如果一个区块的可用数据少于50%,那么对于每个客户端,至少有一个数据可用性样本检查几乎肯定会失败,这将导致客户端拒绝该区块;

2. 如果一个区块至少有50%的数据可用,那么实际上整个区块都可用,因为只需要一个诚实节点来重构区块的其余部分就可以。

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

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

然而,分片系统的装甲中有一些裂缝。值得注意的是:

只依赖委员会的分片链很容易受到适应性对手的攻击,问责制也更弱。也就是说,如果对手有能力实时入侵(或关闭)他们选择的任何一组节点,那么他们只需要攻击一小部分节点就可以破坏一个委员会。此外,如果一个对手(无论是适应性对手还是仅仅是占50%的攻击者)破坏了一个委员会,只有很少的部分会被惩罚。这就是为什么数据可用性抽样与欺诈证明或ZK-SNARK一起是随机抽样技术的重要补充的另一个关键原因。

只有当有足够数量的在线客户端共同发出足够的数据可用性抽样请求时,数据可用性抽样才安全,这些请求的响应几乎总是重叠到至少占到50%的区块。在实践中,这意味着必须有几百个客户端在线(并且这个数字随着系统容量与单个节点容量的比率的增加而增加)。这是一种n中的少数信任模型——通常是相当可信的,但肯定没有非分片链中节点的n中的0信任那么可靠。

如果分片链依赖于欺诈证明,那么它依赖于时间假设;如果网络太慢,节点可能会在防欺诈程序出现并表明它是错误的之前接受最终确定的区块。幸运的是,如果我们遵循在发现无效区块后恢复所有无效区块的严格规则,那么这个阈值是一个用户设置的参数:每个用户选择他们到最终结果等待多长时间,如果他们不想等待足够长的时间,那么就遭受损失,更谨慎的用户可确保安全。尽管如此,这还是削弱了用户体验。使用ZK-SNARK验证有效性解决了这个问题。

需要传递大量的的原始数据量,这增加了在极端网络条件下发生故障的风险。少量数据比大量数据更容易被发送。区块浏览器如果想要保存整个链,就需要存储更多的数据。

分片区块链依赖于分片的点对点网络,每个p2p“子网”更容易被攻击,因为它的节点更少。用于数据可用性抽样的子网模型缓解了这一问题,因为子网之间存在一些冗余,但仍然存在风险。

这些都是值得关注的问题,尽管在我们看来,通过允许更多的应用程序在链上运行而不是通过中心化的第二层服务来实现的用户级中心化的减少远远超过了这些问题。也就是说,这些问题,尤其是后两个问题,实际上是将分片链的吞吐量提高到一定程度的真正限制。二次分片的二次性是有极限的。

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

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

经常被提出的一个分片替代方案是建立一个结构类似于中心化高TPS链的链,只不过它在上面使用数据可用性采样和分片来验证有效性和可用性。

这改善了目前存在的中心化高TPS链,但它仍然比分片系统弱得多。这有以下几个原因:

在高TPS链中,很难发现区块生产者的审查。审查检测需要 (i) 能够查看每笔交易并验证没有明显值得进入但无法进入的交易,或(ii)在区块生产者中有一个n中的1信任模型,并验证没有区块无法进入。在中心化的高TPS链中,(i)是不可能的,(ii)更困难,因为小节点数量使n中的1的信任模型更容易崩溃,如果链的区块时间对DAS来说太快(就像大多数中心化的高TPS链所做的那样),很难证明一个节点的区块没有被拒绝,因为它们都被发布得太慢了。

如果大多数区块生产者和生态系统成员试图强行通过一项不受欢迎的协议更改,用户的客户端肯定会发现它,但对于社区来说,反抗和分叉都要困难得多,因为他们将需要启动一组新的非常昂贵的高吞吐量节点来维护一个保持旧规则的链。

中心化基础设施更容易受到外部参与者的审查。区块产生节点的高吞吐量使它们非常容易被检测到,并且更容易被关闭。从逻辑上来说,审查专用的高性能计算比追查个人用户的笔记本电脑要容易得多。

高性能计算向中心化云服务转移的压力更大,这增加了整个链将在1-3家公司的云服务中运行的风险,因此,由于许多区块生产者同时失败,使得链的风险下降。具有在自己的硬件上运行验证者的文化的分片链也更不容易受到这种攻击。

适当的分片系统最好作为基础层。有了一个分片基础层,我们始终可以通过将其构建为rollup来创建一个中心化生产系统。但是,如果我们有一个依赖于中心化区块生产的基础层,则不能在其上构建更加去中心化的第2层。

热门文章

发表回复

您的电子邮箱地址不会被公开。