区块链分片

大家好,我是Near Protocol的开发者之一,除其他事项外,它实现了分片。在这篇文章中,我想详细介绍一下区块链中的分片是什么,它如何工作以及解决在尝试构建时出现的许多问题。


众所周知,最流行的dApps平台以太坊每秒处理少于20个事务。 由于这一限制,交易的价格和确认交易的时间非常高:尽管有一个区块每10-12秒在以太坊中发布一次,但根据ETH加油站的说法从发送交易到交易真正落入区块之间时间平均为1.2分钟。 低带宽,高价格和长时间的交易确认不允许在以太坊上启动任何高性能服务。


以太坊不能每秒处理超过20个事务的主要原因是因为以太坊中的每个节点都必须检查每个事务。 自以太坊发布以来的五年中,已经提出了解决这一问题的许多想法。 这些解决方案可以大致分为两类:提供解决方案的代理将事务委派给具有良好硬件的一小组节点,以及提供每个节点仅处理所有事务的子集的解决方案。 第一种方法的一个例子是Thunder ,其中仅由一个节点创建块,根据开发人员的说法,这允许每秒接收1200个事务,这是以太坊的100倍。 第一类的其他示例是AlgorandSpaceMeshSolana 。 所有这些协议都改进了协议的各个方面,并允许您执行比以太坊更多的交易,但是所有这些都受到一台(尽管功能非常强大)机器的速度的限制。


第二种方法称为分片,其中每个节点仅处理事务的一个子集。 这就是以太坊基金会计划增加以太坊带宽的方式。


在这篇文章中,我将以目前正在开发的几种协议为例,向您介绍分片在区块链中的工作方式。


术语学

由于术语不是标准化的,因此在本文中将使用以下俄语术语:


区块既可以是一般技术,也可以是包含所有块(包括分支)的数据结构。


是区块链中的一个特定链,也就是说,从一个块开始,使用到前一个块的链接可以访问的所有块。


规范链是区块链中的一条链,观看区块链的参与者将其视为当前链。 例如,在工作量证明区块链中,这将是最复杂的链。


网络是建立和使用区块链的众多参与者。


节点是支持或使用网络的服务器。


最简单的分片


在最简单的实现中,我们将支持多个区块链,而不是支持一个区块链,并且我们将每个这样的区块链称为“碎片”。 每个分片都由一组独立的节点支持,这些节点可以验证事务并创建块。 在下文中,我将这些节点称为验证器。


每个分片负责合同和帐户的子集。 现在假设,交易始终仅使用同一分片内的合同和账户进行。 这种简化的设计足以显示一些有趣的问题和分片功能。


验证人任命和中央区块链


每个分片都有自己的验证程序这一事实的第一个问题是,如果我们有10个shadra,那么每个分片的可靠性现在将比一个区块链低10倍。 因此,如果具有X个验证器的区块链决定在具有10个分片的分片系统中进行硬分叉,并在10个分片之间中断X个验证器,则每个分片中只有X / 10个验证器,并且要获得对该分片的控制权,需要获得对5.1%的控制权(51 %/ 10)验证者。


这就引出了第一个有趣的问题:谁将验证程序分配给分片? 仅当所有5.1%的验证者都在同一分片中时,控制5.1%的验证者才是问题。 如果验证者本身无法选择将其分配给哪个分片,则在将其分配给分片之前获得对5.1%验证者的控制权将不允许他们获得对任何分片的控制权。


图片


几乎所有现有的建议分片设计都使用某种随机数源将验证器分配给分片。 今天,在参与者不互相信任的分布式系统中获得随机数已经不是一个完全解决的问题,在本文中我们将不再赘述,仅假设我们拥有这样的随机数源即可。


随机数的接收和验证者的指定都是系统范围内的计算,并非特定于任何特定分片。 对于此类计算,现代分片区块链设计还具有一个额外的专用区块链,仅用于执行系统范围的计算。 除了随机数和验证者的任命外,这种计算还可以包括从分片中获取最后一块的散列并存储它们; 在权益证明系统中处理抵押品,并通过选择相关抵押品来研究不当行为的证据; 重新平衡碎片(如果提供了此功能)。 这样的区块链在以太坊2.0和Near协议中称为信标链,在PolkaDot中称为中继链,在Cosmos中称为Cosmos Hub。


在本文中,我们将这样的区块链称为“中央区块链”。 中央区块链的存在将我们引向下一个有趣的话题-二次分片。


二次分片


