新消息:Helius 收购 Light Protocol
如何设置 Solana 验证节点
博客/开发

如何设置 Solana 验证节点

软件工程师LinkedIn 上的 John Sloboda
阅读需 19 分钟

本文将从技术角度重点介绍如何启动并运行 Solana 主网验证节点。我们会设置工具和配置,让日常运维更轻松,但不会涉及更高级的验证节点运维。此外,本文也不会讨论运行验证节点的经济效益,例如吸引质押和申请补贴。顺带一提,有意运行验证节点的人可以使用 Cogent Crypto 的验证节点收益计算器,估算验证节点在特定假设情景下的收益。

本文假设你熟悉 Linux 的基本系统管理。运行验证节点不要求你是程序员或系统管理专家,但你需要能够熟练地在终端中执行命令、编写基础 shell 脚本以及处理配置文件。

如果你不太了解 Linux 系统管理,但想进一步学习,可以从许多优秀资源入门,例如 Linux Journey。

术语:什么是 Solana 验证节点?

Solana CLI 工具套件包含 solana-validator 二进制文件,可以:

  • 连接到 Solana 集群,并同步当前集群状态
  • 生成、接收和共享快照及其他集群数据,以保持数据最新
  • 通过投票验证新区块,参与集群共识
  • 处理传入的交易并生成新区块
  • 提供 RPC 和事件驱动型 API,以便查询集群数据和提交新交易

Solana 验证节点也可以称为客户端(因为它会连接验证节点网络并请求数据)、服务器(因为它会处理其他验证节点的请求并向其提供数据)或节点。

RPC 节点是一种未质押、不参与投票的 Solana 验证节点,负责跟踪网络中的所有信息。这意味着它只响应数据请求,不参与共识。

“Solana 验证节点”一词也可以指 Solana 生态系统中运行已质押、参与投票的 Solana 验证节点并参与共识的实体。

你可以在这里进一步了解 RPC、RPC 提供商和验证节点之间的区别。

开始准备:获取服务器硬件

你需要一台专门用于运行验证节点的高性能计算机。如果想同时在测试网和主网上运行验证节点,还需要第二台。目前的最低建议配置为 12 核/24 线程、256GB RAM、2 块 1TB SSD(最好采用 RAID0)以及 10GB 网络连接。有关硬件要求的更多详情,请参阅此处。

如果你想通过只在主网上运行节点来节省成本,请注意:你必须运行测试网验证节点,才有资格参与 Solana Foundation Delegation Program(SFDP)。

你可以自行购买和运维硬件,也可以向数据中心提供商租用硬件(我们推荐 TeraSwitch)。你也可以向云计算提供商租用,但我们不建议这样做,因为费用往往过高,也更容易出现性能问题。Solana Foundation Server Program 旨在帮助验证节点运营者更轻松地向数据中心运营商租用硬件。点击此处了解详情。

为了帮助网络实现去中心化,你可以考虑选择尚未部署大量 Solana 节点或质押量较低的 ASN 和城市。一些质押池和 SFDP 会根据 ASN 和城市的去中心化程度提供奖励。

你可以在这里查看当前排名靠前的数据中心。

在本地安装 Solana CLI

强烈建议在本地安装这些工具,这样你可以在本地生成所有必要密钥,并让提款密钥远离验证节点服务器。有关如何在本地设置 Solana CLI 的说明,请参阅此处。

在本地命令行中可以使用这些工具后,将其默认配置为指向测试网:

代码
$ solana config set --url https://api.testnet.solana.com

对于主网,可以指向以下默认端点:

代码
$ solana config set --url https://api.mainnet-beta.solana.com

公共主网端点经常因请求过多而饱和。如果你对性能不满意,可以注册 Helius,并按如下方式使用你的 Helius 端点:

代码
$ solana config set --url https://mainnet.helius-rpc.com/?api-key=<YOUR-HELIUS-API-KEY>

设置和引导验证节点需要执行交易,因此你必须准备一个存有一些 SOL 的钱包。如果你刚开始设置测试网,可以使用以下命令创建默认钱包,并向自己空投一些 SOL:

