告别测试网拥堵:搭建本地以太坊私有链进行高效开发
操作系统环境: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
