枣阳薇薇新娘婚纱摄影 首页 品牌中心 科技动态 新闻中心 配件系列

以太坊焦点开发者:MPT十六叉树将被替代 | BTC

发布日期:2022-10-16 15:15    点击次数:91

写在前面:

设想一下,你正在翻译一本5000页的书本,作者一贯打电话陈诉你他对故事做了调整,这会影响到你已经翻译过的页面……而这可以或许会一贯继续上来,这就因此太坊从今后运用的MPT十六叉树扭转为二叉树组织中遇到的一个近似逆境。对此,以太坊焦点开发者Guillaume Ballet提出了一种规划,可以或许在约莫几天的时光内,经由过程3个步伐实现这一转换手术。

赐与太坊的做个手术:十六叉树变二叉树必要这三步

(图片来自:tuchong.com)

关于该提案,以太坊联合独创人vitalik驳斥称: “来自Ballet的首要研究底子,它会使以太坊无形态变得敌对,同时发现了一个机会,以大大简化该和谈。等候在未来的几个月中,来自以太坊1.x开发人员更为精彩的事变及功能。” 赐与太坊做个大手术:MPT十六叉树转二叉树必要这三步

下列是译文:

影响以太坊的众多成就之一是账户和合约数据的存储编制,以太坊而今抉择的组织称为默克尔帕特里夏树(Merkle Patricia Tree,或简称MPT)。尽管从实践上讲,它是很有意义的,但在实际中,它带来的成就要比其经管的成就要更多。多年来,焦点开发人员一贯在探究向二叉树(binary tree)的转换,在本文中,我将注解我对这一成就的观点,尔后给出一个经管它的编制。

创议的进程引入了一个过渡期,在此时期,两种树组织都市存在。这样做的益处是,在转换树组织时,主链可以或许对立运行,并且还可以或许确保将全体帐户转换为二叉树项目。

  背景  

而今,以太坊的账户是被存储到一棵十六叉树之中的。所谓十六叉,就默示一个节点有16个子节点,实践上这是很好的,因为这意味着你必要更少的"阶段"来存储你全体的数据。

譬如,这就因此十六叉树的模式默示键与值对(170,v)的进程。在十六进制中,170默示为0xaa,因而你只有要两层:个中之一用于第一个a,另外一层则用于第二个a。

赐与太坊的做个手术:十六叉树变二叉树必要这三步

图1: 这是一棵十六叉trie树示例,体现了值“v”怎么样存储在键0xaa处。此树只有2字节长的键,并且只沿0xaa键的子树被开展。为了轻便起见,不相干的子树被替代为“…”。

留心,这棵树很浅,也很宽。尔后将其与下列沟通键与值对的二叉树默示法举行相比。在二进制中,170默示为10101010。

赐与太坊的做个手术:十六叉树变二叉树必要这三步

图2: 和图1中沟通的键值对,以二叉树模式举行存储。为了轻便起见,不相干的子树被默示为“…”。

你可以或许看到,这棵树要深很多,也窄很多。

在以太坊中,每个区块都包孕一个stateRoot字段,它是MPT根的哈希值。总而言之,这个哈希,是经由过程对根的16个子项的哈希列表举行哈希运算而获取的。这些子哈希列中的每个,又顺次是其子哈希列表的哈希,依此类推。

每次生成一个新区块时,矿工都市更新帐户树并从头计算其根哈希值。哈希存储在新区块的stateRoot字段中,尔后新区块被密封。

赐与太坊的做个手术:十六叉树变二叉树必要这三步 图3 区块头的state root字段指向十六叉树的根。

成就就出当初这里了:经由过程对全体节点举行哈希运算来从头计算哈希根花费的时光过长,品牌中心因而,为了计算根节点,矿工将从数据库中检索同级哈希(sibling hash)。尽管从数据库中获取全体子叶并对整棵树举行哈希运算所需的时光不多,但此操作仍然必要大量时光。这是因为必必要从数据库中获取每个哈希。

在十六叉树中,平日每个阶段要获取15个同级哈希。在上面的示例中,这就是30个哈希。

纵然更深入,二叉树每个阶段也只有要一个同级哈希。在上面的示例中,就只有8个哈希!这就是为安在实际之中,二叉树实际上要更好的启事。

  笼盖转化法  

不幸的是,要将以太坊从十六叉树切换到二叉树,着实不是一件苟且的事。有许大都据必要转换,并且执行改观必要花费逾越15秒的区块时光。

除此之外,设想一下,你正在翻译一本5000页的书本,作者一贯打电话陈诉你他对故事做了调整,这会影响到你已经翻译过的页面……而这可以或许会一贯继续上来。

这就是而今以太坊遇到的成就,因为用户可以或许更新已转换的地点,这意味着你必须从头起头转换进程。

经管此成就的倡导是设一个过渡期,在此时期,在十六叉树的顶部搁置一棵笼盖二叉树,它的浸染是生活生涯形态发生的全体改观,直到基树转换为二叉树。

这类过渡会分成三步举行: 第1步-转换 在这类编制中,肯定在区块高度H1处,区块具有两个stateRoots:一个用于“底子”十六叉树,一个用于“笼盖”二叉树。

赐与太坊的做个手术:十六叉树变二叉树必要这三步

图4: 在转换进程中,区块具有2个形态根(state Root):一个是传统十六叉树的只读根,第二个是“笼盖”二叉树的根。

十六叉树被觉得是只读的,因而对形态的任何更新都将是对笼盖树的更新。

当一笔买卖读取或更新一个帐户时,体系首先征采笼盖树。假定在那里找不到帐户,体系将在旧的十六叉树中征采该值。

而在同时,十六叉树正在后援转换。而今可以或许不消耽心拔出,因为全体改观都存储在顶部树中。 第2步-基转换 后援转换进程实现后,矿工将经由过程转换终局替代只读的十六叉树底子根来颁布揭晓他们已操办好举行切换。对形态的读写操作与步伐1沟通。

赐与太坊的做个手术:十六叉树变二叉树必要这三步

图5:转换的第二个阶段,区块头将十六叉树底子根替代为其二叉树转换底子根,以向网络发送旗子灯号,见知它们已操办就绪。

当一个足够大的序列区块对转换后的底子根具有沟通的值时,这意味着大大都矿工都实现了转换,并对转换后的树的皮相告竣为了共识。接下开,就进入到并吞进程。 第3步-并吞两颗树 并吞进程会逐渐举行:每次生成新区块时,都市从叠加层中删除n个键,尔后将其从头拔出毕竟子树中。该进程将继续举行,直到从叠加层中删除全体键为止。在此阶段,笼盖形态根将从区块头中删除。

除此之外,假定买卖执行写入笼盖树中找到的键,则该键将从笼盖树中删除,并间接写入毕竟子树。

  下一步  

我们已经创立了一个开真个原型,以便估量实现转换所需的时光。我们信赖,全副进程可以或许在公正的时光内(约莫几天)实现。随着算法的改进,我将宣布更多的细节。

称谢

这项创议得益于Alexey Akhunov,Vitalik Buterin,Anna George,Sina Mahmoodi,Tomasz Stanczak以及Martin H. Swende供应的宝贵定见。

 

相干探究:https://ethresear.ch/t/overlay-method-for-hex-bin-tree-conversion/7104



----------------------------------
栏目分类
相关资讯