这篇文章深入讲解了以太坊的状态 trie,详细介绍了不同类型的 trie 数据结构,包括 Merkle Patricia Trie、世界状态 trie、交易 trie、收据 trie 和账户存储 trie。文章以清晰的结构和逻辑逐步展现了各类 trie 的原理和应用,旨在帮助读者加深对以太坊区块链的理解。
解释以太坊状态 trie 以加深对以太坊区块链的理解
本文解释了以太坊状态 trie。以太坊通常被称为“世界状态机器”,并使用原始数据存储来记录状态(账户)和交易。作为以太坊的核心数据库,理解状态 trie 对于加深你对以太坊的知识至关重要。我构建了内容,以让你逐步逻辑地理解。当我学习它时,由于状态 trie 有几种类型且彼此密切相关,理解起来很困难。本文帮助你深入、轻松地理解状态 trie。本文按以下顺序涵盖了以下主题。
Merkle Patricia Trie
世界状态 Trie
交易 Trie
收据 Trie
账户存储 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 由 Merkle Patricia Trie 构成,只有根节点(状态 trie 顶部节点)存储在区块中以节省存储空间。你可以在下面的图表中看到整体架构。
以太坊区块架构
如你所见,三个中央状态 trie,世界状态 trie、交易 trie 和收据 trie 存储在区块中。而账户存储 trie(账户存储内容 Trie)在世界状态 trie 中构成叶子节点。
世界状态 trie 是地址和账户状态之间的映射。它可以被视为一个不断通过交易执行更新的全局状态。以太坊网络是一个去中心化的计算机,而状态树被视为硬盘。有关账户的所有信息都存储在世界状态 trie 中,你可以通过查询它来检索信息。世界状态树与账户存储树密切相关,因为它有一个指向账户存储树根节点的“存储根”字段。
账户存储 Trie 用于存储与账户相关的数据。这仅与合约账户相关,所有智能合约数据都作为 32 字节整数的映射保留在账户存储 trie 中。账户状态存储有关账户的信息,例如账户拥有多少以及从该账户发送了多少交易。它有四个字段:nonce、balance、storageRoot 和 codeHash。它是世界状态 trie 中的一个叶子节点。
Merkle Tree 和以太坊对象——以太坊黄皮书解析
交易 trie 记录以太坊的交易。交易在状态变化中起核心作用,因为以太坊是一个基于交易的“状态”机器。一旦交易被记录在区块中,它就无法更改,永久地证明账户的余额(世界状态)。由于交易 trie 是通过修改后的 Merkle Patricia trie 构建的,因此只有根节点存储在区块中。下面的灰色框描述了交易数据字段。如果你想了解更多细节,请参考以太坊交易结构解释。
nonce: 交易 nonce 是从给定地址发送的交易的序列号。Gas Price: 你提供的支付价格Gas Limit: Gas Limit 是发件人愿意为交易支付的ETH金额的上限Recipient: 收件人是以太坊地址的目标.Value: 值字段表示从发送方到接收方的以太币/wei 数量.Data: 数据字段用于合约相关活动,例如合约的部署或执行.v,r,s: 此字段是源 EOA 的 ECDSA 数字签名组件。
交易收据 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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!