北京大学肖臻老师《区块链技术与应用》P16(状态树)和P17(交易树和收据树)

1️⃣ 参考

  • 北京大学肖臻老师《区块链技术与应用》
    • P16 - ETH状态树篇
    • P17 - ETH交易树和收据树篇
  • 部分文字和图片
    • 北京大学肖臻老师《区块链技术与应用》公开课笔记18——ETH数据结构篇2(状态树2)
    • 北京大学肖臻老师《区块链技术与应用》公开课笔记19——ETH数据结构篇3(交易树和收据树)

1️⃣6️⃣ 状态树

① 引言

  • 回顾
    • 以太坊账户地址为160bits(20字节),表示为40个16进制数
    • 状态包含了
      • 余额(balance)
      • 交易次数(nonce)
      • 合约账户中还包含了代码(code) 和 存储(stroge)
    • 在比特币和以太坊系统中,核心单位是区块,是通过区块构成区块链,交易是保存在区块内部
    • 在脑中要有一个意识,每个人都可以在本地构建区块链,只是像在比特币系统中上链的区块是矿工说的算,其他人复制

现在要实现从账户地址到账户状态的映射,咋一看,容易想到Key-value键值对,所以直观想法便用哈希表实现。若不考虑哈希碰撞,查询直接为常数级别的查询效率。

但采用哈希表,难以提供Merkle proof(需要回顾请看这里)

  • Merkle Tree
    • 作用
      • 提供证明账户上余额
      • 维护全节点之间状态的一致性(对于当前区块中包含了哪些交易,全节点之间要有共识)
    • 缺点
      • 没有提供一个高效的查找和更新的方法

思考

  • 比特币为什么可以构建Merkle Tree,而以太坊不行 ?
    1. 因为构建的内容不是一个量级的
      • 在比特币系统中,仅对一个区块中的交易(最多包含4000左右) 构造,前面构建好的是不发生变化的
      • 在以太坊系统中,基于账户的模式下,每发布一个区块,要将所有的账户都遍历一遍来构建,开销太大
    2. 构建出的Merkle Tree不唯一
      • 在比特币系统中,没有排序不影响,因为是一人(拥有记账权的矿工 POW)说的算,其他都都是复制,所以大家得到的Merkle Tree是唯一的
      • 在以太坊系统中,因为没有排序,没办法保证新账户出现在叶子节点的顺序(因为每个人接受新节点的顺序是不一样的),算出的根哈希值不同,所以构建的Merkle Tree不唯一

思考

  • 那么经过排序,使用Sorted Merkle Tree可以吗?
    • 还是开销太大,新增账户,由于其地址随机,插入Merkle Tree时候很大可能在树中间,发现其必须进行重构。(牵一发而动全身)

所以,简单的Merkle Tree和哈希表数据结构是不满足的
那么我们看一下实际中以太坊采取的数据结构:MPT(第四小节)

② trie(字典树、前缀树)

  • 取自单词retrieval n. 检索

  • 下图是使用trie数据结构对单词进行存储
    请添加图片描述

  • trie特点

    • trie中每个节点的分支数目取决于Key值中每个元素的取值范围【图例中最多26个英文字母分叉 + 一个结束标志位;以太坊中最多17,16进制(0 ~ f) + 1结束符】。
    • trie查找效率取决于key的长度。实际应用中每个地址长度都是相同的
    • 理论上哈希会出现碰撞,而trie上面不会发生碰撞
    • 给定输入后构造的trie都是一样的(无论如何顺序插入)。
    • 更新操作的局部性较好(只用更新其分支,其他不变)

  • trie缺点
    • trie的存储浪费,很多节点只存储一个key(叶子节点)。因此,要是能合并一些就好了,为此,引入了Patricia tree/trie

③ Patricia trie(经过路径压缩的前缀树,压缩前缀树)

  • 下图为压缩后,明显树的高度变得浅了,访问内存的次数将会大大减少,提高了效率
    请添加图片描述

需要注意的是,如果新插入单词,原本压缩的路径可能需要扩展开来。

问题

  • 那么,需要考虑什么情况下路径压缩效果较好?
    • 树中插入的键值分布较为稀疏的情况下,可见路径压缩效果较好(如下图)。
      Disintermediation 去中间商请添加图片描述

在以太坊系统中,160位的地址存在 2 160 2^{160} 2160 种,和账户数目相比,可以认为地址这一键值非常稀疏。因此,我们可以在以太坊账户管理种使用Patricia trie这一数据结构

  • 为什么要设计的非常稀疏?
    • 防止地址发生碰撞,也就是防止账户冲突

