以太坊区块链Java(EthereumJ)学习笔记:区块链结构

本文对EthereumJ的区块链相关的代码做一个简单的介绍。

以太坊区块链

以太坊区块链是在Bitcoin区块链的基础上发展起来的。区块链的数据结构既保留了Bitcoin区块链验证数据的真实性和完整性的功能。同时,以太坊在区块链里保存了Account的State,如nonce,balance等,可以实现更加先进的功能(详情可以参考:https://blog.ethereum.org/2015/11/15/merkling-in-ethereum/)。

 

以太坊区块链采用了Merkle Patricia Tree的数据结构来保存数据(详情可以参考:https://github.com/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<TransactionReceipt>),处理新的block。
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页