在这里插入图片描述

免责声明

这篇文章(教程) 仅供参考、学习与交流,不构成专业建议。作者不保证文章中信息的准确性和完整性。作者无意对以太坊质押进行投资建议,因使用本文造成的损害负责,如数据丢失、利润损失或任何其他金钱损失,均与本文无关。


一、概述

以太坊(Ethereum)在2023年4月12日的上海/卡佩拉升级中成功实现了质押提款功能。这一重要升级为质押者提供了机会提取其质押奖励,并且允许他们安全退出质押并收回本金。这一举措在以太坊社区产生了积极的影响,吸引了更多人加入以太坊的质押生态系统。


二、组成

在过去的PoW时代,构建一个完整的以太坊节点只需要一个客户端。然而,随着PoS升级的推进,构建一个以太坊节点现在需要三个关键组件:

  1. 执行层客户端
  2. 共识层客户端
  3. 验证者客户端

这意味着我们需要在计算机上安装这三个不同的程序,才能组成一个完整的、具备PoS功能的以太坊节点。这些变化反映了以太坊网络架构的演进,以满足新的共识机制和功能需求。

node architecture text background

关于术语ETH1.0和ETH2.0

一些人将基于PoW的以太坊称为ETH1.0,将PoS视为一种升级并称之为ETH2.0,尽管以太坊官方否认了这种说法。但是,许多客户端仍然沿用这种 “错误的” 叫法:

  • ETH 1.0 = 执行层
  • ETH 2.0 = 共识层 + 验证层

此外,你可能听说过类似于“信标链”(Beacon Chain)等术语,现在信标链通常指的就是共识层。这些术语和分类方式有助于更清晰地理解以太坊的演进和架构。


客户端选择:
  • 执行层可以选择的客户端有:
    在这里插入图片描述

  • 共识层 (含验证层) 可选择的客户端有:

在这里插入图片描述

关于验证者,几乎所有共识层都内置了验证者客户端,它们的差异通常仅在于启动参数的设置不同。甚至有一些客户端(例如Teku)将共识层和验证者完全融合在一起,进一步简化了整个系统的架构。

以太坊官方鼓励多样性的客户端选择。例如,目前运行执行层客户端GETH的节点占比高达86%,这可能不太有利于以太坊去中心化的理念。因此,尽量避免使用GETH这种占比较高的常见客户端,而选择使用其他不太常见的客户端有助于促进整个以太坊网络的健康和去中心化。

在本文中,我们选择了Nethermind(执行层)+Prysm(共识+验证)这个组合来构建节点。这种选择可以根据个人需求和偏好进行调整,但需要明确一点,任何人都有权参与以太坊节点的建设。如果你只是想体验节点的运行,可以选择仅运行执行层和共识层,无需运行验证层。不过,请注意,这样做将无法获得作为节点参与者的奖励,这是一种出于志愿的行为,不以盈利为目的。只有当你支付了32个ETH的押金后,你才能获得有效的验证层客户端运行资格,并享有作为节点参与者的奖励。

尽管从经济角度看可能不那么有利可图,但我强烈建议在支付押金之前先尝试搭建节点,熟悉执行层和共识层的搭建过程,然后再考虑是否支付押金。如果你首先支付押金然后再尝试节点搭建,在搭建过程中遇到问题,节点运行异常,可能会导致怠工惩罚(每天产生大约-0.00176ETH的损失)。因此,建议在进一步投入前充分了解并熟悉搭建过程。


三、 硬件选择

运行一个以太坊节点对CPU和内存的要求相对较低,但对硬盘的读写速度要求非常高,因此必须使用高速SSD才能满足要求。以下是本文采用的硬件列表:

  • CPU:Intel N100(迷你电脑专用U,功耗低)

  • 内存:DDR4 32GB(16GB已够,但由于差价不大,建议选择32GB)

  • 硬盘:长城 NVMe 2TB(以太坊账本非常庞大,目前容量达到1.1TB并且仍在不断膨胀,因此至少2TB的SSD才够用)

在这里插入图片描述


操作系统选择

虽然以上提到的客户端大多有适用于 Windows 的版本,但出于稳定性的考虑,建议使用 Linux 操作系统。由于本文作者对 CentOS 比较熟悉,因此本文将以其兼容版 Rocky Linux 9 作为演示系统。其他 Linux 发行版,如 Ubuntu 等,大体的安装流程也类似,可供参考。

  • 硬盘性能测试