但实际上,在以太坊种使用的并非简单的PT(Patricia trie),而是MPT(Merkle Patricia trie)

④ MPT(Merkle Patricia trie)

  • Merkle treeBinary tree 区别
    • 区块链和普通链表的区别在于把普通指针换成了哈希指针
    • 同样,Merkle tree 相比 Binary tree,也是普通指针换成了哈希指针

  • block header中的根哈希值

    • BTC的block header只有一个根哈希值:
      • 区块中的交易组成的Merkle tree根哈希值
    • ETH的block header中有三个根哈希值:
      • 交易树的根哈希值:由区块中交易组成
      • 状态树的根哈希值:将所有账户组织为一个经过路径压缩和排序的Merkle Tree
      • 收据树的根哈希值:后面会展开
  • 根哈希值的用处:

    • 防篡改
    • 提供Merkle proof给轻节点可以验证账户余额
    • 证明某个发生了交易的账户是否存在

⑤ MMPT(Modified Merkle Patricia trie)

⑤① MMPT的图示

请添加图片描述

  • 与普通的Merkle Patricia trie不同在哪?
    • Prefixes有分奇数哥和偶数个nibble

⑤② MMPT的运用

发布新区块的时候,状态树中有一些节点的值会发生变化,这些改变是在保留原来状态基础上新建分支来修改

在这里插入图片描述

  • 虽然有两颗状态树,但大部分节点是共享的
  • 以太坊的结构是大的MMPT包含小的MMPT,每个合约账户的存储中也是一颗MMPT
  • 所以,系统中全节点并非维护一棵MPT,而是每次发布新区块都要新建MPT,只不过大部分节点共享,只有少数发生变化的节点要新建分支

  • 为什么要保存原本状态?为何不直接修改?
    • 便于回滚。因为以太坊支持智能合约,智能合约中的代码时很复杂的,没办法从中倒推出执行合约前的状态,所以要想支持回滚,就必须保存历史状态

⑥ 以太坊数据结构源码

⑥① block header

⑥② 区块结构

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

在这里插入图片描述

⑦ 状态树中的value

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

以太坊的所有类型最后都要经过RLP变成字符数组(nested array of bytes)

1️⃣7️⃣ 交易树和收据树

  • 每次发布一个区块时,区块中的交易会形成一颗交易树
  • 以太坊还添加了收据树,在每个交易执行完之后形成一个收据,记录交易相关信息。
  • 也就是说,使交易树和收据树上的节点是一一对应的。

  • 为什么要有收据树?
    • 因为智能合约执行较为复杂,通过收据树,有利于快速查询执行结果

  • 以太坊中三棵树都是Merkle Patricia trie,MPT的优点是支持查找操作,通过键值

    • 状态树键值与特点
      • 所有账户的状态都包含进去(无论这些账户是否与当前区块中交易有关系)
      • 多个区块状态树共享节点
      • 查找键值为账户地址
    • 交易树和收据树键值与特点
      • 只将当前区块中的交易组织起来
      • 依照区块独立
      • 查找键值为交易在发布的区块中的序号
  • 比特币只有一颗交易树,采用普通的MT(Merkle Tree)


  • 交易树和收据树的用途
    • 向轻节点提供Merkle Proof
      • 交易树证明:某个交易被打包到节点中
      • 收据树证明:某个交易的执行结果
    • 更加复杂的查找操作,例如:查找过去十天的跟某个智能合约的交易

以太坊中是如何实现这复杂的查找操作呢? 答:Bloom filter(布隆过滤器)

① Bloom Filter(布隆过滤器)

布隆过滤器可以判断某个数据一定不存在,但是无法判断一定存在(可能发生互相碰撞,false positive)

  • 功能:支持较为高效查找某个元素是否在某个集合中
  • 实现:计算出一个紧凑的“摘要”。将每个个元素都取哈希,找到向量中的对应位(初始化全为0),然后置为1,全部元素处理完后就得到原来集合的摘要
  • 例子
    在这里插入图片描述
  • 如何删除集合中元素
    • 没法操作。也就是说,简单的Bloom filter不支持删除操作。如果想要支持删除操作,需要将记录数不能为0和1,需要修改为一个计数器来记录这个位置有多少元素映射,而且还需要考虑计数器是否会溢出。