代码
$ mkdir -p ~/.config/solana
$ solana-keygen new --outfile ~/.config/solana/id.json
$ solana airdrop 1 ~/.config/solana/id.json

强烈建议为测试网和主网使用不同的钱包。由于密钥格式相同,同一组密钥可以在两者上使用,但不要这样做。如果测试网和主网上存有资金的钱包使用相同密钥,很容易误在主网上执行原本用于测试网的命令。

点击此处进一步了解如何生成密钥,以及一些更安全的密钥生成方法。

设置投票账户

验证节点的投票账户通过 solana create-vote-account 命令和三个密钥对创建:

  1. 身份密钥对 — 验证节点使用此密钥对在网络中标识自身,并提交投票等交易。私钥必须存放在服务器上,因此最安全的做法是只保留支付投票交易所需的 SOL(约 1 SOL/天)。
  2. 投票账户密钥对 — 此密钥对对应投票账户本身,用于查询投票账户并向其委托质押。create-vote-account 命令只需使用私钥证明你拥有所需密钥。创建投票账户后,只会用到公钥。此密钥无法更改。
  3. 提款密钥对 — 此密钥对相当于投票账户的主密钥,用于提取奖励、更改身份密钥或提款密钥,以及执行其他账户操作。这是三个密钥对中最敏感的一个,不应在服务器上生成或复制到服务器。对于主网,建议为此密钥使用纸钱包、硬件钱包或多签。

创建密钥对

按如下方式为测试网创建密钥对:

代码
$ solana-keygen new -o identity.json
$ solana-keygen new -o vote.json
$ solana-keygen new -o withdraw.json

可选:为提款密钥使用纸钱包

纸钱包是写在纸上的 12 个(或 24 个)单词组成的短语。每当需要使用密钥签名时,再通过键盘输入。如果你不打算设置多签,它提供的额外安全性很适合主网提款密钥,因为该密钥拥有投票账户的根权限。运行以下命令:

代码
$ solana-keygen new --no-outfile

将显示的短语写在纸上。你可能还需要记下公钥、创建密钥时使用的确切命令以及 solana-keygen --version。请注意,将口令转换为私钥的方案不止一种。收好这张纸之前,请验证你能否用它访问密钥:

代码
$ solana-keygen verify <PUBKEY> ASK

绝对不要遗失写有密钥的纸张,因为没有其他方法可以恢复密钥。也别忘了从终端缓冲区中清除密钥短语。

可选:暴力生成投票账户的个性化密钥

一些验证节点会为身份密钥或投票账户密钥使用个性化公钥。例如,Helius 验证节点使用 HEL1USMZKAL2odpNBj2oCjffnFGaYwmbGmyewGv1e2TU 作为身份密钥,使用 he1iusunGwqrNtafDtLdhsUQDFvo13z9sUa36PauBtk 作为投票账户。你可以使用 grind 子命令生成此类密钥,如下所示:

代码
$ solana-keygen grind --starts-with PREF1X:1

此子命令会生成一个公钥以 PREF1X 开头的密钥,你可以指定任何有效的 base58 字符串。它会不断生成密钥,直到找到符合条件的密钥,因此所需时间会随着目标前缀长度呈指数级增长。

投票账户密钥无法更改,特别是在你公布该密钥且其他人开始向其委托质押之后。因此,如果想使用个性化密钥,现在就是生成它的时机。

使用密钥对创建投票账户

密钥对准备就绪后,按如下方式创建投票账户:

代码
$ solana create-vote-account --fee-payer ~/.config/solana/id.json vote_account.json identity.json withdrawal.json

这里,vote_account.json 是投票账户密钥对,identity.json 是验证节点身份密钥对,withdrawal.json 是提款权限密钥对,而 ~/.config/solana/id.json 是一个存有 SOL 的钱包,用于支付创建投票账户的费用。

如果提款密钥对使用纸钱包,命令可以如下所示:

代码
$ solana create-vote-account --fee-payer ~/.config/solana/id.json vote_account.json identity.json ASK

你可以使用以下命令检查该投票账户(或任何投票账户):

代码
$ solana vote-account <PUBKEY>