首先,你可以安装一个名为 fio 的小工具:dnf install -y fio

然后,可以使用以下命令进行硬盘读写速度测试:

读速度测试:

fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=test --bs=4k --iodepth=64 --size=4G --readwrite=randread

写速度测试:

fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=test --bs=4k --iodepth=64 --size=4G --readwrite=randwrite

在进行节点搭建前,建议硬盘的读写速度至少达到 IOPS > 10000,这样才能满足节点的要求。通常,机械硬盘无法满足这一要求,但不论是 SATA 还是 NVMe SSD,达到这个性能门槛都不会太难。请注意,硬盘速度对执行层客户端的影响尤为显著,即使程序看似正常运行,但你可能会发现区块同步进度始终滞后,这时就需要考虑升级硬盘。


四、开始吧
本文的预备工作
  1. 本机登录账号:rockage ,家目录:/home/rockage

  2. 客户端运行程序存储位置:/home/rockage/Downloads

  3. 执行层 (Nethermind) 数据存储位置:/home/eth1/nethermind

  4. 共识层+验证者 (Prysm) 数据存储位置: /home/eth2/prysm

相应的操作:

mkdir -p /home/eth1/nethermind
mkdir -p /home/eth2/prysm
mkdir -p /home/rockage/Downloads

创建通讯密钥
openssl rand -hex 32 | sudo tee /home/rockaage/jwt.hex

请注意,此密钥与我们的质押密钥不同,仅用于通信安全,与资金无关。


安装共识层客户端: Prysm

Prysm的安装较为简单,没有复杂的编译等过程,直接使用它官网提供的脚本即可:

curl https://raw.githubusercontent.com/prysmaticlabs/prysm/master/prysm.sh --output prysm.sh
chmod +x prysm.sh

运行这个脚本,它会自动寻找最新版本:

 ./prysm.sh beacon-chain --download-only (下载共识层客户端)
 ./prysm.sh validator --download-only (下载验证者客户端)

下载完毕后,检查 dist 目录:

ll ./dist

在这里插入图片描述

记下最新的版本号,例如本例中为:

共识层客户端:beacon-chain-v4.1.1-linux-amd64

验证者客户端:validator-v4.1.1-linux-amd64

值得一提的是,官方提供的 prysm.sh 脚本不仅能够下载客户端,还可以运行这两个客户端,并在发现新版本时进行自动更新。然而,由于某些众所周知的原因,Prysm 在更新时需要使用楼梯工具。如果你没有可用的楼梯工具,prysm.sh 脚本可能会在更新时卡住,导致客户端无法正常运行。因此,我们在这里提前下载了共识层和验证层两个客户端,以避开 prysm.sh 脚本的自动更新功能,确保客户端的稳定运行。


运行Prysm并同步共识层(Consensus)数据

共识层,有时也称为信标链(beacon-chain),由于它的数据不需要进行全账本同步,因此可以从一些可信任的节点获取数据续传。共识层的同步速度非常快。在正常情况下,哪怕是一个初始数据量为0的共识层客户端也可以在几分钟内开始正常工作。

这个网站提供了很多这样的续传点:

https://eth-clients.github.io/checkpoint-sync-endpoints/

有兴趣可以自行研究。

接着,用这条指令开启共识层数据续传:

/home/rockage/Downloads/prysm/dist/beacon-chain-v4.1.1-linux-amd64 \
--execution-endpoint=http://localhost:8551 \
--datadir=/home/eth2/prysm \
--jwt-secret=/home/rockage/jwt.hex \
--checkpoint-sync-url=https://beaconstate.info \
--genesis-beacon-api-url=https://mainnet-checkpoint-sync.attestant.io

在这条指令中,需要注意以下参数:

  • datadir:共识层数据存放位置。
  • jwt-secret:通讯密钥存放位置,务必与执行层 Nethermind 使用的密钥一致。
  • checkpoint-sync-url:续传点网址。

在程序运行后,耐心等待几分钟,观察日志。当它开始出现类似以下信息时:

level=info msg="BeaconState slot=529024, Block slot=529024"
level=info msg="BeaconState htr=0x854ca984298e6a0d9fc098b4e37f1b28727e545a8e4d3106188fda3587d14cdbd, Block state_root=0x854ca984298e6a0d9fc098b4e37f1b28727e545a8e4d3106188fda3587d14cdb"

