Cover photo

以太坊单独质押实战教程:手把手教你完成部署

post image

内容丨Ray

编辑 & 排版丨Yewlne、环环

以太坊的单独质押(Solo Staking)是保护网络安全和去中心化的黄金标准。通过运行自己的验证者节点,您可以直接参与网络共识,获得完整的质押奖励,并保持对资金的完全控制。本教程将为您提供详细的指导,帮助您在家中部署以太坊单独质押节点,确保安全性和稳定性。

前提概要

首先,我们需要有这样的一个基本概念:要处理来自执行层的传入验证器存款,您需要运行执行客户端以及共识客户端。这意味着我们至少需要部署两个客户端程序(在本教程中,为三个,共识客户端按照功能进行了拆分)。

post image
post image

如果想了解更多执行客户端和共识客户端的差异及功能职责,可以点击阅读:

https://ethereum.org/zh/developers/docs/networking-layer/

一、选择执行客户端

以太坊生态的客户端种类非常丰富,执行客户端和共识客户端都有多种不同语言的实现,如使用 Go 语言实现的 Geth, 使用 Rust 语言实现的 Reth 等。你可以根据自己喜好,选择不同的客户端,整体流程是类似的,只是不同客户端实现涉及的命令不同。在这里,我们不能对所有的客户端都面面俱到的给出部署教程,教程内选择的是 Reth 作为执行客户端(纯属个人喜好,不做性能最优保证)。

另外,教程选用了从源码编译的方式进行部署,实际上基本每个客户端都提供了基于 docker 的部署方式,你可以自行选择。不过个人推荐使用源码编译的方式进行,它有利于在遇到问题且文档没有提供有效帮助时,可以通过查看源代码来寻找问题产生的原因并解决问题。

1. 构建基础开发环境

1)build-essential

sudo apt install build-essential

2)gcc, g++, make, cmake, clang

sudo apt install gcc g++ make cmake clang

3)Rust

curl --proto '=https' --tlsv1.2 -sSf| sh

2. 从源码构建执行程序

1)下载 Reth 源代码

git clone <https://github.com/paradigmxyz/reth>cd reth

2)切换成 v1.1.1 版本

3)编译并安装 Reth 可执行程序

cargo install --locked --path bin/reth --bin reth

编译完成后,可以通过命令行以 reth 的形式访问二进制文件,并且该二进制文件存在于默认的 .cargo/bin 文件夹下。

3. 启动Reth

1)以全节点的方式运行Reth

reth node --full

执行输出如下:

post image

图中画红圈的三个路径可以留意一下。其分别代表:

  1. 区块数据存储目录

  2. Reth 的节点运行配置

  3. JWT 认证文件

其中 JWT 认证文件,在运行共识客户端时,也需要指定为这一个路径。

另外,当你停止程序运行时,你会看到这样一行输出:

^C2024-11-08T06:21:58.643464Z  INFO Wrote network peers to file peers_file="/root/.local/share/reth/mainnet/known-peers.json"

该文件记录当前发现的一些已知道节点,内容示例如下:

post image

2)启动 Holesky 测试网的节点

目前 Reth 从命令行级别直接支持的网络有:

其中 mainnet 为主网,holeskyETH Sepolia 测试网络,dev 为本地网络。

运行以下命令启动 holesky 测试网络的全节点:

/path/to/secret 记得更换为自己的路径。从reth的输出中,可以获取到jwt.hex的具体路径。reth node --full --chain holesky \  
--authrpc.jwtsecret /path/to/secret \     
--authrpc.addr 127.0.0.1 \     
--authrpc.port 8551 \ 
--metrics 127.0.0.1:9001

二、选择共识客户端

这里我们选择 Lighthouse 作为共识客户端,它同样使用 Rust 语言实现。

1. 构建基础编译环境

sudo apt update && sudo apt install -y git gcc g++ make cmake pkg-config llvm-dev libclang-dev clang 

其中部分软件包我们在安装执行客户端时,已经安装了,可以剔除。

另外,Rust 的开发环境也是必须的,不过我们在上面已经安装了,所以这里没有列出来。

2. 从源码构建执行程序

1)下载 Lighthouse 源代码

git clone https://github.com/sigp/lighthouse.git 
cd lighthousecargo install --locked --path bin/reth --bin reth 

2)切换为 stable 版本

3)编译

make

3. 启动 Lighthouse

Reth 一样,lighthouse 也支持多个网络,包含:

这里我们必须选择和执行客户端同样网络,才能使得两者正确的协同工作。

执行以下命令启动 lighthouse 并设置为 holesky 网络:

