在 Merkle 树中,叶子节点包含数据块的哈希值,非叶子节点包含其子节点的哈希值。
![](https://img.kancloud.cn/a2/6e/a26eed656b421606de889c0fc3f687a4_1400x852.png)
在 Merkle 树中,对底层数据的任何更改都会导致引用该数据的节点的哈希值发生更改。由于每个父节点哈希都依赖于其子节点的数据,因此对子节点数据的任何更改都会导致父节点哈希发生变化。这发生在每个父节点到根节点。因此,任何对叶子节点上数据的更改都会导致根节点哈希发生变化。由此,我们可以得到两个重要的性质:
* 在判断两棵Merkle树所指向的数据是否完全相同时,我们不需要比较每个叶子节点,只需要比较根节点存储的hash即可。
* 在确定树是否指向特定数据时,我们可以使用默克尔证明技术。
第一个属性很重要,因为它只能存储根节点的哈希来表示该时间点的数据。这意味着我们只需将代表区块的树的根哈希存储在区块链上(而不是将所有数据存储在区块链中)并且仍然保持数据完整。
以太坊有四个树结构:
1. World State Trie
2. Transaction Trie
3. Receipt Trie
4. Account Storage Trie
![](https://img.kancloud.cn/de/0e/de0e3be57b15cacfca7193683ade3cb9_800x656.png)
如你所见,三个主要的状态:世界状态树、交易树和收据树都存储在块中。 并且,(智能合约)帐户存储树(account storage contents trie)在世界状态树中构造叶节点。
以太坊Merkle树简化描述图如下:
![](https://img.kancloud.cn/f5/d9/f5d94953b21c5332a17b8d13a2238e95_2038x1252.png)
世界状态树的叶子节点是每一个账户信息,收据树的叶子节点为每一个收据,交易树叶子节点为每一个交易,(智能合约)账户存储树的叶子节点为槽(slot,智能合约以插槽式数组形式存储)。
**真正存储在数据库的数据,是block数据、account数据、slot数据。所有数据都是以key-value形式存储。
表一:block表,key:block hash,value为header、ommers、body构成。
表二:account表:key:account的address(即account的hash值),value:balance、nonce、storageRoot、codeHash构成。
表三、slot表。key值是存储插槽(storage slots)取hash,而value值是插槽里的数据。
- 重要更新说明
- linechain发布
- linechain新版设计
- 引言一
- 引言二
- 引言三
- vs-code设置及开发环境设置
- BoltDB数据库应用
- 关于Go语言、VS-code的一些Tips
- 区块链的架构
- 网络通信与区块链
- 单元测试
- 比特币脚本语言
- 关于区块链的一些概念
- 区块链组件
- 区块链第一版:基本原型
- 区块链第二版:增加工作量证明
- 区块链第三版:持久化
- 区块链第四版:交易
- 区块链第五版:实现钱包
- 区块链第六版:实现UTXO集
- 区块链第七版:网络
- 阶段小结
- 区块链第八版:P2P
- P2P网络架构
- 区块链网络层
- P2P区块链最简体验
- libp2p建立P2P网络的关键概念
- 区块链结构层设计与实现
- 用户交互层设计与实现
- 网络层设计与实现
- 建立节点发现机制
- 向区块链网络请求区块信息
- 向区块链网络发布消息
- 运行区块链
- LineChain
- 系统运行流程
- Multihash
- 区块链网络的节点发现机制深入探讨
- DHT
- Bootstrap
- 连接到所有引导节点
- Advertise
- 搜索其它peers
- 连接到搜到的其它peers
- 区块链网络的消息订发布-订阅机制深入探讨
- LineChain:适用于智能合约编程的脚本语言支持
- LineChain:解决分叉问题
- LineChain:多重签名
- libp2p升级到v0.22版本
- 以太坊基础
- 重温以太坊的树结构
- 世界状态树
- (智能合约)账户存储树
- 交易树
- 交易收据树
- 小结
- 以太坊的存储结构
- 以太坊状态数据库
- MPT
- 以太坊POW共识算法
- 智能合约存储
- Polygon Edge
- block结构
- transaction数据结构
- 数据结构小结
- 关于本区块链的一些说明
- UML工具-PlantUML
- libp2p介绍
- JSON-RPC
- docker制作:启动多个应用系统
- Dockerfile
- docker-entrypoint.sh
- supervisord.conf
- docker run
- nginx.conf
- docker基础操作整理
- jupyter计算交互环境
- git技巧一
- git技巧二
- 使用github项目的最佳实践
- windows下package管理工具