此时,运行验证节点服务器需要身份密钥对;提款密钥对必须保密,并且只能用于投票账户提款和变更;投票账户密钥对则不再需要(但不要忘记公钥)。

你可以在这里进一步了解投票账户。

可选:设置佣金

create-vote-account 将佣金作为可选参数,但默认值为 100%,这意味着你的验证节点是私有的。如果想为主网验证节点吸引外部质押,你可能需要选择更低的佣金。

假设投票账户公钥为 <VOTE_ACCT_PUBKEY>,我们想使用已有资金的 id.json 钱包支付变更费用,提款密钥使用纸钱包,并想将佣金设为 8%,可以按如下方式操作:

代码
$ solana vote-update-commission --fee-payer ~/.config/solana/id.json <VOTE_ACCT_PUBKEY> 8 ASK

可选:添加多签

多签是一种特殊钱包,执行交易时需要一个或多个其他钱包签名,可用于让多人共同托管投票账户。即使由你独自管理验证节点,也可以考虑使用多签,以便日后轻松将其他人添加到投票账户。

Squads 是一款适用于 Solana 的多签工具,专门提供管理共享验证节点的功能。要在 Squads 中设置验证节点:

  1. 为浏览器设置受支持的 Solana 钱包插件,例如 Backpack
  2. 前往 Squads dApp
  3. 使用验证节点所需的成员和参数配置一个 squad
  4. 前往 Developers > Validators,并按照流程添加验证节点
  5. 系统会要求你粘贴提款私钥,该私钥将用于把现有提款密钥更改为 squad 的共享提款密钥
  6. 使用 solana vote-account 验证更新后的提款公钥

你可以在这里进一步了解如何使用 Squads 管理共享验证节点。

将计算机配置为验证节点服务器

具体步骤会因计算机的初始状态而异,但最终目标如下:

  • 安装并更新至 Ubuntu 的最新 LTS 版本
    • 其他 Linux 发行版(例如基于 Debian 的发行版)可能也能使用,但本文所有示例均假设使用 Ubuntu;与 Ubuntu 的差异越大,需要修改的命令就越多
  • 配置用户级 SSH 访问
  • 设置 sol 服务用户
  • 完成系统调优和硬盘设置

设置系统和用户

确保系统为最新版本,并创建 sol 服务用户:

代码
$ sudo apt update
$ sudo apt upgrade
$ sudo adduser sol

你可能还想授予 sudo 访问权限(这会牺牲部分安全性来换取便利):

代码
$ sudo adduser sol sudo

系统调优

将 Solana Labs 建议的设置添加到 sysctl 和 systemd,以提高允许的文件描述符、内存映射文件等数量上限。当你的验证节点成为当前或下一任区块领导者时,整个网络都会尝试打开连接并向其发送交易,因此文件描述符限制尤其重要。

点击此处查看 Solana Labs 最新建议的系统调优设置。

硬盘配置

Solana Labs 当前建议准备 2 块 1TB 以上的物理 SSD,一块用于账户数据,另一块用于账本数据(操作系统也可以位于这块硬盘上)。由于 IOPS 很高,他们不建议将账户数据和账本数据放在同一块硬盘上。

这是他们关于如何设置两块硬盘的指南。

另一种利用多块硬盘提高可用 IOPS 的方法,是将它们配置为一个 RAID0 卷,并让 RAID 控制器优化条带在各硬盘上的存储位置,从而最大限度发挥两块硬盘的 IOPS 容量。如果需要,这种方式还可以向 RAID 添加更多硬盘,进一步提高 IOPS。我们使用此配置运行验证节点时尚未遇到任何性能问题。

如果使用单个 RAID0 卷,只需在该卷上设置验证节点数据目录。可以直接在 sol 用户的主目录下完成:

代码
$ sudo su sol
$ mkdir -p /home/sol/accounts
$ mkdir -p /home/sol/ledger
$ mkdir -p /home/sol/snapshots
$ mkdir -p /home/sol/logs

在验证节点服务器上安装 Solana CLI

重复上述步骤安装 Solana CLI,但这次要在验证节点服务器上以 sol 用户身份安装。在验证节点服务器上安装时,强烈建议从源代码构建。

