首页 / 以太坊2 / 人人都能看懂的《以太坊2.0分片设计》

人人都能看懂的《以太坊2.0分片设计》

标题:人人都能读懂的「以太坊2.0分片设计」

免责声明:本文旨在传达更多市场信息,不构成任何投资建议。文章仅代表作者观点,不代表火星财经官方立场。

小编:记得关注哦

来源:碳链价值

作词:李华

当我们在7-11买早餐时,如果只有一个收银员,我们必须排很长的队才能结账;如果有两个收银员,立刻就会快一倍;如果有四个收银员,也许就不用排队了。这就是分片的基本逻辑,就是将一个人的工作分给多人,以提高效率。

从以太坊分布式账本的角度来看:在分片之前,只有一个账本,即主链,每秒大约可以处理12到45笔交易。当交易量大于这个数据时,需要排队,这意味着网络会拥堵;分片就是把一个账本变成64个账本,让它们同时处理交易,相当于7-11开64个收银台收银。

分片的逻辑很简单,但为什么实现起来这么难呢?因为把一个账本分成64个账本会面临很多新的问题,而分片技术要做的就是解决它们。本文将从这些问题入手,来了解一下以太坊2.0的分片到底是怎么一回事。

01 如何分片1. 将交易分配到分片

分片包含交易和将交易打包到块中的验证器。完成分片的第一步是确定如何将交易和验证器分配给某个分片。我们先来看看分配交易。

让我们用三个村庄的故事来理解:有一个渔村、一个猎户村、一个农民村。村庄内部和村庄之间经常有交易,但没有货币,大家都记账。以前用一本账本记三个村的账,速度有点慢。现在改为三本账本。那么哪个账本记录哪个账户呢?

一种方法是放三个账本在那里,一笔交易到来后,记录在前面没有人排队的账本中;但这会带来一个问题,就是每个账本必须有一个所有者。账号信息,不然我去你那里排队,你就没有我的账号了。

正因为如此,这种分片方式的一个主要问题是无法减少单个账本存储的数据量,而这种存储需求对于想要参与记账的节点来说是一个很高的门槛;该方法还需要解决双花问题。因为一个人可以同时在不同的分片上花同样的钱。

还有一种方法就是渔村有账号,猎户村有账号,农民村有账号。账本上只有本村的账户信息,也只记录本村的交易。这样可以同时记账三个账本,记账效率高,存储要求低。这正是以太坊采用的分片方式:状态分片,每个分片存储且只存储属于自己分片的账户状态。在实现上,以太坊允许用户选择加入哪些分片,而不是按照自然村进行分片。

状态分片的最大问题是,如果渔村里的人想与猎户座村里的人进行交易怎么办?渔村的账本里没有猎户村的人的账本,猎户村的账本上也没有渔村的人的账本。其实这就是分片技术面临的最大考验,跨分片通信。当这个问题彻底解决之后,以太坊2.0就可以使用了。本文将在第二部分讨论这个问题的一些解决方案。

2. 将验证者分配给分片

将交易安排到不同的分片后,接下来要解决的问题是如何为某个分片分配记账人,即分配验证人。

以太坊有64 个分片,每个分片有128 个验证者。如果分片的验证者是固定的或者可预测的,那么攻击者就控制了分片,也就是说,购买128 个分片中的2/3 是一件容易的事情,怎么办?以太坊的解决方案是从所有验证者中随机选择某个分片的验证者,并每6.4 分钟(一个epoch 的长度)更换验证者。结果,攻击者控制一个分片中2/3 人的机会不到万亿分之一(推理过程参见参考文献1)。

信标链的主要任务之一是为分片链分配验证者。这个任务中最重要的是随机性的实现。首先是随机性的重要性。如果不能随机分配验证人,就无法保证账本的安全性。二是随机性的难度。在区块链上实现随机性是极其困难的。可以认为,目前为止情况并非如此。目前还没有经过验证的随机算法可以真正称为工程实现。

以太坊的解决方案是使用RANDAO+VDF提供随机数来实现随机性。 RANDAO分为RAN(随机)和DAO,就很容易理解了。是指一群人中的每个人独立提出一个随机数,然后将所有随机数组合起来生成最后使用的随机数。因为任何人都很难知道其他人提供的数字,因此很难预测最终的组合数字。

然而,RANDAO模型有一个缺陷,那就是提供最后一个数字的人有机会作弊:他知道他之前每个人提供的随机数的总和,并且可以调整他提供的数字,使最终的数字结果对他有利。

为了解决这个问题,以太坊引入了VDF(可验证延迟功能)。它的作用很简单,就是防止最后一个提供随机数的人在自己提供数字之前计算出前面的随机数的和。因此,操纵随机数也是不可能的。 (RANDAO+VDF的详细介绍参见参考资料2)

3. 通过relayer存储分片

