以太坊状态默克尔树架构解析

  • eiki1212
  • 发布于 2023-11-08 10:43
  • 阅读 30

这篇文章深入讲解了以太坊的状态 trie,详细介绍了不同类型的 trie 数据结构,包括 Merkle Patricia Trie、世界状态 trie、交易 trie、收据 trie 和账户存储 trie。文章以清晰的结构和逻辑逐步展现了各类 trie 的原理和应用,旨在帮助读者加深对以太坊区块链的理解。

解释以太坊状态 trie 以加深对以太坊区块链的理解

介绍

本文解释了以太坊状态 trie。以太坊通常被称为“世界状态机器”,并使用原始数据存储来记录状态(账户)和交易。作为以太坊的核心数据库,理解状态 trie 对于加深你对以太坊的知识至关重要。我构建了内容,以让你逐步逻辑地理解。当我学习它时,由于状态 trie 有几种类型且彼此密切相关,理解起来很困难。本文帮助你深入、轻松地理解状态 trie。本文按以下顺序涵盖了以下主题。

Merkle Patricia Trie

世界状态 Trie

交易 Trie

收据 Trie

账户存储 Trie

Merkle Patricia Trie(Radix trie/Patricia trie/前缀树)

Trie,也称为 Radix Trie、Patricia Trie 或前缀树,是一种在查找公共前缀时最快的数据结构,易于实现且占用内存少。由于以太坊使用 Merkle Tree 有效地存储区块中的哈希,Trie 被用作数据存储的核心数据结构。以太坊使用“修改后的 Merkle Patricia Trie”,这是通过 Merkle Tree、Patricia Tree(Trie)以及一些改进发明的。修改后的 Merkle Patricia Trie 用作以太坊的主数据结构,具体包括交易收据 trie、世界状态 trie、账户存储 trie 和交易 trie。

以太坊区块架构

上面的图表展示了 Merkle Patricia Trie 的结构。它主要由三种类型的节点组成:扩展节点、分支节点和叶子节点。每个节点的决定依据其内容的 sha3 哈希值,哈希被用作键。Go-Ethereum 使用 levelDB,Parity 使用 rocksDB 存储状态。如果你想了解更深层次的内容,请参考“修改后的 Merkle Patricia Trie——以太坊如何保存状态”。

状态 Trie 架构

在解释每个状态 trie 之前,让我解释一下以太坊状态 trie 的整体架构。如前所述,状态 trie 有四种类型:世界状态 trie、交易 trie、交易收据 trie 和账户存储 trie。每个状态 trie 由 Merkle Patricia Trie 构成,只有根节点(状态 trie 顶部节点)存储在区块中以节省存储空间。你可以在下面的图表中看到整体架构。

以太坊区块架构

如你所见,三个中央状态 trie,世界状态 trie、交易 trie 和收据 trie 存储在区块中。而账户存储 trie(账户存储内容 Trie)在世界状态 trie 中构成叶子节点。

世界状态 Trie(状态 Trie、全局状态 Trie)

世界状态 trie 是地址和账户状态之间的映射。它可以被视为一个不断通过交易执行更新的全局状态。以太坊网络是一个去中心化的计算机,而状态树被视为硬盘。有关账户的所有信息都存储在世界状态 trie 中,你可以通过查询它来检索信息。世界状态树与账户存储树密切相关,因为它有一个指向账户存储树根节点的“存储根”字段。

账户存储 Trie

账户存储 Trie 用于存储与账户相关的数据。这仅与合约账户相关,所有智能合约数据都作为 32 字节整数的映射保留在账户存储 trie 中。账户状态存储有关账户的信息,例如账户拥有多少以及从该账户发送了多少交易。它有四个字段:nonce、balance、storageRoot 和 codeHash。它是世界状态 trie 中的一个叶子节点。

Merkle Tree 和以太坊对象——以太坊黄皮书解析

交易 Trie

交易 trie 记录以太坊的交易。交易在状态变化中起核心作用,因为以太坊是一个基于交易的“状态”机器。一旦交易被记录在区块中,它就无法更改,永久地证明账户的余额(世界状态)。由于交易 trie 是通过修改后的 Merkle Patricia trie 构建的,因此只有根节点存储在区块中。下面的灰色框描述了交易数据字段。如果你想了解更多细节,请参考以太坊交易结构解释。

nonce: 交易 nonce 是从给定地址发送的交易的序列号。Gas Price: 你提供的支付价格Gas Limit: Gas Limit 是发件人愿意为交易支付的ETH金额的上限Recipient: 收件人是以太坊地址的目标.Value: 值字段表示从发送方到接收方的以太币/wei 数量.Data: 数据字段用于合约相关活动,例如合约的部署或执行.v,r,s: 此字段是源 EOA 的 ECDSA 数字签名组件。

交易收据 Trie(收据 Trie)

交易收据 Trie 记录交易的收据(结果)。收据是成功执行交易的结果。收据包括交易的哈希、区块号、使用的Gas量、合约地址等。以下是交易收据的字段。

blockHash: 字符串,32 字节 - 此交易所在区块的哈希.blockNumber: 数字 - 此交易所在区块的序号.transactionHash: 字符串,32 字节 - 此交易的哈希.transactionIndex: 数字 - 此交易在区块中的索引位置的整数.from: 字符串,20 字节 - 发件人地址.to: 字符串,20 字节 - 接收方地址。如果是合约创建交易,则为 null.cumulativeGasUsed: 数字 - 此交易在区块中执行时使用的总Gas量.gasUsed: 数字 - 此交易单独使用的Gas数量.contractAddress: 字符串,20 字节 - 如果交易是合约创建,则为创建的合约地址,否则为 null.logs: 数组 - 此交易生成的日志对象数组.status: 字符串 - '0x0' 表示交易失败,'0x1' 表示交易成功。cite: https://ethereum.stackexchange.com/questions/6531/structure-of-a-transaction-receipt

结论

本文解释了以太坊的核心状态 trie:Merkle Patricia Trie、世界状态 trie、交易 trie、收据 trie 和账户存储 trie。作为一个世界“状态机器”,以太坊具有原始机制通过 trie 数据结构记录和管理状态。世界状态 trie 存储账户状态,表示账户拥有多少钱。交易 trie 记录可以更新世界状态 trie 的交易,并不可变地存储在区块链上以证明活动历史。收据 trie 表示交易的结果,并可以被外部查询。我希望本文能帮助你加深对以太坊的理解。

  • 原文链接: medium.com/@eiki1212/eth...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
eiki1212
eiki1212
江湖只有他的大名,没有他的介绍。