分片通常作为一种解决方案,随着节点数量的增加而无限扩展。 可能确实可以创建具有此属性的系统,但是具有中央区块链的系统对分片数量有最高限制,因此没有无限的可扩展性。 原因很容易理解:中央区块链执行一些计算,例如分配验证程序和保留最新的分片状态,其复杂度与分片的数量成正比。 由于中央区块链本身未分片,并且其吞吐量受每个节点的吞吐量限制,因此它可以支持的分片数量受到限制。


让我们看看如果支持它的节点的功率增加k倍,整个系统的吞吐量将如何变化。 每个分片将能够处理k倍以上的交易,并且中央区块链将能够支持k倍以上的分片。 因此,整个系统的吞吐量将增长k ^ 2倍。 因此,名称为“二次分片”。


很难预测今天有多少分片可以支持中央区块链,但是在不久的将来,我们很可能无法接近具有二次分片的分片区块链的交易限额。 最有可能的是,我们很快就会遇到支持这么多分片需要多少个节点的限制。


状态分片


状态是有关所有帐户和合同的所有信息。 到目前为止,我们已经讨论了分片,但没有具体说明分片到底是什么。 区块链中的节点执行以下三个任务:1)执行交易2)将交易和区块转发到其他节点,以及3)存储区块链的状态和历史记录。 这三个任务中的每一个都与节点上不断增加的负载相关联:


  1. 进行交易的需求随着交易数量的增加而需要更多的计算能力。
  2. 随着交易的增长,转发交易的需求需要更多的网络带宽。
  3. 随着状态和/或历史记录大小的增加,维护状态和历史记录的需求需要更多的磁盘空间。 重要的是要注意,与前两点不同,即使每单位时间的事务数不变,所需的磁盘空间也会增加。

从上面的列表来看,磁盘空间似乎是最大的问题,因为即使事务数量没有增加,磁盘空间也只会增加,但实际上却没有。 今天,以太坊的状态大约占100GB,可以很容易地在任何现代机器上保存,但是以太坊可以处理的事务数每秒限制在几十个,这要取决于计算能力和网络。


Zilliqa是最著名的项目,它分散计算和网络,但没有陈述。 计算分片比分片状态更简单,因为所有节点都具有所有状态,并且仍然可以轻松执行导致其他合同或影响不同分片帐户的合同。 在这些方面,Zilliqa的设计过于简化,可以在此处阅读对英语的批评。


虽然提出了不带阴影计算的状态分片,但我不知道有哪个项目真正做到了这一点,因此我们将假定状态分片意味着分片计算。


在实践中,状态以某种方式分片的事实将分片隔离开来,从而使它们成为独立的区块链,正如我们上面定义的那样。 分片中的验证器仅存储特定于其分片的状态,并且仅执行和转发影响该状态的事务。 这与分片数量成线性关系,减少了处理器,磁盘和网络上的负载,但带来了新问题,例如分片间事务。


分片间交易


到目前为止,就碎片执行方式而言,我们已经将碎片视为独立的区块链。 例如,通过这种设计,不可能完成在两个不同分片上的两个帐户之间转移资金的交易,或使一个分片上的合约与另一个分片上的合约发生联系。 我想支持两种情况。


为简单起见,我们将仅考虑可转移资金的交易,并且我们假设每个参与者在一个分片上都有一个帐户。 如果某个分片上的参与者希望将钱转移给同一分片上的参与者,则该分片的验证者可以处理此交易并将其应用于州。 但是,例如,如果爱丽丝(Alice)在1号分片上有一个帐户,并且她想通过2号分片上的帐户向Bob汇款,则既不能使用1号分片验证器(谁不能向Bob添加资金),也不能使用2号分片验证器(不能接受Alice的钱) )无法完成交易并更新状态。


有两种解决该问题的方法:


  1. 同步 :对于涉及多个分片的任何事务,将同时产生包含该事务状态更新的分片中的块,并且这些分片中的验证器共同创建此类块。 我所知道的这种方法最精心设计的是合并块,在此进行了描述(英语)。


  2. 异步 :分片间事务在异步影响的分片中执行:当分片中的验证者有证据表明在交易中从Alice减去钱的那一部分在第二部分执行时,向Bob添加钱的事务部分在第二条分片中执行。分片1。 由于不需要在分块之间进行块生产的额外同步这一事实,这种方法在当今正在开发的系统中更为流行。 今天,在Cosmos,以太坊宁静,Near Protocol,Kadena等中提供了这样的系统。 这种方法的问题在于,如果独立生成这些块,则包含事务状态更新的块之一可能不在其分片的规范链中,因此事务将仅部分完成。 例如,考虑下图。 它显示了发生分叉的两个分片和一个分片间事务,其状态更新分别反映在块A和X'中。 如果链AB和V'-X'-Y'-Z'的碎片规范化,那么交易将完全完成。 如果链A'-B'-C'-D'和VX是规范的,则交易被完全取消,这是可以接受的。 但是,例如,如果AB和VX成为规范,则交易的一部分完成,而另一部分取消,交易部分完成。