这表明数据已经同步完成,并且程序已经开始正常工作。现在,你可以按下CTRL+C来退出程序,因为断点续传只需要进行一次,没有必要在每次启动Prysm时都进行续传。在大多数情况下,你只需正常启动Prysm,启动命令如下:

/home/rockage/Downloads/prysm/dist/beacon-chain-v4.1.1-linux-amd64 \
    --datadir=/home/eth2/prysm \
    --execution-endpoint=http://localhost:8551 \
    --jwt-secret=/home/rockage/jwt.hex \
    --suggested-fee-recipient=0x066e4335384FF37dE0F2E08aCD1dc3c266B9D635

需要注意的参数和上面的示例类似,只是省略了checkpoint-sync-url,同时增加了suggested-fee-recipient参数。这个参数用于指定一个接收MEV(最大可提取价值)额外收入的小费地址,你可以填入任何支持ERC20的钱包地址。(关于MEV是什么,我们可以在以后详细讨论。)


安装执行层客户端: Nethermind

因为执行层客户端在同步数据的时候需要信标链(共识层)提供支持,因此在排序上,本文将执行层安装方法放到了共识层之后。

  • 安装依赖项
dnf install glibc-devel snappy-devel libzstd unzip
  • 安装 rockdb
git clone https://github.com/facebook/rocksdb.git
cd rocksdb
make shared_lib (耗时很长,耐心等待)
make install-shared
nano ~/.bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/
  • 编译安装 Nethermind

    • 安装 .Net 支持

      dnf install dnf-plugins-core
      dnf install epel-release
      dnf config-manager --enable crb
      dnf update
      dnf repolist
      
      wget https://dot.net/v1/dotnet-install.sh
      chmod +x dotnet-install.sh
      ./dotnet-install.sh -c STS
      echo 'export PATH=$PATH:~/.dotnet/' | tee -a ~/.bashrc
      source  ~/.bashrc
      echo $PATH
      dotnet --version (验证是否安装成功)
      dotnet --info
      
      nano ~/.bashrc
      export DOTNET_ROOT=/home/rockage/.dotnet (检查是否有这一行)
      source ~/.bashrc
      
    • 编译Nethermind

      git clone --recursive https://github.com/NethermindEth/nethermind.git
      cd nethermind/src/Nethermind
      dotnet build Nethermind.sln -c Release (编译过程耗时较长)
      
      结束后创建一个链接:
      sudo ln -s `find /usr/lib64/ -type f -name "libbz2.so.1*"` /usr/lib64/libbz2.so.1.0 
      
    • 运行Nethermind

      方法1:用dotnet启动器方式运行:
      cd /home/rockage/Downloads/nethermind-git/nethermind/src/Nethermind/Nethermind.Runner 
      dotnet run -c Release \
          --config mainnet \
          --JsonRpc.JwtSecretFile=/home/rockage/jwt.hex \
          --JsonRpc.Enabled true \
          --datadir /home/eth1/nethermind
      
      方法2:运行Nethermind二进制程序:
      cd /home/rockage/Downloads/nethermind-git/nethermind/src/Nethermind/Nethermind.Runner/bin/Release/net7.0
      nethermind \
          --JsonRpc.JwtSecretFile=/home/rockage/jwt.hex \
          --JsonRpc.Enabled true \
          --datadir /home/eth1/nethermind
      

      请将上面的 Nethermind 目录修改为你自己的,参数方面主要注意两点:

      • datadir 指定以太坊执行层(ETH1)数据的存放位置;

      • sonRpc.JwtSecretFile 标明了密钥的位置(务必和 Prysm 一致);

        注意这两个地方即可。


同步以太坊执行层(Execution)数据

即使 Nethermind 能够正常运行,也并不能独立同步数据,在某些阶段它需要共识层客户端的协助。因此在同步执行层数据前,请确保 Prysm 处于运行状态,反过来,有的时候 Prysm也需要 Nethermind 的支持。总而言之,这两个软件最好都同时保持在运行状态就对了。

