以太坊之三状态树

正在学习区块链,如果我哪里有错误希望大家指出,如果有任何想法也欢迎留言。这些笔记本身是在typora上写的,如果有显示不正确的敬请谅解。笔记本身也是给我自己写的,所以如果有侵权的请通知我,我立即删除。

3. 状态树

这个数据结构的目的很明显,为了保存每种账户的当前状态,这就和银行的账户很像了,比比特币的UTXO友好很多。

patricia trie

字典树有一点浪费空间,比如下面这个例子。

avatar

但是路径patricia trie进行路径压缩后。

avatar

因此,当键值分布比较稀疏的时候路径压缩效果比较好,不是说那些公共的前缀多就好,而是说地址之间没有什么共同点,随机性很大。这正好符合以太坊的特点。其实不光是以太坊,比特币也是这样的,为了保证地址之间没有冲突,地址长度大是唯一的办法,而地址一长自然就稀疏了。

merkel patricia trie

这个的改变非常明显,就是用哈希指针代替普通指针。普通指针内存放的是数据的地址,哈希指针内存的是哈希值,具体的地址要由哈希值再次查询。

modify merkel patricia trie

实际中使用的MPT树是修改过的,具体的修改内容看下图

![avatar][pic3-3]

一共有四个账户,就是右上角a7开头的那四个账户,其中第一个有45.0以太币,第二个有1.00WEI,以此类推。整棵树分为extension nod、branch node和leaf node。其中压缩节点是extension node,说明其中有a7和d3这两部分被压缩了。叶结点就叶结点,branch node有点类似于实现时的哈希。如果是没有修改的MPT,应该是这样的:

a7
11355
7d3
f9365
37
97

上面的modify MPT树在存储的时候不是每次仅存一棵,而是每次仅存和上次的差别,具体的例子看下面的图

avatar

仔细看一下就能看懂。这是两个相连的区块。本来状态树的根节点下有三个节点,新的状态树,如果指的是之前没有改过的,就把指针指向之前的位置,这样就省了空间。

状态树能不能仅存本区块中用到的账户而不是存储全部账户的信息呢?这样能够大幅减少每个区块的数量啊。答案肯定是不行的,因为这样就会造成每个区块中的账户数据都不是全的,要是想知道某个账户的信息可能需要遍历很多很多个区块才能查到。这样状态树存在的意义就不大了,和UTXO差别不太大了。尤其是如果A->B,B是个新建的账户,这样可能需要找到创世区块才知道这是个新的账户。

但是为什么要保存以前的账户的状态呢?这里我有点不理解。肖老师说因为分叉或者智能合约的时候需要账户之前的状态。智能合约还没看到我不懂,但是分叉我懂需要回滚。只是我要是每次都存储一整棵MPT不行吗?好像是不行,因为空间太大?我知道我说的有点驴唇不对马嘴,但是肖老师就这么说的,我就这么理解的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tux~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值