Vitalik:为什么说分片是以太坊的未来?

币安Binance,全球排名第一的最大的加密货币交易所。稳定,安全,可靠!→
欧易OKX,最大的老牌加密货币交易所之一,对中文用户非常友好!→
芝麻开门Gate.io,老牌加密货币交易所,2013年创办至今,原名“比特儿”!→


为什么区块链需要分片?

可以说,分片是以太坊可扩展性的未来,它决定了以太坊生态系统是否能在每秒中进行数千笔交易,并使得世界上大部分地区能以可承受的成本定期地使用该平台。

然而,它也是以太坊生态系统和区块链生态系统中很容易被误解的概念之一。分片指的是一组非常具体的想法,具有非常特定的属性,但它经常与那些具有非常不同且通常更弱的安全性属性的技术混为一谈。本文的目的是解释分片到底提供了哪些具体的性能,它与其他不分片的技术有什么不同,以及分片的系统为了实现这些性能需要做出哪些牺牲。

图为以太坊分片版本的一个描述。初始结构图来自 Hsiao-wei Wang,由Quantstamp设计

扩容的三大困境

描述分片的最佳方式,可以从形成和激发分片解决方案的问题开始:扩容的三难困境。

“扩容的三大困境”指的是,区块链尽量要有三个属性—可扩展性、去中心化以及安全性。但如果坚持采用 "简单"的技术,那只能达到其中的两项属性。

  1. 可扩展性:链可以处理比单个常规节点(比如:一台普通的消费性笔记本电脑)能验证更多的交易。
  2. 去中心化:链能在没有任何信任依赖性的情况下运行,无需依赖于一小部分大型中心化行为者。这意味着,不应该对一组节点有任何信任(或者甚至不应该假设多数节点将保持诚实)。
  3. 安全性:该链可以抵御其中大比例的参与节点试图攻击它的情况(理想情况下是能抵御50%及以上,25%以上也还算可以,5%肯定不合格)。

现在我们来看看三种“简单的解决方案”,这些解决方案只获得了上述三个属性中的两个:

  1. 传统的区块链:包括比特币、pre-POS/分片以太坊、Litecoin和其他类似的链。这些依赖于每个参与者运行一个完整的节点,验证每一笔交易,因此它们具有去中心化和安全性,但不具有可扩展性。
  2. 高TPS地区块链:包括DPoS系列以及其他一些链。这些依赖于少数节点(通常是10-100个)之间保持共识,用户必须信任其中大部分节点。这类链的特性就是可扩展和安全性,但不是去中心化的。
  3. 多链生态系统--这指的是让不同的应用作用在不同的链上,并使用跨链通信协议实现链间对话,从而实现 "可扩展"这个概念。这类是去中心化的和可扩展的,但它并不安全。因为攻击者只需要在众多链中的一条链上获得共识节点多数(往往是整个生态系统的<1%),就可以打破这条链,并可能造成涟漪效应,对其他链上的应用造成巨大的破坏。

但分片是一种能让你以上三者兼得的技术。一个分片的区块链是怎样的呢:

  1. 可扩展的:它可以处理的交易量远远超过单个节点。
  2. 去中心化的:它可以完全在普通消费者的笔记本电脑上运行,完全不需要依赖所谓的"超级节点(supernodes)"。
  3. 安全的:攻击者不可能用少量的资源去攻击系统的一小部分,他们只能试图支配和攻击整个系统。

文章剩下的部分将介绍分片区块链是如何做到这些的。

通过随机抽样分片

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

其核心思想如下,假设你有一个带有大量(比如10000个)验证者的PoS链,你有大量(比如100个)区块需要被验证。但在下一组区块出现之前,没有一台计算机强大到可以验证所有这些区块。

因此,我们要做的是随机分配要进行验证的工作。 我们随机地对验证者列表进行混洗,并在混洗后的列表中分配前100个验证者以验证第一个区块,分配后100个验证者以验证第二个区块,依此类推。随机选择的一组验证者被分配去验证一个区块(或执行其他任务),被称为委员会(committee)。

