ETH 之 区块头 stateRoot

每个以太坊区块头中都包含一个字段:stateRoot,它是世界状态树(WorldState)的MerklePatriciaTrie根哈希代表了当前这个区块执行完所有交易后的链上状态快照摘要。📦为什么每个区块的stateRoot不同?因为每个区块执行的交易不同,链上状态

每个以太坊区块头中都包含一个字段:stateRoot,它是 世界状态树(World State)Merkle Patricia Trie 根哈希

代表了当前这个区块 执行完所有交易后的链上状态快照摘要

📦 为什么每个区块的 stateRoot 不同?

因为每个区块执行的交易不同,链上状态会随之发生变化:

变化类型 对状态的影响
转账交易 改变两个账户的余额、nonce
部署合约 添加新账户(合约地址)和代码存储
调用合约 修改存储槽、余额等
链上事件 区块奖励、手续费回退、销毁等

每次这些状态发生改变,就会导致 MPT 的结构变化,从而根哈希 stateRoot 也会随之改变。

如何理解交易

在以太坊中,“交易(Transaction)” 是一种被记录在区块链中的状态转换的请求。

  • 交易必须由外部账户发起(EOA)
  • 交易是导致全局状态变更的唯一方式
  • ❌ 内部调用(如合约内调用另一个合约)不算交易,但它们是交易的一部分执行路径

常见交易行为:

行为类型 是否是交易 举例
向地址转账 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,仅本地执行,不上链

🌰 来个例子

假设:

  • 区块 100 中的 stateRoot0xabc...
  • 执行了一个转账(用户 A 向 B 转 1 ETH)
  • 区块 101 中的 stateRoot 就变成了 0xdef...

你可以理解为:

stateRoot = MerkleRoot(世界状态 = 所有账户状态集合)

只要有一个账户的 balancestorage 改变了,整个树的结构和根 hash 就变化。

🧪 如果两个区块的 stateRoot 相同,意味着什么?

这只能说明:

  • 两个区块中所有账户状态完全一致
  • 没有发生任何交易(比如创世块和第一个空块)

但在主网中,连续出现两个相同的 stateRoot 几乎不可能(除非链停止了)。

🧱 每个区块的 stateRoot 是如何变化的?

以太坊状态随时间变化,你可以这样理解:

Block N-1     → 执行交易 → 更新账户、合约存储 → 计算新的 MPT → 得到新的 stateRoot
   ↓
Block N       → 执行交易 → 再次状态变化       → 新的 stateRoot
   ↓
Block N+1     → ...

每一个区块的 stateRoot,是对“当前区块执行完成后,链上所有账户状态”的一个不可变的哈希承诺。

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Henry Wei
Henry Wei
Web3 探索者