操作系统环境:CentOS 6.5

安装必要的依赖组件

sudo yum install git gcc gcc-c++ ntp epel-release nodejs -y

部署Golang环境

下载并解压Golang安装包:

wget https://studygolang.com/dl/golang/go1.13.4.linux-amd64.tar.gz
tar zxvf go1.13.4.linux-amd64.tar.gz
mv go /usr/local/

配置环境变量:

vi /etc/profile

添加以下内容:
GOROOT=/usr/local/go
PATH=$GOROOT/bin:$PATH

text

使配置立即生效:

source /etc/profile

验证Golang版本:

go version

编译以太坊客户端

下载源码并进行编译:

git clone https://github.com/ethereum/go-ethereum.git
cd go-ethereum
make all

添加以太坊可执行文件路径:

vi /etc/profile
PATH=$GOROOT/bin:/root/ethereum/go-ethereum/build/bin:$PATH

text

重新加载环境配置:

source /etc/profile

账户管理体系

启动Geth控制台:

geth –datadir data –nodiscover console

创建新账户:

personal.newAccount(“123456”)

参数为私钥加密密码,返回值为新创建账户的公钥地址。

查看现有账户列表:

eth.accounts

构建私有区块链网络

vim genesis.json

创建创世区块配置文件,输入以下内容:
{
“nonce”: “0x0000000000000042”,
“timestamp”: “0x00”,
“parentHash”: “0x0000000000000000000000000000000000000000000000000000000000000000”,
“extraData”: “0x00”,
“gasLimit”: “0x80000000”,
“difficulty”: “0x400”,
“mixhash”: “0x0000000000000000000000000000000000000000000000000000000000000000”,
“coinbase”: “0x0000000000000000000000000000000000000000”,
“alloc”: {
“0x4f4db5c14123474b1b173a8d25e676f388202010”: {
“balance”: “1000”
}
},
“config”: {
“chainId”: 15,
“homesteadBlock”: 0,
“eip150Block”: 0,
“eip155Block”: 0,
“eip158Block”: 0
}
}

text

配置参数说明:

参数 说明
chainId 区块链网络标识,以太坊主网ID为1,私有链需使用不同ID
HomesteadBlock 设置为0表示使用Homestead版本启动链
nonce 64位随机数,用于挖矿计算
timestamp 创世区块时间戳
parentHash 前一个区块的哈希值,创世区块为0
mixhash 与nonce配合用于挖矿的哈希值
difficulty 设置区块生成难度,值越大挖矿越困难
alloc 预配置账户及其以太币余额
coinbase 矿工奖励接收账户
extraData 附加信息字段
gasLimit 限制区块包含的交易总量

初始化区块链网络:

geth –datadir data init genesis.json

初始化成功后,会在数据目录data下生成geth和keystore两个文件夹。

如遇初始化错误,可删除现有数据重新初始化:

geth removedb –datadir data

挖矿操作指南

进入交互式控制台:

geth –datadir data –networkid 15 console

启动挖矿进程:

miner.start(5)

参数5表示使用5个线程进行挖矿。首次启动会先生成DAG文件,待进度达到100%后正式开始挖矿。每成功挖出一个区块可获得5个以太币奖励,奖励会自动转入矿工的默认账户(即本地账户列表中的第一个账户)。

设置挖矿收益账户(默认为第一个账户):

miner.setEtherbase(eth.accounts[0])

查询账户余额:

eth.getBalance(eth.accounts[0])

返回值的单位为wei,这是以太币的最小计量单位,1以太币 = 10¹⁸ wei。

查看以太币数量需要进行单位转换:

web3.fromWei(eth.getBalance(eth.accounts[0]),’ether’)

停止挖矿操作:

miner.stop()

交易转账操作:

// 转账10个以太币

amount = web3.toWei(10,’ether’)
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})

如遇错误,通常是因为账户会定期自动锁定,发送交易前需要先解锁账户。由于从账户0发起交易,需要解锁该账户:

personal.unlockAccount(eth.accounts[0])

如果发现转账未立即到账,说明交易已提交到区块链但尚未被处理,可以通过交易池状态查看:

txpool.status
{
pending: 1,
queued: 0
}

text

pending: 1表示有1笔交易等待处理。需要启动挖矿,待区块生成后停止:

miner.start(1);
admin.sleepBlocks(1);
miner.stop()

查看当前区块高度:

eth.blockNumber

退出控制台:

exit