当验证者验证完一个区块时,他们会公布一个签名以证明动作完成。现在其他所有人无需去验证100个完整的区块,只要验证10000个签名就行。这大大减少了工作量,尤其是在使用BLS聚合签名的情况下。每一个区块不是通过同一个P2P网络进行广播,而是在不同的子网络上进行广播,节点仅需要加入它们负责的区块所对应的子网络。

考虑一下如果每个节点的计算能力都增加2倍,会发生什么情况。由于每个节点现在可以安全地多验证2倍以上的签名,我们可以减少最小的staking押金规模去支持2倍多的验证者。从而可以组成200个委员会而不是以前的100个,然后每个插槽就能验证200个区块。此外,每个单独的块也会大2倍。这样一算,我们有了多2倍数量和2倍大小的区块,链容量总共增加了4倍多。

我们可以引入一些数学术语来讨论。使用Big O表示法 ,我们用“O(C)”来指代单个节点的计算能力。传统的区块链可以处理大小为O(C)的块。如上所述的分片链可以并行处理多个O(C)区块(每个节点验证每个区块的成本可以说是O(1),因为每个节点只需要验证固定数量的签名即可),每个区块具有O(C)容量,因此分片链的总容量为O(C²)。这就是我们将这种分片称为二次分片(quadratic sharding)的原因,也是我们为什么认为从长远来看,分片是扩展区块链的最佳方法的关键原因。

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

以下是两个关键性区别:

  1. 随机抽样可以防止攻击者集中攻击一个分片。在100条链的多链生态系统中,攻击者只需要控制stake (质押金)总量的约0.5%就可以造成破坏,他可以集中对单条链发起51%攻击;但在分片的区块链中,攻击者必须控制接近整个质押量的30-40%才能造成破坏。换句话说,整条链有共享的安全性。当然,如果攻击者们如果足够幸运,即通过随机的方式让他们控制了单个分片51%的量,但对于占有远低于51%质押量的攻击者来说,难度会成倍地增加。如果攻击者的质押量占有少于30%左右,那几乎是不可能造成破坏了。
  2. 紧密耦合(Tight coupling):哪怕是一个分片中出现了一个非法区块 (bad block),整条区块链都会通过重组来抛弃该区块。在实施分片的区块链中,存在一个社会契约,即哪怕一条链中的任何一个分片中的任何一个区块出现问题都是不可接受的,一旦发现就该立刻被处理掉(在本文档后面的章节中,我们将描述一些从技术上强制执行该契约的方法)。从链内应用的角度来看,这就保证了完美的安全性,即合约A可以依赖合约B,因为如果合约B由于链上的攻击而行为不当,那整个历史记录就会被还原,包括合约A由于合约B的问题而出错的交易。

以上两个区别确保了分片为应用创造了一个环境,该环境保留单链环境的关键安全属性,这是多链生态系统从根本上来说是不可能实现的。

通过更好的安全模型来提高分片

我完全同意比特币圈子里一中普遍的说法,那就是像比特币(或以太坊)这样的区块链并不完全依赖于诚实的多数假设。如果在区块链上有51%的攻击,攻击者可以做到恢复或删减交易,但他们不能插入无效交易。而且即使他们真的恢复或审查交易,运行常规节点的用户也可以很容易地检测到这种行为。因此,社区可以迅速采取行动来解决攻击。

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

理想情况下,我们希望有一种分片形式,能够避免51%的信任假设的有效性,并保留传统区块链从完全验证中获得的强大的安全性保障。这也正是我们过去几年大量研究的内容。

计算的可扩展验证

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

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

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

可扩展验证计算相对容易,有两组技术:欺诈证明和ZK-SNARKs。