如果使用 Solana 安装工具,今后可以通过 solana-install 命令升级到新版本(你必须及时升级,才能继续参与集群)。

可选:安装 Jito 验证节点客户端

Jito Labs 分叉了 Solana 验证节点并发布了自己的版本,加入了最大可提取价值(MEV)功能。MEV 是指在你创建的区块中添加交易或调整交易顺序,从而获利。Jito 为愿意支付溢价来执行此操作的人(“搜索者”)创建了一个市场。如果运行 Jito 验证节点,他们会向你发送 MEV 交易捆绑包,让验证节点将其纳入所创建的区块,以换取额外小费。

Jito 验证节点会增加验证节点运维的复杂度和延迟,但也会增加 MEV 小费这一额外收入来源。配置基本相同,但你还需要额外了解:

  • 收取和管理 MEV 小费
  • Jito 区块引擎带来的延迟
  • 可能需要运行 Jito 中继器

你可以在这里找到安装 Jito 验证节点客户端的说明。

创建验证节点运行脚本

创建 validator.sh Shell 脚本

首先,将验证节点身份密钥对复制到远程服务器:

代码
$ scp identity.json remoteuser@your.validator.host:/home/sol

管理验证节点配置的标准方法是将其封装在 shell 脚本中。创建一个初始脚本,并赋予其执行权限:

代码
$ sudo su sol
$ cat >/home/sol/validator.sh <<EOF
#!/bin/bash
PATH=/home/sol/.local/share/solana/install/active_release/bin:$PATH
exec solana-validator \
    --identity /home/sol/identity.json \
    --vote-account <VOTE_ACCOUNT_PUBKEY> \
    --known-validator 5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on \
    --known-validator 7XSY3MrYnK8vq693Rju17bbPkCN3Z7KvvfvJx4kdrsSY \
    --known-validator Ft5fbkqNa76vnsjYNwjDZUXoTWpP7VYm3mtsaQckQADN \
    --known-validator 9QxCLckBiJc783jnMvXZubK4wH86Eqqvashtrwvcsgkv \
    --only-known-rpc \
    --log /home/sol/logs/solana-validator.log \
    --accounts /home/sol/accounts \
    --snapshots /home/sol/snapshots \
    --ledger /home/sol/ledger \
    --rpc-port 8899 \
    --dynamic-port-range 8000-8020 \
    --entrypoint entrypoint.testnet.solana.com:8001 \
    --entrypoint entrypoint2.testnet.solana.com:8001 \
    --entrypoint entrypoint3.testnet.solana.com:8001 \
    --expected-genesis-hash 4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY \
    --wal-recovery-mode skip_any_corrupted_record \
    --limit-ledger-size
EOF
$ chmod +x /home/sol/validator.sh

这些设置适合在测试网上快速、安全地启动运行。一切设置完成后,你需要返回此脚本并运行 solana-validator --help,查看完整的配置选项列表并进行自定义。

尝试使用脚本启动验证节点:

代码
$ ./validator.sh

首次启动时,它需要追赶并同步到集群的当前状态。

验证节点是否正常运行

你可以在集群中的任何位置使用以下命令,查看自己或任何其他验证节点对外可见的进度:

代码
$ solana catchup <IDENTITY_PUBKEY>

你也可以在会话中以 sol 用户身份,通过以下命令查看其内部进度:

代码
$ solana-validator --ledger /home/sol/ledger monitor

有关如何检查验证节点是否正确连接集群的更多信息,请参阅此处。

将验证节点设置为守护进程

创建 systemd unit 文件,以守护进程方式管理验证节点:

代码
$ sudo cat >/etc/systemd/system/sol.service <<EOF
[Unit]
Description=Solana Validator
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=1
User=sol
LimitNOFILE=1000000
LogRateLimitIntervalSec=0
ExecStart=/home/sol/validator.sh

[Install]
WantedBy=multi-user.target
EOF

确保之前调用的 ./validator.sh 已停止运行,然后将验证节点作为守护进程启动:

代码
$ sudo systemctl daemon-reload
$ sudo systemctl enable --now sol

设置监控和安全措施

禁用密码身份验证