不知道大家有没有注意到,轮换账本的验证人会带来一个新的问题:验证人被分配到渔村记账,又被分配到猎户村记账。如果他没有所有的账户信息,如何保存账户?帐户?如果他拥有所有账户信息,那么他就持有一个完整的账本,但没有实现状态分片。

为了解决这个问题,以太坊提出了一个重要的新设计:无状态客户端。简单的理解就是,渔村的账本放在渔村,猎户村的账本放在猎户村。验证者不持有账本,只负责奔波于不同村庄之间记账。

那么不同村庄的账本由谁来保管呢?以太坊引入了中继(状态提供者)的角色,中继负责存储不同分片的账户状态,并且只能服务于某个分片。中继者的工作很容易理解,但是如何为他们的服务付费,如何保证他们的诚实……这些相关机制的设计是一个全新的需要解决的问题,也是一个治理问题社区成员应该参与讨论。

无状态客户端的实际情况比上面描述的要复杂得多。 “交易”本身的构成与分片之前有所不同。它必须附有见证数据以证明其有效。可以认为,在1.0中,验证者需要自己存储旧账户来验证新交易; 2.0中,交易需要带上旧账户,交给验证者进行验证。

但我们不能要求每个用户存储所有旧账户,以便他们在发起交易后可以证明交易。这时候就需要一个“中继器”,它存储了分片的所有账户状态。只要用户提出请求,它就可以帮助用户向验证者提供交易的见证数据。

Vitalik Buterin 在3 月11 日发表文章,提出使用多项式承诺来替代状态根。这里使用了这项技术。它采用零知识证明的方法为交易提供证明。可以理解为提供数据的计算结果。向验证者提供验证,而不是直接将所有相关数据提供给验证者进行验证。该方法可以显着减小见证数据的大小,有效减少各种开销。 (Vitalik新方法的详细介绍参见参考文献3,无状态客户端的详细介绍参见参考文献4)

至此,将一个账本划分为多个账本,即划分分片的工作就完成了。

02 跨分片交易如果渔村里的人只和渔村里的人交易,猎户座村里的人只和猎户座村里的人交易,那么每个村庄就可以保留自己的账户。这不需要任何新技术。但如果渔村里的人想和猎户座村里的人进行交易怎么办?不同的账本如何相互通信?这是状态分片面临的最棘手的问题。

解决这个问题有两种思路,一种是同步(紧耦合),一种是异步(松耦合)。

假设渔村里有一个人叫A,猎户村里有一个人叫B。 A想给B 100元。同步是指:当A发起转账时,渔村和猎户村的记账员都知道这笔交易以及交易的进度。记账员为A从账本中扣除100,猎户座村的记账员为B从账本中添加100。交易完成,两个村庄同时生成新的区块。

异步指:当A发起转账时,渔村账本减100给A,并生成新的区块;猎户村的记账人后来通过某种方式收到了这个消息,确认了A的钱确实被减少了。在B自己的账本中添加100,交易完成,但是两个村庄异步生成新的区块。

同步方式看上去很友好,其事务执行过程看上去并不碎片化,但它隐藏着一个很大的问题,那就是难以应对“持续的状态变化”。这意味着什么?

如果A只转100元给B,渔村和猎户村听说这笔交易后,很容易确认大家都是这样记账的。 A的渔村账本减去100元,B的猎户村账本加100元。记账完毕。但如果A向B转账100元,然后又向B转账50元,状态不断变化,但A总共只有120元。此时,两村都很难确认对方是如何记账的:

如果每个验证人都去与对方的验证人进行通信,那么通信开销就会急剧增加,想要达到某个结果将变得极其困难;如果是通过双方村长沟通,则各村需要提前进行一轮共识,然后村长告诉对方一定的结果。除了增加成本之外,还因为以太坊本身的共识机制无法实现最终性而难以实现。

异步方法不会受到连续状态变化的困扰,因为它的做法是“等待”。当你的状态确定后,我将进行下一步;当渔村算完A后,猎户村看到A减去100或50后,决定给B加上100或50。

异步方法的问题是原子失败。交易应该是原子的,要么执行,要么不执行,但异步方式下,有可能交易的一部分被确认,而另一部分被放弃。

例如,渔村中为A 减100 的区块最终在渔村主链上得到了确认,但在猎户村中为B 加100 的区块最终在猎户村侧链上被废弃。原子失效是一个问题,但可以通过设计来解决。这部分的详细介绍可以参见文末参考文献5。

异步方式的另一个问题是时间开销以及通信和存储开销,即完成跨分片交易的等待时间和占用的资源。不同分片之间传输信息的方式决定了这些开销的数量。不同类型的管理费用相互关联且难以平衡。设计时应该追求的是平衡。以太坊2.0未来的表现将由信息传输的方式来主导。

