北京大学肖臻老师《区块链技术与应用》公开课笔记18——ETH数据结构篇2(状态树2)

北京大学肖臻老师《区块链技术与应用》公开课笔记

以太坊数据结构篇2——状态树2,对应肖老师视频:https://www.bilibili.com/video/av37065233?p=16
全系列笔记请见:https://blog.nowcoder.net/n/30cbdb37108b4d93b3a5a93b8226ae31
以太坊数据结构篇1——状态树1请见:https://blog.nowcoder.net/n/af076ef24b1844f7856e7b9602020b8e

本篇内容从视频中匿名性节44:00左右开始。主要内容为MPT数据结构的讲解。


Merkle Tree 和 Balance Tree
区块链和链表的区别在于区块链使用普通指针,链表使用哈希指针。
同样,Merkle Tree 相比 Balance Tree,也是普通指针换成了哈希指针。


所以,以太坊系统中可如此,将所有账户组织为一个经过路径压缩和排序的Merkle Tree,其根哈希值存储于block header中。

BTC系统中只有一个交易组成的Merkle Tree,而以太坊中有三个(三棵树)。
也就是说,在以太坊的block header中,存在有三个根哈希值。

根哈希值的用处:

  1. 防止篡改。
  2. 提供Merkle proof,可以证明账户余额,轻节点可以进行验证。
  3. 证明某个发生了交易的账户是否存在

MPT(Modified Patricia tree)

以太坊中针对MPT(Merkle Patricia tree)进行了修改,我们称其为MPT(Modified Patricia tree)

下图为以太坊中使用的MPT结构示意图。右上角表示四个账户(为直观,显示较少)和其状态(只显示账户余额)。(需要注意这里的指针都是哈希指针)
图片说明

每次发布新区块,状态树中部分节点状态会改变。但改变并非在原地修改,而是新建一些分支,保留原本状态。如下图中,仅仅有新发生改变的节点才需要修改,其他未修改节点直接指向前一个区块中的对应节点。
图片说明

所以,系统中全节点并非维护一棵MPT,而是每次发布新区块都要新建MPT。只不过大部分节点共享。

为什么要保存原本状态?为何不直接修改?
为了便于回滚。如下1中产生分叉,而后上面节点胜出,变为2中状态。那么,下面节点中状态的修改便需要进行回滚。因此,需要维护这些历史记录。
图片说明

通过代码看以太坊中的数据结构

  1. block header 中的数据结构
    图片说明
  2. 区块结构
    图片说明
  3. 区块在网上真正发布时的信息
    图片说明

    最后说明
    状态树中保存Key-value对,key就是地址,而value状态通过RLP(Recursive Length Prefix,一种进行序列化的方法)编码序列号之后再进行存储。

全部评论
第一句话是不是打反了,应该是区块链使用hash指针,链表使用普通指针。orzzz。
1 回复 分享
发布于 2021-02-22 17:39

相关推荐

03-15 00:45
已编辑
中国科学院大学 Java
问的很简单都秒了,但是面试官没开摄像头,疑似kpi,无后续。--------------------3/14更新,3/12通知给了口头offer,3/13发了意向书,已拒。一面(35min)(25/3/6)(无后续)    1、自我介绍    2、介绍一下你的那个Python相关项目(本科毕设,web系统+算法模型提供部分接口)    3、Java面向对象有哪些特点呢?详细说一下。    4、介绍一下hashmap;为什么要把链表转换为红黑树呢?红黑树查找的时间复杂度?1.7和1.8的区别。    5、介绍一下concurrentHashmap。    6、synchronized锁和Lock锁有什么区别?    7、公平锁的一个底层是怎么实现的呢?    8、线程池的核心参数、拒绝策略、提交一个任务执行流程?    9、spring有哪些特点?(ioc/aop)    10、spring中对于循环依赖是怎么解决的?    11、MySQL和redis的区别?    12、MySQL的索引结构是什么?    13、MySQL的事务有哪些特性?怎么保证?    14、MySQL的默认隔离级别?可重复读是怎么做到的呢?    15、介绍一下MVCC和快照读readview。    16、一般在什么场景下会使用redis?    17、对于大量的请求,如果此时缓存中还没有写入数据怎么办?    18、介绍一下redis实现的分布式锁。    19、有用过es和mongo DB吗?(知道,没用过)    20、消息中间件用过吗?说一下你的使用场景?    21、一个场景,如果说有一个接口响应的比较慢,如果说让你排查,你会怎么去排查?(上下游接口、大key问题,只答了两,后面试官补充)    无手撕,反问业务。
胖墩墩的查理在学c语言:哥们我是五号面的 流程差不多
查看21道真题和解析
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务