上传go的安装包到/data/blockchian文件夹
tar -zxvf go1.16.5.linux-amd64.tar.gz cd go
修改环境变量
vi /etc/profile
export GOROOT=/data/blockchain/go #GOROOT是系统上安装Go软件包的位置。 export GOPATH=/data/blockchain/GOPATH #GOPATH是工作目录的位置。一般用于下载Go的第三方依赖包,类似于maven仓库自己在指定的文件夹里创建。 export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
source /etc/profile
# 测试Go的版本 go version
重新安装的话需要删除go、GOPATH文件夹,然后再走一遍上面的流程安装
2. 安装以太坊客户端Geth(官方基于POW的,版本是1.10.5-stable)-
上传geth的源码文件到/data/blockchain,并解压
unzip go-ethereum-master.zip # 更新依赖 apt-get install -y build-essential cd go-ethereum-master # 设置go依赖的代理,不然报超时异常(这一条命令不行的话使用下面两条) go env -w GOPROXY=https://goproxy.cn
-
构建
make geth
-
构建成功后将bin文件复制到/usr/local/bin
cp build/bin/geth /usr/local/bin
-
配置环境变量
vi /etc/profile export PATH=$PATH:/data/blockchain/go-ethereum-master/build/bin source /etc/profile # 验证 geth version
在/data/blockchain/privatechain创建两个文件夹data0,data1两个节点的数据存储位置
mkdir data0 data1
两个节点互连创世块文件必须一样
初始化第一个节点
cd /data/blockchain/privatechain geth --datadir data0 init first.json
初始化第二个节点
geth --datadir data1 init first.json
first.json文件示例
{
"config": {
"chainId": 1001,
"homesteadBlock": 0,
"eip150Block": 0,
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"ethash": {}
},
"alloc": {},
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x20000",
"extraData": "",
"gasLimit": "0x2fefd8",
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}
创世配置参数说明:
- nonce:64位随机数,用于挖矿
- timestamp:创世块的时间戳
- parentHash:上一个区块的hash值,因为是创世块,所以这个值是0
- mixHash:与nonce配合用于挖矿,由上一个区块的一部分生成hash
- extraData:附加信息,任意填写
- gasLimit:对GAS的消耗总量限制,用来限制区块能包含的交易信息总和
- difficulty:难度值,越大越难
- coinbase:矿工账号,第一个区块挖出后将给这个矿工账号发送奖励的以太币
- alloc:预设账号以及账号的以太币数量,测试链挖矿比较容易可以不配置
- chainId:指定了独立的区块链网络ID,不同ID网络的节点无法互相连接
先进入控制台
geth --datadir "./data0" console
创建账户
personal.newAccount()
根据提示输入两次密码即可生成账户地址,这个地址记录一下,下面启动节点的时候要用到
节点2依次执行上述操作
生成完账户后,删除data0和data1文件夹下的geth,history文件夹和geth.ipc文件,只保留keystore
2.3 启动节点新版本使用的是http旧版本使用的是rpc,命令变化具体可查看命令提示 geth --help
参数详解
- –unlock: 解锁以太坊内部账户,就是前面创建的账户
- –password: 解锁以太坊内部账户密码,必须是文件形式的密码
- –allow-insecure-unlock: 允许以不安全的方式解锁账户,不可在主网上这样设置,否则会出现安全问题
- –http:启动Http服务
- –http.addr:Http服务地址
- –http.port:Http服务端口
- –http.api:Http服务的API支持
- –http.corsdomain:Http服务允许跨域
- –datadir:节点数据存储位置
- –port:P2P端口号,用于节点互连
- –networkid: 主网配置为 1 ,其他3、4、5都是以太坊坊社区部署的测试网络,我们是建立自己的私链,定义为1001
- –nodiscover: 是否主动扫描P2P节点
- –rpc.allow-unprotected-txs:允许不受保护的交易
第一个节点启动
nohup geth --unlock "0xd6c82ab0a8e0dbd37f4352cce79f11739f7dccbd" --password ./password.txt --allow-insecure-unlock --http --http.addr=0.0.0.0 --http.port 8545 --http.corsdomain "*" --http.api "eth,net,web3,personal,web3" --datadir "./data0" --port 30303 --networkid 1001 --nodiscover --rpc.allow-unprotected-txs >/dev/null 2>./geth0.log &
进入以太坊控制台
geth attach ipc:data0/geth.ipc
第二个节点启动
nohup geth --unlock "0xa60c73c77a3756ffeb3c73f08e71f26e7b6d2bb4" --password ./password.txt --allow-insecure-unlock --http --http.addr=0.0.0.0 --http.port 8546 --http.corsdomain "*" --http.api "eth,net,web3,personal,web3" --datadir "./data1" --port 30304 --networkid 1001 --nodiscover --rpc.allow-unprotected-txs >/dev/null 2>./geth1.log &
geth attach ipc:data1/geth.ipc
2.4 互连节点第二个节点的http.port、port、日志geth1.log都不一样
第一个节点连接第二个,有一方连接即可
# 先查看第二个节点的连接信息 admin.nodeInfo.enode # 信息如下,复制 enode://c09eb6b390a3ef856bca49c72c50a0cf25ecdb83a58b4e63489308511f01295d823f53c63251b74aba16efe56f123d2df5ea113ba923f326811f2dab93b87075@127.0.0.1:30306
第一个节点添加第二个节点
admin.addPeer("enode://b0737a6fd9c8b980f7b3d235b0b29273edbcb56e6c18317a1a5b53a7cbeb19cc357a8ec7fee82545c0af5781f8e72414365dac092b1350a250c4aea5b295f8ff@192.168.0.106:30306")
3. 安装以太坊客户端Geth(美图技术团队开源的基于DPos共识机制的,版本是1.7.4-stable)@后的IP地址换成真实IP地址,?后的字符串删除
-
上传美图技术团队的Geth的源码文件到/data/blockchain,并解压
unzip go-ethereum-master.zip # 更新依赖 apt-get install -y build-essential # 更改文件夹名,防止和官方以太坊客户端重名 mv go-ethereum-master/ go-ethereum-meitu cd go-ethereum-meitu # 设置go依赖的代理,不然报超时异常(这一条命令不行的话使用下面两条) go env -w GOPROXY=https://goproxy.cn
-
为了方便测试,我们需要将节点最大验证器数修改一下,这样便于我们进行简单测试
修改consensus/dpos/dpos.go文件的maxValidator
// 新值 maxValidatorSize = 21 // 旧值 maxValidatorSize = 3
-
构建
make geth
-
构建成功后将bin文件复制到/usr/local/bin
cp cp build/bin/geth /usr/local/bin
-
配置环境变量(因为之前已经创建了Geth,因此这里可以修改一下)
vi /etc/profile export PATH=$PATH:/data/blockchain/go-ethereum-meitu/build/bin source /etc/profile # 验证 geth version
在/data/blockchain/privatechain-meitu创建三个文件夹data0,data1,data2存放三个节点的数据存储位置
mkdir data0 data1 data2
先进入控制台
geth --datadir "./data0" console
创建账户
personal.newAccount()
根据提示输入两次密码即可生成账户地址,这个地址记录一下,下面启动节点的时候要用到
节点2和节点3依次执行上述操作
生成完账户后,删除data0、data1、data2文件夹下的geth文件夹和geth.ipc文件,只保留keystore
2.2 初始化节点三个节点互连创世块文件必须一样
初始化第一个节点
cd /data/blockchain/privatechain-meitu geth --datadir data0 init first.json
初始化第二个节点
geth --datadir data1 init first.json
初始化第三个节点
geth --datadir data2 init first.json
其中validators就是之前创建的Coinbase账户
first.json文件示例
{
"config": {
"chainId": 1002,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock":0,
"dpos":{
"validators":[
"0x8faccf6413e4e3901aab5f63ad516bad033c9368",
"0xf93560dfe7adc3fb7bf63d65e595ffdceb6abd39",
"0x2b2cf292a6eb2f037651b2e2c6623b0ddbc7753e"
]
}
},
"alloc": {},
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x20000",
"extraData": "",
"gasLimit": "0x2fefd8",
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}
创世配置参数说明:
- nonce:64位随机数,用于挖矿
- timestamp:创世块的时间戳
- parentHash:上一个区块的hash值,因为是创世块,所以这个值是0
- mixHash:与nonce配合用于挖矿,由上一个区块的一部分生成hash
- extraData:附加信息,任意填写
- gasLimit:对GAS的消耗总量限制,用来限制区块能包含的交易信息总和
- difficulty:难度值,越大越难
- coinbase:矿工账号,第一个区块挖出后将给这个矿工账号发送奖励的以太币
- alloc:预设账号以及账号的以太币数量,测试链挖矿比较容易可以不配置
- chainId:指定了独立的区块链网络ID,不同ID网络的节点无法互相连接
新版本使用的是http,旧版本使用的是rpc,命令变化具体可查看命令提示 geth --help
参数详解
- –unlock: 解锁以太坊内部账户,就是前面创建的账户
- –password: 解锁以太坊内部账户密码(之前在控制台设置的密码),必须是文件形式的密码
- –rpc:启动Http服务
- –rpcaddr:Http服务地址
- –rpcport:Http服务端口
- –rpcapi:Http服务的API支持
- –rpccorsdomain:Http服务允许跨域
- –datadir:节点数据存储位置
- –port:P2P端口号,用于节点互连
- –networkid: 主网配置为 1 ,其他3、4、5都是以太坊坊社区部署的测试网络,我们是建立自己的私链,与创世块文件一直定义为1002
- –nodiscover: 是否主动扫描P2P节点
DPos的以太坊节点启动
第一个
nohup geth --unlock "0x0a9bb22c7fef02f3de71f9e68273d4b1416d0651" --password ./password.txt --rpc --rpcaddr=0.0.0.0 --rpcport 8545 --rpccorsdomain "*" --rpcapi "eth,net,web3,personal,web3" --datadir "./data0" --port 30303 --networkid 1002 --nodiscover >/dev/null 2>./geth0.log &
进入以太坊控制台
geth attach ipc:data0/geth.ipc
可以执行挖矿
miner.start()
第二个
nohup geth --unlock "0x4c8b14c7318725f27dc99b79607b6704e592766e" --password ./password.txt --rpc --rpcaddr=0.0.0.0 --rpcport 8546 --rpccorsdomain "*" --rpcapi "eth,net,web3,personal,web3" --datadir "./data1" --port 30304 --networkid 1002 --nodiscover >/dev/null 2>./geth1.log &
第三个
nohup geth --unlock "0x1f7851332e5e995b31db298d7156bf199bb36465" --password ./password.txt --rpc --rpcaddr=0.0.0.0 --rpcport 8547 --rpccorsdomain "*" --rpcapi "eth,net,web3,personal,web3" --datadir "./data2" --port 30305 --networkid 1002 --nodiscover >/dev/null 2>./geth2.log &2.4 查看验证人是否设置成功
# 执行获取验证人列表命令 dpos.getValidators()2.5 互连节点
第一个节点连接第二个,有一方连接即可
# 先查看第二个节点的连接信息 admin.nodeInfo # 信息如下,复制 enode://c09eb6b390a3ef856bca49c72c50a0cf25ecdb83a58b4e63489308511f01295d823f53c63251b74aba16efe56f123d2df5ea113ba923f326811f2dab93b87075@127.0.0.1:30306
第一个节点添加第二个节点
admin.addPeer("enode://b0737a6fd9c8b980f7b3d235b0b29273edbcb56e6c18317a1a5b53a7cbeb19cc357a8ec7fee82545c0af5781f8e72414365dac092b1350a250c4aea5b295f8ff@192.168.0.106:30306")
@后的IP地址换成真实IP地址,?后的字符串删除
查看已经连接的节点
admin.peers4. 以太坊控制台常用命令
# 查看账户 eth.accounts # 创建账户,之后两次输入密码 personal.newAccount() # 查看账户余额,单位是(wei,以太坊最小的单位) eth.getBalance(eth.accounts[0]) # 查看账户余额有几个以太币 web3.fromWei(eth.getBalance(eth.accounts[0]),'ether') # 挖矿 miner.start() # 停止挖矿 miner.stop()5. 安装solc(智能合约编译器)
npm install -g solc@0.5.0 # 根据智能合约头部版本进行安装6. 安装web3j(智能合约生成Java代码)
Windows
使用powershell,管理员身份打开
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/web3j/web3j-installer/master/installer.ps1'))
Linux
curl -L get.web3j.io | sh && source ~/.web3j/source.sh6.1 生成Java代码
智能合约编译成abi和bin文件
输出目录要提前创建好,根据报错提示创建目录
solcjs D:JavaProjectblockchain-apisrcmainresourcestrans.sol --bin --abi --optimize --output-dir D:SmartContarct
web3j生产java代码
web3j generate solidity -a YueNengToken_sol_ERC20Interface.abi -b YueNengToken_sol_ERC20Interface.bin -o D:JavaProjectblockchain-apisrcmainjava -p com.ncepu.blockchain.contract
/path/to/.bin:生成的bin文件的目录
/path/to/.abi:生成的abi文件的目录
D:JavaProjectblockchain-apisrcmainjava:生成的java文件的输出目录
com.ncepu.blockchain.contract:生成的java文件的包名



