🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
我们再次回到block header的数据结构: ~~~ type Header struct { ParentHash Hash `json:"parentHash"` Sha3Uncles Hash `json:"sha3Uncles"` Miner Address `json:"miner"` StateRoot Hash `json:"stateRoot"` TxRoot Hash `json:"transactionsRoot"` ReceiptsRoot Hash `json:"receiptsRoot"` LogsBloom Bloom `json:"logsBloom"` Difficulty uint64 `json:"difficulty"` Number uint64 `json:"number"` GasLimit uint64 `json:"gasLimit"` GasUsed uint64 `json:"gasUsed"` Timestamp uint64 `json:"timestamp"` ExtraData []byte `json:"extraData"` MixHash Hash `json:"mixHash"` Nonce Nonce `json:"nonce"` Hash Hash `json:"hash"` } ~~~ 1、stateRoot为世界状态树根节点(每个账户状态信息是世界状态树的叶子节点),它存储在block的Header中。 2、transactionsRoot为交易树的根节点, 3、receiptsRoot为收据树的根节点。 ![](https://img.kancloud.cn/b0/49/b049c456b535327c9884b2da35a894bb_871x331.png) 所有的状态树并没有存储在区块链上,否则会占用太大的空间。 事实上,状态需要由每个矿工在本地计算。他们从创世状态(初始以太坊状态硬编码到以太坊客户端)开始,递归地应用存储在区块链中的所有交易,将更改应用到他们的 Merkle Patricia Tree 数据库。然后,他们将整个状态数据库压缩成一个 32 字节的 stateRoot Merkle 哈希,由完整节点(验证器)验证,这些节点通过将每笔交易应用于创世状态的完全相同的过程,并确保存储的stateRoot 是正确的。 一句话归总:锚定在 stateRoot 的树实际上并没有存储在链上!