本文详细介绍了如何从技术角度设置和运行Solana主网验证器,包括硬件要求、Solana CLI的安装、密钥对的生成、投票账户的设置、机器配置、监控和安全设置等。文章还提供了一些额外的资源和工具,帮助用户更好地管理和优化验证器。
19 分钟阅读
2024 年 4 月 23 日
本文将重点从技术角度介绍如何启动一个 Solana 主网验证节点。我们将设置工具和配置,以便使持续操作变得更容易,但更高级的验证节点操作不在范围之内。同时,运行验证节点的经济学,包括吸引质押和申请补贴等主题,也不在本文范围之内。顺便提一下,那些有兴趣运行验证节点的人可以使用 Cogent Crypto 的验证节点利润计算器 来估算验证节点在特定假设场景下的收益。
本文假定读者对 Linux 的基本系统管理有一定了解。你不必是程序员或系统管理专家即可运行验证节点,但需要对在终端中运行命令、基本的 shell 脚本和配置文件工作感到舒适。
如果你对 Linux 系统管理不太了解但想了解更多,可以参考许多优秀的入门资料,例如 Linux Journey。
Solana CLI 工具套件包含 solana-validator
二进制文件,能够:
Solana 验证节点也可以称为客户端(因为它连接到验证节点网络并请求数据)、服务器(因为它处理来自其他验证节点的请求并提供数据),或者节点。
RPC 节点是一个未质押、非投票的 Solana 验证节点,用于跟踪网络的所有信息。这意味着它们仅响应数据请求,不参与共识。
“Solana 验证节点”一词也可以指 Solana 生态系统中的一个实体,它运行一个质押的、可投票的 Solana 验证节点并参与共识。
关于 RPC、RPC 提供者和验证节点之间区别的更多信息可以在 这里 查找。
你将需要一台专门用于运行验证节点的强大计算机,如果你希望同时在测试网和主网运行验证节点,还需要第二台计算机。目前,最低要求是 12 个核心/24 个线程、256GB RAM、2 个 1TB SSD 硬盘(理想情况下带有 RAID0),以及 10GB 的网络连接。有关硬件要求的详细信息可以在 这里 找到。
如果你想通过仅在主网运行来节省成本,请注意,你必须运行测试网验证节点以符合 Solana 基金会委托计划(SFDP)。
你可以自行购买和操作硬件,或从数据中心提供商租用硬件(我们推荐 TeraSwitch)。你也可以从云计算提供商处租用,但我们不推荐这样,因为这通常成本高昂且更容易出现性能问题。Solana 基金会服务器计划旨在使验证节点操作员更容易从数据中心运营商处租用硬件。 了解更多内容。
为了帮助 去中心化 网络,你可能希望考虑在尚未拥有许多 Solana 节点或质押的 ASN 和城市。某些质押池和 SFDP 将根据 ASN 和城市的去中心化奖励你。
目前的顶级数据中心可以在 这里 找到。
强烈建议本地安装工具,以便生成所有必要的密钥并将提款密钥保存在验证节点服务器之外。有关如何在本地设置 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
命令和三个密钥对创建:
create-vote-account
命令只需要私钥以证明你拥有所需的密钥。在投票账户创建后,仅需公钥。这无法更改。按如下方式创建测试网的密钥对:
代码
$ 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
截至写作本文时,ASK 和 prompt:// 占位符的密钥解码行为不同。请确保你知道哪个适用于你的密钥。
一定不要丢失写有密钥的纸张,因为没有其他方法可以恢复它。不要忘记清除终端缓冲区中的密钥短语。
部分验证节点使用个性化公钥作为身份或投票账户密钥。例如,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 中设置验证节点:
solana vote-account
验证更新后的提款公钥有关如何使用 Squads 进行共享验证节点管理的更多信息,可以在 这里 找到。
你的步骤会根据机器的起始点有所不同,但目标是使其最终成为:
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,只是这次以 sol
用户身份安装。建议在验证节点服务器上从源代码构建。
如果你使用 Solana 安装工具,可以使用 solana-install
命令对新版本执行未来更新(你必须这样做以继续参与集群)。
Jito Labs 已经 fork 了 Solana 验证节点并发布了自己的版本,增加了最大可提取价值(MEV)功能。MEV 是将或重新排序你创建的区块中的交易以获利的理念。Jito 创建了一个市场,供那些希望支付额外费用以做到这一点的人(“搜索者”)。如果你运行 Jito 验证节点,他们将向你的验证节点发送 MEV 交易捆绑,以便在其创作的区块中包含,为此需支付额外小费。
Jito 验证节点为你的验证节点操作增加了一些复杂性和延迟,但同时为 MEV 小费增加了额外的收入来源。其配置大体相同,但你还需要另外了解:
有关安装 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 单元
文件将其管理为守护进程:
代码
$ 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 开箱即用,可以禁止多次认证失败的连接:
代码
$ 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 页面获取更多验证节点安全提示。
solana-watchtower
包含于 Solana CLI 工具包中,可用于监视你的验证节点及其更广泛集群的问题并进行报警。其配置和运行可以类似于验证节点,通过创建一个 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 >>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 提供基于 Telegram 的 Solana 验证节点监控。例如,如果你希望根据 Helius 验证节点提供警报,你可以 导航到其页面,然后点击“+ 创建警报”。
请注意,基于社区的监控旨在让人们了解与其质押的验证节点的问题,作为验证节点操作员,你不应仅依赖他人来监控你的服务。
如果你想直接检查验证节点的健康状态,验证节点的 JSON RPC 接口有一个名为 getHealth 的方法,可以轮询你的验证节点是否健康及相关问题的信息。
一旦你的验证节点扩展且你有收入来源需要保护,你可能希望考虑商用级 SaaS 监控解决方案,例如 Datadog 或 Splunk。这些类型的解决方案通常通过在你的服务器上运行一个守护进程来允许本地监控日志和指标,并将这些数据导出到提供者,或者通过 NS 端点远程轮询你的验证节点的 getHealth
的方法。
Solana 网络通过 权益证明(PoS) 投票过程达成共识,这意味着验证节点的投票权重与委托给它的 SOL 质押量成正比,类似于股票公司将质押的 SOL 视为股份。除了投票外,你验证节点作为区块领导者的频率也与质押给它的 SOL 数量成正比。
有许多钱包、去中心化应用程序和其他工具可以轻松将你的 SOL 质押给现有的验证节点,但以下是通过 CLI 手动执行的步骤:
solana-keygen new
创建 3 个密钥对solana create-stake-account
从密钥对中创建一个质押账户solana airdrop
在测试网中执行)solana delegate-stake
将存入的质押委托给一个验证节点solana stake-account
检查状态创建密钥对和质押账户的过程与创建投票账户的过程类似,其中 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
<VOTE_ACCT_PUBKEY>
是指投票账户的地址,而不是验证节点身份!
现在你可以检查状态,以查看质押的激活情况及其将在哪个时代激活:
代码
$ solana stake-account <STAKE_ACCT_1_PUBKEY>
一旦下一个时代开始并且质押激活,你验证节点的投票将开始计算,你可以通过 solana vote-account
命令查看最近的投票。如果你像示例一样只添加了少量 SOL,请不要指望你的验证节点会成为区块领导者。
投票成本约为每天 1-2 SOL,因此截至本文写作,你的验证节点仅投票在主网上的费用约为 200-300 美元/天。
如果你浏览常见的 Solana 验证节点目录,如 validators.app,你会注意到所有验证节点都有名称、描述、徽标和其他元数据。这些数据会被在链上发布供每个集群的所有注册验证节点使用,并可以通过运行 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
参数更新。请注意,图标网址最大长度为 80 个字符。有关发布验证节点信息和元数据的更多信息可以在 这里 找到。
恭喜你!如果你跟着步骤走到这一点,你应该已经成功启动了自己的 Solana 验证节点。欢迎加入 Solana 验证节点社区!
- 原文链接: helius.dev/blog/how-to-s...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!