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

以太坊数据结构篇1——状态树1,对应肖老师视频:click here
全系列笔记请见:click here
以太坊数据结构篇1——状态树2请见:click here
About Me:点击进入我的Personal Page

在以太坊中,有三棵树的说法,分别是状态树、收据树和交易树。了解了这三棵树,就弄清楚了以太坊的基础数据结构设计。
而以太坊实现的是一个"平台性"的应用,其复杂性必然较高。因此,其内部数据结构设计也存在一定复杂度。对此,ETH数据结构篇将花费较多篇幅进行编写,请继续关注后续内容。

前一篇文章中有提过,以太坊采用基于账户的模式,系统中显式记录每个账户的余额。而以太坊这样一个大型分布式系统中,是采用的什么样的数据结构来实现对这些数据的管理的。

引入

首先,我们要实现从账户地址到账户状态的映射。在以太坊中,账户地址为160字节,表示为40个16进制数额。状态包含了余额(balance)、交易次数(nonce),合约账户中还包含了code(代码)、存储(stroge)。

  • 直观地来看,其本质上为Key-value键值对,所以直观想法便用哈希表实现。若不考虑哈希碰撞,查询直接为常数级别的查询效率。
    但采用哈希表,难以提供Merkle proof(BTC数据结构篇中有对Merkle proof的介绍,还记得是什么吗?)。

需要记住的是,在BTC和以太坊中,交易保存在区块内部,一个区块可以包含多个交易。通过区块构成区块链,而非交易。

思考如何组织账户的数据结构

  1. 我们能否像BTC中,将哈希表的内容组织为Merkle Tree?
    但当新区块发布,哈希表内容会改变,再次将其组织为新的Merkle Tree?如果这样,每当产生新区块(ETH中新区块产生时间为10s左右),都要重新组织Merkle Tree,很明显这是不现实的。
    需要注意的是,比特币系统中没有账户概念,交易由区块管理,而区块包含上限为4000个交易左右,所以Merkle Tree不是无限增大的。而ETH中,Merkle Tree来组织账户信息,很明显其会越来越庞大。
    实际中,发生变化的仅仅为很少一部分数据,我们每次重新构建Merkle Tree代价很大
  2. 那我们不要哈希表了,直接使用Merkle Tree,每次修改只需要修改其中一部分即可,这个可以吗?
    实际中,Merkle Tree并未提供一个高效的查找和更新的方案。此外,将所有账户构建为一个大的Merkle Tree,为了保证所有节点的一致性和查找速度,必须进行排序。
  3. 那么经过排序,使用Sorted Merkle Tree可以吗?
    新增账户,由于其地址随机,插入Merkle Tree时候很大可能在Tree中间,发现其必须进行重构。所以Sorted Merkle Tree插入、删除(实际上可以不删除)的代价太大。

既然哈希表和 Merkle Tree都不可以,那么我们看一下实际中以太坊采取的数据结构:MPT。

注意:BTC系统中,虽然每个节点构建的Merkle Tree不一致(不排序),但最终是获得记账权的节点的Merkle Tree才是有效的。

一个简单的数据结构——trie(字典树、前缀树)

如下为一个通过5个单词组成的trie数据结构(只画出key,未画出value)

特点:

  1. trie中每个节点的分支数目取决于Key值中每个元素的取值范围(图例中最多26个英文字母分叉+一个结束标志位)。
  2. trie查找效率取决于key的长度。实际应用中(以太坊地址长度为160byte)。
  3. 理论上哈希会出现碰撞,而trie上面不会发生碰撞。
  4. 给定输入,无论如何顺序插入,构造的trie都是一样的。
  5. 更新操作局部性较好
    那么trie有缺点吗?当然有:
    trie的存储浪费。很多节点只存储一个key,但其“儿子”只有一个,过于浪费。因此,为了解决这一问题,我们引入Patricia tree/trie

Patricia trie(Patricia tree)

Patricia trie就是进行了路径压缩的trie。如上图例子,进行路径压缩后如下图所示:

