以太坊数据结构之Merkle、MPT(Merkle Patricia Tree)

引言

以太坊是一种基于区块链技术的智能合约平台,它为开发人员提供了构建去中心化应用程序的强大工具。 以太坊区块头中有三个核心字段,分别用于存储状态树(State Root)根哈希、交易树(Transactions Root)根哈希和凭证树(Receipts Root)根哈希。它们用于验证区块的数据完整性和一致性。它们是保障区块链网络的安全性和可靠性的关键组成部分,确保了每个区块都包含正确的账户状态、交易数据和交易执行结果。本文主要剖析这三个字段哈希的由来以及与其相关的数据结构。

概述

以太坊每个区块被产出时都会构建一个交易树、一个凭证树,并且更新状态树。其中交易树和凭证树数据生成后就不会再改变,通常它们用于交易验证,而状态树维护的是以太坊整个生态中所有地址对应的账户信息,其信息经常变动。根据这些树的特点以太坊选择为不同的树使用了不同的数据结构。

状态树(State Root):

  • 数据结构:MPT(Merkle Patricia Tree)
  • 功能: 状态树根哈希指向了当前区块的账户状态树的根。
  • 作用: 验证账户状态的完整性。它确保了在当前区块中所有账户的余额、合约代码和存储数据等信息都是正确的。如果某个区块中状态树根哈希验证失败,那么整个区块将被视为无效,从而维护了区块链网络的一致性和安全性。

交易树(Transactions Root):

  • 数据结构:Merkle
  • 功能: 交易树根哈希指向了由当前区块内包含的所有交易构建的默克尔树的根。
  • 作用: 验证区块内的所有交易数据的完整性。它确保了在当前区块中的每笔交易都未被篡改,包括发送者、接收者、交易金额等信息。如果某个区块中交易树根哈希验证失败,整个区块将被拒绝,从而维护了区块链的可靠性。

凭证树(Receipts Root):

  • 数据结构:Merkle
  • 功能: 凭证树根哈希指向了当前区块中包含的所有交易执行结果的默克尔树的根。
  • 作用: 验证区块内交易的执行结果,包括合约调用、合约创建、交易状态变化等。它确保了在当前区块中的每笔交易都按照规则执行,并产生了正确的结果。如果某个区块中凭证树根哈希验证失败,整个区块将被视为无效,从而维护了区块链的一致性和可验证性。

以太坊区块头相关根哈希对应数据结构

Merkle

Merkle树,也称为哈希树,是一种高效验证数据完整性的数据结构,广泛应用于分布式系统和区块链领域中,它可以提供高度的安全性和可验证性。

构建过程

以太坊的交易树是一个默克尔树。以太坊的交易树是以每笔交易的哈希值为基础构建的一个默克尔树,以此来组织区块中的所有交易。每个区块头都包含一个字段指向交易树根的哈希值,以便其他节点可以验证该区块中的是否存在指定交易或验证交易的完整性。
Merkle结构

  1. 收集交易: 首先,以太坊区块中的所有交易会被收集。这些交易可能包括用户之间的转账、智能合约的调用和创建等。

  2. 计算每个交易的哈希: 对于每笔交易,计算它的交易哈希值。这通常是使用SHA-256等哈希函数对交易数据进行哈希计算。

  3. 构建叶子节点: 每个交易的哈希值作为一个叶子节点添加到默克尔树的底部。每个叶子节点都代表一个单独的交易。

  4. 计算哈希对: 从底向上,每两个相邻的叶子节点的哈希值会被组合成一个哈希对。这是通过将两个哈希值串联在一起,并再次应用哈希函数来计算哈希对的哈希值。

  5. 重复步骤4: 重复步骤4,将哈希对组合成更高级别的哈希对,直到最终形成了一个树根哈希。这个树根哈希是整个交易树的根哈希,用于表示区块中包含的所有交易。

  6. 添加到区块头: 计算出的树根哈希被添加到区块头中的"Transactions Root"字段,以便其他节点可以验证区块中的交易数据的完整性。

特点:

  1. 高效的数据完整性验证: Merkle树的最大特点是能够高效验证大量数据的完整性。通过将被验证交易的哈希值构建一个默克尔树,将其树根与区块头的根哈希(Root Hash)进行比较,可以确定数据是否被篡改。基于这个特性以太坊中的一些轻节点只需要同步区块头就可以验证交易的有效性。

  2. 分布式系统的数据一致性: Merkle树广泛应用于分布式系统,如区块链,以验证多个节点之间的数据一致性。每个节点只需共享部分哈希值,而不是整个数据块,以减少带宽开销。

  3. 高效的查找和验证: Merkle树的结构允许快速查找和验证特定数据块,而无需遍历整个数据集。

  4. 数据块分割: 数据可以分割成多个数据块,每个数据块生成一个哈希值,构建Merke树。这允许数据的动态增加和删除。