/path/to/secret 记得使用和reth一样的jwt.hex路径
lighthouse bn --network holesky \ 
--checkpoint-sync-url https://holesky.beaconstate.info \ 
--execution-endpoint http://localhost:8551 \ 
--execution-jwt /path/to/secret 

一旦共识客户端成功启动,在等待一小段时间后,在执行客户端 Reth 处,将看到类似日志:

post image

此时,正在进行检查点的同步操作。一段时间后,将有以下输出:

post image

这意味着 Reth 和 Lighthouse 协同成功。

三、配置 Reth 的指标监控(可选)

在前面,我们通过 --metrics 127.0.0.1:9001 参数,开启了 Reth 的指标监控功能。

可以通过:

来验证,是否成功开启以及功能是否正常。它会输出很多的指标数据,不过这对于观察来说并不友好。我们需要安装 Prometheus 和 Grafana 来协助我们降低观察难度。

1. 安装 Prometheus 和 Grafana

grafana 不在官方的默认仓库中,因此需要额外添加一下源,然后再安装:

sudo wget -q -O - <https://packages.grafana.com/gpg.key> | sudo apt-key add -
echo "deb <https://packages.grafana.com/oss/deb> stable main" | sudo tee -a /etc/apt/sou
rces.list.d/grafana.listsudo apt-get update
sudo apt install grafana

2.启动 prometheus

sudo systemctl start prometheus

设置配置文件 & 解决端口占用问题

这里可以使用 Reth 推荐的配置文件内容:

scrape_configs:
  - job_name: reth
    metrics_path: "/"    
scrape_interval: 5s    
static_configs:   
   - targets: ['reth:9001', 'localhost:9001', 'host.docker.internal:9001']  - job_name: ethereum-metrics-exporter    
metrics_path: "/metrics"    
scrape_interval: 5s    
static_configs:    
  - targets: ['metrics-exporter:9091']

并将该内容写入 /opt/prometheus.yml 文件中(路径可以自由调整,在 prometheus.service 文件中同步调整即可)。

prometheus 默认运行在 :9090 端口。如果该端口被占用,可以自行修改 systemd 的配置文件来调整端口。

比如我的 prometheus.service 文件路径为:

/lib/systemd/system/prometheus.service

在该文件的的 ExecStart 配置项中,添加:

--config.file=/opt/prometheus.yml --web.listen-address=:9095

即可将服务端口设置为 9095。之后重新加载 systemd,然后再启动服务即可。

3.启动 grafana

systemctl start grafana-server

grafana 的默认端口是 3000。再浏览器打开 ip:3000, 如果见到 grafana 页面就代表安装好了。

默认账号和密码都是 admin。登录后马上要求你改密码的。

1)添加刚才配置好的 Prometheus 作为数据源

操作路径为:Configuration -> Data Sources ->add data source -> Prometheus

post image
post image
post image

注意设置这个端口为上面配置的对应端口号。

2)配置仪表板

要在 Grafana 中配置仪表板,请单击左上角的方块图标,然后单击“新建”,然后单击“导入”。从那里,单击“上传 JSON 文件”,然后选择中的示例文件reth/etc/grafana/dashboards/overview.json

https://github.com/paradigmxyz/reth/blob/main/etc/grafana/dashboards/overview.json

最后,选择刚刚创建的 Prometheus 数据源,然后单击“导入”。

配置完成后的效果如下:

post image
post image

如果尚未连接到任何对等点,仪表板看起来将处于空状态,但一旦连接到对等点,您应该会看到它开始填充数据。

成为验证者

注意:需要准备 32 个 Holesky 网络的 ETH,才能完成下面的教程。

1.创建验证者密钥

以太坊基金会提供了用于创建验证者密钥的 staking-deposit-cli

https://github.com/ethereum/staking-deposit-cli/releases

需要根据你自己的机器平台,下载对应的软件。

然后运行以下命令:

./deposit new-mnemonic

并按照说明生成密钥。当提示选择网络时,选择 holesky 来运行 Holesky 测试网验证器。在此过程中将生成一个新的助记符。基本上按照提示操作即可,最终成功运行时会出现如图提示:

post image

重要提示:助记词(或种子短语)是在此过程中随机生成的 24 个单词的字符串。强烈建议记下助记词并离线保存。重要的是确保助记词永远不会以任何连接到互联网的数字形式(计算机、手机等)存储。还请对助记词进行一次或多次备份,以确保在数据丢失的情况下您的 ETH 不会丢失。保持助记词的私密性非常重要,因为它代表了您对 ETH 的最终控制权。

完成此步骤后,将创建文件 deposit_data-*.json 和 keystore-m_*.json。从 staking-deposit-cli 生成的密钥可以很容易地加载到第三步中的 Lighthouse 验证器客户端(lighthouse vc)中。事实上,这两个程序都是为相互配合而设计的。

