Geth自建节点分为三种模式,全节点(full)、快照节点(snap)和轻节点(light)
我们今天搭建snap模式的节点,实时监听pending中的交易
购买服务器,snap模式的最低的要求服务器有1TB的存储,因为首次同步的数据占到650G,后面每周会增加大概12G的数据。
我自己购买的vultr的服务器,可以使用支付宝付费很方便,如果像我一样要求不是很高,建议买 E-2286G 的配置的就好,完全够用
服务器购买单租户裸机,位置选择新加坡,系统选择CentOS 7(没有SELinux),服务器大小就选E-2286G,磁盘选择没有RAID的已格式化磁盘就好,其他默认。输入服务器主机名和标签名后就可以了
启动后,通过ssh链接到服务器,基本的准备算是完成
ETH由PoW转向PoS协议之后,每个节点就需要同时运行两个软件,执行客户端和共识客户端。这里需要提到的是运行节点并不需要质押ETH。但如果要作为验证者,产生区块,获得收益,就必须运行共识客户端的验证器,并质押32个ETH。本文中并不介绍质押相关的内容,有需要的可以在节点搭建完成后,阅读运行验证器
首先,创建ethereum
文件夹,并在其中创建两个子文件夹consensus
和execution
,分别存放共识客户端和执行客户端
进入consensus
文件夹,执行如下命令
mkdir prysm && cd prysm
curl https://raw.githubusercontent.com/prysmaticlabs/prysm/master/prysm.sh --output prysm.sh && chmod +x prysm.sh
首先安装Golang,可以直接用yum
yum install golang
下载并安装Geth,查看最新版本
wget https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.10.25-69568c55.tar.gz
tar -xzvf geth-linux-amd64-1.10.25-69568c55.tar.gz -C ./geth
cd geth && make geth
ln -s 你的解压路径 /usr/local/bin/geth
执行完,运行geth version
能正常看到版本号即安装完成
nohup geth --syncmode snap --cache 24000 --datadir /usr/ethereum/execution/ --http --http.addr 0.0.0.0 --http.port 8545 --http.api "eth,engine,net,admin,rpc" --ws --ws.addr 0.0.0.0 --ws.port 8546 --ws.api "eth,net,web3,txpool" --txpool.globalslots=250000 --txpool.globalqueue=50000 --maxpeers 50 >> /usr/local/eth/output.log 2>&1 &
命令解释:使用nohup守护geth进程,通过snap的模式运行节点,设置缓存大小,通过datadir设置链数据储存数据目录(这里的路径设置为最开始创建的两个子文件夹中的execution
文件夹),设置http协议运行ip和端口,设置ws协议的运行ip和端口(客户端通过rpc链接到节点监听pending交易,必须设置txpool
)设置txpool参数,设置太小会导致pending交易不能全部被监听到,maxpeers为同步数据时最大连接的其他节点数,指定nohup日志输出文件
节点运行后,开始同步区块链的数据,数据会被存储到execution
下,可能需要10-20个小时,中途可以结束进程,再次运行的时候会继续上次的工作
通过查看nohup的日志文件,可以看到最新同步状况
tailf /usr/local/eth/output.log
nohup ./prysm.sh beacon-chain --execution-endpoint=/usr/ethereum/execution/geth.ipc --checkpoint-sync-url=https://beaconstate.info --genesis-beacon-api-url=https://beaconstate.info >> /usr/local/eth/prysm.log 2>&1 &
命令解释:使用nohup守护prysm进程,指定本地执行客户端,指定同步URL(加快信标链同步速度,几乎是瞬间完成)
通过查看nohup的日志文件,可以看到prysm的运行情况
tailf /usr/local/eth/prysm.log
此时,你已经完成了需要做的工作,等待执行客户端同步完数据,节点就可以用了
客户端中,你可以使用ethers.js库的WebSocketProvider,通过ws链接到节点,就可以监听pending池子啦
provider.on('pending', (tx) => {
console.log(tx)
})
前面提到,本地的区块链数据会不断增加,1TB的磁盘很快就会被用完,这里可以使用gethpruning
对旧数据进行修剪,详情产可以查看,文档说的很仔细