本文详细介绍了如何从技术角度设置和运行一个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基金会服务器计划旨在让验证者运营者更容易从数据中心运营商租用硬件。在这里了解更多。
为了帮助去中心化网络,你可能希望考虑ASNs和那些尚未有很多Solana节点或委托的城市。一些委托池和SFDP将根据ASNs和城市的去中心化程度给予你奖励。
当前顶级的数据中心可以在这里找到。
非常推荐在本地安装工具,以便你可以生成所有必要的密钥并将撤回密钥保留在验证者服务器之外。安装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
开头,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
多重签名是特定类型的钱包,其中需要一个或多个其他钱包的签名才能执行交易,可用于在多个人之间共享投票账户的管理权。即使你自己管理验证者,你仍然可能希望考虑使用多重签名,以便 later easily add others to the vote account.
Squads是一个适用于Solana的多重签名工具,具有专门用于管理共享验证者的功能。要在Squads中设置验证者:
solana vote-account
验证更新后的撤回公钥关于使用Squads进行共享验证者管理的更多信息可以在这里找到。
你的步骤将根据你计算机的起始状态而有所不同,但目标是最终获得:
sol
服务用户确保你的系统是最新的,并创建sol
服务用户:
代码
$ sudo apt update
$ sudo apt upgrade
$ sudo adduser sol
你可能还想给予sudo
访问权限(这在便利性与安全性之间权衡):
代码
$ sudo adduser sol sudo
将Solana实验室推荐的设置添加到sysctl
和systemd
中,以增加对文件描述符、内存映射文件等的限制。当你的验证者是当前或即将出现的区块领导者时,整个网络将尝试与其建立连接并向其发送交易,因此文件描述符限制尤为重要。
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
重复上述步骤在验证者服务器上作为sol
用户安装Solana CLI。为验证者服务器安装时,强烈建议从源代码构建。
如果你使用Solana安装工具,可以使用solana-install
命令对新版本进行未来的更新(你必须这样做才能继续参与该集群)。
Jito Labs已分叉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-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。这些类型的解决方案通常是在你的服务器上运行守护进程,监控日志和本地指标并将其导出到提供商,或者通过使getHealth
或类似状态端点可用来允许提供商远程轮询你的验证者。
Solana网络通过 权益证明(PoS)投票过程达成共识,这意味着验证者的投票权重与委托给它的SOL数量成正比,类似于股份公司的运作机制(如果将委托的SOL视为股份的话)。除了投票,你的验证者成为区块领导者的频率也与委托给它的SOL数量成正比。
有许多钱包、DApp和其他工具可以很轻松地将你的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 "世界上最好的验证者!"
当元数据记录创建时,它将拥有自己的密钥,可以稍后使用--info-pubkey
参数更新。请注意,图标URL最大长度为80个字符。有关发布验证者信息和元数据的更多信息可以在这里找到。
恭喜你!如果你跟随并完成了上述步骤,你应该已经搭建好了自己的Solana验证者。欢迎加入Solana验证者社区!
- 原文链接: helius.dev/blog/how-to-s...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!