暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

以太坊源代码 - StateDB以及数据存储

星想法 2018-05-17
1678

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数据库。



文章转载自星想法,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论