以太坊已经讨论了一些异步架构模型。最新的是Vitalik 在2019 年10 月的DevCon 5 会议上提出的,基本思想是利用信标链来传输信息:在每个时隙(12 秒)内,分片链生成区块并与信标链进行交叉链接链块。连接方法如下图所示。这样,任何一个分片在打包自己的新交易时,都可以通过信标链知道之前所有其他分片的信息。槽在不同分片之间是异步的。

这种方式减少了跨分片交易的等待时间,但增加了对信标链的要求,信标链需要存储所有分片的证明数据;这种方法也增加了交叉链接的数量(原来的设计是每个epoch,即6.4分钟,32个区块交叉链接一次),这必然会增加各种相关的开销。正因为如此,以太坊分片的数量从1024个变成了64个,这是另一个设计方向。减少链接总数。 (该架构的详细介绍参见参考文献6)

从目前的一些分片设计方案来看,同步模型更倾向于分片之间进行自身通信,而异步模型则更倾向于分片之间通过第三方进行通信;前者面临通信量的限制。问题,后者面临多重开销的平衡问题。跨分片交易的设计和实现仍在进行中,目前还不确定以太坊2.0最终会采用哪种架构。

03 跨分片智能合约介绍完分片和跨分片交易后,以太坊2.0发展路上的终极BOSS来了,就是跨分片智能合约。跨分片交易和跨分片智能合约的区别在于,交易只有全局变量,而智能合约有局部变量。局部变量会带来什么麻烦?

以太坊分片后,从物理角度看有64个账本,但从抽象角度看只有一个账本:你可以把账本想象成一棵大树,树的每片叶子都存储一个账户状态数据,64个账本是64个树。如果把这些树的根交给信标链,就会形成一棵新的大树,64个账本就会组合成一个账本(这只是一个近似的比喻)。

在跨分片交易中,当一个分片需要知道另一个分片的账户状态时,无论它如何工作,它总能沿着树找到存储状态的叶子,然后更改自己的分片。帐户状态以完成交易。可以认为通过这棵树,不同的分片完成了信息的交换。

但对于跨分片的智能合约,问题就出现了。这棵树的叶子上保存的数据都是全局变量,没有局部变量。如果一个分片的智能合约调用另一个分片的智能合约,两者会发生什么?传递有关局部变量的信息?这棵树无法为他们服务。

也可以理解为,跨分片的交易,只需要看全局变量,也就是一级状态。跨分片的智能合约需要查看局部变量,这意味着它们还需要查看二级状态。跨分片交易和跨分片智能合约的设计难度不在一个数量级上。

目前我们还没有看到系统的智能合约跨分片设计,但是我们看到了两个提案。一是将相关的智能合约放到同一个分片中执行,即消除跨分片的智能合约。一是提出使用SIMD(单指令流多数据流)技术让智能合约本身能够并行执行。

以太坊2.0将在第二阶段引入智能合约,这意味着要到第二阶段才能实现智能合约的交叉分片。只有迈出这一步,才能真正宣告以太坊进入2.0时代。

以上是以太坊分片设计的介绍以及设计中的难点。我们仍处于以太坊2.0 实施的早期阶段。现阶段值得重点关注的关键词有:状态分片、无状态客户端、随机数。参考:

1.《Minimum Committee Size Explained》;作者:梁志成; https://medium.com/@chih Chengliang/minimum-committee-size-explained-67047111fa20

2.《以太坊 2.0:随机性》;作者:布鲁诺·斯科沃克;乔尼·阿健翻译; https://ethfans.org/posts/two-point-oh-randomness

3.《Using polynomial commitments to replace state roots》;作者:Vitalik Buterin; https://ethresear.ch/t/using-polynomial-commitments-to-replace-state-roots/7095

4、《Eth2.0 的中继者网络与手续费机制》;作者:约翰·阿德勒;刘毅,阿健,译; https://ethfans.org/posts/relay-networks-and-fee-markets-in-eth-2

5、《区块链分片的理念与挑战》;作者:亚历山大·斯基达诺夫;翻译,Jhonny、Echo、阿健; https://ethfans.org/posts/the-authoritative-guide-to-blockchain-sharding-part-1

6、《Eth2 shard chain simplification proposal》;作者:Vitalik Buterin; https://notes.ethereum.org/@vbuterin/HkiULaluS

7.《给工程师的 ETH 2.0 指南》;作者:詹姆斯·普雷斯特维奇;译者,Aisling、Qiqi、stormpang、Ajian; https://ethfans.org/posts/what-to-expect-when-eths-expecting

8.《Merge blocks and synchronous cross-shard state execution》;作者:Vitalik Buterin; https://ethresear.ch/t/merge-blocks-and-synchronous-cross-shard-state-execution/1240

上一篇
下一篇

为您推荐

手机访问
手机扫一扫打开网站

手机扫一扫打开网站

返回顶部