需要注意的是,如果新插入单词,原本压缩的路径可能需要扩展开来。那么,需要考虑什么情况下路径压缩效果较好?树中插入的键值分布较为稀疏的情况下,可见路径压缩效果较好。
在以太坊系统中,160位的地址存在2^160 种,该数实际上已经非常大了,和账户数目相比,可以认为地址这一键值非常稀疏。
因此,我们可以在以太坊账户管理种使用Patricia tree这一数据结构!但实际上,在以太坊种使用的并非简单的PT(Patricia tree),而是MPT(Merkle Patricia tree)。关于MPT的内容,我们将在下一篇以太坊数据结构篇1——状态树2中进行介绍。

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

  1. 肖臻老师区块链公开课笔记

    前段时间,区块链大火,出现了很多种基于区块链技术的政务应用.之前通过零散的网页信息和讲座,自我感觉理解了block chain原理,当看到各种区块链技术广泛应用时,自己以技术理解,反而对之不屑.当然, ...

  2. 《区块链技术与应用》学习笔记10——ETH数据结构

    在以太坊中,有三棵树的说法,分别是状态数.收据树和交易树. 一.引入 我们要实现从账户地址到账户状态的映射.在以太坊中,账户地址为160位,表示为40个16进制数.状态包含了余额(alance).交易 ...

  3. 北京大学肖臻老师《区块链技术与应用》公开课笔记8——BTC挖矿篇

    北京大学肖臻老师<区块链技术与应用>公开课笔记 比特币挖矿篇,对应肖老师视频:click here 全系列笔记请见:全系列笔记请见:click here About Me:点击进入我的Pe ...

  4. 北京大学肖臻老师《区块链技术与应用》公开课笔记23——ETH挖矿难度调整篇

    北京大学肖臻老师<区块链技术与应用>公开课笔记 以太坊挖矿难度调整,对应肖老师视频:click here 全系列笔记请见:click here About Me:点击进入我的Persona ...

  5. 北京大学肖臻老师《区块链技术与应用》公开课笔记:以太坊原理(一):以太坊概述、账户、状态树、交易树和收据树

    1.ETH-以太坊概述 比特币和以太坊是两种最主要的加密货币,比特币被称为区块链1.0,以太坊被称为区块链2.0 以太坊在系统设计上针对比特币运行过程中出现的问题进行了改进,比如: 出块时间,比特币的 ...

  6. 北京大学肖臻老师《区块链技术与应用》公开课笔记:以太坊(四):The DAO、反思、美链、总结

    10.ETH-The DAO 1).The DAO 比特币实现了去中心化的货币,以太坊实现了去中心化的合约,有人想既然去中心化这么好,为什么不把所有的东西都改成去中心化呢?有人提出口号:let's d ...

  7. 北京大学肖臻老师《区块链技术与应用》公开课笔记15——ETH概述篇

    北京大学肖臻老师<区块链技术与应用>公开课笔记 以太坊概述篇,对应肖老师视频:click here 全系列笔记请见:click here About Me:点击进入我的Personal P ...

  8. 北京大学肖臻老师《区块链技术与应用》公开课笔记25——ETH智能合约篇1

    北京大学肖臻老师<区块链技术与应用>公开课笔记 以太坊智能合约,对应肖老师视频:click here 全系列笔记请见:click here 智能合约是以太坊的精髓所在,也是其与比特币系统最 ...

  9. 北京大学肖臻老师《区块链技术与应用》公开课笔记26——ETH智能合约篇2

    北京大学肖臻老师<区块链技术与应用>公开课笔记 以太坊智能合约,对应肖老师视频:click here 全系列笔记请见:click here 智能合约是以太坊的精髓所在,也是其与比特币系统最 ...

最新文章

  1. Unity脚本生成插件:Script Create Dialog
  2. 「完结」你对深度学习模型的理解是否足够深刻,这12篇文章了解下
  3. mysql 按重复排序_php-按日期排序并允许重复的日期时,获取MySQL中的上一个和下一个记录...
  4. 冷板式液冷--术语、定义和缩略语(6-1)
  5. 条件变量为什么要和互斥锁一起使用
  6. 码农身份得到正式认证
  7. java中接口私有反方_Java 8:在接口中声明私有和受保护的方法
  8. php有关卡的消消乐源码,查看“宝可消消乐/活动关卡/得分挑战关卡/超梦”的源代码...
  9. 什么是python自动化测试_python已经自动化了,大家一般用什么测试框架?
  10. 苹果和虫子(信息学奥赛一本通-T1038)
  11. dicom是指_dicom格式是什么
  12. php大量数据库抽象,数据库的数据抽象有几个级别
  13. 无偿加班_我如何赚到我的第一百万美元(无偿代码)
  14. redis内存碎片问题
  15. HR-FICO跨系统工资过账的一些知识点分享
  16. 图片转成文字:方便准确的OCR识图软件
  17. 安装程序总是提示重启计算机,技巧|安装西门子软件反复提示重启电脑的解决方法...
  18. 2019上海ICPC H.Tree Partition
  19. 为何使用云原生应用架构 三 :独霸天下之四大绝技 — 弹,弹,弹性扩展篇
  20. 【RSA】RSA加密、解密、签名与验证

热门文章

  1. 全新的windows7论坛之家
  2. 简述python语言的主要领域_简述Python语言经验总结
  3. java手撕KMeans算法实现手写数字聚类(失败案例)
  4. An association from the table yi_community refers to an unmapped class: com。yiyi.domain.YiGroup
  5. 【运动规划】RRT快速搜索随机树 Rapidly Exploring Random Tree
  6. 问题 A: 相约HNUST
  7. 一个支付流程要考虑到哪些测试点?
  8. Far_planner初次探索全过程(attempt search)
  9. 博客论坛系统数据库之表的设计
  10. 快手坐拥3亿用户,想成为平行世界里的Snapchat,然后呢