以太坊搭建私有链

本文记录了以太坊的搭建过程,以供备忘。其中借鉴了很多网上的资料,具体链接放在文末。

1. 安装环境

操作系统:CentOS 7.6

2. 以太坊安装

2.1 安装相关组件

为了避免后续安装出错,提前安装需要的依赖。

yum update -y && yum install git wget bzip2 vim gcc-c++ ntp epel-release nodejs -y

epel : 网络第三方的linux安装包源

2.2 安装Golang环境

安装包下载地址:https://golang.google.cn/dl/

  1. 下载Golang安装包:go1.13.linux-amd64.tar.gz
  2. 将下载的包解压至/usr/local目录:
tar -C /usr/local -xzf go1.13.linux-amd64.tar.gz
  1. /usr/local/go目录添加至PATH环境变量,编辑/etc/profile文件,在末尾添加如下内容:
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
  1. 使配置生效:source /etc/profile
  2. 输入go,查看环境是否安装成功

2.3 下载并编译geth

  1. 从github上clone下来go-ethereum(简称geth)
git clone https://github.com/ethereum/go-ethereum.git
  1. 进入geth根目录并编译
cd go-ethereum && make all
  1. 配置环境变量,编辑etc/profile文件,在末尾添加如下内容:
export PATH=$PATH:XXX/go-ethereum/build/bin  # XXX改为自己的存放路径
  1. 使配置生效:source /etc/profile
  2. 输入geth -h,查看环境是否安装成功

2.4 安装及配置cmake环境

智能合约编译需要cmake。去官网下载安装包。这里使用的版本是3.15.3。网址:https://cmake.org/files/

  1. 下载
wget https://cmake.org/files/v3.15/cmake-3.15.3.tar.gz
  1. 解压
tar -xzf cmake-3.15.3.tar.gz
  1. 进入cmake根目录并编译安装
cd cmake-3.15.3
./bootstrap && make && make install
  1. 输入cmake --version,查看环境是否安装成功

2.5 防火墙

根据自己的喜好,关闭防火墙或者添加防火墙规则。

systemctl stop firewalld    # 关闭防火墙
systemctl status firewalld  # 查看防火墙状态
# 添加防火墙规则,允许某些端口
firewall-cmd --zone=public --add-port=8545/tcp --permanent
firewall-cmd --zone=public --add-port=30303/tcp --permanent

2.6 时钟同步

开启时钟同步。

systemctl start ntpd

3. 开始创建以太坊私有链

3.1 初始化创世区块

编写创世区块的配置文件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目录。启动后的效果如下:
以太坊搭建私有链_第1张图片

3.2 启动私有链

使用下面的命令启动私有链。

geth --datadir data --nodiscover console 2>> geth.log

参数解释:

参数名称 参数描述
datadir 当前区块链数据存放的位置
console 启动命令行模式,可以在geth中执行命令
nodiscover 私有链地址,不会被网上看到

启动后的效果如下:
以太坊私有链启动后的效果
此时进入了geth的控制台,可以执行相关的命令。

3.3 常用命令

以下命令都是在geth的控制台中执行的,仅列出基本操作。在执行命令前,可以使用tail -f geth.log监控日志输出。

  1. 新建账号,密码为”pwd“:personal.newAccount(“pwd")
  2. 查看账户:eth.accounts
  3. 查看账户余额:eth.getBalance("your account")
  4. 解锁账户:personal.unlockAccount("your account")
  5. 查看挖矿的账户:eth.coinbase
  6. 1 wei转换为ether:web3.fromWei(1, 'ether')
  7. 1 ether转换为wei:web3.toWei(1, 'ether')
  8. 发起交易:eth.sendTransaction({from : "account1", to : "account2", value : web3.toWei(1, 'ether')})
  9. 查看交易池状态:txpool.status
  10. 开始挖矿:miner.start()
  11. 停止挖矿:miner.stop()
  12. 挖到n个块的时候停止挖矿:miner.start();admin.sleepBlocks(n);miner.stop()

3.4 私有链节点加入

在第一台机器(称为节点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信息。
admin.nodeInfo.enode
将节点1的enode最后的ip部分(127.0.0.1)换为节点1的真实ip后,在另外一个机器(称为节点2)上用同样的命令启动geth。
在节点2的命令行中使用admin.addPeer(节点1的enode信息)命令连接到节点1。
admin.addPeer()
可以通过admin.peers命令查看连接情况:
以太坊搭建私有链_第2张图片

3.5 RPC远程调用

按照上述命令启动geth控制台后,可以通过RPC远程调用命令。这里展示两种方法。

3.5.1 curl

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地址。
返回的结果如下:
RPC调用结果

3.5.2 postman

使用postman工具,请求方式设为POST,Headers设置"Content-Type"的值为”application/json“。
以太坊搭建私有链_第3张图片
Body设为”raw“,内容填写如下:

{
	"jsonrpc":"2.0",
	"method":"eth_accounts",
	"params":[],
	"id":1
}

以太坊搭建私有链_第4张图片
点击Send按钮,返回的结果如下:
以太坊搭建私有链_第5张图片

4 区块字段解释

以太坊搭建私有链_第6张图片

参数名称 参数描述
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 叔哈希的数组

参考资料

  1. 以太坊搭建私有链和部署智能合约
  2. 以太坊私有链创建及智能合约的部署和交互
  3. 手把手教你搭建以太坊私有链
  4. 以太坊私链区块字段和交易字段的解释
  5. 使用 Go-Ethereum 1.7.2搭建以太坊私有链
  6. Go-Ethereum Wiki

你可能感兴趣的:(区块链)