本篇文章的目的是介绍分片的特定属性,并与其他非分片技术加以区分,且为了实现这些属性,分片系统需要做出哪些牺牲。
来源 | vitalik.ca
此处特别感谢Dankrad Feist和Aditya Asgaonkar的校对工作。
分片是以太坊可扩展性的未来,是让以太坊生态系统实现每秒数千笔交易的关键,这样大部分人才能以负担得起使用成本,成为该以太坊的用户。然而,在以太坊生态系统中,分片是容易受到误解的概念之一,在更广泛的区块链生态系统中也是如此。它指的是一组非常特定的概念,这些概念都拥有自己的特质,但人们经常将前者与一些技术混为一谈,后者的安全特性更弱,且与前者不同。本篇文章的目的是介绍分片的特定属性,并与其他非分片技术加以区分,且为了实现这些属性,分片系统需要做出哪些牺牲。
图注:以太坊分片系统,原图来自Hsiao-wei Wang,由Quantstamp设计
要介绍分片,最佳方式是从描述一个问题开始,即扩展性不可能三角,这个问题促成了该解决方案的诞生。
根据扩展性不可能三角,一个区块链想要实现三个特性,若使用简单技术手段,只能实现三个特性中的两个。这三个特性如下:
以下是三种不同类型的“简单解决方案”,但是这些解决方案只能实现三个特性中的两个。
分片技术能够同时实现上文提及的三个特性。一个分片型区块链拥有以下特征:
本文接下来的部分将讨论分片型区块链如何实现这些优势。
最容易理解的分片版本是通过随机抽样进行分片。与以太坊生态系统中构建的分片形式相比,随机抽样分片的信任属性更弱,但以太坊分片应用的技术更简单。
下文阐述了分片的核心思想。假设有一个PoS区块链,其验证者数量非常多,例如10000位验证者,并且需要验证区块的数量非常庞大,比如100个区块。在下一组区块产生之前,没有一台计算机能够验证这100个区块。
为了解决这个问题,我们需要以随机的方式,分配验证工作。我们对验证者名单进行随机混洗,然后选取名单中前100个验证者来验证第一个区块,第二组100位验证者来验证第二个区块,以此类推。随机抽样分片通过这种方式来验证区块或执行其他任务,这些随机选出的验证者称为委员会(committee)。
验证者验证一个区块后,会通过发布一个签名来证明。其他所有节点都只需要验证10000个签名,而不是验证100个完整区块,这样会减少很多工作量,特别是应用了BLS签名聚合技术之后。每个区块的广播无需通过同一个P2P网络,而是通过不同子网,节点只需加入自己负责或其他想要验证的区块相对应的子网。
想象一下,如果每个节点的算力增加2倍,会产生什么效果。对于每个节点,现在能够安全验证签名的数量增加了2倍,那么可以减低最小质押数量,让验证者的数量增加2倍,这样就可以产生200个委员会,而不是100个。所以,每个时隙的区块验证数量能够达到200个,而不是100个。此外,每个区块容量可以扩大2倍。因此,总体区块链容量会增加4倍。
我们可以通过数学术语来解释其背后的原理。根据大O符号 (Big O notation),我们用“O( C )”表示单个节点的算力。O ( C )代表传统区块链能够处理的区块大小。如上所述,分片链可以并行处理大小为O( C )的区块 (请记住,每个节点来验证每个区块的间接成本为O(1),因为每个节点只需要验证固定数量的签名)。因此,每个区块容量为O ( C ),分片链总容量是O (C^2^)。这就是为什么这种类型的分片称为二次方分片 (quadratic sharding),基于二次方分片的关键作用,我们认为从长远来看,分片是扩展区块链的最佳方式。
人们经常会问这样一个问题:“随机组成100个委员会与分裂为100条独立区块链有什么不同?”
其不同之处主要在于以下两个方面:
1.随机抽样能防止攻击者将算力集中于某个分片中。在一个100条区块链组成的多链生态系统中,攻击者只要拥有总质押量的0.5%就可以造成破坏,意味着可以针对其中一个区块链发起51%攻击。在一个分片链中,攻击者必须拥有总质押量的30-40%,才能达到相同目标,换言之,该链的安全性能共享给分片。当然,攻击者可以等到运气好的时候,偶然在单个分片中获得51%的算力,尽管拥有的质押量不到50%,但对于质押量远远低于51%的攻击者来说,发起攻击的难度呈指数型上升。如果质押量少于30%,几乎不可能发起攻击。
2.若有一个分片出现了坏块,整个链会重组,以避免接受该区块,这称为紧密耦合性。根据社会契约,即使单个分片中出现了一个坏块,也不能被主链接受,一旦发现坏块,分片会被拒绝,本文后面章节将介绍一些从技术上强制执行社会契约的方法。有了这一机制,从应用程序的角度来看,分片链享有完美安全性,合约A能够信任合约B,即使由于区块链受到攻击,合约B出现故障,并且回滚了整个历史,其中也包含合约A中由于合约B出现问题而受到影响的交易。
这两种差异确保分片为应用创建了一个环境,该环境保留了单链条件下的关键安全属性,而多链生态系统则无法实现这一点。
我完全同意比特币社区中的一种普遍看法,那就是像比特币(或以太坊)等区块链并不完全依赖诚实的大多数假设。如果对这些区块链展开51%攻击,则攻击者可以做一些具有破坏力的坏事,例如回滚或审查交易,但不能插入无效的交易。而且即使他这么做了,运行常规节点的用户也可以轻松检测到这种行为,因此,社区若希望通过分叉来剥夺攻击者的力量,以协调的方式抵御攻击,可以迅速采取行动。
对于更为中心化的高TPS链,它们的主要弱点是缺乏这种额外安全性。这种区块链没有,也不可能具有让普通用户运行节点的文化,因此主要节点和生态系统参与者可以更轻松地聚在一起,强制实行一项协议更改,即使社区非常不喜欢这个改动。更糟糕的是,在默认情况下,用户的节点会接受这项改动。一段时间后,用户会察觉到,但等到那时,这个更改已经成为既成事实,意味着其中主要的协调负担,即拒绝更改,将由用户承担,并且不得不做出痛苦的决定,回滚一天或更多的交易记录,而其他用户都以为这些记录已经得到了最终确认。
理想情况下,我们希望采用一种分片形式,其验证方式能避免上文提到的51%信任假设,并保留传统区块链的高安全性,这种安全性只有在经过完全验证的情况下才能实现。而这正是我们过去几年的大部分研究成果。
我们可以将能够抵御51%攻击的可扩展验证问题分为两种情况:
区块链中的区块验证同时涉及计算和数据可用性检查,即你需要确信区块中的交易有效,并且区块中的新状态根哈希是执行这些交易的正确执行结果,但是你还需要确信该区块中有足够多的数据实际得到发布,这样下载数据的用户可以计算状态,继续处理区块。第二点关系到一个非常微妙但重要的概念,即数据可用性问题 (data availability problem)。下文会对这个问题进行探讨。
可扩展计算验证相对容易实现,其中会运用两类技术:欺诈证明及ZK-SNARKs
欺诈证明能够验证计算的同时,保证扩展性。
以下是对两类技术的简单介绍:
基于欺诈证明的计算之所以具有扩展性,是因为在“通常情况下”,你不用运行复杂计算,只需验证单个签名。在特殊情况下,挑战出现后,你必须在链上验证计算,但是特殊情况很少发生,因为触发这种情况的成本非常昂贵,因为最初的声明者或挑战者之一会失去大量保证金。ZK-SNARKs概念更简单,它们只是通过成本更低的证明进行验证,从而代替计算,但其背后的数学原理却要复杂得多。
有一种半可扩展系统,它能以可扩展的形式验证计算,但需要每个节点验证所有数据。该系统若能通过一系列压缩技术,通过运算替换大部分数据,效率便可大大提高。这便是Rollup所做的事。
欺诈证明不能用于验证数据可用性。运算的欺诈证明基于这样一种条件,即原始声明一旦提交,运算的输入数据要在链上发布,因此,如果有人发起挑战,该挑战的执行与原始执行的“环境”完全一致。对于数据可用性检查,上述操作无法实现,因为如果要在链上发布,需要检查的数据量太多。因此,针对数据可用性,如何生成欺诈证明方案变成了一个关键问题,有人可以声称“数据X可用”,但不在链上发布,等待挑战者出现,发起挑战后,再向整个网络发布该数据,使得网络中的其他参与者认为挑战者是不正确的
下图的“渔夫困境”能够很好阐释其中道理:
“渔夫困境”的核心理念涉及到两种情况,一种情况是V1是恶意发布者,但V2是一个诚实挑战者,而另一种情况是V1是诚实发布者,而V2是恶意挑战者。两种情况对于当时未尝试下载该特定数据的任何人来说都没有区别。当然,在可扩展的去中心化区块链中,每个个人节点只期望下载一小部分数据,因此只有一小部分节点能够了解分歧之外的所有状况。
由于不可能辨识出哪一方是正确的,所以也无法为数据可用性生成有效的欺诈证明解决方案。
人们经常问道:“如果某些数据不可用怎么办?ZK-SNARK可以确保一切数据的有效性,但这还不够吗?”
不幸的是,仅仅保证数据有效性还不足以维持区块链正常运行。原因是如果区块链能经过验证,但所有数据均不可用,则用户将无法更新数据,生成证明验证未来的区块。攻击者如果能生成一个区块,该区块虽然能够经过验证,但数据不可用,可以有效阻碍区块链运行。有的攻击者还可以不上传特定用户的帐户数据,直到该用户支付赎金为止,因此这不仅仅是一个活性问题。
有一些强有力的信息论观点认为这个问题是根本性问题,没有优良解决方案 (例如密码学累加器的应用)。有关详细信息,请参见本文。
那么,如何在不下载的情况下,检查1 MB数据是否可用?这听起来无法实现!
关键的解决方案是一种称为数据可用性采样 (data availability sampling) 的技术。该技术的工作方式如下:
通过纠删码,我们能够将问题从“检查100%数据可用性” (即保证每条数据均可用) 转变为“检查50%数据可用性” (即至少一半数据可用)。随机抽样则解决了50%可用性问题。如果可用数据量少于50%,那么这两种检查手段中至少一个不可行,并且如果至少50%的数据可用,那么,尽管某些节点可能无法得知一个区块的可用性,但只需要一个诚实节点运行纠删码重构程序,就能恢复剩余50%的区块数据。因此,为了检查1 MB区块的可用性,你无需下载1 MB数据,只需下载几KB。这样每个区块都能接受数据可用性检查。有关如何使用P2P子网有效进行数据检查,请参见这篇文章
通过ZK-SNARK证明,数据纠删码的正确性也能够得到验证,然后利用默克尔树的分支来验证各个数据块。另一种验证方式是使用多项式承诺 (polynomial commitment),例如Kate commitments (KZG承诺),本质上,该承诺通过一个简单组件进行纠删编码,证明每个要素和正确性验证,这就是以太坊分片所使用的技术。
总结:如何保证所有数据的正确性?
假设有100个区块,并且你不想依赖委员会有效地验证所有区块的正确性。为了实现这个目标,我们需要进行以下措施:
数据可用性得到验证后,那么验证其正确性将变得更加容易。验证正确性要通过以下两种技术:
以上就是全文的总结! 就以太坊分片而言,短期计划是让分片中的区块只包含数据。 也就是说,这些分片的作用纯粹是“数据可用性引擎”,Layer2 rollup的工作则是使用安全的数据空间,另外还会利用欺诈证明或ZK-SNARK技术,实现高交易吞吐量,同时维持安全性。但是,我们还可以创建一个内部系统,“原地”实现高吞吐执行,这是完全有可能实现的。
分片的主要目标是尽可能地继承传统非分片区块链最重要的安全属性,同时无需每个节点验证每笔交易。
分片基本可以满足这些要求。以下是传统区块链的特征:
以下是强安全性的分片区块链特征:
无效区块无法添加到区块链中,原因如下:
传统高TPS链因为没有分片,无法实现上述特征。而多链系统面临的问题在于,攻击者如果选择一条链进行攻击,就可以轻易取得控制,系统中的链也可以共享安全性,但是如果安全性低,那将与传统高TPS链没有区别,还会继承传统区块链的所有缺点,若安全性较高,共享安全性只是上述分片技术的一种更复杂的实现。
侧链(sidechain) 高度依赖于实现方式,如果它们共享矿工或验证者,通常它们容易面临传统高TPS链的弱点;如果它们不共享矿工或验证者,也会面对多链生态系统的弱点。分片链避免了这些问题。
但是,分片系统也有一些隐患。尤其是在以下几个方面:
这些是数据验证需要关注的问题,尽管在我们看来,让更多应用程序在链上运行,而不是通过中心化layer 2服务,减少用户层的中心化,会比上述方面更值得注意。也就是说,实际上这些问题,特别是最后两个问题,会对增加分片链吞吐量造成真正限制,使其无法超过特定规模。二次方分片 (quadratic sharding) 只能实现有限二次方性。
顺便说一句,如果吞吐量过高,分片链的安全风险将日益增大,很大程度上,这也是放弃扩展至超二次分片的主要原因。使二次方分片保持其有限二次方性似乎是合适的中间值。
人们经常提出一种替代分片的方法,那就是使用类似于中心化高TPS链的结构,除此之外,利用数据可用性采样和分片以验证数据有效性和可用性。
这种方案能够改善既有的中心化高tps区块链,但仍远没有分片系统强大。其中一些原因如下:
系统适当分片化后,能更加适合作为基础层。基于一个分片化的基础层,你始终能够通过构建Rollup的方式创建一个中心化的产品系统 (例如用于DeFi的具有同步可组合性的高吞吐量领域)。但是,如果基础层依赖于中心化区块生产,则无法基于此构建一个更加去中心化的 Layer2。
ECN的翻译工作旨在为中国以太坊社区传递优质资讯和学习资源,文章版权归原作者所有,转载须注明原文出处以及ethereum.cn,若需长期转载,请联系eth@ecn.co进行授权。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!