每个以太坊区块头中都包含一个字段:stateRoot,它是世界状态树(WorldState)的MerklePatriciaTrie根哈希代表了当前这个区块执行完所有交易后的链上状态快照摘要。📦为什么每个区块的stateRoot不同?因为每个区块执行的交易不同,链上状态
每个以太坊区块头中都包含一个字段:stateRoot,它是 世界状态树(World State) 的 Merkle Patricia Trie 根哈希
代表了当前这个区块 执行完所有交易后的链上状态快照摘要。
stateRoot 不同?因为每个区块执行的交易不同,链上状态会随之发生变化:
| 变化类型 | 对状态的影响 | 
|---|---|
| 转账交易 | 改变两个账户的余额、nonce | 
| 部署合约 | 添加新账户(合约地址)和代码存储 | 
| 调用合约 | 修改存储槽、余额等 | 
| 链上事件 | 区块奖励、手续费回退、销毁等 | 
每次这些状态发生改变,就会导致 MPT 的结构变化,从而根哈希 stateRoot 也会随之改变。
在以太坊中,“交易(Transaction)” 是一种被记录在区块链中的状态转换的请求。
| 行为类型 | 是否是交易 | 举例 | 
|---|---|---|
| 向地址转账 | ✅ | tx.to = address; tx.value > 0 | 
| 部署合约 | ✅ | tx.to = null; tx.data = bytecode | 
| 调用合约函数 | ✅ | tx.to = contractAddress; tx.data = abi.encode(...) | 
| 合约之间互相调用(内部) | ❌ | contractA.call(contractB.func()) | 
| 查询链上数据(call) | ❌ | eth_callRPC,仅本地执行,不上链 | 
假设:
stateRoot 是 0xabc...stateRoot 就变成了 0xdef...你可以理解为:
stateRoot = MerkleRoot(世界状态 = 所有账户状态集合)只要有一个账户的 balance 或 storage 改变了,整个树的结构和根 hash 就变化。
stateRoot 相同,意味着什么?这只能说明:
但在主网中,连续出现两个相同的 stateRoot 几乎不可能(除非链停止了)。
stateRoot 是如何变化的?以太坊状态随时间变化,你可以这样理解:
Block N-1     → 执行交易 → 更新账户、合约存储 → 计算新的 MPT → 得到新的 stateRoot
   ↓
Block N       → 执行交易 → 再次状态变化       → 新的 stateRoot
   ↓
Block N+1     → ...每一个区块的
stateRoot,是对“当前区块执行完成后,链上所有账户状态”的一个不可变的哈希承诺。
 
                如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!