数据结构
1. 以太坊的数据结构概览
以太坊的核心数据结构包括:
- 区块(Block)
- 交易(Transaction)
- 账户(Account)
- 状态树(State Trie)
- 交易树(Transaction Trie)
- 收据树(Receipt Trie)
所有数据最终都被组织进一个Merkle Patricia Trie(默克尔帕特里夏树),用来保证数据的完整性和高效存储。
2. 区块(Block)
以太坊的区块结构类似于比特币,但有更丰富的内容。每个区块由以下几个核心字段组成:
字段 | 说明 |
---|---|
Parent Hash | 父区块的哈希值(链接前一个区块) |
Ommer Hash | 叔块的哈希值(以太坊支持叔块机制) |
State Root | 账户状态树的根哈希 |
Transactions Root | 交易树的根哈希 |
Receipts Root | 交易收据树的根哈希 |
Difficulty | 计算难度(PoW 时代) |
Number | 区块高度 |
Gas Limit | 区块最大 Gas 限制 |
Gas Used | 本区块已使用的 Gas 量 |
Timestamp | 区块时间戳 |
Nonce | PoW 时代的随机数 |
Mix Hash | PoW 时代的计算混淆值 |
Extra Data | 附加信息 |
Transactions | 区块包含的交易列表 |
📌 核心特点:
- 以太坊的区块不仅存储交易,还存储状态(账户余额、合约数据)。
- 通过 Parent Hash 形成区块链,确保数据不可篡改。
3. 账户(Account)
以太坊的账户有两种:
- 外部账户(EOA):由私钥控制,可发送交易。
- 合约账户(CA):由智能合约代码控制,无法主动发起交易。
账户数据结构
每个账户都存储在 状态树(State Trie) 中,数据包括:
json
{
"nonce": 5,
"balance": "1000000000000000000",
"storageRoot": "0xabc123...",
"codeHash": "0xdef456..."
}
1
2
3
4
5
6
2
3
4
5
6
nonce
:交易次数,防止重放攻击。balance
:账户余额,以 Wei(最小单位)表示。storageRoot
:合约存储的根哈希,指向一个 Merkle Patricia Trie。codeHash
:合约代码的哈希值,外部账户此字段为空。
4. 交易(Transaction)
交易是以太坊网络的基本单位,每次状态变化都由交易触发。交易数据结构如下:
json
{
"nonce": 5,
"gasPrice": "20000000000",
"gasLimit": "21000",
"to": "0xabc123...",
"value": "1000000000000000000",
"input": "0x...",
"v": "27",
"r": "0x...",
"s": "0x..."
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
nonce
:发送方账户的交易计数。gasPrice
:交易执行的 Gas 单价。gasLimit
:本次交易可消耗的最大 Gas。to
:接收方地址(智能合约或 EOA)。value
:发送的 ETH 数量(以 Wei 为单位)。input
:交易附加的数据(调用智能合约时包含合约参数)。v, r, s
:交易签名数据。
📌 Merkle Patricia Trie 作用:
- 所有交易存储在 交易树(Transaction Trie) 中,根哈希值存储在区块头的
transactionsRoot
字段中。 - 这样可以快速验证某个交易是否属于某个区块,提高数据完整性和安全性。
5. 以太坊的状态树(State Trie)
Merkle Patricia Trie 介绍
以太坊使用 Merkle Patricia Trie(MPT,默克尔帕特里夏树)来存储状态数据,相比传统的哈希链,它的优势:
- 路径压缩:减少存储空间。
- 可验证性:可以快速校验数据完整性。
- 高效更新:树结构可以快速插入和删除数据。
状态树(State Trie)
所有账户的状态信息都存储在 状态树 中,并且其根哈希(stateRoot
)存储在区块头中。
State Root
├── Account A (0xabc)
│ ├── Nonce
│ ├── Balance
│ ├── Storage Root → 指向 Storage Trie
│ ├── Code Hash
├── Account B (0xdef)
│ ├── ...
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
📌 特点:
- 账户数据存储在 Merkle Patricia Trie 结构中,保证数据一致性。
- 通过
stateRoot
,可以验证特定账户是否存在于某个区块的状态中。
6. 交易树(Transaction Trie)
每个区块都包含一个 交易树(Transaction Trie),它的根哈希存储在 transactionsRoot
。
Transaction Root
├── Tx Hash 1
├── Tx Hash 2
├── Tx Hash 3
1
2
3
4
2
3
4
📌 特点:
- 通过 Merkle Proof,可高效验证交易是否属于某个区块。
- 轻节点(Light Clients)可以只存
transactionsRoot
,无需存储所有交易数据。
7. 收据树(Receipt Trie)
每个交易执行后都会生成一条交易收据,包括:
- 交易是否成功。
- 交易消耗的 Gas。
- 交易日志(Event Log)。
这些收据存储在 收据树(Receipt Trie) 中,根哈希存储在 receiptsRoot
字段。
Receipt Root
├── Receipt 1
├── Receipt 2
├── Receipt 3
1
2
3
4
2
3
4
📌 作用:
- 方便查询交易执行情况和事件日志。
- 轻客户端可通过
receiptsRoot
验证交易是否成功执行。
8. 以太坊数据结构总结
数据结构 | 作用 |
---|---|
区块 | 记录区块链历史 |
交易 | 触发状态变化 |
账户 | 存储用户 ETH 余额、合约代码等 |
状态树(State Trie) | 存储所有账户状态 |
交易树(Transaction Trie) | 存储区块的交易 |
收据树(Receipt Trie) | 存储交易执行结果 |
📌 Merkle Patricia Trie(MPT)是以太坊数据存储的核心,它通过哈希树结构保证数据完整性、高效性,并支持轻客户端验证数据。