主页 > imtoken官方app > Java以太坊源码分析_以太坊区块链Java(EthereumJ)学习笔记:区块

Java以太坊源码分析_以太坊区块链Java(EthereumJ)学习笔记:区块

imtoken官方app 2023-10-01 05:08:27

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

以太坊区块链

以太坊区块链是在比特币区块链的基础上发展起来的。 区块链的数据结构不仅保留了比特币区块链验证数据真实性和完整性的功能。 同时,以太坊在区块链中保存了Account的State,比如nonce、balance等,可以实现更高级的功能(详见:)。

以太坊区块链采用Merkle Patricia Tree数据结构来存储数据(详见:),简称Trie结构。 以太坊区块链使用 Trie 结构来存储三种类型的数据:

l 账户状态。

l 每个区块中的交易列表。

l 每个区块中的TransactionReceipt列表。

其中,只需要临时创建Transaction list和TransactionReceiptlist的Trie结构来验证每个区块的真实性。 需要保存Account状态的Trie结构。

Accountstate的Trie结构可以参考下面的简单示例图。

09a633248476e53a72c82ba16c345732.png

以太坊区块链的组织结构可以参考下面的简单示例图。

36fbd892c189af0468ff7d928ff2f509.png

Block中的Prev Hash类似于比特币的功能,用于建立真实完整的区块链。 State Root 用于指代保存在数据存储中的账户状态。 Transaction Root和Receipt Root分别是本区块中Transaction list和TransactionReceipt list的哈希根。

EthereumJ 区块链管理

本文介绍了在 EthereumJ 中管理以太坊区块链数据结构主要涉及的 Java 类/接口。

l CommonConfig主要定义了很多数据源的spring beans作为数据存储/访问的基础。

n 键值数据源

n 区块链数据库

n 区块链资源

n stateSource,保存账户状态。

l DefaultConfig,使用CommonConfig中的数据源定义

n blockStore(),保留Block信息。

n transactionStore()以太坊源码解析,保存Transaction信息。

l WorldManager,EthereumJ的主要管理模块,负责启动EthereumJ的一些主要模块。

n init(),负责启动SyncManager。

n loadBlockchain(),负责加载repository、blockStore和blockChain的数据。

l BlockChain/BlockChainImpl,BlockChain定义了访问以太坊区块链区块的接口,BlockChainImpl实现了该接口。

n getXXX() 用于获取各个区块的信息。

n tryToConnect(Block),用于向区块链添加一个新的区块。

l Repository/RepositoryRoot(RepositoryImpl),Repositiry定义了访问以太坊区块链AccoutState的接口,RepositoryRoot(RepositoryImpl)实现了该接口。

n getXXX() 用于获取各种账户状态信息。

n getRoot() 获取区块中需要的stateroot信息。

n syncToRoot(byte[])以太坊源码解析,用于跟随新的repository到新的state root。

n getSnapshotTo(byte[]),用于根据新状态根获取respository。

l PendingState/PendingSateImpl,由于以太坊区块链采用分布式共识机制来确认新区块,所以新区块的确认需要一个等待窗口。 在窗口时间内,可能会有多个区块分支。 PendingState 定义了一个接口来处理这种情况,PendingSateImpl 实现了这个接口。

n addPendingTransaction(Transaction),添加一个新的Transaction。 processBest(Block,List),处理新块。