图片


上述场景是分片中的一大问题,其中所有提出的解决方案都不是最优的。 我们将在下面对此进行说明。


不良行为


现在我们已经弄清楚了分片区块链是如何工作的,并研究了中央区块链的概念,验证者的任命和跨分片交易。在本文的结尾,我们将探讨另一个有趣的话题:如果参与者设法获得攻击,尝试攻击系统的方法是什么?在一个分片中控制足够多的验证器。


目标货叉


如果参与者对分片有足够的控制权,则可以有目的地创建分叉。 要创建派生,在分片中使用什么共识都没有关系,特别是是否为BFT无关紧要,如果攻击者控制了足够数量的验证器,则可以创建派生。 例如,分叉的目标可能是回滚为区块链之外的东西付费的交易。


据称,获得分片的50%的控制权比整个网络的50%容易(例如,因为参与者可能在分配给分片后验证或贿赂验证者)。 根据定义,分片间事务会在多个分片中更改状态。 此类更改将落入相应分片的区块链中的某些块中。 有必要要么所有这样的块都必须完成(即,属于其各自分片中的规范链),要么不应该全部确定(即,不属于其分片中的规范链)。 由于我们假设某些有恶意的参与者原则上可以控制分片,因此即使达成拜占庭共识,或者在具有交易的区块之上构建大量区块,我们也不能假设不会发生分叉。


这个问题有很多解决方案,其中最简单的方法有时是将分片中最后一个块的哈希保存到中央区块链。 然后更改分片中的规范链选择算法,以便没有包含最后存储在中央区块链规范中的块的目标。 然后,为了完全避免由于某些状态包含状态更新的块位于规范链之外而部分完成事务的情况,您可以更改执行分片间事务的算法,以使分片A直到分块才接受分片B中的交易证明。包含分片B中交易状态更新的信息未保存在中央区块链中。


创建无效的块


如果参与者能够控制分片中足够多的验证者,则他可以尝试创建一个完全无效的块。 例如,假设在该块之前,状态为Alice有10个令牌,并且在Bob-0中,该块仅包含一个事务,该事务将10个令牌从Alice的帐户发送到Bob的帐户,但是在新状态下,它反映了0个来自Alice的令牌和1000个令牌与鲍勃。


图片


在经典的,没有分片的区块链中,创建这样的区块是不可能的,因为所有参与者(例如创建区块的参与者和仅使用区块链的参与者)都会检查所有区块并立即丢弃任何包含此类错误的区块。 即使由攻击者控制的验证者可以更快地构建链,这也将不允许他们通过包含无效块的更长链作为规范链,因为所有网络参与者都会立即丢弃无效块以及任何建立在顶部的块。 诚实的验证者将继续建立在最后一个有效块之上,并且所有网络参与者都将其链视为规范。


图片


上图显示了五个验证器,其中三个在攻击者的控制下。 他们创建了无效的块A',然后继续在顶部构建链。 两个私人验证器立即将A块视为无效块,并继续在他们知道的最后一个有效块之上构建,从而创建了一个分叉。 由于诚实链中的验证者比不诚实链中的验证者少,因此他们的链更短。 但是,在经典的未分片区块链中,系统中的所有参与者都会验证他们看到的所有区块。 因此,使用区块链的任何参与者都将看到A'是无效的,将其丢弃,并因此丢弃构建​​在无效块之上的B',C'和D',因此所有参与者将AB视为规范链。


在分片设计中,没有参与者可以验证所有区块链中的所有区块。 因此,我们需要一种机制,该机制将允许特定分片中的验证器确保过去从未在另一个分片中创建无效块,从中他们接收到了分片间事务。


, , . , , ( ).


, :


  1. - . , 2/3 . , , , . , , , - , . , .
  2. - , , , , , . , zk-SNARKs ( zk, zero-knowledge, , non-zk SNARKs). , zk-SNARKs , .

, , , , . — .


我用英语写了很多有关区块链和分片的文章。我们还会定期采访其他协议(例如Cosmos和Solana)的作者,并深入研究技术细节。如果您对该主题感兴趣,可以订阅我的Twitter @AlexSkidanov来关注新帖子和视频

Source: https://habr.com/ru/post/zh-CN437924/


All Articles