执行层数据同步比共识层同步要漫长得多,这个过程从 Phase 1 阶段开始,接着进入 Bodies、Receipts,以及其他多个阶段。每当一个阶段完成时,同步进度计数器都会从0%重新开始计算。整个过程的耗时将取决于你计算机的性能和家庭宽带的网速。如果你的计算机配置高端且宽带速度较快,可能只需几个小时即可完成同步。然而,对于一些配置较低或网络较慢的情况,可能需要数天的时间来完成同步。


质押 32 ETH

在进行质押操作之前,请提前完成之前的两个步骤,以确保一切正常:

  1. Nethermind 执行层客户端已经成功运行并完成数据同步

    (这通常需要一段比较长的时间来完成。)

  2. Prysm 共识层客户端已经成功运行并完成数据同步

    (通过续传方式一般花不了太长时间。)

一旦你确认上述两个步骤都已完成,你可以继续以下操作:

  1. 访问 ETH PoS 启动器网站:https://launchpad.ethereum.org/zh

  2. 点击 “成为验证者”。

  3. 阅读并接受通告清单中的条款(建议仔细阅读)。

  4. 在选择执行层客户端时,可以直接继续,无需特别选择。

  5. 在选择共识层客户端时,同样可以直接继续,无需特别选择。

    当网站来到这一步的时候:

在这里插入图片描述

输入正确的验证者节点数,并且设置好提款地址,将网页向下拖动:

在这里插入图片描述

事实上,这个页面仅提供了一个简单的教程,教导你如何创建正确的存款文件,而并非直接在该页面上生成存款文件。接下来,我们将用更详细的篇幅来解释这个过程。


创建质押存款证明文件

这是与资金相关的步骤,请务必认真执行。

  1. 下载密钥生成器客户端

    官方 Github地址 :Releases · ethereum/staking-deposit-cli · GitHub

    wget https://github.com/ethereum/staking-deposit-cli/releases/download/v2.7.0/staking_deposit-cli-fdab65d-linux-amd64.tar.gz
    tar xf staking_deposit-cli-fdab65d-linux-amd64.tar.gz
    cd staking_deposit-cli-fdab65d-linux-amd64
    
  2. 启动生成指令

    ./deposit new-mnemonic --num_validators 1 --chain mainnet --eth1_withdrawal_address <你的ETH钱包地址>
    

!!! 注意 !!!

请确保提款地址是在以太坊主网(ERC20)上的以太币(ETH)地址,以0x开头。你必须确保能够完全控制该地址,因为这将是未来提取质押本金的唯一凭证。一旦设置,提款地址将无法更改,因此请务必确保地址的所有权和准确性。

输入以上指令后,屏幕将显示:
在这里插入图片描述

接着屏幕会显示24个英文单词的助记词:
在这里插入图片描述

现在,建议你拿出一个笔记本,用笔和纸记录下这24个单词,不要仅仅保存在电脑上(强烈不建议)。记录完毕后敲回车键,程序将要求你再次输入这24个助记词。如果你成功输入,屏幕将会显示如下内容:
在这里插入图片描述

这说明助记词以及其对应的存款文件已经创建成功,程序将在当前目录创建一个 validator_keys 的子目录,

cd validator_keys
ll

将会发现类似这样的两个文件:

deposit_data-1697663140.json
keystore-m_12381_3600_0_0_0-1697663140.json

  • deposit_data-XXXXXXXXXX.json 文件,等一下我们将上传到启动器网页。

  • keystore-m_XXXXXXXXXX.json 将拷贝到我们的验证者客户端使用。

请注意:整个质押过程,这个步骤非常重要,请确保:

  1. 保证提款钱包地址无误,且在自己的控制范围内;

  2. 保证24助记词已经安全记录,且没有泄露的风险。

以上两项工作如果出错,可能会导致你无法取回32个ETH的本金。


可选步骤:测试从助记词还原存款文件

这是一个可选步骤,你可以略过这节,但为了安全起见,也可以进行一次测试,看看是否可以从这24个助记词中恢复出相应的存款文件。

你可以按照以下步骤操作:

首先,将 validator_keys 目录更名为备份目录 (例如 validator_keys_bak ), 可以使用以下命令:

mv validator_keys validator_keys_bak

然后,使用那之前定义的24个助记词还原密钥对。在此过程中,你还可以重新设置访问密码。这将帮助你确保你是否正确记录了助记词,并且知道如何从中恢复访问密码。

./deposit existing-mnemonic --num_validators 1 --chain mainnet --eth1_withdrawal_address <你的ETH钱包地址>

