本系列文章介绍以太坊区块链基于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. JAVA_SE基础——59.权限访问修饰符

    了解了包的概念,就可以系统的介绍Java中的访问控制级别.在Java中,针对类.成员方法和属性提供了四种访问级别,分别是private.default.protected和public. 权限访问修饰 ...

  2. linux的链接工具secure设置字体大小和颜色

  3. php框架中的phalcon框架的安装,及初步认识,从表单提交简单的数据到数据库中

    php框架中的phalcon框架的安装,及初步认识,从表单提交简单的数据到数据库中 1.phalcon框架的安装: phalcon框架在windows本地安装可以利用wamp软件,安装之后可以查看对应 ...

  4. LeetCode & Q13-Roman to Integer-Easy

    Math String Description: Given a roman numeral, convert it to an integer. Input is guaranteed to be ...

  5. 分布式版本控制系统Git的安装及使用

    Git的安装分为客户端安装和服务端安装,鉴于我平时码代码在windows环境下,因此本文客户端安装直接在windows环境,服务端安装在linux环境下(centos). Git客户端安装 客户端下载 ...

  6. apollo1.7.1初探(二)使用apollo订阅主题,发布主题消息

    一.MQTT协议配置 为了使用MQTT协议,首先使用MQTT3.1协议的客户端连接到Apollo正在监听端口.Apollo会做协议检测,而且自动识别MQTT连接,而且将连接作为MQTT协议处理. 你不 ...

  7. ELK学习总结(1-3)倒排索引

    1.倒排索引(反向索引) 一种索引方法,用来存储在全文检索下某个单词在一个/组文档中的存储位置. 常规索引,文档->关键词,费时,得把一个文档全部遍历一遍 倒排索引,关键词->文档,全文搜 ...

  8. 关于阿里巴巴iconfont的使用方法

    iconfont网址:http://www.iconfont.cn/ 说起iconfont,做前端开发的应该知道它的好处,图标库之丰富,只有你想不到的,没有你找不到的,而且轻量高清.用户在iconfo ...

  9. Django实现 省 市 县 自关联的下拉级联

    前端部分: 三个下拉拉菜单进行级联 <body> <select id="province" > <option value="" ...

  10. 南京邮电大学java程序设计作业在线编程第四次作业

    王利国的的 "Java语言程序设计第4次作业(2018)" 详细 主页 我的作业列表 作业结果详细 总分:100 选择题得分:40  1.下列方法定义中,正确的是() A.doub ...