区块链学习笔记15——ETH状态树

学习视频:北京大学肖臻老师《区块链技术与应用》
笔记参考:北京大学肖臻老师《区块链技术与应用》公开课系列笔记——目录导航页

引入

要实现的功能:地址到状态的映射
ETH的账户地址是160位的,一般表示成40个十六进制数
状态就是外部账户和合约账户的状态,包括余额、交易次数,合约账户还有代码和存储。

数据结构的组织形式

  1. 直观上用哈希表存储比较简单,我们将哈希表组织成一棵Merkle tree用来证明交易的合法性有什么问题?
    当新区块发布,哈希表内容会改变,我们需要再次将其组织为新的Merkle Tree,这样的话,每当产生新区块(ETH中新区块产生时间为10s左右),都要重新组织Merkle Tree,这样的代价是很大的。
    需要注意的是,比特币系统中没有账户概念,交易由区块管理,而区块包含上限为4000个交易左右,每次发布一个区块对应一棵新的Merkle tree,一旦发布是不会改变的,所以Merkle Tree不是无限增大的。而ETH中,Merkle Tree用来组织账户信息,是要把所有的以太坊账户一起构建一个Merkle tree,这个数目比BTC中的Merkle tree会大好几个数量级。
    实际中,发生变化的仅仅为很少一部分数据,我们每次重新构建Merkle Tree代价很大
  2. 能不能不用哈希表,直接用Merkle tree,改的时候直接在Merkle tree里改?
    Merkle tree没有提供一个高效的查找和更新的方法。为了保证所有节点的一致性和查找速度,必须进行排序。比特币系统中虽然没有进行排序,但是交易的顺序是由发布区块的结点确定的,顺序是唯一的。如果以太坊要想实现的话必须把所有账户的状态也发布到区块上,数量级很大是不可行的。
  3. 如果用排序的Merkle tree会有什么问题?
    插入账户的话代价很大

综上所述,以上两种简单的数据结构均是不可行的,实际中以太坊采取的数据结构是MPT。

简单的数据结构——trie

特点:

  • 每个结点的分支数目取决于Key值中每个元素的取值范围
    图例中的分支数目为27(最多26个小写的英文字母+一个结束标志位);以太坊中的地址为40个十六进制数,所以分支数目为17(16个十六进制数+一个结束标志符)
  • 查找效率取决于key值的长度,以太坊中所有的键值是相同长度,都是40位16进制数
    Ps:比特币和以太坊的地址是不通用的,格式长度均不同,以太坊的地址是公钥取哈希从前面截取一段(160bit)得来的
  • 哈希表存储理论上是会出现哈希碰撞的,trie是不会出现碰撞的
  • 给定一组输入构成的trie是相同的,与顺序无关
  • 更新的局部性比较好,只需要更改元素所属的分支即可

缺点

  • 存储浪费,很多中间节点都只有一个子节点,如果能将其合并,可以减少存储的开销,同时提高了查找的效率。因此,为了解决这一问题,我们引入Patricia tree/Patricia trie。

Patricia tree

经过了路径压缩的前缀树

需要注意的是,如果新插入单词,原本压缩的路径可能需要扩展开来。
路径压缩在什么情况下效果比较好:键值分布比较稀疏

Trie:

Patricia tree:

以太坊的地址是160bit的,共有2160种,是非常稀疏的,这样可以避免产生碰撞,这是去中心化系统防止产生碰撞的唯一办法。

MPT——Merkle Patricia tree

Merkle tree与binary tree的区别:把普通指针转为哈希指针

Merkle Patricia tree:所有账户组织成一棵Patricia tree,用路径压缩提高效率,然后把普通指针换成哈希指针,这样就可以计算出一个根哈希值。(比特币的block header中只有一个根哈希值,就是区块中包含的交易组成的Merkle tree的根哈希值;以太坊中有三个)

这个根哈希值的作用:

  • 防篡改
  • Merkle proof,证明账户余额
  • 证明账户不存在,如果存在的话应该存在哪个分支上,将这个分支作为Merkle proof发送,可证明其不存在

实际用到的MPT——Modified MPT


每次发布新区块,状态树中部分节点状态会改变。**但改变并非在原地修改,而是新建一些分支,保留原本状态。**如下图中,仅仅有新发生改变的节点才需要修改,其他未修改节点直接指向前一个区块中的对应节点。
合约账户的存储也是MPT形式保存,也是用一棵MPT,以太坊的结构是一棵大的MPT包含很多小的MPT,每一个合约账户的存储都是一个小的MPT

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

为什么要保留历史状态?
系统中有时会出现分叉,出块时间降到十几秒,临时性的分叉是很普遍的。
保留历史状态为了便于回滚。
如下图1中产生分叉,而后上面节点胜出,变为2中状态。那么下面节点中状态的修改便需要进行回滚,将这个结点的状态取消掉,退回到上一个区块,然后沿着上一个链向后推进。
因此,需要维护这些历史记录。

比特币中的交易可以通过简单的反向交易退回到之前的状态,但是以太坊中有智能合约的存在,一旦执行完后就无法推算出之前的状态,所以要想回滚必须保存历史状态。