这两种技术可以简单地描述为:

  1. 欺诈证明是一个接受计算结果的系统,你需要有质押量的人签署以下形式的消息:“我证明,如果你对输入X进行计算C,你得到的输出是Y”。默认情况下你会信任这些消息,但你也会让其他有质押量的人发起挑战(签名消息为“我不同意,输出为Z”)。 仅在遇到挑战时,所有节点才会运行计算。这两方中的任何一方出错都会丢失其质押量,并且所有依赖于该计算结果的计算都会被重新计算。
  2. ZK-SNARK是一种可以直接证明“在输入X上执行计算C会得到输出Y ”的加密证明形式。该证明在密码学上是 "合理的",因为如果C(x)不等于Y,那么在计算上就无法做出有效的证明。该证明的验证速度也很快,即使运行C本身需要大量的时间。关于ZK-SNARKs的更多数学细节,请参见本文。

基于欺诈证明的计算是可扩展的,因为 "在正常情况下",你将通过验证单个签名来代替运行复杂的计算。在特殊情况下,由于存在挑战,你必须在链上验证计算。,但特殊情况是非常罕见的,因为触发它的代价非常昂贵(原始索赔者和挑战者都会损失大量质押量)。ZK-SNARKs在概念上更简单,它们只是用便宜得多的证明验证来代替计算-但其工作原理背后的数学却要复杂得多。

有一种半可扩展系统,它只对计算进行可扩展验证,同时仍然要求每个节点对所有数据进行验证。这个方法通过使用一套压缩技巧将大部分数据替换为计算,十分有效。这就是rollups的范围了。

数据可用性的可扩展验证难度较大

欺诈证明不能用于验证数据的可用性。计算的欺诈证明依赖于这样一个事实,即计算的输入在提交原始请求的那一刻就已经在链上发布了,因此如果有人提出质疑,质疑的执行就发生在与原始执行完全相同的 "环境 "中。在检查数据可用性的情况下,你无法做到这一点,因为问题恰恰在于需要检查的数据太多,无法在链上发布。因此,数据可用性的欺诈证明方案会遇到一个关键问题:有人可以在不发布数据的情况下声称 "数据X是可用的",等待被挑战,然后才发布数据X,从而使得发起挑战者被网络上的其他人认为不正确。

我们可以在“渔夫的困境”中进一步的阐述:

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

由于无法区分谁对谁错,就不可能有一个行之有效的数据可用性欺诈证明方案。

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

不幸的是,仅仅是有效的并不足以确保区块链的正确运行。这是因为,如果区块链是有效的,但所有的数据都不可用,那么用户还是没有办法更新他们所需的数据来生成用于验证未来区块的有效性的证明。如果攻击者生成了一个有效但不可用的区块后就消失,那攻击者就可以有效地停止了这条链的运行。有人也可以扣留某个特定用户的账户数据,直到该用户支付赎金,所以这个问题并不纯粹是一个区块链活性问题。

有一些强有力的信息论论点认为,这个问题是根本性的,没有任何巧妙的技巧(例如涉及密码学累加器)可以来规避它。详情请点击参阅这篇文章

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

有一种关键技术叫做数据可用性采样(data availability sampling)。数据可用性采样的工作原理如下:

  1. 使用一种叫纠删码(erasure coding)的工具,可以把一段含有N个数据块的数据扩展成一段含有2N个数据块的数据,这样当中任何N个数据块都可以恢复整个数据。
  2. 为了检查数据是否可用,用户无需下载整个数据,只需要随机选择区块中一个固定数量的位置(例如30个位置),只有当用户在其选择的位置成功地找到这些数据块时,才会接受该区块。

纠删码将"检查100%的可用性"(即检查每一数据都是可用的)这一问题转化为"检查50%的可用性"(即至少一半的数据是可用的)。随机抽样可以解决50%的可用性问题。但如果不到50%的数据是可用的,那么至少有一次检查几乎肯定会失败。但如果至少有50%的数据是可用的,那么,虽然有些节点可能无法识别一个区块是否可用,但只需要一个诚实的节点运行纠删码重构程序,就能将该区块剩余的50%数据恢复。因此不需要下载1MB来检查一个1MB的区块是否可用,而只需要下载几KB。这使得对每个区块运行数据可用性检查是可行的。可以通过点击这篇文章来了解如何通过P2P子网络来有效地实现这种检查。

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

概述:我们又是如何确保一切正确的呢?

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

