本系列文章介绍以太坊区块链基于Java语言的解决方案。通过介绍EthereumJ定义的主要模块和Class,希望为大家学习和使用EthereumJ提供一些帮助。

整体架构

以太坊的Java解决方案主要是由两个项目来实现的:

l  EthereumJ(https://github.com/ethereum/ethereumj),实现了Ethereum定义的核心协议,完成了区块链的核心功能。

l  Ethereum Harmony(https://github.com/ether-camp/ethereum-harmony),提供了Ethereum用户访问层的功能。

下图描述了两个项目里的主要的模块。

在EthereumJ里面,

l  最底层的DataSource提供了数据的persistence。数据采用的是<key, value>格式,以byte的形式保存,缺省使用的是Facebook的RocksDB。

l  Blockchain Management实现了以太坊定义的Trie node,Transaction,Block,Block chain等数据结构,以及这些数据结构的管理功能。

l  P2P Network实现了以太坊定义的devp2p协议,实现了以太坊的网络的,nodes之间的发现和nodes之间的通信功能。

l  Sync Management,实现了以太坊网络nodes之间同步blocks/Transactions的功能。

l  Block Mining实现了Ethash协议定义的block生成以及产生共识的功能。

l  Program/VM实现了Solidity的compile和prgram的执行功能。

在Ethereum Harmony里面,

l  Json RPC实现了以太坊定义的RPC接口,应用可以通过该RPC接口访问EthereumJ的数据,如Blocks,Transactions,Balance等。

l  Wallet实现了简单的Wallet功能,可以采用Ethereum Go相同的key store格式来保存Account的私钥。记录了Account的Balance余额。但是无法显示Account的Transactions的历史记录。

l  Command Terminal可以执行RPC的操作。

l  Peer Connection显示了与EthereumJ相链接的Peer的状态。

主要配置文件

Ethereum Harmony/EthereumJ提供了很多的sample配置文件,通过不同的配置文件可以实现访问不同的以太坊网络,如MainNet,TestNet以及私有网络。

EthereumJ.conf

EthereumJ提供了很多的配置选项来差异化的定制系统, 配置文件采用Json的格式。缺省的Ethereumj.conf文件配置了系统的绝大部分参数,一般用户只需要在自己的配置文件,定义很少的参数,如database的文件存储位置,genesis配置文件的位置,系统的privateKey,listening port等系统外部参数。

EhereumJ的配置文件是由SystemProperties.java通过typesafe的config类库读取的。用户可以通过多个配置文件,实现系统在不同的部署环境下运行说需要的差异化配置。

l  JVM的system property定义的某个参数

l  JVM命令行定义的ethereumj.conf.file(-Dethereumj.conf.file)文件位置

l  JVM的resource path下的test-user.conf

l  JVM的resource path下的test-ethereumj.conf

l  OS的user.dir目录下的/config/ehtereumj.conf

l  JVM的resource path下的user.conf

l  JVM命令行定义的ethereumj.conf.res(-Dethereumj.conf.res)在JVM的resource path下的文件

l  系统缺省的ethereumj.conf

上面列出了配置生效的顺序(优先级从上到下)。

Genesis.json

Genesis.json定义了每一个以太坊网络的第0个block。该网络里后续mining的区块链上的blocks都是建立在这一个block的数据的基础上的。如果要建立一个私有的以太坊网络,需要定义一个不同于其它以太坊网络的gensis block。同一个私有网络的genesis.json需要完全一致。

一个典型的genesis.json的配置文件如下:

// genesis.json

{

"alloc": {

"0xca843569e3427144cead5e4d5999a3d0ccf92b8e": {

"balance": "1000000000000000000000000000"

},

"0x0fbdc686b912d7722dc86510934589e0aaf3b55a": {

"balance": "1000000000000000000000000000"

}

},

"config": {

"chainID": 68,

"homesteadBlock": 0,

"eip155Block": 0,

"eip158Block": 0

},

"nonce": "0x0000000000000000",

"difficulty": "0x0400",

"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",

"coinbase": "0x0000000000000000000000000000000000000000",

"timestamp": "0x00",

"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",

"extraData": "0x43a3dfdb4j343b428c638c19837004b5ed33adb3db69cbdb7a38e1e50b1b82fa",

"gasLimit": "0xffffffff"

}

其中alloc的数据定义了网络开始就已经生效的account。配置数据,包括该account的address和account的state,如balance等。

Config也定义了以太坊网络的配置参数,这里面的配置将会覆盖EthereumJ的配置文件里配置的以太坊网络的配置参数。以太坊网络在实际的部署过程中,发现了一些问题,网络为了改正这些错误进行了相应的升级。这些升级反应在以太坊网络的配置参数,以太坊网络里的Node上的程序按照这些配置参数来工作。Config里配置决定了网络节点在某一个block序号开始采用何种网络工作版本。下面是MainNetConfig里定义的不同的block序号,采用不同的网络工作版本。

add(0, new FrontierConfig());

add(1_150_000, new HomesteadConfig());

add(1_920_000, new DaoHFConfig());

add(2_463_000, new Eip150HFConfig(new DaoHFConfig()));

add(2_675_000, new Eip160HFConfig(new DaoHFConfig()));

add(4_370_000, new ByzantiumConfig(new DaoHFConfig()));

如果是一个私有的网络,就可以从第一个block开始就采用最新的工作版本了。

Difficulty定义了共识算法的难度。该数值越小,表示越容易生成新的block。如果是私有网络,可以定义较小的值来快速的生成block,从而提高网络的响应速度。

gasLimit定义了本网络的每一个block产生时,允许使用的最大gas数量。

下面的参数主要用于配置网络节点产生新的block,在genesis的block里不被使用。

Nonce/MixHash是为了验证新生成的block是否有效。

ParentHash是上一个block的hash。

Coinbase是成功生成block后,该地址的account将会得到奖励。

启动

EthereumJ使用Spring Framework来加载各个模块。

在EthereumJ的samples里面,提供了很多的例子,使用EthereumFactory的createEthereum()来加载Spring的Application Context。Spring通过加载EthereumJ定义的DefaultConfig和CommonConfig来加载EthereumJ的其它模块。EthereumJ除了在这两个类里创建的多个spring beans,在CommonConfig里通过Spring的ComponentScan的功能创建了EthereumJ定义的多个Components,Services。

EthereumJ启动的主要Spring Beans包括:

l  DataSources类,定义了多个Data Source的访问类(实现了Source<K,V>接口),采用了Decorator模式,实现了多种cache,DB access等功能。

l  BlockMiner,block mining的主要管理模块。

l  WorldManager,作为主要的管理模块,启动了block chain的创建,和以太坊node间的同步。

l  EthereumImpl,实现了Ethereum接口。Ethereum接口提供了外部应用程序访问以太坊内部功能的多个methods。

其它的主要模块,在后续的文章里会有介绍。

以太坊区块链Java(EthereumJ)学习笔记:概述的更多相关文章

  1. 使用Geth 构建以太坊区块链并模拟挖矿过程

    使用Geth 构建以太坊区块链并模拟挖矿过程 Go-ethereum 是以太坊官方的一个Golang 实现,我们可以使用Geth 工具来创建创世区块并启动区块链,使用Clef 实现以太坊钱包的功能,以 ...

  2. 区块链--Ubuntu上搭建以太坊私有链

    1.搭建私链所需环境 操作系统:ubuntu16.04,开虚拟机的话要至少4G,否则会影响测试挖矿时的速度 软件: geth客户端 Mist和Ethereum Wallet:https://githu ...

  3. geth搭建以太坊私链及常用操作

    一.下载安装geth客户端 https://www.ethereum.org/ 二.搭建私有链 1.准备创世区块配置文件 要运行私有链,我们就需要定义自己的创世区块,创世区块信息写在一个json格式的 ...

  4. 区块链学习(四)truffle部署编译智能合约以太坊私有链

    前面我们介绍了以太坊私有链的搭建以及多节点私有链网络,这次我们介绍如何使用truffle框架来部署编译智能合约到我们之前搭建的私有链网络中. 搭建环境及需使用的工具:ubuntu18.04  Truf ...

  5. Android(java)学习笔记216:多线程断点下载的原理(Android实现)

    之前在Android(java)学习笔记215中,我们从JavaSE的角度去实现了多线程断点下载,下面从Android角度实现这个断点下载: 1.新建一个Android工程: (1)其中我们先实现布局 ...

  6. 使用 Go-Ethereum 1.7.2搭建以太坊私有链

    目录 [toc] 1.什么是Ethereum(以太坊) 以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约.开源的底层系统,以太坊从诞生到2017年5月,短短3年半时间,全球 ...

  7. 转:使用 Go-Ethereum 1.7.2搭建以太坊私有链

    使用 Go-Ethereum 1.7.2搭建以太坊私有链 目录 [toc] 1.什么是Ethereum(以太坊) 以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约.开源的底 ...

  8. Mac环境搭建以太坊私有链

    原文地址: 石匠的blog 为了测试以太坊智能合约,最方便的是在本地搭建一个以太坊私有链.在mac上搭建环境主要需要以下步骤. geth安装 geth是go-ethereum的简写,是一个用go语言编 ...

  9. Android(java)学习笔记159:多线程断点下载的原理(Android实现)

    之前在Android(java)学习笔记215中,我们从JavaSE的角度去实现了多线程断点下载,下面从Android角度实现这个断点下载: 1. 新建一个Android工程: (1)其中我们先实现布 ...

随机推荐

  1. 消除ExtJS6的extjs-trila字样

  2. 偶遇vue-awesome-swiper的坑

    最近用vue重构一个移动端的项目,碰到了不少坑,今天拿移动端最著名的轮播插件swiper为例来说,由于这个项目没用UI库,纯手写的样式,沿用老的插件,自然而然的选择了vue-awesome-swipe ...

  3. Windows Powershell脚本执行

    在cmd下执行powershell进入shell模式: 变量定义:$i = 10 $a = ifconfig | findstr "192" Windows下的命令都可以执行如: ...

  4. Column Addition~DP(脑子抽了,当时没有想到)

    Description A multi-digit column addition is a formula on adding two integers written like this:

  5. OpenShift实战(三):OpenShift持久化存储Redis

    1.模板定义 修改OpenShift自带模板 [root@master1 pv]# oc edit template redis-persistent 添加如下: 2.创建PV 编辑redis pv ...

  6. Docker学习笔记 - Docker容器与外部网络的连接

    学习目的: ip_forward 包过滤防护墙 iptables 允许端口映射访问 限制ip访问容器 1.ip_forward 控制系统是否会转发流量 检查linux系统转发是否开启命令:sysctl ...

  7. leetcode算法: Average of Levels in Binary Tree

    Given a non-empty binary tree, return the average value of the nodes on each level in the form of an ...

  8. python实现归并排序,归并排序的详细分析。

    学习归并排序的过程是十分痛苦的.它并不常用,看起来时间复杂度好像是几种排序中最低的,比快排的时间复杂度还要低,但是它的执行速度不是最快的.很多朋友不理解时间复杂度低为什么运行速度不一定快,这个不清楚的 ...

  9. Django form表单

    Form介绍 之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来.与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入, ...

  10. 理解JavaScript中函数方法

    1.函数声明和函数表达式 通过字面量创建函数的方式有两种函数声明和函数表达式: 函数声明: function sum(x, y) { var result = x + y; return result ...