特别感谢Dankrad Feist和Aditya Asgaonkar对本文内容的审核。
分片(sharding)是以太坊可扩展性的未来,它将是帮助以太坊生态系统每秒支持数千笔交易并允许世界上大部分地区以可承受的成本经常使用该平台的关键。但是,分片也是以太坊生态系统和更广泛的区块链生态系统中很容易被误解的概念之一。分片指的是一组具有非常特定属性的非常特定的想法,但是它常常与具有非常不同且通常弱得多的安全属性的技术混为一谈。这篇文章的目的是确切解释分片提供的特定属性,它与没有分片的其他技术有何不同,以及为实现这些属性而必须做出的牺牲。
描述分片的最佳方法就是从塑造和启发解决方案的问题陈述开始:可扩展性三角。
可扩展性三角认为,区块链试图同时拥有三个属性,如果坚持技术“简单性”,那么你只能获得这三个属性中的两个,即区块链“不可能三角”。 这三个属性是:
可扩展性:区块链可以处理的交易量比单个常规节点(例如:消费级笔记本电脑)可以验证的交易量更多。
去中心化:区块链可以在不依赖来自一小群大型中心化参与者的任何信任的情况下运行。 这通常意味着,您不能把信任交给一小组节点(即使假设它们多数是诚实的)(你无法通过消费级笔记本加入成为这些节点之一)。
安全性:区块链可以抵抗来自很大一部分参与节点正在对其展开的攻击。(对于攻击成功所需要的节点,理想情况下50%,25%以上也可以,5%绝对不行)
要想获得可扩展性三角中的两个,我们现在来看一下三类“简单的解决方案”:
传统的区块链——包括比特币,预PoS /分片的以太坊,莱特币和其他类似的链。这些区块链都依赖于那些运行完整节点的每个参与者来验证每笔交易,因此它们具有去中心化和安全性,但没有可扩展性。
高TPS区块链——包括DPoS系列,也包括许多其他产品。这些依赖于少数几个节点(通常为10-100个)之间保持共识,而用户必须信任这些节点中的大多数。这是可扩展的和安全的(从上面的定义来讲),但是它不是去中心化的。
多链生态系统——这是指“横向扩展”的一般概念,通过在不同的链上开发不同的应用,并使用跨链通信协议在它们之间进行对话。这是去中心化的,也是可扩展的,但是不是安全的,因为攻击者仅需要在多个链中的一个(通常少于整个生态系统的1%节点)中获得共识节点的多数,即可打破该链并可能引起连锁反应,从而导致对其他链中的应用造成了极大的损害。
分片是一种可以让您同时拥有全部三个属性的技术。 分片区块链具备:
可扩展:与单个节点相比,它可以处理更多的交易
去中心化:它可以完全在家用笔记本电脑上使用,而不依赖于任何“超级节点”
安全:攻击者无法使用少量资源来瞄准系统的一小部分进行攻击; 他们只能试图统治和攻击整个区块链系统
本文章的其余部分将描述分片区块链如何做到这一点。
分片最容易理解的版本是通过随机采样进行分片。与我们在以太坊生态系统中建立的分片形式相比,通过随机采样进行分片具有较弱的信任属性,但它使用的技术更简单。
核心思想如下。假设您有一个具有大量(例如10000个)验证者的PoS链,并且您有大量(例如100个)需要验证的区块。在出现下一组区块产出之前,单一一台计算机不具有足以验证所有这些区块的能力。
因此,我们要做的是随机分配进行验证的工作。我们随机地对验证者列表进行混洗,并在混洗后的列表中分配前100个验证者以验证第一个区块,在混洗后的列表中分配后100个验证者以验证第二个区块,依此类推。这些随机分配用于验证区块(或执行其他任务)的验证者们称为委员会(committee)。
验证者验证区块时,他们会发布签名,以证明他们已这样做。 不同于所有人都验证这100个区块,取而代之的是所有人验证10000个签名——这么做的工作量要小得多,尤其是使用BLS签名聚合时。 取代通过相同的P2P网络广播每个区块,而是在不同的子网(sub-network)上广播每个区块,并且节点仅需要加入它们负责(或出于其他原因而感兴趣)的区块所在的子网。
请考虑一下,如果每个节点的计算能力增加2倍,会发生什么情况。 由于每个节点现在可以安全地验证2倍以上的签名,因此您可以减少最小的质押存款大小以支持2倍的验证者,因此,您可以组成200个委员会而不是100个委员会。因此,您可以每个插槽验证200个区块而不是100个。 此外,每个单独的区块也可以扩大2倍。 因此,您有2倍数量的2倍大小区块,换句话说区块链容量总共增加了4倍。
我们可以通过一些数学术语来表示。 使用Big O表示法,我们使用“ O(C)”来指代单个节点的计算能力。 传统的区块链可以处理O(C)个区块。 如上所述的分片区块链可以并行处理O(C)个区块(请记住,每个节点间接验证每个区块的成本为O(1),因为每个节点只需要验证固定数量的签名即可),每个区块具有O(C)容量,因此分片区块链的总容量为O(C2)。 这就是为什么我们将这种分片称为“二次分片”,并且这种影响是我们认为从长远来看分片是扩展区块链的最佳方法的关键原因。
常见问题:拆分为100个委员会与拆分为100个独立的链有何不同?
有两点不同:
随机采样可防止攻击者将力量集中在一个分片上。在一个拥有100条链的多链生态系统中,攻击者只需要约0.5%的质押就可造成严重破坏:他们可以专注于对一条链展开51%攻击。在分片的区块链中,攻击者必须拥有全部质押的约30-40%才能做同样的事情(换句话说,整个链具有共享的安全性)。当然,攻击者可以等待,尽管其持有的质押少于全部质押的50%,但可以通过获得随机机会获得单个分片进行51%攻击的机会,但是对于少于51%的攻击者,这将攻击难度成倍增加。如果攻击者的资产少于〜30%,则几乎是不可能的攻击成功的。
紧密耦合:即使一个分片遇到坏块,整个链也会重组以避免这个区块。这里有一个社会合约(在本文档的后续部分中,我们描述了一些从技术上实施这种合约的方式),即使一条链在一个分片中只有一个坏块,这也是不可接受的,一旦发现,就应该废弃。这样可以确保从链上应用的角度来看,它具有完美的安全性:合约A可以依赖合约B,因为如果合约B由于对链的攻击而行为不当,那么整个历史记录都将还原,包括其由于合约B的故障而行为不当的合约A交易。
这两种差异确保分片为应用创建了一个环境,该环境保留了单链环境的关键安全属性,而多链生态系统则根本没有这种方式。
比特币社区的一种普遍看法是我完全同意的,那就是像比特币(或以太坊)这样的区块链并不完全依赖一种诚实多数假设。如果对这样的区块链展开51%攻击,则攻击者可以做一些令人讨厌的事情,例如还原或审查交易,但他们不能插入无效的交易。而且即使进行还原或审查交易,运行常规节点的用户也可以轻松检测到该行为,因此,如果社区希望通过分叉来消除攻击者的力量来协调解决该攻击,他们可以迅速采取行动。
缺乏这种额外的安全性是更中心化的高TPS链所面临的主要弱点。这样的链没有,也不可能具有运行节点的常规用户文化,因此主要节点和生态系统参与者可以更轻松地聚在一起,并实施社区非常不喜欢的协议更改。更糟糕的是,用户的节点默认情况下会接受它。一段时间后,用户会察觉,但是到那时,这个强制协议更改已经成为既成事实:这个协调负担将由用户承担来拒绝更改,他们将不得不做出痛苦的决定来逆转这一天在区块链上产生的价值,或撤销更多每个人都以为已经完成的活动。
理想情况下,我们希望采用一种分片形式,避免51%信任假设,并保留传统区块链从全面验证中获得的强大安全堡垒。而这正是我们过去几年的大部分研究成果。
我们可以将抗51%攻击的可扩展验证问题分为两种情况:
验证计算:检查某些计算是否正确完成,假设您拥有该计算的所有输入
验证数据可用性:检查计算本身的输入是否以某种形式存储,如果确实需要,可以下载它们;执行此检查时,请不要实际下载所有输入本身(因为数据可能太大,无法每个区块都下载)
验证区块链中的区块涉及计算和数据可用性检查:您需要确信区块中的交易有效,并且区块中声明的新状态根哈希是执行这些交易的正确结果,但是您还需要需要确信来自该区块的足够数据实际上已经发布,以便下载该数据的用户可以计算状态并继续处理区块链。第二部分是一个非常微妙但重要的概念,称为数据可用性问题。稍后再讨论。
扩展验证计算相对容易;有两种技术:欺诈证明(fraud proofs)和ZK-SNARK。
欺诈证明是一种可扩展地验证计算的方法。
这两种技术可以简单地描述,如下:
欺诈证明是一个接受计算结果的系统,您需要有进行过质押的人签署以下形式的消息:“我证明,如果使用输入X进行计算C,则会得到输出Y”。您默认情况下会信任这些消息,但是会给进行过质押的其他人提供挑战结果的机会(他们可以签名消息,说“我不同意,输出结果应该为Z,而不是Y”)。仅当有人挑战结果时,所有节点才运行计算。这两方中的任何一方出错都会失去其质押,并且将重新计算所有依赖于该计算结果的计算。
ZK-SNARK是一种加密证明形式,可以直接证明“在输入X上执行计算C会给出输出Y”的主张。该证明在密码上是“合理的”:如果C(x)不等于Y,则在计算上不可能做出有效的证明。即使运行C本身花费大量时间,该证明也可以很快地进行验证。有关ZK-SNARK的更多数学详细信息,请参见此文章。
基于欺诈证明的计算是可扩展的,因为在“通常情况下”,您将通过验证单个签名来代替运行复杂的计算。在特殊情况下,由于存在挑战,您必须在链上验证计算,但是在特殊情况下却很少见,因为触发它的代价非常昂贵(最初的声明者或挑战者都会可能失去大量保证金)。 ZK-SNARK在概念上更简单——它们只是用便宜得多的证明验证来代替计算——但其工作原理背后的数学却要复杂得多。
有一种半可扩展系统,它只能扩展地验证计算,同时仍然需要每个节点验证所有数据。通过使用一组压缩技巧将大部分数据替换为计算,可以使此方法非常有效。这是Rollup的领域。
欺诈证明不能用于验证数据的可用性。计算的欺诈证明依赖于这样的事实,即计算的输入在最初声明者提交后即在链上发布,因此,如果有人挑战,则挑战执行将在与原始执行完全相同的“环境”中进行。在检查数据可用性的情况下,您不能执行此操作,因为问题恰恰是存在太多数据需要检查才能在链上发布的事实。因此,用于数据可用性的防欺诈方案遇到了一个关键问题:有人可以声称“数据X可用”但并不发布它,等待受到挑战,然后只有在挑战者出现在网络的其余部分并且错误的时候才发布数据X。
这在“fisherman困境”中得到了扩展:
核心思想是,这两个“世界”,一个是V1是一个邪恶的发布者,V2是一个诚实的挑战者,而另一个“世界”是V1是一个诚实的发布者,V2是一个邪恶的挑战者。两种情况对于当时未尝试下载该特定数据的任何人来说都没有区别。 当然,在可扩展的去中心化区块链中,每个单独的节点只能希望下载一小部分数据,因此只有一小部分节点会看到发生了什么事情,除了存在分歧的事实。
分清谁对谁错是不可能的,这个事实使得不可能有一个有效的欺诈证明机制来保证数据的可用性。
常见问题:如果某些数据不可用怎么办?使用ZK-SNARK,您可以确保一切都有效,这还不够吗?
不幸的是,仅仅有效性还不足以确保区块链正确运行。这是因为,如果区块链有效,但所有数据均不可用,则用户将无法更新其生成任何未来区块有效的证明所需的数据。生成有效但不可用的区块然后消失的攻击者可以有效地让区块链陷入停滞。有人还可以保留特定用户的帐户数据,直到该用户支付赎金为止,因此问题不仅仅在于生存问题。
有一些强有力的信息理论论点认为这个问题是根本的,并且没有可以解决的聪明技巧(例如,涉及密码累加器)。有关详细信息,请参见本文(https://eprint.iacr.org/2009/612.pdf)。
那么,如何在不实际下载的情况下检查1 MB数据是否可用?听起来是不可能的!
这里的关键是一项称为数据可用性采样的技术。数据可用性采样的工作方式如下:
使用称为擦除编码(erasure coding)的工具将具有N个区块的数据扩展为具有2N个区块的数据,以使这些区块中的任何N个都可以恢复整个数据。
为了检查可用性,用户无需尝试下载全部数据,而只是随机地选择区块中恒定数量的位置(例如30个位置),并且仅当他们在所有选定位置的块中成功找到块时,才接受这个区块。
擦除编码将“检查100%可用性”(每条数据可用)问题转换为“检查50%可用性”(至少一半数据可用)问题。随机抽样解决了50%可用性问题。如果少于50%的数据可用,那么至少有一项检查几乎可以肯定会失败,并且如果至少50%的数据可用,那么,尽管某些节点可能无法将某个区块识别为可用,但这只需要一个诚实节点就能运行擦除编码重建程序,以带回剩余的50%区块。因此,您无需下载1 MB来检查1 MB区块的可用性,而只需下载几KB。这使得在每个区块上运行数据可用性检查变得可行。有关如何使用点对点子网有效地执行此检查的信息,请参见这篇文章(https://hackmd.io/@vbuterin/sharding_proposal#Blob-publication-process)。
可以使用ZK-SNARK来验证对一条数据的擦除编码是否正确完成,然后可以使用Merkle分支来验证各个区块。或者,您可以使用多项式承诺(例如Kate(又名KZG)承诺),该承诺本质上是在一个简单的组件中进行擦除编码并证明单个元素和正确性验证——这就是以太坊分片所使用的。
回顾:我们如何确保一切都正确?
假设您有100个区块,并且您想不依靠委员会就有效地验证所有区块的正确性。我们需要执行以下操作:
每个客户端在每个区块上执行数据可用性采样,以验证每个区块中的数据是否可用,同时每个区块仅下载几KB,即使区块的整体大小为MB或更大。客户端仅在正确响应了其可用性挑战的所有数据后才接受区块。
既然我们已经验证了数据的可用性,那么验证正确性将变得更加容易。有两种技术:
我们可以使用欺诈证明:一些质押存款的参与者可以对每个区块的正确性进行签名。其他称为挑战者(或fisherman)的节点随机检查并尝试完全处理区块。因为我们已经检查了数据可用性,所以始终可以下载数据并完全处理任何特定的块。如果他们发现一个无效的区块,他们将发布一个所有人都可以验证的挑战。如果该块被证明是坏的,则需要重新计算该块以及所有依赖于该块的未来区块。
我们可以使用ZK-SNARK。每个区块都带有一个ZK-SNARK证明正确性。
在以上两种情况下,每个客户端仅需要对每个区块进行少量验证工作,无论区块有多大。就欺诈证据而言,偶尔需要在链上对区块进行充分验证,但这应该非常少见,因为即使仅触发一个挑战也是非常昂贵的。
这就是全部! 在以太坊分片中,短期计划是使分片的区块仅成为数据(data only)。 也就是说,这些分片纯粹是一个“数据可用性引擎”,使用该安全数据空间以及欺诈证明或ZK-SNARK来实现高吞吐量安全交易处理功能是Layer Rollup的工作。 但是,完全有可能创建这样一个内置系统来添加“本机”高吞吐量执行。
分片的主要目标是尽可能地复制传统(非分片)区块链最重要的安全属性,而无需每个节点亲自验证每笔交易。
分片正在非常接近到来。 在传统的区块链中:
无效的区块无法通过,因为验证节点会注意到它们无效并忽略它们。
不可用的区块无法通过,因为验证节点无法下载它们并忽略它们。
在具有高级安全功能的分片区块链中:
无效的区块无法通过,因为:
欺诈证明会迅速将其捕获,并告知整个网络该区块的不正确性,并严重惩罚创建者,或者
ZK-SNARK证明是正确性,并且您不能为无效区块制作有效的ZK-SNARK。
不可用的区块无法通过,因为:
如果只有不到50%的数据区块可用,则几乎可以肯定每个客户端都会进行至少一次数据可用性样本检查,从而导致客户端拒绝该数据块,
如果至少有50%的区块数据可用,那么实际上整个区块都是可用的,因为仅需一个诚实节点即可重建其余区块。
没有分片的传统高TPS链无法提供这些保证。 多链生态系统无法避免攻击者选择一条链进行攻击并轻易接管的问题(这些链可以共享安全性,但是如果做得不好,它将变成事实上的传统高TPS链 ,这些都是缺点,并且如果做得好,将只是上述分片技术的一种更复杂的实现)。
侧链高度依赖于实现,但是它们通常容易面临传统高TPS链的弱点(这是如果它们共享矿工/验证者)或多链生态系统的弱点(即,如果它们不共享矿工/验证者) )。 分片链避免了这些问题。
但是,分片系统中有一些隐患。尤其:
仅依赖于委员会的分片链很容易受到适应性对手的攻击,并且问责制也较弱。也就是说,如果对手能够实时入侵(或关闭)他们选择的任何节点集合,那么他们只需要攻击少量节点即可破坏一个委员会。此外,如果对手(无论是适应性对手还是占质押总数的50%的攻击者)确实破坏了一个委员会,则只能公开确认他们的少数节点(该委员会中的节点)参与这个攻击,因此只有少量质押会受到处罚。这是为什么数据可用性采样与欺诈证明或ZK-SNARK一起成为随机采样技术的重要补充的另一个关键原因。
仅当有足够数量的在线客户端集体收集足够的数据可用性采样请求时,数据可用性采样才是安全的,这些响应几乎总是重叠以构成至少50%区块。在实践中,这意味着必须有几百个客户端在线(并且此数量越大,系统容量与单个节点容量的比率就越高)。这是一个few-to-N信任模型——通常非常值得信赖,当然,它不如非分片链中的节点具有可用性的N-of-N信任那么强大。
如果分片链依赖于欺诈证明,那么它依赖于时序假设;如果网络太慢,则在欺诈证明显示它是错误的之前,节点可能会接受某一个区块具有最终性。幸运的是,如果您遵循严格的规则,一旦发现了无效性,就会还原所有无效块,此阈值是用户设置的参数:每个用户都选择等待达到最终状态所需的时间,如果他们不想等待足够长的时间,则会遭受损失,但更谨慎的用户是安全的。即使如此,这仍在削弱用户体验。使用ZK-SNARK验证有效性可以解决此问题。
需要传递大量的原始数据,从而增加了极端网络条件下发生故障的风险。与大量数据相比,少量数据更容易发送(如果强大的政府试图审查链,也更容易安全隐藏)。如果区块链浏览器想要保留整个链,则需要存储更多数据。
分片的区块链依赖于分片的点对点网络,并且每个单独的p2p“子网”由于具有较少的节点而更容易受到攻击。用于数据可用性采样的子网模型可以缓解这种情况,因为子网之间存在一些冗余,但仍然存在风险。
这些是有效的关注点,尽管在我们看来,通过允许更多应用程序在链上运行而不是通过集中式第2层服务来实现的用户级别集中化的减少,远远超过了它们。也就是说,这些问题,特别是最后两个问题,实际上是对增加分片链的吞吐量超过特定点的真正限制。二次分片的二次性是有限度的。
顺便说一句,如果吞吐量过高,则分片区块链的安全风险将日益增大,这也是很大程度上放弃了扩展至超二次分片的努力的主要原因。好像保持二次分片只是二次真的是快乐的媒介。
经常提出的一种替代分片的方法是,使用类似于中心化高TPS链的结构,除了它在顶部使用数据可用性采样和分片以验证有效性和可用性之外。
如今,中心化高TPS链在这方面有所改善,但仍比分片系统弱得多。 这是出于以下几个原因:
在高TPS链中,要检测区块生产者的审查要困难得多。 审查检查需要(i)能够查看每笔交易并验证没有明显值得加入的交易,而该交易莫名其妙地无法进入,或者(ii)在区块生产者中具有N分之一的信任模型,并且在中心化高TPS链中,(i)是不可能的,而(ii)则更困难,因为节点数少,甚至1of N信任模型都更容易被破坏,并且 如果该链的区块时间对于DAS来说太快(就像大多数中心化高TPS链那样),则很难证明节点的区块不会仅仅因为它们的发布速度太慢而被拒绝。
如果大多数区块生产者和生态系统成员试图强制执行不受欢迎的协议更改,则用户的客户肯定会检测到它,但是社区反抗和分叉的难度要大得多,因为他们需要旋转一套新的昂贵的高吞吐量节点,以维持遵守旧规则的链条。
中心化基础架构更容易受到外部参与者的审查。区块生产节点的高吞吐量使其非常易于检测,并且更易于关闭。审查专用的高性能计算在政治上和后勤上比在单个用户的笔记本电脑上进行审查要容易得多。
高性能计算向中心化云服务转移的压力更大,增加了整个链将在1-3家公司的云服务中运行的风险,因此,由于许多区块生产者同时失败,导致链崩溃的风险更大。那些在自己的硬件上运行的验证者的分片链不会那么容易受到这种攻击。
适当分片的系统最好作为基础层。对于一个分片的基础层,您可以将其构建为Rollup,始终能够创建一个中心化生产系统(例如,您想要一个用于DeFi的具有同步可组合性的高吞吐量域名)。但是,如果您有一个依赖于中心化区块生产的基础层,则不能在上面构建一个更加去中心化的Layer2。
本文作者:以太坊创始人Vitalik Buterin
英文原文:https://vitalik.ca/general/2021/04/07/sharding.html