5月28日 04:13

以太坊区块由哪些部分组成?Merkle 树和区块生成机制详解

以太坊区块是链上的基本数据单元,每个区块由区块头和区块体组成。区块头是核心,包含三棵 Merkle 树的根哈希——状态树根(stateRoot)、交易树根(transactionsRoot)、收据树根(receiptsRoot),加上父区块哈希、时间戳、Gas 限额等元数据。区块体就是交易列表。

以太坊用的不是普通二叉 Merkle 树,而是 Merkle Patricia Trie(MPT)。MPT 结合了 Merkle 树的数据完整性验证和 Patricia 树的高效键值查找,适合以太坊频繁更新的状态数据。三棵树各有分工:状态树存所有账户信息(余额、nonce、合约代码哈希、存储根),交易树存区块内交易,收据树存交易执行结果(日志、Gas 消耗、状态码)。任何底层数据变化都会逐层传导到根哈希,轻节点只需保存根哈希就能通过 Merkle Proof 验证数据。

区块生成已经从 PoW 挖矿转为 PoS 提议。合并后,每个 slot(12 秒)由信标链选出的验证者提议新区块,交易排序后执行,状态变更后计算新的状态根写入区块头,其他验证者 attest 确认。

追问

以太坊为什么用三棵 Merkle 树而不是像比特币那样一棵?

比特币只需要验证交易是否存在,一棵交易树够了。以太坊是状态机,除了交易本身,还需要验证账户状态(余额对不对)和交易执行结果(合约有没有触发事件),所以需要三棵树分别对应三个维度。

MPT 和普通 Merkle 树有什么区别?

普通 Merkle 树是静态的二叉哈希树,更新任何一个叶子都要重新计算整棵树。MPT 是前缀树结构,更新某个键值对只需要重新计算从叶子到根那条路径上的节点,O(log n) 复杂度。对于以太坊这种每秒都在更新账户状态的系统,这个效率差异是决定性的。

轻节点怎么用 Merkle Proof 验证交易?

轻节点只存区块头(包含三棵树的根哈希)。要验证某笔交易是否在区块中,向全节点请求该交易的 Merkle Proof(从交易哈希到根哈希路径上兄弟节点的哈希),本地逐层计算后与 transactionsRoot 比对,一致则证明交易确实存在。

叔区块在 PoS 下还有吗?

没有了。叔区块是 PoW 时代的产物——两个矿工几乎同时出块时,没被选入主链的那个有效区块就是叔区块,包含它可以提高安全性和给矿工补偿。PoS 下出块顺序由协议预先确定,不存在竞争出块,所以叔区块机制已移除。

实际开发中区块重组(reorg)怎么处理?

监听链上事件时要意识到当前区块可能被重组掉。ethers.js 里用 event.on 监听时加 confirmations 参数等几个区块确认后再处理业务逻辑,或者用 provider.on("block") 检测到区块回退时重新拉取数据。交易所和钱包一般要求 12-30 个确认数才算最终确认。

标签:以太坊