本文记录了以太坊的搭建过程,以供备忘。其中借鉴了很多网上的资料,具体链接放在文末。
操作系统:CentOS 7.6
为了避免后续安装出错,提前安装需要的依赖。
yum update -y && yum install git wget bzip2 vim gcc-c++ ntp epel-release nodejs -y
epel : 网络第三方的linux安装包源
安装包下载地址:https://golang.google.cn/dl/
/usr/local
目录:tar -C /usr/local -xzf go1.13.linux-amd64.tar.gz
/usr/local/go
目录添加至PATH环境变量,编辑/etc/profile
文件,在末尾添加如下内容:export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
source /etc/profile
go
,查看环境是否安装成功git clone https://github.com/ethereum/go-ethereum.git
cd go-ethereum && make all
etc/profile
文件,在末尾添加如下内容:export PATH=$PATH:XXX/go-ethereum/build/bin # XXX改为自己的存放路径
source /etc/profile
geth -h
,查看环境是否安装成功智能合约编译需要cmake。去官网下载安装包。这里使用的版本是3.15.3。网址:https://cmake.org/files/
wget https://cmake.org/files/v3.15/cmake-3.15.3.tar.gz
tar -xzf cmake-3.15.3.tar.gz
cd cmake-3.15.3
./bootstrap && make && make install
cmake --version
,查看环境是否安装成功根据自己的喜好,关闭防火墙或者添加防火墙规则。
systemctl stop firewalld # 关闭防火墙
systemctl status firewalld # 查看防火墙状态
# 添加防火墙规则,允许某些端口
firewall-cmd --zone=public --add-port=8545/tcp --permanent
firewall-cmd --zone=public --add-port=30303/tcp --permanent
开启时钟同步。
systemctl start ntpd
编写创世区块的配置文件genesis.json
。
{
"config": {
"chainId": 10,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"nonce": "0x0000000000000042",
"difficulty": "0x20000",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00",
"gasLimit": "0xffffffff",
"coinbase": "0x0000000000000000000000000000000000000000",
"extraData": "",
"alloc": {}
}
字段解释:
字段 | 含义 |
---|---|
nonce | 64位的随机数,用于挖矿 |
difficulty | 当前区块的难度 |
mixhash | 由上一个区块的一部分生成的hash |
parentHash | 上一个区块的hash值。因为是创世块,所以是0 |
timestamp | 创世块的时间戳 |
gasLimit | 限制gas的消耗总量,用来限制区块能包含的交易信息总和。因为是私有链,所以可以填最大 |
coinbase | 矿工的账号 |
extraData | 附加信息,可以填个性信息 |
alloc | 预置账号以及账号的以太币数量 |
使用命令geth --datadir data init genesis.json
进行创世区块的初始化。当前区块链网络数据存放的位置为data
目录。启动后的效果如下:
使用下面的命令启动私有链。
geth --datadir data --nodiscover console 2>> geth.log
参数解释:
参数名称 | 参数描述 |
---|---|
datadir | 当前区块链数据存放的位置 |
console | 启动命令行模式,可以在geth中执行命令 |
nodiscover | 私有链地址,不会被网上看到 |
启动后的效果如下:
此时进入了geth的控制台,可以执行相关的命令。
以下命令都是在geth的控制台中执行的,仅列出基本操作。在执行命令前,可以使用tail -f geth.log
监控日志输出。
personal.newAccount(“pwd")
eth.accounts
eth.getBalance("your account")
personal.unlockAccount("your account")
eth.coinbase
web3.fromWei(1, 'ether')
web3.toWei(1, 'ether')
eth.sendTransaction({from : "account1", to : "account2", value : web3.toWei(1, 'ether')})
txpool.status
miner.start()
miner.stop()
miner.start();admin.sleepBlocks(n);miner.stop()
在第一台机器(称为节点1)上启动私有链时,使用下面的命令:
geth --datadir data --networkid 2020 --rpc --rpcaddr="0.0.0.0" --rpcport 8545 --rpcapi "db,eth,net,web3" --rpccorsdomain "*" --rpcvhosts "*" --port 30303 --nodiscover console 2>> geth.log
参数解释:
参数名称 | 参数描述 |
---|---|
networdid | 私有链的网络id,与其它节点相连时id要一致 |
rpc | 开启RPC通信 |
rpcaddr | RPC监听地址 |
rpcport | RPC监听端口,默认8545 |
rpcapi | RPC提供的API |
rpccorsdomain | 跨域请求 |
rpcvhosts | 接收请求的域名 |
port | 工作端口,默认30303 |
在命令行中,使用命令admin.nodeInfo.enode
查看节点1的enode信息。
将节点1的enode最后的ip部分(127.0.0.1)换为节点1的真实ip后,在另外一个机器(称为节点2)上用同样的命令启动geth。
在节点2的命令行中使用admin.addPeer(节点1的enode信息)
命令连接到节点1。
可以通过admin.peers
命令查看连接情况:
按照上述命令启动geth控制台后,可以通过RPC远程调用命令。这里展示两种方法。
curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1}' http://10.10.149.1:8545
其中,最后的地址换为运行geth机器的ip地址。
返回的结果如下:
使用postman工具,请求方式设为POST,Headers设置"Content-Type"的值为”application/json“。
Body设为”raw“,内容填写如下:
{
"jsonrpc":"2.0",
"method":"eth_accounts",
"params":[],
"id":1
}
参数名称 | 参数描述 |
---|---|
difficulty | 挖到当前区块的难度 |
extraData | 额外数据 |
gasLimit | 该区块允许使用的手续费上限 |
gasUsed | 该区块实际包含的所有手续费 |
hash | 该区块的唯一哈希值标识,32字节 |
logsBloom | 区块日志的布隆过滤器,256字节 |
miner | 打包该区块的矿工地址,20字节 |
mixHash | 混合哈希 |
nonce | 一个符合PoW难题的随机值,8字节 |
number | 当前区块的序号 |
parentHash | 父区块的哈希值,32字节 |
receiptsRoot | 收据树的根哈希 |
sha3Uncles | 叔区块的SHA3哈希值 |
size | 区块的字节大小 |
stateRoot | 区块状态树的根哈希 |
timestamp | 该区块被发现时的Unix时间戳 |
totalDifficulty | 挖到当前区块前所有区块的难度总和 |
transactions | 所有交易的数组 |
transactionsRoot | 区块交易树的根哈希 |
uncles | 叔哈希的数组 |