http://www.7klian.com

利用包围层改变以太坊状态树的名目

配景
为了预计完成转换所需要的时间,我已经做了一个低转换率的原型系统。我们确信,整个进程耗费的时间不会太离谱,也就是说几天时间就够了。我们会跟着算法的改造而发布更多细节。
与此同时,十六叉树在靠山举办转换。此时不需要担忧值插入的问题,因为所有的改变城市存储在上层的包围树中。
下一步
以太坊中,每个区块包括一个 stateRoot 字段,这是该块处理惩罚完成后暗示以太坊全局状态的 MPT 的树根哈希值。总的来说,这个哈希值是对根节点的 16 个孩子节点的哈希值所构成的列表作哈希运算获得的。这些孩子节点的哈希值又是孩子的 16 个孩子节点的哈希值所构成的列表做哈希运算获得的,以此类推。
叩谢

第 3 步 —— 归并两棵树
在十六叉树中,凡是每一层你都需要取出 15 个兄弟哈希值。在上面谁人我结构的例子(图 1)中,(重计较根哈希)就需要 30 个哈希值。
此提议得益于 Alexey Akhunov、Vitalik Buterin、Anna George、Sina Mahmoodi、Tomasz Stanczak 以及 Martin H. Swende 的名贵意见。
当一笔生意业务读取可能更新一个账户时,系统首先会搜索包围树。假如在包围树中找不到账户,接着将会在旧的十六叉树中搜索值。

可以看出,上图的树很矮,并且很宽。给定沟通的键值对,下图展示了二叉树存储的景象。170 在二叉树中被暗示为 10101010。

办理这个问题的步伐是增加一个过渡期,过渡期间,在十六叉树下层上成立一棵包围树(overlay tree)。这棵包围树是二叉树名目标,它的浸染是生存状态上产生的所有变革,直到下层十六叉树完全转换为二叉树。转换分为 3 步举办。
作者: Guillaume Ballet
翻译&校对: 裴奇 & 阿剑

每次打包生意业务生成新区块时,矿工城市更新账户树,从头计较根哈希。根哈希存储在新区块的 stateRoot 字段,然后新区块被共鸣。

问题在于:假如要对所有节点做哈希,从头计较根哈希的时间就太长了,因此,为了计较根节点的哈希,矿工将从数据库中检索 同层节点的兄弟哈希值(sibling hashes) 。固然后者(矿工从数据库检索兄弟哈希值)耗费的时间没有前者(矿工从数据库库获得所有的叶子节点并做哈希)那么多,这个操纵照旧很耗时。因为每个哈希都必需从数据库中取出。
今朝,以太坊的状态树是十六叉制的。十六叉制暗示每个节点有 16 个孩子节点。理论上讲,这种方法挺好的,因为孩子节点多意味着只需要更少的 “层” (即树高)便可存储所有数据。

除此以外,设想你要翻译一本 5000 页的书,作者还在不断地汇报你他们对故事做了些修改,而且这些修改会影响你已经翻译过的页 …… 那这个进程就没完没了。转换状态树的
名目也是一样的问题:大概你刚完成某个地点的名目转换,用户就利用了该地点(因此更新了该地点的状态),那你又得从新转换一遍(因为一个地点的状态更新也会影响到整棵状态树)。
第 1 步 —— 转换
不幸的是,转换为二叉树并不简朴。需要转换的数据 太多了,执行转换耗费的时间将多于 15 秒的区块生成时间 。
尽量二叉树条理更深一点,但在每一层只需要一个兄弟哈希值。在上述例子(图 2)中,仅仅需要 8 个哈希值!这就是为什么在实际中二叉树更优。
第 2 步 —— 下层树切换

账户和合约存储数据的方法是影响的浩瀚问题之一。以太坊协议选用了 Merkle Patricia Tree(MPT,默克尔帕特里夏树)来组织账户及合约数据。尽量这种数据布局在理论上结果很好,但在实际应用中,它带来的问题却比它可以或许办理的问题多。焦点开拓者们已经接头多年,想要把这种数据布局换为二叉树,我将在这篇文章中叙述我对这个问题的观点以及如何实现这种转变。
整个步调的焦点只有一个:假如生意业务执行时要写的键存在于包围树上,这个键就会从包围树上删除,写操纵直接在二叉下层树长举办。
在这种要领下,区块高度为 H1 时必定会有 两个 状态根:一个是 “下层” 十六叉树状态根,一个是 “包围层” 二叉树状态根。

譬喻,下图是用十六叉树暗示的键值对 (170, v)。十六进制中,170 记作 0xaa,因此你只需要两层:第一层记录第一个 a,,第二层记录第二个 a。

归并进程不绝推进:每发生一个新的区块,就从包围树上删除 n 个键,把它们从头插入二叉下层树。此进程一直一连,直到所有的键都从包围树上移除。达到这步时,区块头就不再保存包围状态树的树根。
我所提议的处理惩罚要领包罗一段时间的过渡期,在这段时间内,网络要同时维护两种树布局。这样做的长处是,转换树布局的进程不会影响链的运行,而且可以确保所有的账户都被转换成了二进制名目。
https://medium.com/@gballet/ethereum-state-tree-format-change-using-an-overlay-e0862d1bf201

十六叉树被配置为只读,因此对状态的任何更新都将在包围树长举办。

当靠山转换进程完成,矿工对外宣告,他们已经筹备好用转换功效(只读二叉树根)来替换只读的十六进制下层树根。对状态的读写与步调 1 阶段是一样的。(译者注:此时的只读二叉下层树是按照原本的十六进制状态树获得的)

包围层转变要领
原文链接:

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读