本文对EthereumJ的区块链相关的代码做一个简单的介绍。
以太坊区块链
以太坊区块链是在Bitcoin区块链的基础上发展起来的。区块链的数据结构既保留了Bitcoin区块链验证数据的真实性和完整性的功能。同时,以太坊在区块链里保存了Account的State,如nonce,balance等,可以实现更加先进的功能(详情可以参考://11/15/merkling-in-ethereum/)。
以太坊区块链采用了Merkle Patricia Tree的数据结构来保存数据(详情可以参考:/ethereum/wiki/wiki/Patricia-Tree),简称为Trie结构。以太坊区块链采用Trie结构保存三种数据:
l Account state。
l 每一个block里的Transaction list。
l 每一个block里的TransactionReceipt list。
其中Transaction list和TransactionReceiptlist的Trie结构只需要临时创建以校验每一个block的真实性。而Account state的Trie结构需要保存起来。
Accountstate的Trie结构可以参考下面的简单示例图。
以太坊的区块链的block的组织结构可以参考下面的简单的示例图。
Block里的Prev Hash与Bitcoin的功能相似,用来建立一个真实完整的区块链。 State Root用来reference到data storage里保存的account states。Transaction Root和Receipt Root分别是本block里的Transaction list和TransactionReceipt list的hash root。
EthereumJ区块链管理
本文介绍一下EthereumJ里管理以太坊区块链数据结构的主要涉及到的Java Classes / Interfaces。
l CommonConfig,主要定义了很多data sources的spring bean作为数据保存/访问的基础。
n keyValueDataSource
n blockchainDB
n blockchainSource
n stateSource,保存account state。
l DefaultConfig,通过使用CommonConfig里的data source定义了
n blockStore(),保留Block的信息。
n transactionStore(),保留Transaction的信息。
l WorldManager,EthereumJ的主要管理模块,它负责启动EthereumJ一些主要的模块。
n init(),负责启动SyncManager。
n loadBlockchain(),负责加载repository,blockStore和blockChain的数据。
l BlockChain/BlockChainImpl,BlockChain定义了访问以太坊区块链block的接口,BlockChainImpl实现了该接口。
n getXXX()用于得到各种block的信息。
n tryToConnect(Block),用于将新的block加到区块链上。
l Repository/RepositoryRoot(RepositoryImpl),Repostiry定义了访问以太坊区块链的AccoutState的接口,RepositoryRoot(RepositoryImpl)实现了该接口。
n getXXX()用于得到各种account state的信息。
n getRoot()得到block里需要的stateroot信息。
n syncToRoot(byte[]),用于跟新repository到新的state root。
n getSnapshotTo(byte[]),用于得到基于新的state root的respository。
l PendingState/PendingSateImpl,由于以太坊区块链采用的是分布式的共识机制确认新的blocks,因此新的blocks的确认需要一个等待窗口,在窗口时间内,可能会有多个blocks分支。PendingState定义了接口来处理这种场景,PendingSateImpl实现了该接口。
n addPendingTransaction(Transaction),加入新的Transaction。processBest(Block,List),处理新的block。