一冠王深度剖析以太坊系统——4.以太坊的状态树(二)

后现代泼痞浪漫主义奠基人  2019-10-07  以太坊/以太坊(Ethereum)栏目  
今年的阅兵式看得我是怎一个“爽”字了得!祖国硬实力的增强有目共睹,作为华夏儿女实感万分自豪。
十一假期转眼间就临近了尾声,就好像在工作日早高峰的地铁上偶然瞥见一个面容姣好的姑娘,当故作无意地撇第二眼时,人面已不知何处去。笃定地讲,所有的法定节假日都是这样。无一幸免,周而复始。黄昏中的北京南站总是给人一种黯然落寞的感觉。不知道有没有南京北站?如果有的话,那里的黄昏是不是也会是同样境况呢?
收拾一下羁旅心情,咱们言归正传。1. 以太坊的Modified MPT
俺在上回书说道:以太坊中使用的还不是原生的MPT,而是Modified MPT。这个特殊的数据结构是基于MPT改造而成。它在结构方面进行了一些非本质的修改。下面来看一张网上的图片:右上角方框中为四个以太坊账户的地址状态。为了方便起见,图片事例将地址假定为28位(真正的以太坊账户地址是160位),同时假定以太坊账户的状态只包含余额。所以目前四个账户a711355、a77d337、a7f9365、a77d397地址下分别拥有余额45ETH、1WEI、1.1ETH、0.12ETH。再来看一下状态树,其中的节点类型有三种:1.Extension Node:如果了解前面我讲过的路径压缩,那么对应压缩部分的节点就是Extension Node。其中shared nibbles表示压缩后的十六进制数,即一个nibble就是一个16进制数。2.Branch Node:在MPT中出现有分叉的地方就会形成一个Branch Node。在Branch Node中提供0到f十六个可选分支。3.Leaf Node:最后的叶节点,即下面不再拥有分支的节点。其key-end中为剩余的key的部分值,value中保存着该分支账户中的余额。由上图可以看出以太坊使用的Modified MPT和原生的MPT是不一样的,它里面拥有三种不同的节点:Extension NodeBranch NodeLeaf Node。注意!以太坊的Modified MPT的根节点取哈希值后,要将值写入区块头中。并且Leaf Node和Extension Node中的prefix也是有讲究的:如果Extension Node中存放的nibbles数量为偶数,对应的prefix等于0;如果Extension Node中存放的nibbles数量为奇数,对应的prefix等于1????;如果Leaf Node中存放的nibbles数量为偶数,对应的prefix等于2;如果Leaf Node中存放的nibbles数量为奇数,对应的prefix等于3????;    注:????为Node中存有的第一个nibble(十六进制数)。以太坊的Modified MPT中使用的都是哈希指针,如下图所示:下面的Branch Node和Extension Node以此类推。
2. 状态树的工作原理每一次发布新的区块的时候,以太坊状态树中有一些节点的值是会发生变化。这些改变不是在原地改(原来的状态分支是要保留的),而是新建一些分支:上图展示的是以太坊两个相邻区块的区块头,其中的State Root就是状态树。从图上可以看出:虽然两个区块头都有自己的状态树,但是这两个状态树有很大一部分是共享的(未发生改变的Node),只有那些发生变化的Node需要重新创建一个分支。图中展示的账户是一个合约账户,因为它有Codehash(智能合约代码取的哈希值)和Storage root(合约内的变量状态取的根哈希值)。所以以太坊合约账户的存储也同样是使用MPT的数据结构来实现的。合约账户中的Storage 其实也是一个key-value store,维护的是智能合约中的变量到变量取值的映射。当然此处依然使用了MPT的数据结构。整体上看,以太坊的状态树是一个大的MPT,其下面还包含着许多小的MPT。每一个合约账户的存储都是一棵小的MPT。从后一个区块的状态树中可以看出:这个区块的xxx账户下的合约账户中的内容状态发生了变化。计数器从Nonce变成Nonce',合约账户余额从Balance变成Balance',合约代码没有变,合约的存储树(Storage)中有一个变量的值发生了变化(从29变成45)。所以以太坊系统中每个全节点需要维护的不是一棵MPT,每次出现一个新的区块都要新建一个MPT。只不过这些MPT大部分都是相同的,只有那些发生变化的Node才需要重新创建一个分支。那么为什么要保留历史状态呢,干嘛不直接在原先的状态树上直接修改呢?同比特币系统不同,以太坊系统中有时可能出现分叉,尤其是临时性的分叉是很普遍的。因为以太坊的出块时间降到了十几秒(比特币的出块时间约为10分钟),那么出现临时分叉其实是常态。如下图所示:至于以太坊的分叉常态特性与对应解决方案,在后面我会详细讲解。  end大城市的漂泊,使我逐渐忘却家的味道。尤其是这次回家,这种温馨感来得既饱满又陌生。故乡是回不去的。伴随着成长,我越加笃信这一点。
在回来的高铁上,读到余秀华的一句诗——“把一个和横店类似的村庄当成故乡”。
说不定有朝一日,这个主语就会是“我”。

  

  往期厉文一览

  1、一冠王深度剖析以太坊系统——3.以太坊的状态树(一)

  2、一冠王深度剖析以太坊系统——2.以太坊的账户模型

  3、一冠王深度剖析以太坊系统——1.以太坊概述

  4、你好,忧愁

  5、大调改成小调,我把安河桥变成富士山

关注

  听说关注了

  后现代泼痞浪漫主义奠基人

  会得到

  夜幕的星辰

  凡世的幸福

????有思想的人都点了“在看”????????????
版权信息
作者:一冠王
来源:后现代泼痞浪漫主义奠基人

关于我们

联系我们

作者进驻

公众号

Copyright © 2013 比特巴 www.btb8.com
只为您提供客观公正有用的比特币 区块链 加密数字货币新闻、技术教程、行情分析、行业人物资讯
手机版