StateDB是以太坊中比较重要的概念(世界状态)。以太坊区块中的所有交易的状态由StateDB表示。一个交易的状态由stateObject表示:

其中address是一个账户地址,data是一个账户的基本信息,db是该stateObject从属的StateDB,Storage是该账户的存储对,trie是Storage的MPT树。
一个账户的基本信息包括:Nonce,Balance(余额),Root(Storage的MPT树的hash root),CodeHash是智能合约的代码的hash。

一个StateDB中包括多个stateObject。
1)从StateDB到levelDB的框架
整体框架如下图所示:

StateDB建立在Trie的基础上,trie.Database维护着所有MPT树的节点信息。state.cachingDB是对MPT以及trie.Database的进一步封装。ethdb.LDBDatabase是对leveldb的封装,提供了Database以及Batch的接口。
2)StateDB更新流程
miner.worker通过commitTransactions函数执行区块中的交易。针对每一个交易,创建一个EVM虚拟机,执行交易指定的智能合约的相关代码。在EVM的执行过程中,更新区块对应的StateDB信息(账户余额,Nonce,Storage等等)。

3)区块信息以及StateDB更新到levelDB流程
在区块挖矿成功后,miner.worker调用writeBlockWithState函数更新信息到levelDB。区块信息(区块头,区块交易,区块receipts)都是直接通过ethdb.LDBDatabase的Batch方式更新到levelDB。StateDB信息通过Commit函数更新所有信息,再调用ethdb.LDBDatabase的Batch方式更新。

总结:StateDB是以太坊的世界状态,记录着区块中涉及到的账户的信息(stateObject)。在区块中的交易在EVM执行时,更新StateDB。在区块挖矿成功后,区块信息以及StateDB信息会更新到levelDB数据库。





