最近项目需要自己搭全节点,但发现不管是官方还是民间并没有一个可以清晰的指导文档。希望这篇小文能给需要自己搭建节点的朋友带来一些帮助。
0x01 搭建节点需要什么配置
推荐配置:
CPU: 4 core
内存: 8G
硬盘: 500G SSD (固态硬盘)
网络: 5M+
最低配置:
CPU: 2 core
内存: 4G
硬盘: 500G 高速硬盘
网络: 2M
我自己搭节点用的是这里说的推荐配置,周一下午开始同步,周三早上来上班就已经同步好了。
0x02 节点是放国内还是国外
放国外安装过程会更顺利,国内云服务已经比较成熟了,但由于墙的原因,搭建过程稍微麻烦一点儿。
最近的这次安装,因为买国外服务器走公司财务比较麻烦,就买了阿里云的 VPS,因为公司其它系统用的都是 CentOS 6,这里也用了CentOS 6,其实网上关于 Ubuntu 和 CentOS 7的资料更多。
0x03 具体安装步骤
1. 安装 go 语言
安装 go 主要是为了去编译 go-ethereum 源码
平日里一般我都是用 gvm 去安装和管理不同版本的 go,但 gvm 在阿里云上默认是连不上所需要的 golang 下载服务器的。于是直接用下面一条命令搞定。
yum install golang
安装的版本不是最新的但也还是可以用的。
# go version
go version go1.9.6 linux/amd64
2. 安装 git
安装 git 主要是为了拉取 go-ethereum 源码
直接通过 yum 安装的版本比较老
我是通过下面的命令安装的:
yum install https://centos6.iuscommunity.org/ius-release.rpm
yum install epel-release
yum install git2u
得到下面的 git 版本
# git version
git version 2.16.4
ius 是专门用来提供 RPM 包的一个社区项目,具体可以查看 iuscommunity
3. 获取 go-ethereum 源码
可以通过下面的命令获取 go-ethereum 并切换到指定的 release branch
git clone https://github.com/ethereum/go-ethereum.git
cd go-ethereum/
git checkout release/1.8
接下来对源码进行编译
cd go-ethereum/
make all
编译之后会在 go-ethereum/build/bin 下生成各种二进制文件,其中包括接下来会用到的 geth
# ls
abigen bootnode clef ethkey evm examples faucet geth p2psim puppeth rlpdump simulations swarm swarm-smoke wnode
4. 添加 geth 到系统路径
- 打开 /etc/profile
- 将 export PATH=$PATH:/opt/ethereum/go-ethereum/build/bin 添加到文件最后
- 运行 source /etc/profile 将设置加载到当前 shell 环境
- 看到类似下面的结果说明就配置成功了
# geth version
Geth
Version: 1.8.13-stable
Git Commit: 225171a4bfcc16bd12a1906b1e0d43d0b18c353b
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.9.6
Operating System: linux
GOPATH=
GOROOT=/usr/lib/golang
5. 启动 geth 重要参数
直接在命令行运行 geth 不就行了么,当然可以,geth 会立马启动主网数据同步的准备工作。当还是建议关注一下下面的参数:
--datadir "xxxx" 指定数据目录,用来存放区块链数据,状态数据,keystore数据等。如果不加这个参数这些数据在不同的系统会放到不同的位置。这个目录占用空间是比较大的,我一般会指定一个目录,并保证这个目录所在分区有足够的磁盘空间。
--cache value 分配给内部缓存的内存MB数量,默认为 128,最后设置大一点儿,起码 1024吧,这个值设大一些可以提高数据同步效率。
--rpc 启用HTTP-RPC服务器
--rpcaddr value HTTP-RPC服务器接口地址(默认值:“localhost”),默认只允许本地连接,设置为 0.0.0.0 可以接收任何地址发来的连接请求
--rpcport value HTTP-RPC服务器监听端口(默认值:8545),可以改为不同的端口
--ws 启用WS-RPC服务器,几乎所有第三方节点都不启动这个服务,而要监听以太坊事件又必须启动这个服务
--wsaddr value WS-RPC服务器监听接口地址(默认值:“localhost”)
--wsport value WS-RPC服务器监听端口(默认值:8546)
最后启动 geth 的命令看起来是这样的:
geth --datadir --cache 4096 data --rpc --rpcport 6666 --rpcaddr 0.0.0.0 --ws --wsaddr 0.0.0.0 --wsport 6667 --wsorigins "*"
这里把 rpcaddr 设为 0.0.0.0 是有一定安全风险的,最好指定特定 ip 地址或者通过反向代理控制对 geth 节点的访问
6. 后台启动 geth
如果直接在 shell 终端直接启动 geth,终端关掉进程也就关掉了,可以通过下面的命令使 geth 在后台运行
nohup geth --datadir data --cache 4096 --rpc --rpcport 6666 --rpcaddr 0.0.0.0 --ws --wsaddr 0.0.0.0 --wsport 6667 --wsorigins "*" & > nohup.out
但如果直接在 shell 终端运行,可以用 CTRL + C 关闭进程,如何关闭运行在后台的 geth 进程呢,写了个简单的脚本如下:
#!/bin/sh
pid=`ps -ef|grep geth|grep -v grep|awk '{print $2}'`
echo $pid
kill -INT $pid
0x04 监控同步状态
可以通过下面的命令 attach 到运行的节点,这里的 data 为上面启动 geth 时指定的 datadir 目录。
# geth attach data/geth.ipc
Welcome to the Geth JavaScript console!
instance: Geth/SamewayProdNode1/v1.8.13-stable-225171a4/linux-amd64/go1.9.6
modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
然后调用 eth.syncing, 如下面所示,可以看到当前的同步状态,我这边节点已经运行一段时间了,可以看到当前区块和最新区块高度是比较接近的。刚开始这两个数字差别是比较大的,在运行一天后这两个数字就开始比较接近,给人的感觉好像是快要同步完了,但实际上要再跑一天左右才能真正同步完成。
> eth.syncing
{
currentBlock: 6143193,
highestBlock: 6143296,
knownStates: 91512910,
pulledStates: 91498893,
startingBlock: 0
}
在同步的过程中我们通过 eth.blockNumber 去查看当前区块号的话会显示为 0
> eth.blockNumber
0
这个时候看 geth 的输出的话,可以看到下面的日志
INFO [08-14|04:32:20] Imported new block headers
INFO [08-14|04:32:24] Imported new block receipts
INFO [08-14|04:32:33] Imported new state entries
可以通过 net.peerCount
来看自己的这个节点连了多少个其它节点进行数据同步。如果返回结果为0,就要自查一下了。
> net.peerCount
8
当看到 geth 日志里是下面的信息
# tail nohup.out
INFO [08-16|14:20:15.307] Imported new chain segment blocks=1 txs=117 mgas=7.979 elapsed=761.592ms mgasps=10.477 number=6156276 hash=56b327…03c068 cache=905.73mB
INFO [08-16|14:20:32.926] Imported new chain segment blocks=1 txs=42 mgas=2.325 elapsed=143.505ms mgasps=16.204 number=6156277 hash=f577a7…1c6104 cache=905.59mB
INFO [08-16|14:20:35.940] Imported new chain segment blocks=1 txs=121 mgas=7.992 elapsed=776.752ms mgasps=10.289 number=6156278 hash=c92744…2d1448 cache=905.67mB
调用 eth.blockNumber
得到的数字不再是 0 了
> eth.blockNumber
6156294
恭喜你,区块数据已经同步完成了,该节点可以接收交易请求了。
总结
本文讲解了以太坊主网节点搭建从准备到数据同步完成的全过程,希望能给有看到本文的人带来一些帮助。以后有相关经验积累也会同步更新到这篇文章中,大家在搭建节点的过程中有碰到什么问题,也可以给我留言或同我联系,同学习共进步。
有疑问加站长微信联系(非本文作者)