使用场景:

  1. 区块链: Merkle树在区块链中用于验证交易的完整性。每个区块包含多个交易,而区块头中的交易根哈希是所有交易的Merkle树的根哈希,用于验证区块内的交易数据。

  2. 分布式文件系统: Merkle树用于验证分布式文件系统(如IPFS)中的文件块的完整性。它使得可以快速查找和验证特定文件块,而不需要下载整个文件。

  3. 数据同步: Merkle树在分布式系统中用于同步数据。每个节点只需交换部分哈希值,以验证数据的一致性。

  4. P2P网络: Merkle树在点对点(P2P)网络中用于验证文件的完整性。用户可以通过比较文件的Merkle树根哈希来确定文件是否正确。

  5. 数字证明和身份验证: Merkle树用于生成数字证明,证明特定数据块在给定的Merkle树中存在。这在身份验证和数据完整性证明中非常有用。

举例说明:

Merkle树验证说明
上图是一个交易默克尔树,其中叶子节点A、B、C……H为区块中交易的hash值(默克尔树构建过程参考上文“构建过程”)。当需要验证hash为C(图中蓝色节点)的交易是否在当前区块时,只需要获取图中绿色框中的数据即可。验证过程是用图中蓝色框和绿色框中的hash值构建hash树,当树的根hash与当前区块头中的交易hash一致时验证成功。

MPT(Merkle Patricia Tree)

MPT(Merkle Patricia Tree)是一种树状数据结构,结合了默克尔树和前缀树(直观的理解前缀树)的特点。
MPT是一种高效存储和检索数据的数据结构,适用于多种场景,包括区块链、分布式存储、动态数据更新和数据完整性验证等。它的灵活性和可验证性使得它在分布式系统和加密货币领域广泛应用。

特点:

  1. 安全的数据完整性验证: MPT使用哈希值来验证数据的完整性,类似于默克尔树,可以确保数据没有被篡改。
  2. 快速的检索和高效存储: MPT支持前缀树的特性,可以快速查找特定数据。共享前缀使得其存储高效。
  3. 支持动态数据更新: MPT允许动态地添加、删除和修改数据,而不需要重建整个树。
  4. 可用于账户状态存储: MPT在以太坊中用于存储账户状态,包括账户余额、合约代码和存储数据等。这使得以太坊的账户状态数据高效且可验证。

使用场景:

  1. 区块链账户状态存储: MPT广泛用于区块链中存储账户状态。每个账户都有一个唯一的地址,而MPT将这些账户状态数据组织成一个树状结构。这样,可以高效存储和检索账户状态,以支持快速的交易处理。

  2. 分布式文件存储: MPT可以用于构建分布式文件存储系统,类似于IPFS(InterPlanetary File System)。它允许存储大规模文件,并支持高效的文件检索。

  3. 动态数据存储: MPT适用于需要支持动态数据更新的应用程序,如分布式数据库系统。数据的添加、修改和删除都可以在MPT中高效完成。

  4. 数字证明和身份验证: MPT可以用于生成数字证明,以验证数据的存在和完整性,以支持身份验证和数据完整性证明。

举例说明

在这里插入图片描述上图是官方经典状态树缩略图,图中有三种类型的节点,每种节点都有其不同的特点。这些节点类型是:

叶子节点(Leaf Node):

  • 叶子节点包含键值对,其中键是数据的前缀(在以太坊中键值是半字节编码,取值范围0~f),值是RLP编码的数据(此处是账户余额,还可以是合约代码等)。
  • 叶子节点的哈希值是由键和值组成的数据哈希。

扩展节点(Extension Node):

  • 扩展节点也包含键值对,其键值是共同前缀,值是子节点的哈希值。
  • 扩展节点的子节点可以是另一个扩展节点、分支节点或叶子节点。
  • 扩展节点的哈希值是由共同前缀和子节点的哈希值组成的数据哈希。

分支节点(Branch Node):

  • 分支节点是一个包含17(以太坊中半字节范围0~f,外加一个value)个条目的数组,分支节点既可以是搜索路径的终止也可以是路径的中间节点,当为路径终止时value存储其值。
  • 分支节点的子节点可以是另一个分支节点、扩展节点或叶子节点。
  • 分支节点的哈希值是由子节点的哈希值组成的数据哈希。

以太坊对MPT树进行了一些优化:

  1. 以太坊nibble(半字节,4 bits)编码,每个nibble的数值范围时0x0~0xF),所以分支节点条目长度为16+1。
  2. 以太坊对特殊的半字节编码,而底层存储时以字节为单位,为了明确区分各字段值,以太坊根据扩展节点和叶子的键值长度奇偶分别为其添加了不同的前缀(见上图prefix)

这些不同类型的节点在MPT中合作以存储和检索数据。叶子节点存储实际的键值对数据,扩展节点用于共享相同前缀的数据,而分支节点用于树的分支和路径。这种结构允许MPT高效地存储大量数据,支持数据的快速检索和验证,同时节省存储空间和带宽。

参考链接:
以太坊白皮书
https://medium.com/codechain/modified-merkle-patricia-trie-how-ethereum-saves-a-state-e6d7555078dd
https://docs.alchemy.com/docs/patricia-merkle-tries
https://blog.csdn.net/itleaks/article/details/79992072
https://cloud.tencent.com/developer/article/1585653
https://medium.com/shyft-network/understanding-trie-databases-in-ethereum-9f03d2c3325d

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值