【钱包·RPC搭建】以太坊主网节点搭建

01. 搭建节点需要什么配置

推荐配置:

CPU: 8 core
内存: 16G
硬盘: 500G SSD (固态硬盘)
网络: 5M+

最低配置:

CPU: 4 core
内存: 8G
硬盘: 500G SSD (固态硬盘)
网络: 5M+

我自己搭节点用的是这里说的推荐配置,下午开始同步,三四天才可以完全同步完成!(2018-11-15)

02. 节点是放国内还是国外

放国外安装过程会更顺利,国内云服务已经比较成熟了,但由于墙的原因,搭建过程稍微麻烦一点儿。
最近的这次安装,才开始用的阿里云服务器,但明显出现网络卡顿,最后换用aws亚马逊服务器,因为公司其它系统用的都是 CentOS 7,这里也用了CentOS 7,网上关于 Ubuntu 和 CentOS 7的资料多。

03. 安装前的配置

本次最终安装选择国外亚马逊服务器,选用Center OS 7 + Nginx + Mysql 5.7.24 + PHP 7.2 ,也可以选用lnmp一键安装。安装完就可以开始节点的安装配置了。

04. 安装ETH

防火墙: 开启 22 和 30303 端口,分别用于 SSH 和以太坊节点数据同步

1. 安装系统依赖库

# 安装编译工具和库
sudo yum -y groupinstall 'Development Tools'

# 安装和设置 ntp 时间校准服务
sudo yum -y install ntp
sudo systemctl enable ntpd.service
sudo systemctl start ntpd.service

2. 安装 geth

官方并不直接提供 geth 的 RPM 安装包或者 Yum 安装源,但是提供了交叉编译的 geth 二进制包以供下载安装。(参考文档

# 下载并解压缩 geth: http://ethfans.org/wikis/Ethereum-Geth-国内镜像下载
# 在root目录下载 https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.8.18-58632d44.tar.gz (官网下载:https://ethereum.github.io/go-ethereum/downloads/)

cd /root
wget https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.8.18-58632d44.tar.gz

tar zxvf geth-linux-amd64-{version}.tar.gz
cd geth-linux-amd64-{version}

# 移动 geth 到 /usr/bin 目录下
sudo mv geth /usr/bin/

3. 安装 NodeJS

curl --silent --location https://rpm.nodesource.com/setup_6.x | sudo bash -
sudo yum install -y nodejs

4. 安装验证

看到类似下面的结果说明就配置成功了

# 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 设为\color{red}{ 0.0.0.0 }\color{red}{有安全风险}的,最好指定特定 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

05. 监控同步状态

可以通过下面的命令 attach 到运行的节点,这里的 data 为上面启动 geth 时指定的 datadir 目录。

# 需要在eth的根目录下
# 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

恭喜你,区块数据已经同步完成了,该节点可以接收交易请求了。

06. 常见问题

问题: 如果非正常关闭 geth 进程,比如机器强制重启的时候,如果这个时候以太坊正在执行数据库写操作,下次启动 geth 进程时就很容易碰到下面的错误信息:

Fatal: Error starting protocol stack: missing block number for head header hash

方案: 很不幸,目前还没有特别好的解决办法
需要通过下面的命令移除区块链数据并从新同步数据

# geth removedb --datadir data

总结

本文讲解了以太坊主网节点搭建从准备到数据同步完成的全过程,希望能给有看到本文的人带来一些帮助。以后有相关经验积累也会同步更新到这篇文章中,大家在搭建节点的过程中有碰到什么问题,也可以给我留言或同我联系,同学习共进步。

至此,我们就可以通过此节点进行正常的转提币操作!

猜你喜欢

转载自blog.csdn.net/qq_28505809/article/details/84256458