ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
在 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值是插槽里的数据。