② 以太坊中的Bloom filter

  • 每个交易完成后会产生一个收据,收据中包含一个Bloom filter,用于记录交易类型、地址等信息

  • 发布的区块中块头里有一个总Bloom filter,其为该区块中所有交易的Bloom filter的一个并集

  • 查找时候先查找哪个区块块头中包含需要的Bloom filter,(如果不包含,则一定不存在)如果块头中包含,再查找区块中包含的交易所对应的收据树中的Bloom filter,也就是每个收据的Bloom filter,看看哪个有,再查看交易进行确认;也可能都没有,因为可能是false positive

在这里插入图片描述


  • 这样设计Bloom filter结构的优点
    • 快速大量过滤掉大量无关区块,从而提高了查找效率。(可以过滤掉很多轻节点,若想进一步确认,再向全节点请求信息)

③ 状态机

以太坊的运行过程,可以视为交易驱动的状态机(transaction-driven state machine),通过执行当前区块中包含的交易,驱动系统从当前状态转移到下一状态。当然,BTC我们也可以视为交易驱动的状态机,其状态为UTXO(用掉一些输出,又会增加一些新的输出,所以发布的区块会驱动状态机从当前的状态转移到下一个状态)。

  • 状态机的共同特点:状态转移是确定性的
    • 对于给定的当前状态和给定一组交易,可以确定性的转移到下一状态(保证系统一致性)。

问题1:

  • 有没有可能收款账户不包含再状态树中?
    • 可能
    • 因为在以太坊和比特币系统中,新建的账户是不会被知道的,只有产生交易时才会被系统知道,对应在以太坊的操作是在状态树中新插入一个节点

问题2:

  • 能否将每个区块中状态树改成只包含和区块中交易相关的账户状态?(这样就和交易树、收据树保持一致,可以大幅削减状态树大小)
    • 不能
    • 这样的设计账户状态查找不方便,因为不存在某个区块包含所有状态
      • 例如,查询新建账户的状态,则需要一直找到创世纪块才能知道这个账户不存在是个新建的账户😅,而区块链是不断延长的。

④ 交易树和收据树的创建过程(代码)

  • NewBlock()

  • DeriveSha()

在这里插入图片描述

  • Trie struct

在这里插入图片描述

  • Receipt struct
    + 每个交易执行完后形成的收据

在这里插入图片描述

  • 创建Bloom filter

在这里插入图片描述

  • 使用Bloom filter查询查询topic(交易类型、地址等信息)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/605298.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

入门视频剪辑:视频合并不再难,批量嵌套合并的简单步骤

在数字媒体时代,视频剪辑已成为一项基本技能。无论是制作家庭电影、公司宣传片还是在线教育内容,视频剪辑都扮演着重要角色。对于初学者来说,视频剪辑可能看起来有些复杂,但掌握了正确的步骤和技巧后,你会发现它其实并…

Angular中的路由

