以太坊的状态树 Merkle Patricia Tree

2023-11-09

Merkle Patricia Tree

Merkle树

https://www.cnblogs.com/fengzhiwu/p/5524324.html

Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树。Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值。非叶节点是其对应子节点串联字符串的hash。Merkle Tree的主要作用是当我拿到Top Hash的时候,这个hash值代表了整颗树的信息摘要,当树里面任何一个数据发生了变动,都会导致Top Hash的值发生变化。 而Top Hash的值是会存储到区块链的区块头里面去的, 区块头是必须经过工作量证明。 这也就是说我只要拿到一个区块头,就可以对区块信息进行验证。

Merkle Tree的特点

  1. MT是一种树,大多数是二叉树,也可以多叉树,无论是几叉树,它都具有树结构的所有特点;

  2. Merkle Tree的叶子节点的value是数据集合的单元数据或者单元数据HASH。

  3. 非叶子节点的value是根据它下面所有的叶子节点值,然后按照Hash算法计算而得出的。

Trie树

Trie,又经常叫前缀树,字典树,也是一种key-value的存储结构。比如有下面这些单词需要排成trie的数据结构,gennral、genesis、god、go、good。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wFH2pnoU-1643700433444)(https://github.com/hrt014pocky/pocky/blob/main/pictures/trie01.drawio.png?raw=true “trie01.drawio.png”)]

Trie树的特点可以归纳为:

  1. trie的每个节点的分支数目取决于key中的元素的取值范围

  2. trie的查找效率取决于key的长度

  3. trie不会存在哈希碰撞

  4. 输入不变,最终得到的trie树是唯一的

  5. 更新操作是局部性的

Patricia Tries

Patricia Tries是一种路径压缩的trie。直观上看树的高度明显变小了,访问内存的次数就少了,效率提高。以太坊中的账户地址分布是非常稀疏的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8t2iujMs-1643700433445)(https://github.com/hrt014pocky/pocky/blob/main/pictures/PatriciaTries.drawio.png?raw=true “PatriciaTries.drawio.png”)]

以太坊的MPT

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QxxPxO5m-1643700433445)(https://github.com/hrt014pocky/pocky/blob/main/pictures/worldstatetrie.png?raw=true “worldstatetrie.png”)]

课程视频笔记

以太坊状态数据结构推测

以太坊是基于账户的账本,需要完成从账户地址到账户状态的映射,address=>state。address是一个160bits的地址,state包括余额、nonce、code等。首先想到是使用哈希表。

哈希表

首先想到是使用哈希表,更新、插入、查询都在这个哈希表中,一个address的key对应一个state的value。每个全节点在本地维护一个哈希表,打包交易时构建一颗merkle tree,根哈希放在区块头。

如果需要提供一个merkle proof,怎么提供?发起交易时,要查询账户余额正确性怎么查询?一种方法是,使用这个哈希表构建一颗merkle tree,把根哈希存放在区块头中,公布出去,只要这个根哈希正确,那么数据就不会被篡改。这样有什么问题呢?新区块发布,当有一笔新的交易时,执行后必然会改变哈希表的内容,又需要重新构建一颗账户地址到账户状态的merkle tree。但是以太坊的账户数量级是巨大的,再构建一颗merkle tree代价太大了。除了证明账户余额外,merkle proof还有另外一个很重要的作用就是维护各个全节点之间状态的一致性。

那么我们考虑第二种方法,不用哈希表,直接构建一颗merkle tree

merkle tree

直接构建一颗merkle tree,把所有的账户放在merkle tree中,需要修改的时候直接该merkle tree。需要修改的只是很小一部分的账户信息,只需要修改很小一部分的merkle tree。这个结构的问题在于merkle tree没有提供一个快速高效的查找和更新的方法。还有一个问题就是,这个merkle tree需不需要排序?假如不排序,这些账户组成一个merkle tree的叶子节点是账户信息,不规定叶子节点在merkle tree中出现的顺序,在每个全节点的构建的merkle tree是不唯一的,计算出来的根哈希也是不唯一的,也就无法达成共识。所以每个10几秒,发布新区块都会构建一颗不一样的merkle tree。而大多数的账户状态是不变的,账户的数量级很大,所以每次发布新区块都构建新merkle tree是不现实的。
那么,排序的merkle tree行不行呢

sorted merkle tree

如果有新增的账户怎么办?账户地址是随机的,很可能在merkle tree的中间插入一个叶子节点,后面的tree又需要重构merkle tree。于是又回到了上面同样的问题。sorted merkle tree插入一个账户的代价太大。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以太坊的状态树 Merkle Patricia Tree 的相关文章

  • Hyperledger Fabric如何通过虚拟机部署以太坊智能合约

    EVM作为用户链代码安装到Fabric中 然后可以通过它部署智能合约 单个EVM链代码足以在通道上运行多个以太坊智能合约 链码不采用以太坊的共识方法 所有事务仍将遵循Fabric事务流中的执行 订单 验证步骤 确保在不同组织中的足够对等方安
  • 基础回顾3

    java中有哪些容器 集合类 Collection 接口的接口 对象的集合 单列集合 List 接口 元素按进入先后有序保存 可重复 LinkedList 接口实现类 链表 插入删除 没有同步 线程不安全 ArrayList 接口实现类 数
  • 中国齿轮行业发展状况与投资规划建议报告2022-2028年

    中国齿轮行业发展状况与投资规划建议报告2022 2028年 详情内容请咨询鸿晟信合研究院 全新修订 2022年2月 撰写单位 鸿晟信合研究研究 报告目录 第1章 齿轮行业发展环境分析 1 1 齿轮行业政策环境分析 1 1 1 齿轮行业相关政
  • 搭建第一个Dapp应用(4)——搭建SmartDev-Scaffold——2021.5.3

    搭建第一个Dapp应用 4 搭建SmartDev Scaffold 一丶环境配置 Java gt JDK 1 8 Solidity 0 4 25 Git 下载安装包需要使用Git Gradle 大于6 小于7 使用gradle7会报错 二丶
  • 【收藏向】一文弄懂什么是ERC20

    本文只做技术探讨 谨防数字加密货币炒作风险 Token Token 即通证 是以数字形式存在的权益凭证 它代表的是一种权利 一种固有和内在的价值 货币 积分 股票等权益证明 都可以由通证来代表 它代表着数字资产 下图就是在 opensea
  • 在一台电脑上用不同端口同步以太坊区块链节点

    首先要获取第一个节点的信息 在第一个节点的控制台中输入 gt admin nodeInfo enode 将输出的结果用鼠标操作复制 然后在第二个节点的JS控制台中添加第一个节点为静态节点 输入 gt admin addPeer 例如admi
  • openssl命令基础用法:哈希

    单向加密需要使用的标准命令为 dgst 用法如下 openssl dgst md5 md4 md2 sha1 sha mdc2 ripemd160 dss1 c d hex binary out filename sign filename
  • JDK8 HashMap put() 方法源码分析

    文章目录 一 前置知识 红黑树定义 二 构造方法 HashMap HashMap int initialCapacity float loadFactor tableSizeFor int cap 计算hashmap初始容量 三 put 方
  • 字符函数和内存函数的模拟实现

    1 字符串函数 长度不受限的函数 1 1strlen函数 字符串已经 0 作为结束标志 strlen函数返回的是在字符串中 0 前面出现的字符个数 不包含 0 参数指向的字符串必须要以 0 结束 模拟实现 size t my strlen1
  • 哈希表——哈希表的概念,哈希表的实现(闭散列,开散列)详细解析

    作者 努力学习的少年 个人简介 双非大二 一个正在自学c 和linux操作系统 写博客是总结知识 方便复习 目标 进大厂 如果你觉得文章可以的话 麻烦你给我点个赞和关注 感谢你的关注 种一颗树最好是10年前 其次是现在 目录 哈希概念 哈希
  • Redis是怎么对缓存下手的

    文章目录 数据模型 1 字符串 String 2 哈希表 Hash 3 列表 List 4 集合 Set 5 有序集合 Sorted Set 内存存储 以下是一些常见的Redis概念 支持多种数据结构 1 字符串 2 哈希表 3 列表 4
  • 区块链的结构和原理

    区块链的结构和原理 文章目录 区块链的结构和原理 区块链原理 区块链结构 关于区块链的几个问题 结语 区块链原理 区块链是一个链表 链表上存有交易信息 所有人共享同一个链表 因此它也是一个没有管理员的分布式数据库 即去中心化数据库 所有人都
  • Redis中的Hash

    1 前言 本篇博客将介绍Redis中五大类型之一的Hash类型及一些其常用命令 Reids中的Hash是一个键值对类型的集合 类似于Java里面的Map
  • 你也可以构建私有区块链网络

    这是我如何构建私有区块链网络的一篇文章 你也可以 没有什么比自己构建区块链更能帮助理解区块链了 以下是我们将在这篇文章中完成的内容 下图我们以前可能见过 但基本上以太坊区块链网络只是很多EVM 以太坊虚拟机 或连接到每个其他节点的 节点 来
  • 面试题六道-2022-1-6

    CopyOnWriteArrayList的底层原理是怎样的 1 首先CopyOnWriteArraylist内部也是用过数组来实现的 在向CopyOnWriteArrayLlist添加元素时 会复制一个新的数组 写操作在新数组上进行 读操作
  • 以太坊区块链学习之在私链上部署合约

    上一篇博客介绍了如何搭建私链并在私链上创建账户 挖矿 查看余额 本篇将介绍在私链上部署合约并与之交互 本篇开发环境为MacOS 10 12 建议读者使用macOS系统或者Ubuntu系统 第一步 进入geth客户端 启动私链 进入geth客
  • Redis—列表(List)、集合(Set)、哈希(Hash)、有序集合 Zset

    Redis 列表List 集合Set 哈希Hash 有序集合 Zset 列表List 单键多值 常用命令 数据结构 Redis 集合 Set 常用命令 数据结构 Redis 哈希 Hash 常用命令 数据结构 Redis 有序集合 Zset
  • 自己动手部署以太坊联盟链

    一个区块链学习项目 GitHub https github com xianfeng92 Love Ethereum 假设已经在Ubunbu 14 04 LTS上安装好了以太坊客户端Geth 使用Geth部署以太坊联盟链 以太坊Geth客户
  • 哈希表的设计

    概念 顺序结构以及平衡树 中 元素关键码与其存储位置之间没有对应的关系 因此在 查找一个元素时 必须要经过关键 码的多次比较 顺序查找时间复杂度为 O N 平衡树中为树的高度 即 O 搜索的效率取决于搜索过程中 元素的比较次数 理想的搜索方
  • 【算法】使用BFS算法(队列、哈希等)解决最短路径问题(C++)

    文章目录 1 前言 1 1 什么是最短路问题 1 1 1 什么是权值 1 2 如何解决此类最短路径 1 3 BFS解最短路径 前提 FloodFill 洪流问题 2 算法题

随机推荐

  • Protobuf(二)proto3语法格式

    proto文件有两种语法标准 proto2和proto3 我们以proto3为例 其语法格式如下 message
  • 什么是软件测试?

    什么是软件测试 软件测试的定义 在一定条件下对软件进行操作 发现软件的问题 提高软件的质量 软件测试在开发中的有着重要地位 软件测试在各阶段的完成相应的任务 需求测试 架构测试 详细测试等 随着测试的发展 测试技术有了新的支持和扩充CMMI
  • Spline interpolation and Savitzki-Golay smoothing

    转自 http octave 1599824 n4 nabble com Spline interpolation and Savitzki Golay smoothing td1675136 html natural cubic spli
  • QT---窗口、按钮的基本设置

    目录 一 窗口相关的设置及中文编译错误设置 1 在源文件widget cpp中进行修改数据 并创建有关界面 2 如遇中文编译错误 即标题中文显示乱码 可如下设置 3 窗口界面及标题设置 窗口是否拉伸 二 创建按钮的相关设置 1 添加头文件
  • mybatis使用resultMap自定义映射处理,处理多对一的映射关系:

    1 级联方式处理
  • UML 中九种图

    UML 中九种图 1 用例图 说明 由参与者 actor 用例 User Case 以及他们之间的关系构成 用来描述系统功能 作用 可视化表达系统需求 更直观 规范 客服纯文字说明不足 图示 2 类图 说明 类 Class 封装了数据和行为
  • 数据结构 线性表的顺序存储和链式存储,以及基本操作、单链表例题

    一 线性表的存储表示 1 顺序表 线性表的顺序表示又称为顺序表 顺序表的静态分配存储表示 线性表的静态分配顺序存储结构 typedef int ElemType typedef struct 顺序表的定义 ElemType elem LIS
  • 2023Go面试问答_Go基础

    与其他语言相比 使用 Go 有什么好处 与其他作为学术实验开始的语言不同 Go代码的设计是务实的 每个功能和语法决策都旨在让程序员的生活更轻松 Golang 针对并发进行了优化 并且在规模上运行良好 由于单一的标准代码格式 Golang 通
  • Android开发中Handler的经典总结

    一 Handler的定义 主要接受子线程发送的数据 并用此数据配合主线程更新UI 解释 当应用程序启动时 Android首先会开启一个主线程 也就是UI线程 主线程为管理界面中的UI控件 进行事件分发 比如说 你要是点击一个 Button
  • 关于Redis配置主从复制遇到的问题,从机连接到主机,主机显示的从机数量仍然为0

    问题 设置单机集群的时候 两台从机都显示连接到主机 但是主机显示连接到的从机数量为0 主机79 从机80 从机81 解决 主库master要求密码验证 因为之前配置了redis的密码 方法一 建议 在配置文件中将requirepass注释掉
  • 云计算常用命令

    云计算IAAS篇 mysql篇 mysql uroot p000000 使用root账号登录mysql use mysql 切换到mysql层 show tables 查询mysql数据库列表 select from mysql user
  • 记一次阿里云黑客攻击事件

    这几天服务器一直发生异常行为 阿里云报警如下 根据执行命令 bin sh c curl fsSL http 165 225 157 157 8000 i sh sh 可知道 后台某个进程一直从这个美国的IP地址下载sh可执行文件 访问这个地
  • SpringMVC:从入门到精通,7篇系列篇带你全面掌握--四.5分钟搞定文件上传与下载

    Welcome Huihui s Code World 接下来看看由辉辉所写的关于SpringMVC的相关操作吧 需要添加的依赖
  • Android Studio安装及环境配置教程

    前言 首先需要确定好电脑是否有安装java环境 即是否安装有JDK 验证方法 直接电脑桌面win R 输入cmd 然后在黑窗口中分别输入java javac javadoc java version enter键 注意是输入一个指令按一次e
  • 【前端|CSS系列第4篇】面试官:你了解居中布局吗?

    欢迎来到前端CSS系列的第4篇教程 如果你正在寻找一种简单而又强大的前端技术 以使你的网页和应用程序看起来更加专业和美观 那么居中布局绝对是你不能错过的重要知识 在前端开发中 实现居中布局是一项必备技能 无论是垂直居中 水平居中 还是同时实
  • python函数中的可变默认值

    In 27 def f a a append 5 print a In 28 P f 5 In 29 L f 5 5 函数多次调用竟然使用的用一个参数对象 请注意
  • 大数据数据库:MPP vs MapReduce

    这些年大数据概念已经成为IT界的热门 我们经常也会在新闻和报纸中看到 大数据概念中最为关键的技术就是数据库管理系统 伴随着hadoop和MapReduce技术的流行 大数据的数据库中Hive和Spark等新型数据库脱颖而出 而另一个技术流派
  • javafx服务器监控系统,用于服务器端图像生成的JavaFX

    这可能听起来很奇怪 但我想使用JavaFX在服务器端生成我的图表图像 因为JavaFX具有很好的canvas API来执行图像转换连接和定位 特别是我有一个spring MVC服务来生成我的图表作为图像 主要问题是如何从方便的Spring
  • 骚操作:c++如何用goto便捷地写人工栈?

    在如今所有NOI系列赛事已经开全栈的时势下 人工栈已经离我们很远很远 所以这博客就是我弄着玩的 首先我们要清楚的是c 的goto写法 loop goto loop 在运行到goto时 就会跳到对应的标记 标记在goto的前后都可以 然而你试
  • 以太坊的状态树 Merkle Patricia Tree

    Merkle Patricia Tree Merkle树 https www cnblogs com fengzhiwu p 5524324 html Merkle Tree 通常也被称作Hash Tree 顾名思义 就是存储hash值的一