在 /etc/ssh/sshd_config 文件中,可以将 SSH 守护进程设置为不接受密码或质询-响应登录方式:

代码
...
PasswordAuthentication no
ChallengeResponseAuthentication no
...

别忘了使用新配置重新加载 sshd 守护进程:

代码
$ sudo systemctl reload sshd

添加 fail2ban 和 ufw

fail2ban 开箱即用,可以封禁多次身份验证失败的任何连接:

代码
$ sudo apt install fail2ban

ufw 是系统自带的防火墙,只需几条命令即可完成设置(假设最终的验证节点配置使用默认端口和端口范围,并在端口 22 上托管 SSH):

代码
$ sudo ufw allow 22/tcp
$ sudo ufw allow 8000:10000/tcp
$ sudo ufw allow 8000:10000/udp
$ sudo ufw enable

验证节点身份密钥对

实践中,大多数验证节点会将身份密钥保存在验证节点服务器上,以便验证节点脚本无需人工干预即可运行和重启。不过,也可以使用 ASK 或 prompt:// 将身份密钥传入验证节点,这样就不必将其保存在验证节点服务器的文件系统中。这样做会增加运维负担和风险,因为现在需要由人工代替 systemd 手动管理守护进程,但这种方式确实可行。

保护身份密钥对的最佳策略是仅存入足以支付几天投票费用的最低 SOL 数量。

Shinobi Systems 发布了一些用于管理投票账户的工具,其中包括无需每次使用提款密钥,即可自动从投票账户转出余额的功能。

有关更多建议,请参阅 Solana Labs 的验证节点安全页面。

使用 Watchtower 设置监控

Solana CLI 工具包中包含 solana-watchtower,可用于在验证节点和整个集群出现问题时发出警报。你可以创建 watchtower.sh 脚本,以类似验证节点本身的方式配置和运行它。

以下示例使用 PagerDuty 发送警报,并将日志写入 watchtower.log:

代码
$ cat >watchtower.sh <<EOF
#!/bin/bash
PATH=/home/solana/.local/share/solana/install/active_release/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

exec &gt;>watchtower.log \\
  env PAGERDUTY_INTEGRATION_KEY=<PAGERDUTY_KEY> \\
solana-watchtower \\
  --validator-identity <IDENTITY_PUBKEY> \\
  --monitor-active-stake \\
  --interval 20 \\
  --minimum-validator-identity-balance 3 \\
  --url https://api.testnet.solana.com
EOF

Solana Labs 还提供了一个使用 Telegram 设置警报的示例。

不建议在运行验证节点的同一台计算机上设置 watchtower,因为如果整台计算机宕机,你将无法收到通知。不过,如果已经设置多种监控方式,并能单独监控此类情况,也可以这样做。

与验证节点不同,watchtower 不需要大量资源,可以在 AWS 或 GCP 等提供的云计算或无服务器计算环境中运行。

可选:社区监控

Solana 社区中也有很多人监控集群,并愿意根据与 watchtower 类似的条件提供警报。

Stakewiz 为 Solana 验证节点提供基于 Telegram 的监控。例如,如果想为 Helius 验证节点设置警报,可以前往其页面,然后点击“+ 创建警报”。

请注意,社区监控旨在帮助用户了解其质押对象验证节点的问题。作为验证节点运营者,你不应完全依赖他人监控自己的服务。

可选:通过 getHealth RPC 方法进行自定义监控

如果想直接从源头了解验证节点的健康状况,验证节点的 JSON RPC 接口提供名为 getHealth 的方法。你可以轮询该方法,了解验证节点是否健康以及任何问题的相关信息。

可选:第三方监控解决方案

当验证节点扩展到一定规模,并且需要保护收入来源时,可以考虑 Datadog 或 Splunk 等商业级 SaaS 监控解决方案。这类解决方案通常采用以下两种方式之一:在服务器上运行守护进程,在本地监控日志和指标并将其导出给提供商;或者开放 getHealth 或类似的状态端点,让提供商远程轮询验证节点。

为验证节点添加质押