以太坊中代码的数据结构

区块头的结构:

区块的结构:

区块在网上真正发布时的信息:

value的存储

状态树中保存的是(key,value)
key就是地址,value是经过RLP(Recursive Length Prefix)编码做序列化之后再存储
RLP的特点:简单,只支持一种类型——nested array of bytes

区块链学习笔记15——ETH状态树相关推荐

  1. 区块链学习笔记16——ETH交易树和收据树

    区块链学习笔记16--ETH交易树和收据树 学习视频:北京大学肖臻老师<区块链技术与应用> 笔记参考:北京大学肖臻老师<区块链技术与应用>公开课系列笔记--目录导航页 交易树和 ...

  2. 区块链学习笔记21——ETH智能合约

    区块链学习笔记21--ETH智能合约 学习视频:北京大学肖臻老师<区块链技术与应用> 笔记参考:北京大学肖臻老师<区块链技术与应用>公开课系列笔记--目录导航页 智能合约简介 ...

  3. 区块链学习笔记23——ETH反思

    区块链学习笔记23--ETH反思 学习视频:北京大学肖臻老师<区块链技术与应用> 笔记参考:北京大学肖臻老师<区块链技术与应用>公开课系列笔记--目录导航页 智能合约真的智能吗 ...

  4. 区块链学习笔记19——ETH难度调整

    区块链学习笔记19--ETH难度调整 学习视频:北京大学肖臻老师<区块链技术与应用> 笔记参考:北京大学肖臻老师<区块链技术与应用>公开课系列笔记--目录导航页 前面学过,比特 ...

  5. 区块链学习笔记2——BTC中的数据结构

    区块链学习笔记2--BTC中的数据结构 学习视频:北京大学肖臻老师<区块链技术与应用> 笔记参考:北京大学肖臻老师<区块链技术与应用>公开课系列笔记--目录导航页 本文主要介绍 ...

  6. 区块链学习笔记4——BTC实现

    区块链学习笔记4--BTC实现 学习视频:北京大学肖臻老师<区块链技术与应用> 笔记参考:北京大学肖臻老师<区块链技术与应用>公开课系列笔记--目录导航页 UTXO 区块链是一 ...

  7. 区块链学习笔记(一)——区块链和搓麻是一样一样的

    区块链学习笔记(一)--区块链和搓麻是一样一样的 新的开始 一个故事 要点 总结概念 几个搞笑的解释(真实性待查) 新的开始 你好! 这是我的第一篇学习笔记,想来想去就从近几年挺火的区块链开始吧,大多 ...

  8. 区块链学习笔记(三)——从商鞅变法谈“共识机制”

    区块链学习笔记(三)--从商鞅变法谈"共识机制" 前言 一.商鞅变法的故事 总结一下 二.共识机制 1)什么是共识机制 2)要点 总结 前言 区块链健康运行的灵魂是"共识 ...

  9. 区块链学习笔记16——以太坊中的交易树和收据树

    十六.以太坊中的交易树和收据树 每次发布一个交易的时候,那些交易会组织成一个交易树,也是一颗Merkle tree跟比特币中的情况是类似的,同时以太坊还增加了一个收据树,每个交易执行完之后会形成一个收 ...

最新文章

  1. main函数的参数问题 (转载)
  2. python 学习笔记day03-python基础、python对象、数字、函数
  3. 网易智慧企业Node.js实践(1) | Node应用架构设计和React同构
  4. 计算机网络中的时延有哪几部分,计算机网络中的四种延迟分别是什么?
  5. 策略模式、上下文与内部类的思考
  6. 用递归法求1²+2²+...+n²的值
  7. Foundation 6 – 先进的响应式的前端开发框架
  8. Oracle官网登录下载资源账号密码共享
  9. 数电实验(二)利用8选1数据选择器74LS151设计四舍五入判别电路
  10. C#注入DLL-C#注入器
  11. 如何压缩PDF文件、图片转PDF、PDF合并拆分!!!!
  12. InsecureProgramming-master——abo4
  13. Linux内核模块最简驱动
  14. 文字图片滚动 jquery 实现代码
  15. 【愚公系列】华为云系列之ModelArts+AppCube带你识别101种西式美食【我的低代码AI体验】
  16. 20175208 张家华 MyCP
  17. 三菱 FX5U PLC结构化4轴伺服机器人程序
  18. 牛客SQL 大厂面试真题 某宝店铺分析 5套代码及解析
  19. 什么是人工智能技术?
  20. 在VS平台下使用JAI_SDK库1———— 配置工程包含路径

热门文章

  1. 讯飞实时语音转写 python3.6.1 可完美运行 解析返回的json字符串 输出所获语音文字
  2. web网站服务(一)
  3. PS之人物通道磨皮法
  4. 【C++】洛谷P1873 [COCI 2011/2012 #5] EKO / 砍树
  5. Zabbix网站pv_uv_ip的监控
  6. 计算机系统软件和应用软件的区别
  7. 小米3android版本,小米手机
  8. rufus 装windows11 系统 z790 msi 主板
  9. 徐小明:探寻股市下跌的真正原因
  10. PMP®第十三章 项目干系人管理