分片 (Sharding) 是以太坊扩容的未来,它将是帮助以太坊生态系统支持每秒成千上万笔交易的关键,并允许世界上大部分人以负担得起的成本定期地使用该平台。
撰文:Vitalik Buterin
编辑:南风
特别感谢 Dankrad Feist 和 Aditya Asgaonkar 的校审。
分片 (Sharding) 是以太坊扩容的未来,它将是帮助以太坊生态系统支持每秒成千上万笔交易的关键,并允许世界上大部分人以负担得起的成本定期地使用该平台。然而,分片也是以太坊生态系统和更广泛的区块链生态系统中更容易被误解的概念之一。它指的是一组非常具体的具有特定属性的想法,但它经常与那些具有非常不同且通常更弱的安全性属性的技术混为一谈。本文的目的是解释分片提供了哪些特定的属性,它与其他非分片技术的区别,以及分片系统为了实现这些属性需要做出哪些权衡。
*上图:*以太坊分片版本的一个描述。初始结构图来自 Hsiao-wei Wang,由Quantstamp设计。
描述分片的最佳方式,可以从形成和激发分片解决方案的问题开始:扩容的三难困境。
扩容的三难困境指出,区块链尝试拥有三个属性,如果你坚持使用“简单”的技术,你只能获得这三个属性中的两个。这三个属性分别是:
现在我们来看看三种“简单的解决方案”,这些解决方案只获得了上述三个属性中的两个:
分片是一种让你拥有所有这三大属性的技术。一条使用分片技术的区块链是:
本文的其余部分将描述分片区块链如何做到这一点。
最容易理解的分片版本是通过随机抽样 (random sampling) 进行分片。与我们正在以太坊 (2.0) 生态系统中构建的分片形式相比,通过随机抽样进行分片具有更弱的信任属性,但它使用的技术更简单。
其核心理念如下:假设有一条拥有很大数量 (比如 10000 名) 验证者的 PoS 区块链,并且该链有大量 (比如100个) 区块需要验证。没有任何一台计算机有能力在下一组区块到来之前,将所有这些区块进行验证。
因此,我们所做的就是随机地划分验证工作。我们随机洗牌 (打乱) 验证者列表,然后将经打乱的验证者列表中的前 100 名验证者分配去验证第一个区块,将列表中接下来的 100 名验证者分配去验证第二个区块,以此类推。这样的一组经随机选中的验证者 (被分配去验证某个区块或执行一些其它任务),我们称之为一个委员会 (committee)。见下方示例图:
当一名验证者验证某个区块时,该验证者会发布一个签名 (signature) 来证明自己验证了该区块。其它验证者现在仅需验证 10000 个签名,而不是验证 100 个完整的区块 -- 这样一来,工作量就小得多了,尤其是通过使用 BLS 签名聚合 (注:也即将多个签名聚合成一个签名)。每个区块不是通过同一个 P2P 网络进行广播,而是在不同的子网络中广播,且节点只需加入与它们负责的区块 (或因其它原因感兴趣的区块) 相对应的子网络。
想象一下,如果每个节点的计算能力增加 2 倍将会发生什么。由于每个节点现在能够安全地验证多 2 倍的签名,你 (指区块链) 可以减少最低 Staking 质押金,从而支持多 2 倍的验证者数量,这样你就可以有 200 个委员会,而不是 100 个。因此,你在每个 slot 可以验证 200 个区块,而不是只有 100 个。此外,每个单独的区块还可以大 2 倍。这样以来,你 (在每个 slot) 就验证了多 2 倍的的区块,且每个区块的大小还增加了 2 倍,也即是说,整个区块链的容量增加了 4 倍。
我们可以引入一些数学术语来讨论这是怎么回事。借助大O表示法,我们用“O(C)”表示单个节点的计算能力。传统的区块链可以处理大小为 O(C) 的区块;而一条采用如上所述的分片技术的区块链可以并行处理 O(C) 区块 (请记住,每个节点间接验证每个区块的成本是 O(1),因为每个节点仅需验证固定数量的签名),且每个区块有着 O(C) 的容量,因此整个分片区块链的总容量将是O(C**2)。这就是为何我们将这种类型的分片称之为二次分片** (quadratic sharding),且这种效果是我们认为从长远来看,分片是扩展区块链的最佳方式的关键原因。
有两个关键区别:
这两个差异确保分片为应用程序创建了这样一个环境,该环境保留着一个单链环境所拥有的关键安全属性,而这是多链生态系统根本无法做到的。
比特币圈中一个常见的说法,也是我完全同意的一个说法是,像比特币 (或以太坊) 这样的区块链并不完全依赖于「诚实大多数的假设」。如果对这样的区块链发起 51% 的攻击,那么攻击者可以做出一些令人讨厌的事情,比如逆转或审查交易,但他们不能添加无效的交易。而且,即使它们确实逆转或审查交易,运行常规节点的用户也可以很容易地检测到这种行为,因此,如果社区希望通过一个削弱攻击者算力的分叉来协调解决该攻击,他们可以很快做到这一点。
缺乏这种额外的安全性正是那些更加中心化的高 TPS 区块链的一个关键弱点。这样的区块链没有,也不可能会有普通用户运行节点的文化,因此其主要节点和生态参与者可以更容易地聚集起来,强制执行一项社区非常厌恶的协议更改。更糟糕的是,用户的节点将默认接受这种更改。一段时间后,用户会注意到这种更改,但到那时,这种强制的更改已经是一个既成事实:用户将承担拒绝这项更改带来的协调负担,他们将不得不做出痛苦的决定,逆转每个人都认为已经被敲定的一天或更多的活动。
理想情况是,我们希望有一种分片形式,避免 51% 的信任假设,并保留传统区块链通过全网验证获得的强大安全保障。这正是我们在过去几年里所做的研究。
我们可以把防 51% 攻击的、具有可扩展性的验证分为两种情况:
验证区块链中的某个区块,涉及对「计算」和「数据可用性」同时**进行检查:你需要确信,1) 该区块中包含的交易是有效的,且该区块新的状态根哈希是执行这些交易的正确结果;但你也需要确信,2) 有足够多来自该区块的数据已经被发布,这样下载该数据的用户就可以对该状态进行计算,并继续处理这条链。这第二部分是一个非常微妙但却很重要的概念,我们称之为[数据可用性问题**](https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding),稍后再详细介绍。
首先,以可扩展的方式验证计算是相对容易实现;有两类技术:欺诈证明 (fraud proofs) 和 ZK-SNARKs(简洁的非交互式零知识证明)。
*欺诈证明是一种具有可扩展性的计算*验证方法
这两种技术可以简单地描述如下:
基于欺诈证明的计算是可扩展的,因为“在正常情况下”,你可以通过验证单个签名来代替运行复杂的计算。也有例外的情况,即由于有人发起了挑战,你必须在链上验证计算,但这种例外情况非常罕见,因为触发这种情况的成本非常昂贵 (最初的证明者或者发起挑战者,其中一方将损失一大笔存款)。
ZK-SNAKRs 在概念上更简单 -- 它们只是用更便宜的证明验证代替了计算 -- 但其工作原理背后的数学运算要复杂得多。
当前,有一类半扩展 (semi-scalable) 的 Layer 2 系统,它仅仅以可扩展的方式 (即使用欺诈证明或者 ZK-SNARKs) 验证计算,同时仍然要求每个节点对所有数据进行验证。通过使用一套压缩技巧可以非常有效地实现这一点。这就是 rollups。
欺诈证明不能用于验证数据的可用性。计算的欺诈证明依赖于这样一个事实,即计算的输入在最初的证明被提交的那一刻就发布在链上,因此如果有人发起挑战,那么挑战的执行与最初证明的执行是完全发生在同一个“环境”中的。但在检查数据可用性时,你不能这么做,因为问题恰恰在于,有太多的数据需要检查,不能全部发布到链上。因此,针对数据可用性的欺诈证明方案遇到了一个关键问题:某人可以声称“数据 X 是可用的”而不公布该数据,等待被挑战,然后才会在链上公布数据 X,从而使发起挑战者被网络上的其它人视为不正确。
这在渔夫的困境 中到了进一步的阐述:
「渔夫的困境」的核心概念是存在两个“世界”:一个世界中,V1 是个邪恶的数据发布者,V2 是个诚实的挑战者;另一个世界中,V1 是个诚实的数据发布者,V2 是个邪恶的挑战者。对于当时没有试图下载这一特定数据的人来说,是无法对此进行区分的。当然,在一个可扩展的去中心化区块链中,每个单独的节点可以只下载一小部分数据,因此,除了存在分歧这一事实之外,只有一小部分节点可以看到发生了什么。
由于不可能区分谁对谁错,因此不可能有一个有效的数据可用性欺诈证明方案。
不幸的是,仅仅只有有效性是不足以确保正确运行区块链的。这是因为,如果区块链是有效的,但是所有的数据都是不可用的,那么用户就没有办法更新他们所需的数据来生成用于验证未来区块的有效性的证明。如果一个攻击者生成了一个有效但不可用的区块,然后该攻击者又消失了,那么他就可以有效地暂停这条链。某个人可能会劫持某个特定用户的账户数据,直到该用户支付赎金,所以这个问题并不纯粹是区块链活性问题。
有一些强有力的信息-理论观点认为这个问题十分重大,没有什么明智的方式来规避。详情请参阅这篇文章:
https://eprint.iacr.org/2009/612.pdf
其中的关键是一种称为数据可用性抽样 (data availability sampling) 的技术。数据可用性抽样的工作方式如下:
纠删码将“检查100%可用性”(即检查每一段数据都是可用的) 这一问题转变成了“检查50%的可用性”(即至少有一半的数据是可用的)。随机抽样解决了 50% 的可用性问题。如果不到 50% 的数据是可用的,那么至少有一次检查几乎肯定会失败;如果至少 50% 的数据是可用的,同时某些节点可能无法识别出某个区块是可用的,那么只需要一个诚实节点运行纠删码重构过程,就能将该区块剩余的 50% 数据恢复。因此,不需要下载 1 MB 来检查 1MB 区块的可用性,你只需要下载几 KB。这使得对每个区块进行数据可用性检查是可行的。可以通过这篇文章来了解这种检查如何在 P2P 子网络中有效地实现:
https://hackmd.io/@vbuterin/sharding_proposal#Blob-publication-process
可以使用 ZK-SNARK 来验证对一段数据进行的纠删码是否正确地被执行,然后可以使用 Merkle 分支来验证单个数据块。或者,你可以使用多项式承诺 (例如 Kate (又名KZG) 承诺),本质上是在一个简单的组件中进行纠删码、证明单个元素和正确性验证——这就是以太坊分片所使用的。
假设有 100 个区块,你想要在不依赖委员会的情况下有效地验证所有区块的正确性。我们需要做以下工作:
就是这样!就以太坊分片而言,近期计划是将分片区块仅用于数据;也就是说,分片纯粹是一个“数据可用性引擎”,而 Layer 2 Rollups 将使用这个安全的数据空间,同时使用欺诈证明或 ZK-SNARKs,来实现高吞吐量的安全交易处理能力。但是,完全可以创建这样一个内置系统来添加“本地”高吞吐量执行。
分片的关键目标是尽可能复制传统 (非分片) 区块链最重要的安全属性,但不需要每个节点亲自验证每笔交易。
在传统的区块链中:
在一个具有高级安全特征的分片区块链中:
没有实施分片的传统高 TPS 区块链 (比如 DPoS 链) 无法提供这些保证;多链生态系统也没有办法避免攻击者选择其中一条链作为攻击目标并轻易控制该条链的问题 (这些链可能会共享安全性,但如果这方面做不好,整个多链生态系统将实际上变成一条传统的高 TPS 的链,并具有后者的所有缺点;如果在共享安全性方面做好了,这个多链生态就只是成了上述分片技术的一个更复杂的实现而已)。
侧链 (sidechains) 高度依赖于具体实现,但它们通常容易受到传统高 TPS 区块链的弱点的影响 (如果它们共享矿工/验证者),或受到多链生态系统的弱点的影响 (如果它们不共享矿工/验证者)。采用分片的区块链 (注:译者在下文中简称为“分片区块链”或“分片系统”)能够避免这些问题。
然而,分片系统的盔甲上也有一些裂缝。尤其是:
以上这些都是合理的担忧,尽管在我们看来,允许更多的应用运行在区块链上,而不是通过中心化的 Layer 2 服务运行,是更为令人担忧的问题。话虽如此,这些担忧,尤其是后两个问题,实际上是限制分片区块链吞吐量超过某个点的真正因素。二次分片的二次性是有限制的。
顺便说一句,如果分片区块链的吞吐量变得太高,那么它的安全风险会越来越大,这也是为什么扩展到超二次分片的努力在很大程度上被放弃的关键原因;似乎保持二次分片的二次性才是最好的方法。
人们经常提出的一种分片替代方案是,搭建一条结构类似于中心化的高 TPS 链的区块链,但这条链上面使用数据可用性抽样和分片,以实现对有效性和可用性的验证。
这改进了目前存在的中心化高 TPS 区块链,但仍然比分片系统弱得多。这有几个原因:
适当进行分片的系统作为基础层更好。给定一个实施分片的基础层,你总是可以通过构建一个 Rollup 来在其上创建一个中心化的生产系统。但是,如果你有一个依赖于中心化的区块生产的基础层,那你就无法在上面构建一个更加去中心化的 Layer 2。
原文链接:
https://vitalik.ca/general/2021/04/07/sharding.html
本文首发于Unitimes App
-END-
【发布文章仅为传播更有价值的信息,文章版权归原作者所有,其内容与观点不代表Unitimes立场。本微信平台出现的图片均在互联网收集而来,版权归版权所有人所有,若版权者认为其作品不宜供大家浏览或不应无偿使用,请添加微信unitimes2018联系我们,本平台将立即更正。】
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!