Solana 网络通过权益证明(PoS)投票流程达成共识。这意味着验证节点的投票权重与委托给它的 SOL 质押量成正比。如果将质押的 SOL 视为股份,这类似于股份制公司的运作方式。除投票外,验证节点成为区块领导者的频率也与质押给它的 SOL 数量成正比。

许多钱包、dApp 和其他工具都能让你轻松地将 SOL 质押给现有验证节点,但以下是使用 CLI 手动操作的步骤:

  1. 使用 solana-keygen new 创建 3 个密钥对
  2. 使用 solana create-stake-account 从密钥对创建质押账户
  3. 将一些 SOL 转入质押账户(测试网可以使用 solana aidrop)
  4. 使用 solana delegate-stake 将存入的质押委托给验证节点
  5. 等待下一个 epoch 使质押激活,并使用 solana stake-account 检查状态

创建密钥对和质押账户

创建密钥对和质押账户的流程与创建投票账户类似,所需的 3 个密钥对如下:

  1. 质押权限密钥对 - 允许对质押账户执行委托、取消委托、拆分和合并等操作
  2. 质押账户密钥对 - 用于标识质押账户本身的公钥(创建质押账户后不再需要私钥)
  3. 提款密钥对 - 用于提取质押并重置质押账户权限密钥对的主密钥对。请妥善保管,并考虑使用硬件钱包、纸钱包或多签

出于与投票账户相同的原因,强烈建议为测试网和主网使用不同的密钥。不过,在同一集群内,可以为多个质押账户重复使用同一个质押权限和提款权限密钥对。质押账户必须使用相同密钥才能合并。

以下示例演示了如何在测试网上创建一个含 1 SOL 的质押账户:密钥对使用基于文件的钱包,通过 id.json 钱包为其注资,并将该质押委托给你的新验证节点:

代码
$ solana-keygen new -o stake_auth.json
$ solana-keygen new -o stake_acct_1.json
$ solana-keygen new -o stake_withdrawal_auth.json
$ solana airdrop 1 ~/.config/solana/id.json
$ solana create-stake-account --from ~/.config/solana/id.json stake_acct_1.json 1 --stake-authority stake_auth.json --withdraw-authority stake_withdraw_auth.json --fee-payer ~/.config/solana/id.json
$ solana delegate-stake --stake-authority stake_auth.json <STAKE_ACCT_1_PUBKEY> <VOTE_ACCT_PUBKEY> --fee-payer ~/.config/solana/id.json

现在,你可以检查质押是否正在激活,以及将在哪个 epoch 激活:

代码
$ solana stake-account <STAKE_ACCT_1_PUBKEY>

下一个 epoch 开始且质押激活后,验证节点的投票将开始计入,你可以在 solana vote-account 命令的输出中查看最近投票。如果像示例中一样只添加了几个 SOL,不要指望验证节点成为区块领导者。

投票每天大约需要 1–2 SOL,因此在本文撰写时,仅在主网上投票就会让验证节点每天花费约 200–300 美元。

(有关质押委托和管理质押账户的更多信息)。

发布验证节点信息

如果你浏览 validators.app 等常见的 Solana 验证节点目录,会发现所有验证节点都有名称、描述、徽标和其他元数据。这些数据会在链上发布,适用于各集群中所有已注册的验证节点,你可以运行 solana validator-info get 查看这些数据。

验证节点启动并正常运行后,你可能需要发布相关信息,特别是在主网上运行并尝试吸引质押时。

以下是发布元数据的基本示例:

代码
$ solana validator-info publish "My Awesome Validator" \
--website "https://awesome-validator.xyz/" \
--icon-url "https://awesome-validator.xyz/icon360x360.png" \
--keypair validator_identity.json \
--details "The best validator in the world!"

创建元数据记录后,它会拥有自己的密钥,之后可以使用 --info-pubkey 参数进行更新。请注意,图标 URL 最多可包含 80 个字符。你可以在这里进一步了解如何发布验证节点信息和元数据。

总结

恭喜!如果你一直按照本文操作并完成了所有步骤,现在应该已经成功启动并运行自己的 Solana 验证节点。欢迎加入 Solana 验证节点社区!

其他资源

订阅 Helius

及时了解 Solana 开发的最新动态,并在我们发布新内容时收到更新