每个以太坊区块头中都包含一个字段: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_call RPC,仅本地执行,不上链 |
假设:
stateRoot
是 0xabc...
stateRoot
就变成了 0xdef...
你可以理解为:
stateRoot = MerkleRoot(世界状态 = 所有账户状态集合)
只要有一个账户的 balance
或 storage
改变了,整个树的结构和根 hash 就变化。
stateRoot
相同,意味着什么?这只能说明:
但在主网中,连续出现两个相同的 stateRoot
几乎不可能(除非链停止了)。
stateRoot
是如何变化的?以太坊状态随时间变化,你可以这样理解:
Block N-1 → 执行交易 → 更新账户、合约存储 → 计算新的 MPT → 得到新的 stateRoot
↓
Block N → 执行交易 → 再次状态变化 → 新的 stateRoot
↓
Block N+1 → ...
每一个区块的
stateRoot
,是对“当前区块执行完成后,链上所有账户状态”的一个不可变的哈希承诺。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!