命令格式与创建的时候基本一样,只是参数变成了 existing-mnemonic

输入命令后,程序将显示:

  • Please enter your mnemonic separated by spaces (" ").

    (输入刚才生成的24个助记词,词与词之间用空格隔开)

  • Enter the index (key number) you wish to start generating more keys from.

    (输入0,因为我们刚才只创建了一个验证者节点,它的下标是0)

  • Create a password that secures your validator keystore(s).

    (输入一个密码,进行密码重置)

接下来,你可以使用 cat 命令来查看新生成的 deposit 文件和旧的 deposit 文件之间的区别,以确保一切正常。

首先看看 “反推” 出来的deposit文件:

cat ./validator_keys/deposit_data-1697664225.json。

PS: deposit_data 后面的时间戳有可能不一样,按你的实际为准

然后再来看看之前我们备份的原始 deposit 文件:

cat ./validator_keys_bak/deposit_data-1697663140.json

仔细观察两个 json 文件中的 pubkey 字段,如果发现两者是完全一致的。那么恭喜你已经完成了一个关键的安全性检查,确保新生成的 deposit 文件与旧的 deposit 文件具有相同的公钥字段(“pubkey”)。这是质押过程中非常关键的一步,以确保你可以在需要时正确访问你的验证者节点。接下来,你可以继续进行下一步操作。


回到质押启动网站

返回 https://launchpad.ethereum.org/zh 启动网站,点击【继续】

页面显示:
在这里插入图片描述

其实关于这个启动器网站,前面的所有步骤都是教程性内容,它们不会直接产生实际效果。如果你的浏览器意外重置或窗口关闭,只需重新访问该网址,然后一直点击【继续】​​按钮,即可回到这个页面。实际的质押和签约操作是在接下来的步骤中进行的。

将我们刚才生成的 deposi_data_XXXXXXXXX.json 文件上传到此处。

注意,请再次检查,确保上传了正确的存款文件!

点【继续】后,页面将会显示如下:
在这里插入图片描述

质押的最后一步是将你的 MetaMask 钱包与启动器链接,并确保你账户上拥有超过32ETH的存款,最好是32.001 ETH以考虑到 GAS 费用。确认一切准备就绪后,点击【继续】​​和​​【确认存款】,恭喜你加入以太坊 PoS 验证者的大家庭!


确认存款

当32ETH已存入并准备好进行验证时,需要等待约3到10分钟,期间需要2048个验证者来完成验证并正式上链。你可以打开以下网站进行查询:

https://mainnet.beaconcha.in/

在搜索栏中输入你的公钥(PublicKey),然后点击搜索即可。

如果不记得如何找到你的公钥,打开 deposit_data_XXXXXXXXX.json 文件,并查找 pubkey 字段。
在这里插入图片描述

如果你的存款文件已经正式上链,网站将会显示如下内容:

在这里插入图片描述

出现这个页面表示你的质押存款已经支付正确,接下来将会进入Pending期等待节点的正式启动。Pending期的时长会根据整个以太坊质押者的参与程度而不同,如果参与的人数较多,等待时间可能会较长。在这个等待期间,我们有时间来讨论一些关于质押节点的其他内容。


运行验证者(Validator)客户端

一旦我们成功质押了32ETH并创建了存款文件,我们便可以启动验证者客户端。

实际上,你随时可以启动验证者客户端,而不必等到质押32ETH之后。然而,请注意,在尚未进行质押之前,运行一个未质押的 “空验证者” 将不会获得任何权益或奖励。需要特别注意的是,即使是那些已经质押了32ETH但尚未真正激活(Active)的 “Pending” 节点也不会获得任何奖励。

现在,让我们回到Prysm客户端,首先使用其附带的validator程序导入我们的存款文件:

/home/rockage/Downloads/prysm/dist/validator-v4.1.1-linux-amd64 accounts import \
    --keys-dir=/home/rockage/Downloads/staking_deposit-cli-fdab65d-linux-amd64/validator_keys

参数说明:

  • keys-dir:指定存款文件的位置,即刚才生成的deposit_XXXX.json和keystore-m_XXXXX.json文件所在目录。

输入上述指令后,程序将显示:

在这里插入图片描述