1.每个客户端都对每个区块进行数据可用性抽样,以验证每个区块中的数据是否可用,同时每个区块只下载几 KB,即使整个区块的大小有1MB或更大。客户端只有在某个区块的所有数据的可用性挑战都被正确地响应时,才会接受该区块。

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

a. 我们可以使用欺诈证明:一些质押了存款的参与者可以对每个区块的正确性进行签名。其他节点,被称为挑战者(或渔夫)会随机检查并试图完整地处理区块。因为我们已经检查了数据的可用性,所以总是可以下载数据并完整地处理所有特定的区块。如果挑战者发现一个无效的区块,他们就会发布一个挑战让大家验证。如果这个区块被证明是无效的,那么这个区块和后续所有依赖该区块的区块都需要重新计算。

b. 我们可以使用ZK-SNARKs。每个区块都会带有一个ZK-SNARK来证明其正确性。

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

这就是全部了! 就以太坊分片而言,近期的计划是让分片区块只用于数据,也就是说,分片纯粹是一个 "数据可用性引擎",而Layer 2 Rollups的工作就是用这个安全的数据空间,加上欺诈证明或ZK-SNARKs,来实现高吞吐量的安全交易处理能力。不过,完全可以创建这样一个内置系统,来增加 "本地"的高吞吐量执行能力。

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

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

Sharding十分接近的,传统的区块链中:

  1. 无效区块无法通过,因为验证节点会发现它们是无效的,并忽略它们。
  2. 不可用的区块无法通过,因为验证节点无法下载它们,所以忽略它们。

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

  1. 无效的区块无法通过,因为欺诈证明会迅速抓住无效区块,并告知整个网络该区块的不正确性,并严惩其创建者;或者ZK-SNARK证明了正确性,你无法为一个无效区块创建一个有效的ZK-SNARK。
  2. 不可用的区块不能通过,因为如果一个区块的数据可用率低于50%,那每个客户端至少有一个数据可用性样本检查会失败,导致客户端拒绝该区块。如果一个区块的数据至少有50%是可用的,那么实际上整个区块都是可用的,因为只需要一个诚实的节点就可以重建该区块的剩余部分。

没有进行分片的传统高TPS链没法提供这些保障。多链生态系统也无法避免攻击者选择其中一条链进行攻击,并轻松控制该条链的问题(链可以共享安全性,但如果做得不好,整个多链生态系统就会变成一条传统的高TPS链,并存在其所有缺点。但如果在安全性上做的好,这个多链生态系统就只是成了上述分片技术的一个更复杂的实现而已)。

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

不过,分片系统的盔甲也有一些缺口。尤其是:

  1. 仅依靠于委员会的分片区块链很容易受到自适应对手(adaptive adversaries)的攻击,而且问责制也较弱。也就是说,如果对手有能力实时入侵(或者直接关闭)任何一组他们选择的节点,那么他们只需要攻击少量节点就可以破坏一个委员会。此外,如果对手(不管是自适应对手还是仅是控制有50%总质押量的攻击者)真的攻破了某个委员会,那么只有他们的少数节点(即攻击者在该委员会中控制的少数节点)会被公开地证明参与了该攻击,因此只有少量质押金会被惩罚。这也是为什么数据可用性抽样与欺诈证明或ZK-SNARKs一起组成了随机抽样技术的重要补充的另一个关键原因。
  2. 只有当有足够多的客户端在线时,它们集体发出足够多的数据可用性抽样请求,响应几乎总是重叠的,至少占区块的50%时,数据可用性抽样才是安全的。在实践中,这意味着必须有几百个客户端在线(而且这个数字会随着系统容量与单个节点容量的比例的增加而增加)。这是一个few-of-N信任模型,一般来说是相当可信的,但肯定不如非分片区块链中的节点对数据可用性无需信任那么稳健。
  3. 如果分片区块链依赖于欺诈证明,那么它依赖于时效假设。如果网络太慢,节点可能会在用于证明某个区块不正当的欺诈证明出现之前接受某个区块是被确定的。幸运的是,如果你严格遵循旦发现无效区块就逆转所有无效区块的规则,那么这个阈值是一个用户设定的参数:每个个体用户选择他们可以等待最终确定的时间,如果他们不想等太长的时间,那么就会受到损失,但更谨慎的用户是安全的。即便如此,这还是对用户体验的一种削弱。使用ZK-SNARKs来验证有效性,就解决了这个问题。
  4. 需要传递的原始数据量更大,就增加了极端网络条件下的故障风险。与大量数据相比,少量数据更容易发送(如果有强大的政府试图审查这条链,也更容易安全地隐藏)。如果区块探索者想要持有整条链的话,他们需要存储更多的数据。
  5. 分片区块链依赖于分片 P2P 网络,每个单独的 P2P“子网络”更容易被攻击,因为它的节点更少。用于数据可用性抽样的子网模型可以缓解这种情况,因为子网之间有一定的冗余,但即使如此,仍然存在风险。