Angular中的路由 文章目录 Angular中的路由前言一、创建路由二、创建多个组件路由三、创建子路由四、创建多个组件子路由 前言 在Angular中,路由是用于在不同的视图和组件之间导航的机制。Angular提供了一种强大的路由机制来管理单页应用(SPA&#xff0…

十九、分布式数据库MyCat

目录 一、概述 1、MyCat是什么? 2、原理: 3、能干什么 1、读写分离 2、数据分片 3、多数据源整合 4、Mycat监控 4、安装部署 1、环境准备 2、安装 3、Mycat配置详解 1、server.xml user 标签 2、schema.xml schema标签: table标签&…

实践遥感卫星场景海洋船只检测,基于YOLOv8全系列【n/s/m/l/x】参数模型开发构建卫星遥感场景下海洋海面船只检测识别系统

遥感相关的实践在我们前面的系列博文中也有相关的一些实践,胡药师基于MASTAR数据集开发构建对应的目标检测系统在前文也有一些介绍,感兴趣的话可以自行移步阅读即可: 《基于YOLOv7开发构建MSTAR雷达影像目标检测系统》 《基于yolov5n的轻量…

多角度解析动态住宅IP的多元化应用

动态住宅IP指的是在住宅网络中使用的、能够随时间或用户需求配置的IP地址,能够根据网络状况自动调整,为用户提供更加灵活、高效的上网体验。这种IP地址不是固定不变的,而是会定期自动更换,这种IP地址也让使用者的安全得以保障。 作…

【牛客】【模板】前缀和

原题链接:登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 前缀和模板题。 前缀和中数组下标为1~n。 前缀和:pre[i]pre[i-1]a[i]; 某段区间 [l,r]的和:pre[r]-pre[l-1] 3.…

247 基于matlab的梁的振型仿真

基于matlab的梁的振型仿真。利用有限元理论,求二维梁的固有频率和振型。短边固定,给定长度、横截面积,弹性模量及材料密度已知。并对比理论计算结果进行分析。各参数自己设定。程序已调通,可直接运行。 247 梁的振型仿真 固有频率…

顶级SCI优化!24年新算法冠豪猪算法CPO优化无人机集群三维路径规划!先用先发!

声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~ 目录 结果展示 原理讲解 一、路径长度成本 F1 …

【Linux】Linux——Centos7安装RabbitMQ

目录 安装包准备socaterlang 安装rabbitmq安装命令启动rabbitmq,两种方式查看rabbitmq 启动后的情况配置并开启网页插件关闭防火墙或开放端口测试登录问题配置web端访问账号密码和权限添加用户,后面两个参数分别是用户名和密码.添加权限修改用户角色再次…

ifconfig命令找不到 command not found

问题 今天解决虚拟机的网络问题后,使用ifconfig发现报错命令未找到 解决方案 输入yum install ifconfi的程序安装包 yum install ifconfig 如果显示没有可用软件包 ifconfig,错误:。 就输入yum search ifconfig匹配安装包程序 yum searc…

windows环境下 postgresql v12 绿色版+postgis 3.4.1版本配置,空间数据库迁移

windows环境下 postgresql v12 绿色版+postgis 3.4.1版本配置,空间数据库迁移 一、软件环境 操作系统:windows 11 pg免安装版数据库:postgresql-12.17-1-windows-x64-binaries.zip 下载地址:https://get.enterprisedb.com/postgresql/postgresql-12.18-1-windows-x64-bina…

《构建高效审批系统:架构设计与实践》

在现代企业管理中,审批系统扮演着至关重要的角色,它不仅能够规范业务流程,提高工作效率,还能够增强企业的管理控制力和信息化水平。本文将探讨如何设计和构建一套高效的审批系统架构,以满足企业日常审批需求&#xff0…

Vue3基础(API风格、监听、生命周期、toRefs、组件通信、插槽、axios,Promise)

Vue3基础(API风格、监听、生命周期、toRefs、组件通信、插槽、axios,Promise) 目录 Vue3基础(API风格、监听、生命周期、toRefs、组件通信、插槽、axios,Promise)API 风格选项式API组合式API混合式 事件监听…

并发问题系统学习(更新中)

进程、线程 进程:进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。可以理解为一个java应用。 线程:线程是进程的一个执行路径,一个进程中至少有一个线程,进程中的多个线程共享进程的资源。…

java报错:使用mybatis plus查询一个只返回一条数据的sql,却报错返回了1000多条

今天遇到一个问题 系统线上问题,经常出现这样的问题,刚重启系统时不报错了,可是运行一段时间又会出现。sql已经写了limit 1,mybatis的debug日志也返回total为1,可是却报错返回了1805条数据 乍一看,感觉太不…

Elasticsearch的基本使用

Elasticsearch的基本使用 1.基本概念1.1 文档和字段1.2 索引和映射1.3 mysql与elasticsearch对比 2.索引库2.1 es中mapping映射属性2.2.es中索引库的增删改查 3.文档3.1 新增文档3.2 查询文档3.3 删除文档3.4 修改文档3.4.1 全量修改3.4.2 增量修改3.5 总结 4.DSL查询语法4.1 D…

Redis如何保证数据一致性?

Redis如何保证数据一致性? Redis通常作为持久层数据库(例如MySQL)的缓存层,如果缓存或者数据库数据发生改变,如何保证双方的数据是一致的? 这其实是要分情况讨论滴,对数据一致性不同的要求有不…

08.图形化界面字体问题处理

图形化界面字体问题处理 发现图形存在乱码,不显示文字 zabbix服务器的字符集所在的路径下: /usr/share/zabbix/assets/fonts 将本地windows系统的字体进行上传,选择一个自己喜欢的字体 上传到系统路径下并且直接覆盖掉 回到web浏览器界面…

什么是Facebook付费广告营销?

Facebook作为全球最大的社交平台之一,成为了跨境卖家不可或缺的营销阵地。它不仅拥有庞大的用户基数,还提供了丰富的广告工具和社群互动功能,让商家能够精准触达目标市场,提升品牌影响力。云衔科技通过Facebook付费广告营销的专业…

【CSS基础--CSS选择器的常见用法】

CSS选择器的常见用法 1.CSS介绍1.1 基本语法规范1.2 引入样式1.3 规范 2. CSS选择器2.1 标签选择器2.2 类选择器2.3 ID选择器2.4 复合选择器 1.CSS介绍 CSS(Cascading Style Sheet),层叠样式表,由于控制页面的样式。CSS能够对网页…
最新文章