Prysm 设计了一个隔离机制,我们需要一个单独的目录来存放Prysm ”钱包“ 数据,这个钱包数据与原始的存款文件是彼此独立且互不干涉的。此外,这个钱包还有一个独立于存款文件密码的密码。Prysm 的做法可能显得有些繁琐,但出于安全考虑,这种分离可以提高你的资产安全性。在这里,“存款文件密码”是指你在最开始创建存款文件时设置的密码,而“钱包密码”是指在运行Prysm验证者客户端时所需的密码。


钱包导入完毕后,可以使用这条指令启动验证者客户端:

/home/rockage/Downloads/prysm/dist/validator-v4.1.1-linux-amd64 \
    --wallet-dir=/home/eth2/prysm/wallet \
    --wallet-password-file=/home/eth2/prysm/wallet/passwd.txt \
    --suggested-fee-recipient=0x066e4335384FF37dE0F2E08aCD1dc3c266B9D635

参数说明:

–wallet-dir:这是在前一步中为 Prysm 设置的“钱包目录”;

–wallet-password-file : 你需要指定一个明文文件,其中包含你在前一步创建的“钱包密码”。

如果不指定这个参数,程序每次启动都会要求你手动输入钱包密码。

–suggested-fee-recipient: 一个以太坊钱包地址,用于接收 mev 小费奖励。


输入以上指令后,即启动了 Prysm 验证者客户端,它的日志更新频率相对较低,如果程序正常运行,日志会在约5分钟左右一次显示如下信息:

time="2023-12-01 01:46:51" level=info msg="Submitted new attestations" AggregatorIndices=[] AttesterIndices=[925694] BeaconBlockRoot=0x5cc9a9034b9e CommitteeIndex=31 Slot=7878532 SourceEpoch=246203 SourceRoot=0x6f078af761e0 TargetEpoch=246204 TargetRoot=0x4118529eb0f2 prefix=validator

这行日志描述了节点已经成功地提交了新的证明(attestations),其中包括一些与验证相关的信息,如委员会索引(CommitteeIndex)、槽号(Slot)、源时期(SourceEpoch)、目标时期(TargetEpoch)等。出现这些信息,说明你的整个节点,包括你的执行层、共识层、验证者客户端等都处于正常工作状态。


另外,你还可以访问 https://mainnet.beaconcha.in/

输入你的公钥,如果显示如下所示,表示正常。如果显示黄色的 “Missed” 字样,说明你的节点存在问题,将会受到怠工惩罚,需要及时修复。

在这里插入图片描述


防火墙设置

由于本文使用的操作系统是 RockyLinux 9 (兼容Centos 9) ,从 Centos 8 开始常用的 iptables 工具就已经开始逐渐退出历史舞台,因此在这里我们采用新款的 nftables 来完成这个简单的防火墙设置。

你可以通过修改 nftables 默认防火墙规则,来放行 TCP 的 30303 和 13000 端口,以及 UDP 的 12000 端口。具体操作如下:

nano /etc/sysconfig/nftables.conf

flush ruleset
table inet filter {
        chain input {
                type filter hook input priority 0; policy drop;
                ct state established,related accept
                ct state invalid drop
                iif lo accept
                ip protocol icmp icmp type { destination-unreachable, router-solicitation, router-advertisement, time-exceeded, parameter-problem } accept
                ip protocol igmp accept
                #放行端口:22/SSH(如果需要) 21/FTP(如果需要) 30303/ETH1 13000/ETH2 12000/ETH2
                tcp dport { 22, 21, 30303, 13000} accept
                udp dport { 12000 } accept
        }
        chain forward {
                type filter hook forward priority 0; policy drop;
        }
        chain output {
                type filter hook output priority 0; policy accept;
        }
}

存盘退出后,执行以下命令:

让脚本生效:nft -f /etc/sysconfig/nftables.conf
查看是否生效:nft list ruleset (如果显示的内容和上面的脚本一致,说明生效成功)
最后输入:systemctl enable nftables (确保 nftables 本身是可以自行启动的)


服务设置

如果在命令行下执行这三个客户端并且都已经运转正常,我们可以考虑将他们定义为系统服务,这样的好处是计算机重启之后不再需要手工输入命令行,程序将自动运行。
为了简单起见,我们将服务名设定为:
ETH1 = Nethermind 执行层客户端
ETH2 = Prysm 共识层客户端
Validator = Prysm 验证者客户端
下面编辑ETH1(执行层)服务文件:

