以太坊主网节点搭建

最详细搭建以太坊主网节点

1.搭建节点需要什么配置
推荐配置:(切记一定要物理机)
CPU: 8 核
内存: 16G
硬盘: 500G SSD (固态硬盘)
网络: 10M(如果是用物理机可以找机房临时拉满同步会比较快哦,如果能加到100M几个小时就能同步完成,)
我搭建节点和推荐客户都是用的8核16g 500G SSD,在跑的时候我会临时帮客户把带宽拉到100M,这样她几个小时就能同步完。如果不拉满的情况下,会要3-4天才能同步完成,耽误时间。

2. 节点是放中国大陆还是放在香港或者台湾海外国外?
放国外安装过程会比较顺利,国内云服务已经比较成熟了,但由于墙的原因,搭建过程稍微麻烦一点儿。
最近的这次安装,因为买国外物理服务器会便宜一些(相比云服务器和物理机,物理机会更便宜,稳定性也非常不错),相比买云服务器节约了几百上千元。同时也效率了很多。另外现在linux官方系统不更新centos6和centos8了,所以只能用centos7或者Ubuntu。所以大家在选择系统的时候一定要选择centos7以上版本或者Ubuntu,不要选择centos8和6。

3 具体安装步骤
1. 安装 go 语言
安装 go 主要是为了去编译 go-ethereum 源码
我一般都是用 gvm 去安装和管理不同版本的 go,如果 gvm 在默认是连不上所需要的 golang 下载服务器的。于是直接用下面一条命令搞定。

yum install golang

安装的版本不是最新的但也还是可以用的。 

go version

go version go1.18.1 linux/amd64

2. 安装 git
安装 git 主要是为了拉取 go-ethereum 源码
直接通过 yum 安装的版本比较老
我是通过下面的命令安装的:

yum install https://centos7.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.9


接下来对源码进行编译 

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 添加到文件最后(该/opt/ethereum/go-ethereum/build/bin 路径为安装目录)

echo 'export PATH=$PATH:/opt/ethereum/go-ethereum/build/bin' >> /etc/profile


运行 source /etc/profile 将设置加载到当前 shell 环境

source /etc/profile


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

geth version


Geth
Version: 1.10.20-unstable
Git Commit: c7f485d9e5b9ffe125d59495da3a13e1f66a24c9
Git Commit Date: 20220626
Architecture: amd64
Go Version: go1.18.1
Operating System: linux
GOPATH=/home/gopath
GOROOT=/usr/local/go
到此geth环境已经安装完毕

启动geth

5. 启动 geth 重要参数
直接在命令行运行 geth 不就行了么,当然可以,geth 会立马启动主网数据同步的准备工作。当还是建议关注一下下面的参数:

--datadir "xxxx" 指定数据目录,用来存放区块链数据,状态数据,keystore数据等。如果不加这个参数这些数据在不同的系统会放到不同的位置。这个目录占用空间是比较大的,我一般会指定一个目录,并保证这个目录所在分区有足够的磁盘空间。
--cache value 分配给内部缓存的内存MB数量,默认为 128,最后设置大一点儿,起码 1024吧,这个值设大一些可以提高数据同步效率。
--http                      启用HTTP-RPC服务器
--http.addr value             HTTP-RPC服务器接口地址(默认值:“localhost”),默认只允许本地连接,设置为 0.0.0.0 可以接收任何地址发来的连接请求
--http.port value             HTTP-RPC服务器监听端口(默认值:8545),可以改为不同的端口
--ws                        启用WS-RPC服务器,几乎所有第三方节点都不启动这个服务,而要监听以太坊事件又必须启动这个服务
--ws.addr value              WS-RPC服务器监听接口地址(默认值:“localhost”)
--ws.port value              WS-RPC服务器监听端口(默认值:8546)
最后启动 geth 的命令看起来是这样的:

geth --datadir /data/database/eth --cache 4096 --http --http.port 6666 --http.addr 0.0.0.0  --ws --ws.addr 0.0.0.0 --ws.port 6667 --ws.origins "*"

这里把 rpcaddr 设为是的,最好指定特定 ip 地址或者通过反向代理或防火墙控制对 geth 节点的访问

6. 后台启动 geth
如果直接在 shell 终端直接启动 geth,终端关掉进程也就关掉了,可以通过下面的命令使 geth 在后台运行

nohup geth --datadir data --cache 4096 --http --http.port 6666 --http.addr 0.0.0.0  --ws --ws.addr 0.0.0.0 --ws.port 6667 --ws.origins "*" & > nohup.out

但如果直接在 shell 终端运行,可以用 CTRL + C 关闭进程,如何关闭运行在后台的 geth 进程呢,写了个简单的脚本如下:

#!/bin/sh
pid=`ps -ef|grep geth|grep -v grep|awk '{print $2}'`
echo $pid
kill -INT $pid

关于关闭 geth 进程,想了解更多可以查看这里。

0x04 监控同步状态
可以通过下面的命令 attach 到运行的节点,这里的 data 为上面启动 geth 时指定的 datadir 目录。

# geth attach data/geth.ipc


Welcome to the Geth JavaScript console!

instance: Geth/SamewayProdNode2/v1.9.5-stable-a1c09b93/linux-amd64/go1.11.5
at block: 8637418 (Sat, 28 Sep 2019 20:52:34 CST)
 datadir: /opt/ethereum/prod/data
 modules: admin:1.0 debug:1.0 eth:1.0 ethash: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
这个时候调用 eth.syncing 会返回 false

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

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

Fatal: Error starting protocol stack: missing block number for head header hash
方案: 很不幸,目前还没有特别好的解决办法
需要通过下面的命令移除区块链数据并从新同步数据

# geth removedb --datadir data
问题: 数据同步经常落后主网若干区块,落后也不是很多,往往也就几十个区块,等段时间可以完成同步,可过段时间又落于主网了

方案: 确保节点监听端口 30303 已经在防火墙打开,此端口在防火墙放行后,可大大提高主网数据同步的稳定性
————————————————

借鉴于CSDN博主「米罗75」的原创文章,内容稍作更改
原文链接:https://blog.csdn.net/qq_59591392/article/details/123350694

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值