作者:?GuillaumeBallet
翻译&校对:?裴奇?&阿剑
来源:以太坊爱好者
账户和合约存储数据的方式是影响以太坊的众多问题之一。以太坊协议选用了MerklePatriciaTree来组织账户及合约数据。尽管这种数据结构在理论上效果很好,但在实际应用中,它带来的问题却比它能够解决的问题多。核心开发者们已经讨论多年,想要把这种数据结构换为二叉树,我将在这篇文章中阐述我对这个问题的看法以及如何实现这种转变。
我所提议的处理方法包括一段时间的过渡期,在这段时间内,网络要同时维护两种树结构。这样做的好处是,转换树结构的过程不会影响链的运行,并且可以确保所有的账户都被转换成了二进制格式。
背景
目前,以太坊的状态树是十六叉制的。十六叉制表示每个节点有16个孩子节点。理论上讲,这种方式挺好的,因为孩子节点多意味着只需要更少的“层”便可存储所有数据。
中信证券:4月或5月的LPR利率有一定可能会跟随调整:4月18日消息,中信证券研报指出,央行宣布全面降准25BPS,释放长期资金5300亿元。降准幅度略低于市场预期,可能是因为当前市场流动性较为充裕且MLF到期量较小。另外,媒体报道存款利率自律机制鼓励中小银行存款利率浮动上限下调10BPS,也可以起到降低银行负债成本的效果,但影响程度可能弱于2021年的存款改革。后续,我们认为4月或5月的LPR利率有一定可能会跟随调整。(财联社)[2022/4/18 14:30:16]
例如,下图是用十六叉树表示的键值对?(170,v)。十六进制中,170?记作?0xaa,因此你只需要两层:第一层记录第一个?a,第二层记录第二个?a。
LBank蓝贝壳于4月30日23:00首发NAOS,开放USDT交易:据官方公告,4月30日23:00,LBank蓝贝壳首发NAOS(NAOS Finance),开放USDT交易,4月30日22:00开放充值,5月3日18:00开放提现。
LBank蓝贝壳将于4月30日23:00开启充值&交易NAOS瓜分5,000 USDT活动。用户净充值数量不少于10枚NAOS ,可按净充值量获得等值1%的NAOS的USDT空投奖励。单个用户最高奖励200 USDT,本部分总奖池2,500 USDT。交易赛将根据用户的NAOS交易量进行排名,前30名可按个人交易量占比瓜分2,500 USDT。详情请点击官方公告。[2021/4/30 21:14:28]
-图1.十六叉树的例子,展示了值v是如何在在对应键0xaa处是存储的。这棵树的键长度只有2个字节,只有沿着0xaa的子树被表现出来了。为了简洁,不相关的子树替换为“...”-
声音 | 中国自动化学会王飞跃:区块链让“注意力”与“信用度”成为流通商品:5月15日,WIC全球区块链科技创新峰会在天津蓟州举办,中国自动化学会秘书长王飞跃在分享中表示,区块链的表象是信用机器+真相机器,在本质上使得传统上难以流通和商品化的“注意力”与“信用度”成为批量化生产的流通商品,革命性地扩展了经济活动的范围与提高效率的途径。[2019/5/15]
可以看出,上图的树很矮,而且很宽。给定相同的键值对,下图展示了二叉树存储的情形。170?在二叉树中被表示为?10101010。
-图2.与图1相同的键值对,存储在二叉树中。为了简洁,不相关的子树被表示为“...”-
从图中可见,二叉树要深得多,也窄得多。
现场 | ShoCard企业发展主管:把用户ID放在基于区块链证书验证的智能手机上有助保护用户数据:据CoinTime现场报道,美西时间9月13日,在圣何塞举办的Blockworld 2018区块链开发者及技术峰会上, ShoCard企业发展主管Armin Ebrahimi说:“目前系统下之所以存在许多安全漏洞,是因为我们用了大约40年几乎不变的“ID+密码”的模式,许多补救措施对于用户来说比较繁琐,技术上来讲比较废杂,大规模的应用成本也很高。我们需要彻底转变这种传统模式,与以往把所有数据都放在服务器上的模式不用,我们需要把用户ID放在基于区块链技术的,已经有证书验证的智能手机上。区块链可以将用户的ID和证书分享给其他参与方,这些参与方无需依赖相互的服务或者数据库,用户可以自主决定与谁分享什么数据,因此隐私将得到保护;用户数据是在本地手机上加密、储存并生产RSA签名或哈希值并上传到区块链上的。[2018/9/14]
以太坊中,每个区块包含一个?stateRoot?字段,这是该块处理完成后表示以太坊全局状态的MPT的树根哈希值。总的来说,这个哈希值是对根节点的16个孩子节点的哈希值所组成的列表作哈希运算得到的。这些孩子节点的哈希值又是孩子的16个孩子节点的哈希值所组成的列表做哈希运算得到的,以此类推。
动态 | 李银科:区块链作为底层技术已在金融科技、食品安全等行业应用:据腾讯科技报道,工信部中国电子商会区块链专委会秘书长李银科表示,区块链作为底层技术,已经在金融科技、食品安全等行业应用,未来希望能与青藤链盟一起,运用区块链技术共同为实体企业赋能。此前,青藤票改实验室在清华成立,由青藤链盟研究院、中国电子商会区块链专委会等共同发起。[2018/8/6]
每次打包交易生成新区块时,矿工都会更新账户树,重新计算根哈希。根哈希存储在新区块的?stateRoot?字段,然后新区块被共识。
-图3.区块头中的状态根字段,指向十六叉树的树根-
问题在于:如果要对所有节点做哈希,重新计算根哈希的时间就太长了,因此,为了计算根节点的哈希,矿工将从数据库中检索?同层节点的兄弟哈希值。虽然后者花费的时间没有前者那么多,这个操作还是很耗时。因为每个哈希都必须从数据库中取出。
在十六叉树中,通常每一层你都需要取出15个兄弟哈希值。在上面那个我构造的例子中,就需要30个哈希值。
尽管二叉树层次更深一点,但在每一层只需要一个兄弟哈希值。在上述例子中,仅仅需要8个哈希值!这就是为什么在实际中二叉树更优。
覆盖层转变方法
不幸的是,转换为二叉树并不简单。需要转换的数据?太多了,执行转换花费的时间将多于15秒的区块生成时间。
除此以外,设想你要翻译一本5000页的书,作者还在不停地告诉你他们对故事做了些修改,并且这些修改会影响你已经翻译过的页……那这个过程就没完没了。转换状态树的格式也是一样的问题:可能你刚完成某个地址的格式转换,用户就使用了该地址,那你又得从头转换一遍。
解决这个问题的办法是增加一个过渡期,过渡期间,在十六叉树基层上建立一棵覆盖树。这棵覆盖树是二叉树格式的,它的作用是保存状态上发生的所有变化,直到基层十六叉树完全转换为二叉树。转换分为3步进行。
第1步——转换
在这种方法下,区块高度为?
H1?时肯定会有?
两个?状态根:一个是“基层”十六叉树状态根,一个是“覆盖层”二叉树状态根。
-图4.转换过程中,区块拥有两个状态根:一个是传统十六叉树的只读根,一个是覆盖二叉树的可读写根-
十六叉树被设置为只读,因此对状态的任何更新都将在覆盖树上进行。
当一笔交易读取或者更新一个账户时,系统首先会搜索覆盖树。如果在覆盖树中找不到账户,接着将会在旧的十六叉树中搜索值。
与此同时,十六叉树在后台进行转换。此时不需要担心值插入的问题,因为所有的改变都会存储在上层的覆盖树中。
第2步——基层树切换
当后台转换过程完成,矿工对外宣告,他们已经准备好用转换结果来替换只读的十六进制基层树根。对状态的读写与步骤1阶段是一样的。
-图5.转换的第二个阶段,矿工在区块头使用转换所得二叉树的树根替换十六叉树根,向网络示意他们已经准备好了-
当足够多的一系列区块对转换所得的二叉基层树根给出了相同的值,意味着大多数矿工都完成了转换,并且认可转换后的树。合并过程则开始。
第3步——合并两棵树
合并过程不断推进:每产生一个新的区块,就从覆盖树上删除n个键,把它们重新插入二叉基层树。此过程一直持续,直到所有的键都从覆盖树上移除。到达这步时,区块头就不再保留覆盖状态树的树根。
整个步骤的核心只有一个:如果交易执行时要写的键存在于覆盖树上,这个键就会从覆盖树上删除,写操作直接在二叉基层树上进行。
下一步
为了估计完成转换所需要的时间,我已经做了一个低转换率的原型系统。我们确信,整个过程花费的时间不会太离谱,也就是说几天时间就够了。我们会随着算法的改进而公布更多细节。
致谢
此提议得益于AlexeyAkhunov、VitalikButerin、AnnaGeorge、SinaMahmoodi、TomaszStanczak以及MartinH.Swende的宝贵意见。
原文链接:https://medium.com/@gballet/ethereum-state-tree-format-change-using-an-overlay-e0862d1bf201
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。