以太坊区块链Java(EthereumJ)学习笔记:概述
本系列文章介绍以太坊区块链基于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)学习笔记:概述的更多相关文章
- 使用Geth 构建以太坊区块链并模拟挖矿过程
使用Geth 构建以太坊区块链并模拟挖矿过程 Go-ethereum 是以太坊官方的一个Golang 实现,我们可以使用Geth 工具来创建创世区块并启动区块链,使用Clef 实现以太坊钱包的功能,以 ...
- 区块链--Ubuntu上搭建以太坊私有链
1.搭建私链所需环境 操作系统:ubuntu16.04,开虚拟机的话要至少4G,否则会影响测试挖矿时的速度 软件: geth客户端 Mist和Ethereum Wallet:https://githu ...
- geth搭建以太坊私链及常用操作
一.下载安装geth客户端 https://www.ethereum.org/ 二.搭建私有链 1.准备创世区块配置文件 要运行私有链,我们就需要定义自己的创世区块,创世区块信息写在一个json格式的 ...
- 区块链学习(四)truffle部署编译智能合约以太坊私有链
前面我们介绍了以太坊私有链的搭建以及多节点私有链网络,这次我们介绍如何使用truffle框架来部署编译智能合约到我们之前搭建的私有链网络中. 搭建环境及需使用的工具:ubuntu18.04 Truf ...
- Android(java)学习笔记216:多线程断点下载的原理(Android实现)
之前在Android(java)学习笔记215中,我们从JavaSE的角度去实现了多线程断点下载,下面从Android角度实现这个断点下载: 1.新建一个Android工程: (1)其中我们先实现布局 ...
- 使用 Go-Ethereum 1.7.2搭建以太坊私有链
目录 [toc] 1.什么是Ethereum(以太坊) 以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约.开源的底层系统,以太坊从诞生到2017年5月,短短3年半时间,全球 ...
- 转:使用 Go-Ethereum 1.7.2搭建以太坊私有链
使用 Go-Ethereum 1.7.2搭建以太坊私有链 目录 [toc] 1.什么是Ethereum(以太坊) 以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约.开源的底 ...
- Mac环境搭建以太坊私有链
原文地址: 石匠的blog 为了测试以太坊智能合约,最方便的是在本地搭建一个以太坊私有链.在mac上搭建环境主要需要以下步骤. geth安装 geth是go-ethereum的简写,是一个用go语言编 ...
- Android(java)学习笔记159:多线程断点下载的原理(Android实现)
之前在Android(java)学习笔记215中,我们从JavaSE的角度去实现了多线程断点下载,下面从Android角度实现这个断点下载: 1. 新建一个Android工程: (1)其中我们先实现布 ...
随机推荐
- 消除ExtJS6的extjs-trila字样
- 偶遇vue-awesome-swiper的坑
最近用vue重构一个移动端的项目,碰到了不少坑,今天拿移动端最著名的轮播插件swiper为例来说,由于这个项目没用UI库,纯手写的样式,沿用老的插件,自然而然的选择了vue-awesome-swipe ...
- Windows Powershell脚本执行
在cmd下执行powershell进入shell模式: 变量定义:$i = 10 $a = ifconfig | findstr "192" Windows下的命令都可以执行如: ...
- Column Addition~DP(脑子抽了,当时没有想到)
Description A multi-digit column addition is a formula on adding two integers written like this:
- OpenShift实战(三):OpenShift持久化存储Redis
1.模板定义 修改OpenShift自带模板 [root@master1 pv]# oc edit template redis-persistent 添加如下: 2.创建PV 编辑redis pv ...
- Docker学习笔记 - Docker容器与外部网络的连接
学习目的: ip_forward 包过滤防护墙 iptables 允许端口映射访问 限制ip访问容器 1.ip_forward 控制系统是否会转发流量 检查linux系统转发是否开启命令:sysctl ...
- 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 ...
- python实现归并排序,归并排序的详细分析。
学习归并排序的过程是十分痛苦的.它并不常用,看起来时间复杂度好像是几种排序中最低的,比快排的时间复杂度还要低,但是它的执行速度不是最快的.很多朋友不理解时间复杂度低为什么运行速度不一定快,这个不清楚的 ...
- Django form表单
Form介绍 之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来.与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入, ...
- 理解JavaScript中函数方法
1.函数声明和函数表达式 通过字面量创建函数的方式有两种函数声明和函数表达式: 函数声明: function sum(x, y) { var result = x + y; return result ...