以上都是合理的担忧,不过在我们看来,通过允许更多的应用在区块链上运行,而不是通过中心化的 Layer 2 服务运行,减少了用户层面的集中化,是更为令人担忧的问题。也就是说,这些顾虑,尤其是后两个问题,实际上才是制约分片区块链吞吐量超过某个点的真正因素。二次分片的二次性是有限制的。

顺带一提,如果分片区块链的吞吐量过高,其安全风险也会越来越大,这也是为什么扩展到超二次分片的努力在很大程度上被放弃的关键原因,看来保持二次分片的二次性才是最好的办法。

为什么不采用中心化方式生产区块和分片式验证?

一种经常被提出的分片替代方案是,搭建一条结构类似于中心化的高TPS链,但它可以使用数据可用性采样和分片来实现验证的有效性和可用性。

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

  1. 在高TPS链中,区块生产者检测审查要难得多。检测审查需要:(i)能够看到每一笔交易,并验证没有明明应该进入的交易却莫名其妙地进不去;或者(ii)在区块生产者中建立一个1-of-N信任模型,并验证没有区块没能进入链中。在中心化的高TPS链中,(i)是不可能的,(ii)更难实现。因为节点数量少,即使是1-of-N信任模型也更容易被破坏,而且如果链上的区块时间对于DAS来说太快了(就像大多数中心化的高TPS链一样),就很难证明某个节点生产的区块不是因为发布速度太慢而被拒绝。
  2. 如果大多数区块生产者和生态系统成员试图强行通过一个不受欢迎的协议变更。虽然用户的客户端肯定会检测到它,但对于社区来说,反抗和通过分叉来拒绝该变更是非常困难的,因为他们需要用一套新的非常昂贵的高吞吐量节点来维持一个保持旧规则的链。
  3. 中心化的基础设施更容易受到外部行为者的审查。区块生产节点的高吞吐量使得它们非常容易被检测到,也更容易被关闭。在政治和逻辑上,审查专用的高性能计算也比审查个人用户的笔记本电脑更容易。
  4. 高性能计算向中心化云服务转移的压力比较大,增加了整个链条在1-3家公司的云服务内运行的风险因此会增加由于许多区块生产者同时出现故障而导致整条链崩溃的风险。而有着在用户自己的硬件上运行验证者的文化的分片区块链不容易受到这种影响。

适当进行分片的系统作为基础层更好。给定一个实施分片的基础层,你就可以通过将其构建为Rollup的方式,在上面创建一个中心化的生产系统(例如,因为你想要一个高吞吐量的域,就对defi进行同步合成)。但如果你的基础层对中心化的区块生产有依赖性,那你就不能在上面构建一个更去中心化的 Layer 2。

原文作者:以太坊创始人-Vitalik Buterin

编译:Ursula Wang

原文标题:"Why sharding is great: demystifying the technical properties"

原文链接:https://vitalik.ca/general/2021/04/07/sharding.html


https://www.bitalk.com/news/detail/474882511206486016

版权声明:
作者:哔哔News
链接:https://www.btcbus.net/7445.html
来源:比特巴士
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>