顺便一提,在这个过程中会需要设置密码,这个密码需要记住,它在导入时需要输入。未来有不少操作,应该也需要用到这个密码。

2.启动 Reth 和 Lighthouse 并等待同步

启动的操作我们已经在上面完成了,主要是需要等待两个客户端之间的同步,并且需要追赶至主网最新高度。

3.将验证器密钥导入 Lighthouse

运行以下命令,将刚刚生成的密钥导入 Lighthouse。

lighthouse --network holesky account validator import --directory /root/nodes/staking_deposit-cli-fdab65d-linux-amd64/validator_keys

别忘记替换为自己的本机路径。

另外,不要将同一个验证者密钥同于不同的客户端,否则将会受到惩罚。

4.启动 Lighthouse 验证器客户端

导入密钥后,用户可以通过启动 Lighthouse 验证器客户端来开始执行其验证器职责:

lighthouse vc --network holesky --suggested-fee-recipient YourFeeRecipientAddress

别忘了将 YourFeeRecipientAddress 替换为你的收益接收地址。

当 lighthouse vc 启动时,检查验证者公钥是否出现作为 voting_pubkey,如下所示:

INFO Enabled validator       voting_pubkey: 0xa5e8702533f6d66422e042a0bf3471ab9b302ce115633fa6fdc5643f804b6b4f1c33baf95f125ec21969a3b1e0dd9e56

此日志出现(并且没有错误)后,lighthouse vc 应用程序 将确保验证人开始履行其职责并获得奖励 通过协议。

5.提交押金

成功运行并同步执行客户端、信标节点和验证器客户端后,您现在可以继续提交存款。转到主网质押启动板 

https://launchpad.ethereum.org/en/

或测试网验证器的Holesky 质押启动板

https://holesky.launchpad.ethereum.org/en/

并仔细完成成为验证器的步骤。准备就绪后,您可以通过向存款合约发送每个验证器 32 ETH 来提交存款。将步骤 1中生成的 deposit_data-*.json 文件上传到质押启动板。

6.完成质押启动板的CheckList

Checklist 链接

https://holesky.launchpad.ethereum.org/en/checklist/#section-three

请务必耐心的完成 CheckList, 这对于你的资产安全极其重要

7.查看验证者生效进度

提交成为验证者交易后,尽管交易执行成功了,但验证者并不是立刻生效的。他需要一段等待时间,通常为 16 小时~一周的时间。可以根据使用 deposit_data-*.json 中的 pubkey,在 beaconcha.in 上查询进度。示例:

https://holesky.beaconcha.in/validator/8168b57546614075587aa0e53698477d95c6ebdbbd953109b1305a0773f66307d2a455fe7d99b8c1e5d0507999ed0340#deposits

当等待期过了后,可以查看是否出于 Active 状态,出于 Active 状态即为成功。

post image

8.下一步的工作

验证器运行并履行职责后,保持验证器在线以继续累积奖励非常重要。但是,计算机、互联网或其他因素可能会出现问题,导致验证器离线。为此,最好订阅通知,例如通过beaconcha.in

https://beaconcha.in/

它将发送有关错过的证明和/或提案的通知。您将收到有关验证器离线状态的通知,并能够迅速做出反应。

下一件重要的事情是及时了解 Lighthouse 和执行客户端的更新。更新会不时发布,通常每月发布一到两次。对于 Lighthouse 更新,您可以通过点击订阅 Github

https://github.com/sigp/lighthouse

 Watch 上的通知。如果您只想收到新版本的通知,请选择 Custom,然后选择 Releases

您还可以加入 Lighthouse Discord

https://discord.gg/cyAszAh

我们会在有新版本发布时发布公告。

如果你还有兴趣,还可以尝试自己配置一个Siren

https://lighthouse-book.sigmaprime.io/lighthouse-ui.html

这是 Lighthouse 开发的用于监控验证器性能的 UI。

另外,验证者退出也有一个固定的流程,本教程尚未涉及,可以参考共识客户端的文档进行操作。异常的验证者退出流程可能导致资金损失,请务必仔细操作!

结束语

得益于以太坊客户端开发者的优秀工作,当你整体的跑了一遍教程,并进行了实际部署,你会发现,整个部署质押的流程并不复杂。欢迎尝试~~

另外,如果你想用于生产环境,请务必花费一些精力用于运维及监控的工作,它们对于保障你的资金安全非常重要(仅管单纯的离线惩罚非常低,但我想没有人会愿意接受莫名的损失)。配置好监控系统后,您不需要每天与它交互,只需要保持关注即可。祝您质押愉快!