nano /usr/lib/systemd/system/eth1.service

输入以下内容后存盘退出:

Description=Nethermind Service (Mainnet)
Wants=network.target
After=network.target

[Service]
User=rockage
Group=rockage
Type=simple
Environment="DOTNET_ROOT=/home/rockage/.dotnet"
ExecStart=/home/rockage/Downloads/nethermind-git/nethermind/src/Nethermind/Nethermind.Runner/bin/Release/net7.0/nethermind \
    --JsonRpc.JwtSecretFile=/home/rockage/jwt.hex \
    --JsonRpc.Enabled true \
    --datadir /home/eth1/nethermind
ExecStop=killall nethermind && killall dotnet

[Install]
WantedBy=multi-user.target

将ExecStart后面的路径替换为你 Nethermind 执行层客户端的可执行文件的实际路径,将 rockage 替换为你的用户名。然后保存并关闭编辑器。

参数说明:

Environment : 表示该启动脚本需要的系统变量

注意:Linux的服务脚本不共享系统变量,全都需要单独设置。

ExecStart:启动 Nethermind 的指令,与我们在命令行下输入的完全一致(此处注意将我的路径修改成你自己的即可)

ExecStop:停止运行 Nethermind 的指令,此处我们就简单的用 killall 处理一下即可。


下面编辑ETH2 (共识层)服务文件:

nano /usr/lib/systemd/system/eth2.service

输入以下内容后存盘退出:

[Unit]
Description=Beacon-chain-v4 Service (Mainnet)
Wants=network.target
After=network.target

[Service]
User=rockage
Group=rockage
Type=simple
ExecStart=/home/rockage/Downloads/prysm/dist/beacon-chain-v4.1.1-linux-amd64 \
    --datadir=/home/eth2/prysm \
    --execution-endpoint=http://localhost:8551 \
    --jwt-secret=/home/rockage/jwt.hex \
    --suggested-fee-recipient=0x066e4335384FF37dE0F2E08aCD1dc3c266B9D635 \
    --http-mev-relay=http://127.0.0.1:18550
ExecStop=killall beacon-chain-v4

[Install]
WantedBy=multi-user.target

这个文件没有太多可说的,ExecStart 启动指令跟我们在命令行时使用的完全一样。


最后编辑Validator (验证者客户端) 服务文件:

nano /usr/lib/systemd/system/validator.service

输入以下内容后存盘退出:

[Unit]
Description=validator-v4.1. Service (Mainnet)
Wants=network-online.target
After=network-online.target

[Service]
User=rockage
Group=rockage
Type=simple
ExecStart=/home/rockage/Downloads/prysm/dist/validator-v4.1.1-linux-amd64 \
    --wallet-dir=/home/eth2/prysm/wallet \
    --wallet-password-file=/home/eth2/prysm/wallet/passwd.txt \
    --suggested-fee-recipient=0x066e4335384FF37dE0F2E08aCD1dc3c266B9D635 \
    --enable-builder
ExecStop=killall validator-v4.1.

[Install]
WantedBy=multi-user.target

三个文件都创建完毕后,通过以下指令验证是否安装成功:

systemctl daemon-reload

systemctl start eth1
systemctl start eth2
systemctl start validator

然后输入:

systemctl status eth1
systemctl status eth2
systemctl status validator

如果Active 是绿色的 running,表示服务运行成功。
在这里插入图片描述

如果总是报错,可以尝试使用以下三个指令分析完整的运行日志:

sudo journalctl -fu eth1
sudo journalctl -fu eth2
sudo journalctl -fu validator

最后,如果三个服务都运行正常,使用以下指令将其写入系统服务中,这三个程序以后将会自动运行:

systemctl enable eth1
systemctl enable eth2
systemctl enable validator

后记

在搭建以太坊PoS验证者节点的旅程中,我们窥见了区块链技术的奥秘,并将家用电脑转化为参与以太坊生态的一部分。尽管过程有点复杂,但这个节点代表了去中心化理念的一小步。当然,作为验证者是并非纯义务的,而是有年化奖励的(尽管这个利息现在真的不高啊😓)。但无论如何,搭建验证者节点都是一个令人兴奋和有意义的冒险,通过学习和实践,我们还是能学会不少知识,且还为自己创造了机会,尽管这个机会可能远在天边,哈哈哈。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