# 如何自建一个基于PoS的ETH节点

By [白丁](https://paragraph.com/@0xlover) · 2022-09-25

---

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。本文中并不介绍质押相关的内容，有需要的可以在节点搭建完成后，阅读[运行验证器](https://docs.prylabs.network/docs/install/install-with-script#step-5-run-a-validator-using-prysm)

首先，创建`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

下载并安装Geth，查看[最新版本](https://geth.ethereum.org/downloads/)

    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的磁盘很快就会被用完，这里可以使用geth`pruning`对旧数据进行修剪，详情产可以[查看](https://geth.ethereum.org/docs/interface/pruning)，文档说的很仔细

---

*Originally published on [白丁](https://paragraph.com/@0xlover/pos-eth)*
