以太坊中预状态(pre-state)
在以太坊中,预状态(pre-state) 是指在某个区块或交易执行之前,整个区块链的全局状态(包括账户余额、合约存储、nonce等)。它是执行交易或区块计算后的状态(post-state)的对照基准。
1. 预状态的核心概念
以太坊的状态是一个庞大的默克尔帕特里夏树(Merkle Patricia Trie, MPT),存储了所有账户和合约的数据。预状态特指:
-
在某个区块被处理前的完整状态。
-
在某个交易被执行前的账户和合约数据。
关键点
-
预状态 + 交易 → 后状态(post-state)
交易执行后,预状态会被修改,生成新的状态(如余额变化、合约存储更新等)。 -
用于验证一致性
节点必须基于相同的预状态执行交易,才能保证全网状态一致。
2. 预状态的具体内容
预状态包含以下信息(以账户为例):
| 字段 | 说明 |
|---|---|
| 余额(Balance) | 账户的ETH余额。 |
| Nonce | 账户的交易计数(用于防止重放攻击)。 |
| 存储根(Storage Root) | 合约存储的默克尔树根哈希(仅合约账户有)。 |
| 代码哈希(CodeHash) | 合约字节码的哈希(如果是外部账户则为空)。 |
3. 预状态的作用
(1) 交易执行的基准
-
当交易被执行时,以太坊虚拟机(EVM)会基于预状态计算 gas 消耗、余额变化等。
-
例如:如果Alice给Bob转账1 ETH,EVM会检查Alice的预状态余额是否足够。
(2) 区块验证
-
矿工/验证者必须从父区块的状态(预状态)开始,执行区块内的所有交易,生成新的状态根(post-state)。
-
其他节点会重复此过程,确保计算结果一致。
(3) 快照与回滚
-
预状态允许节点回滚到某个历史状态(如分叉时)。
-
轻客户端可以通过预状态的默克尔证明验证特定数据。
4. 预状态的实际用例
(1) 创世区块(Genesis)
-
创世区块的
alloc字段定义了初始预状态(初始分配的账户和余额)。
(2) 状态同步(State Sync)
-
新节点同步时,会从某个检查点(checkpoint)的预状态开始下载数据。
(3) 调试与测试
-
开发者可以通过
debug_traceTransaction等工具查看交易执行前后的状态变化(pre-state vs post-state)。
5. 预状态 vs 后状态
| 对比项 | 预状态(Pre-State) | 后状态(Post-State) |
|---|---|---|
| 定义 | 交易/区块执行前的状态。 | 交易/区块执行后的状态。 |
| 用途 | 作为计算的输入基准。 | 作为新区块的最终状态。 |
| 修改者 | 不可变(只读)。 | 由交易或区块修改。 |
| 例子 | Alice余额=5 ETH,Bob余额=0 ETH。 | Alice余额=4 ETH,Bob余额=1 ETH(转账后)。 |
6. 技术实现
-
以太坊使用状态树(State Trie)存储预状态,其根哈希记录在区块头中(
stateRoot)。 -
执行交易时,EVM会复制预状态,修改后生成新的状态树。
总结
-
预状态是以太坊执行交易或区块前的“数据快照”,确保计算的一致性。
-
它是区块链状态机模型的核心,直接影响交易有效性、Gas计算和分叉处理。
-
开发者、矿工和验证者都依赖预状态来维护网络的正确性。

浙公网安备 33010602011771号