以太坊的状态树 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 的相关文章

  • solidity通用模式访问限制

    通用模式 访问限制 访问限制是智能合约的一种通用模式 但你不能限制任何人获取你的智能合约和交易的状态 当然 你可以通过加密来增加读取难度 但是如果你的智能合约需要读取该数据 指加密的数据 其他人也可以读取 你可以通过将合约状态设置为私有来限
  • Remix 以太坊Solidity IDE搭建与初步使用

    以太坊 因为以太坊为开源社区 虽然东西很优秀 但是组件十分的杂乱 因此首先简单介绍下以太坊的一些常用组件 1 Geth Geth是由以太坊基金会提供的官方客户端软件 用Go编程语言编写的 2 Parity Parity 是对以太坊协议的另一
  • 以太坊如何通过构建智能合约来销售商品?

    如何通过构建以太坊智能合约来销售商品 这是个问题 毫无疑问 比特币已经改变了我们看待和理解什么是金钱 价值以及最近由智能合约产生的所有权的方式 这很有趣 因为几乎每个人都听说过它或加密货币 来自许多业务领域的人 不仅仅是我们 IT工作者 在
  • 【收藏向】一文弄懂什么是ERC20

    本文只做技术探讨 谨防数字加密货币炒作风险 Token Token 即通证 是以数字形式存在的权益凭证 它代表的是一种权利 一种固有和内在的价值 货币 积分 股票等权益证明 都可以由通证来代表 它代表着数字资产 下图就是在 opensea
  • LeetCode刷题-1

    数组 1 两数之和 题目描述 题目样例 Java方法 暴力枚举 思路及算法 代码 执行结果 复杂度 Java方法 哈希表 思路及算法 代码 执行结果 复杂度 题目描述 给定一个整数数组 nums 和一个整数目标值 target 请你在该数组
  • HashMap源码分析

    HashMap源码分析 HashMap是Java集合框架中常用的数据结构之一 它提供了一种用于存储键值对的哈希表实现 在本文中 我们将深入源码 详细分析HashMap的实现原理和关键方法 HashMap的基本结构是一个数组和一组链表 或红黑
  • FISCO BCOS——SmartDev-Contract——MarriageEvidence结婚证书合约案例分析

    MarriageEvidence结婚证书合约案例分析 一 合约场景分析 二丶基础合约介绍 1 角色合约 1 功能说明 2 接口说明 3 使用说明 2 存证合约 1 功能说明 2 接口说明 3 使用说明 三丶业务合约介绍 1 结婚证书合约 1
  • PHP 创建派生类对象时基类部分问题

    之前我以为在派生类的构造函数中 在调用基类的构造函数前是不能使用基类成员的 因为基类对象还未构造 其中的成员也不存在 但在以下测试中发现 在调用基类的构造函数前基类中的成员已经存在 基类构造函数只是改变了基类中成员的值 class base
  • Redis是怎么对缓存下手的

    文章目录 数据模型 1 字符串 String 2 哈希表 Hash 3 列表 List 4 集合 Set 5 有序集合 Sorted Set 内存存储 以下是一些常见的Redis概念 支持多种数据结构 1 字符串 2 哈希表 3 列表 4
  • 以太坊智能合约各方法对应的签名编码

    erc20智能合约常见方法对应的签名编码 常见例如交易 transfer address uint256 编码为 web3 sha3 transfer address uint256 substring 0 10 gt 0xa9059cbb
  • 【算法日志】哈希表应用:set和map容器,哈希表的使用(day5)

    代码随想录60day 链表 day4 链表 day3 目录 前言 一 三种哈希结构 数组 散列技术 哈希思想 哈希碰撞 set 集合 map 映射 二 哈希表的一些应用 总结 前言 哈希表 也叫散列表 是一种较为常用的数据结构 我们常用的数
  • Waffle使用初体验

    一 什么是Waffle Waffle是什么呢 我们直接看其文档上的介绍 Waffle is a library for writing and testing smart contracts Sweeter simpler and fast
  • Redis中的Hash

    1 前言 本篇博客将介绍Redis中五大类型之一的Hash类型及一些其常用命令 Reids中的Hash是一个键值对类型的集合 类似于Java里面的Map
  • 【基础算法】简单了解一下常见的几种散列算法?

    简单了解一下常见的几种散列算法 如果觉得对你有帮助 能否点个赞或关个注 以示鼓励笔者呢 博客目录 先点这里 前提概念 好的哈希函数 MD5 与 SHA MD5 SHA 家族 CRC MurmurHash times31 33 times33
  • 转:Tendermint 简介

    Tendermint 是分布式一致性软件 即使有1 3的机器叛变了 也能保证其余机器上的数据一致 容忍机器以任意方式失败的能力 包括变得恶意 被称为拜占庭容错 BFT 该理论被提出来数十年了 由于bitcoin和ethereum 区块链技术
  • Redis之hash类型

    文章目录 Redis之hash类型 1 设置一个字段 获取一个字段 2 获取所有字段值 3 判断字段是否存在 4 设置多个字段 获取多个字段 5 只获取字段名 字段值 6 获取某个key内全部数量 7 增加数字 8 删除key内字段 9 字
  • 【区块链与密码学】第2-3讲:区块链基础技术大剖析之哈希函数

    本课堂内容全部选编自PlatON首席密码学家 武汉大学国家网络安全学院教授 博士生导师何德彪教授的 区块链与密码学 授课讲义 教材及互联网 版权归属其原作者所有 如有侵权请立即与我们联系 我们将及时处理 2 4 1 哈希函数 区块链作为一个
  • 期货ctp基础知识(合约,开仓,平仓,做多,做空,保证金,手续费)

    期货ctp教程地址 期货ctp教程 合约 期货买卖的是合约 股票买卖的是股票 做多和做空 2 1 做多 你就是买入看涨 所以买这个动作对应的指令就是 买开仓 当你赚了或者止损的时候 就要把合约卖掉 对应的指令就是 卖平仓 2 2 做空 你先
  • JDK7 HashMap

    在Java中HashMap是一个常用且重要的容器 它基于哈希表实现 提供了高效的插入 删除和查找操作 本文我们将分别讲述JDK7中的HashMap 使用 HashMap的使用非常简单 下面演示下存数据与取数据 简单示例 public sta
  • 一致性哈希算法,hash(key)是负值时,会出现异常吗?

    一致性哈希算法 hash key 是负值时 会出现异常吗 一致性哈希算法中 哈希函数hash key 的返回值通常是一个非负整数 如果hash key 返回负值 则可能会出现一些问题 例如无法正确地映射对象到哈希环上的位置 或者无法正确地找

随机推荐

  • 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值的一