Solana 如何配置 RPC 节点的 --full-rpc-api、--no-voting 与 --account-index 参数?
【免费下载链接】solanaWeb-Scale Blockchain for fast, secure, scalable, decentralized apps and marketplaces.项目地址: https://gitcode.com/GitHub_Trending/so/solana
Solana 的 RPC 服务器与共识验证者运行的是同一个进程,即solana-validator,二者的区别完全体现在启动参数上。如果你要部署一个对外提供 JSON RPC 服务的节点,就需要在启动脚本里正确配置--full-rpc-api、--no-voting和--account-index这几项参数。本文以 testnet 集群为例,给出官方文档中的完整启动脚本、--account-index的取值依据,以及节点启动后的验证命令。
适用前提(来自官方文档的明确说明):
- 软件环境为 Ubuntu 20.04,已在机器上安装 Solana CLI;
- 需要先按 Validator 设置指南 完成 CLI 安装、身份密钥、磁盘挂载和系统调优等前置步骤;
- RPC 节点不需要创建 vote account,也不参与投票,这是与共识验证者流程最大的区别。
三个参数分别解决什么问题
RPC 节点设置文档 对这几个参数的说明如下:
--full-rpc-api:在本验证者上启用全部 RPC 操作。不加这个参数时,节点只开放部分只读 RPC 接口。--no-voting:让验证者不参与共识投票。文档同时提醒:出于资源限制考虑,通常不希望同一个节点既当共识节点又当全功能 RPC 节点。--account-index:为账户构建内存索引,加速需要扫描整个账户集合的 RPC 请求(如getProgramAccounts和 SPL token 类请求)。随着链上已填充账户数量增长,这类请求可能性能变差,需要支持它们时才应开启。- 示例脚本中还包含
--private-rpc:不在solana gossip命令的输出中公布本节点的开放 RPC 端口。是否使用取决于你是否希望被 gossip 网络里的其他节点发现你的 RPC 端口。
更多参数细节文档建议查阅solana-validator --help命令。
准备工作
安装并配置 CLI
在可信本机安装 Solana CLI 后,用下面命令确认安装成功:
solana --version文档给出的示例输出(文档示例,实际版本可能不同):
solana-cli 1.14.17 (src:b29a37cf; feat:3488713414)然后把 CLI 指向目标集群,本文示例使用 testnet:
solana config set --url https://api.testnet.solana.com执行solana config get验证,输出中应出现RPC URL: https://api.testnet.solana.com这一行。
生成身份密钥
在可信本机上生成身份密钥对:
solana-keygen new -o validator-keypair.json注意:RPC 节点不需要vote-account-keypair.json,也不需要authorized-withdrawer-keypair.json,因此可以跳过验证者指南中创建 vote account、充值 SOL 和创建投票账户的整个章节。
磁盘与硬件
硬件要求文档 对 RPC 节点给出的建议如下:
- CPU:16 核 / 32 线程或更多(比共识验证者的最低要求更高);
- RAM:如果使用了
account-index,需要 512 GB 或更多; - 磁盘:Accounts 和 Ledger 不应存放在同一块盘上;如需保留更长的交易历史,考虑更大的 ledger 盘;
- 软件:官方构建和运行的平台是 Ubuntu 20.04,预构建二进制要求 CPU 支持 AVX2。
验证者设置指南中的磁盘准备流程(df -h检查空间、lsblk -f查看设备、mkfs -t ext4格式化、分别挂载到/mnt/ledger和/mnt/accounts)对 RPC 节点同样适用,照 setup-a-validator.md 中 "Hard Drive Setup" 一节操作即可。
系统调优(sysctl 的 UDP 缓冲区、vm.max_map_count、文件描述符上限等)在文档中被标注为"缺少这些设置验证者可能无法启动",因此属于必做项,命令见 validator-start.md 的 "System Tuning" 一节。
编写 validator.sh 启动脚本
在/home/sol/bin/下创建validator.sh并加上可执行权限:
mkdir -p /home/sol/bin touch /home/sol/bin/validator.sh chmod +x /home/sol/bin/validator.sh以下是官方文档给出的 testnet RPC 节点完整示例脚本。注意其中--identity指向/home/sol/validator-keypair.json,如果你把密钥放在别处,需要替换成实际路径:
#!/bin/bash exec solana-validator \ --identity /home/sol/validator-keypair.json \ --known-validator 5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on \ --known-validator dDzy5SR3AXdYWVqbDEkVFdvSPCtS9ihF5kJkHCtXoFs \ --known-validator eoKpUABi59aT4rR9HGS3LcMecfut9x7zJyodWWP43YQ \ --known-validator 7XSY3MrYnK8vq693Rju17bbPkCN3Z7KvvfvJx4kdrsSY \ --known-validator Ft5fbkqNa76vnsjYNwjDZUXoTWpP7VYm3mtsaQckQADN \ --known-validator 9QxCLckBiJc783jnMvXZubK4wH86Eqqvashtrwvcsgkv \ --only-known-rpc \ --full-rpc-api \ --no-voting \ --ledger /mnt/ledger \ --accounts /mnt/accounts \ --log /home/sol/solana-rpc.log \ --rpc-port 8899 \ --rpc-bind-address 0.0.0.0 \ --private-rpc \ --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几点说明:
- 第一行必须使用
exec solana-validator ...。文档特别强调:如果使用 logrotate 做日志轮转,不用exec会导致轮转信号发给包装脚本而不是验证者进程,两者一起被杀死。 - 与共识验证者的示例相比,本脚本去掉了
--vote-account,增加了--full-rpc-api、--no-voting、--private-rpc、--accounts和--rpc-bind-address 0.0.0.0。 --rpc-port 8899对应 8899 TCP(JSONRPC over HTTP);8900 TCP(JSONRPC over Websockets)是派生端口,取RPC_PORT + 1,无需单独指定。--dynamic-port-range 8000-8020把 P2P 动态端口限制在 13 个端口的范围内;--entrypoint和--expected-genesis-hash都是 testnet 集群的值,换集群时要整体替换,可对照 Available Clusters 页面 中各集群的示例命令,文档同时提醒这些命令仍需按 RPC 节点的用途再做调整。- 示例中的
--known-validator身份及其运营方在 setup-an-rpc-node.md 中有完整列表(Solana Labs、MonkeDAO、Certus One、SerGo、Algo|Stake)。
按要支持的 RPC 请求选择 --account-index
setup-an-rpc-node.md 和 validator-start.md 都给出了--account-index支持的取值。它的作用是建立内存中的账户索引,通过关键字段索引账户来显著提升 RPC 性能:
| 取值 | 索引方式 | 服务的 RPC 请求 |
|---|---|---|
program-id | 每个账户按其所属 program 索引 | getProgramAccounts |
spl-token-mint | 每个 SPL token 账户按其 token Mint 索引 | getTokenAccountsByDelegate、getTokenLargestAccounts |
spl-token-owner | 每个 SPL token 账户按 token owner 地址索引 | getTokenAccountsByOwner,以及带 spl-token-owner 过滤条件的getProgramAccounts |
文档说明可以用该参数启用一个或多个索引。如果你的 RPC 服务需要支持getProgramAccounts,就加上--account-index program-id;如果需要服务 SPL token 查询,则对应增加spl-token-mint或spl-token-owner。选择依据是文档中各取值对应的 RPC 方法,不需要支持相应请求就不必开启——开启后按硬件要求文档,RAM 需要提升到 512 GB 或更多。
启动节点并验证
手动试运行
在sol用户下执行启动脚本:
/home/sol/bin/validator.sh脚本应当拉起solana-validator进程。在另一个终端窗口中检查进程是否存在:
ps aux | grep solana-validator输出中应能看到一行包含solana-validator以及你写入validator.sh的全部参数,借此可以确认--full-rpc-api、--no-voting等参数确实生效。
查看日志
su - sol tail -f solana-rpc.log文档说明验证者运行时会产生持续的大量日志输出,应留意其中是否有_ERROR_字样;如果没有错误信息,可以继续下一步。
确认节点已加入集群
先查出自己节点的公钥:
solana-keygen pubkey ~/validator-keypair.json然后用solana gossip确认节点已注册到 gossip 协议:
solana gossip | grep <pubkey>其中<pubkey>替换为上一步得到的公钥。成功后应看到类似下面的一行(文档示例输出):
139.178.68.207 | 5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on | 8001 | 8004 | 139.178.68.207:80 | 1.14.17 | 3488713414如果 grep 没有任何输出,文档给出的判断是节点可能启动出了问题,应回到验证者日志中排查。
接着用solana validators确认节点已加入网络:
solana validators | grep <pubkey>最后用solana catchup观察节点追赶网络的进度:
solana catchup <pubkey>如果这条命令报连接尝试相关的消息,说明节点尚未真正加入网络,需要重新检查日志以及上面两条命令的结果。
配置为系统服务
验证手动启动正常后,可以参照 validator-start.md 中 "Systemd Unit" 一节创建/etc/systemd/system/sol.service(其中ExecStart指向/home/sol/bin/validator.sh),然后启动服务:
sudo systemctl enable --now sol再次用tail -f看日志、用solana gossip和solana validators复核即可。
限制与已知问题
- 不会保留完整链上历史:示例脚本使用
--limit-ledger-size限制本地保留的区块数(默认目标是把 blockstore 磁盘占用控制在 500 GB 以内)。RPC 用户若需要查询历史区块数据,需要额外接入 Solana bigtable 实例,仓库中的 storage-bigtable 目录说明了相关组件。 - 磁盘空间:文档的常见故障一节提示,ledger 所在磁盘至少需要 2 TB 空间;节点长时间追不上网络时,文档归因可能是网络/硬件问题,或需要向其他验证者获取最新快照。
- Docker 不支持用于生产集群:requirements 文档明确不建议在 Docker 中运行线上集群(含 mainnet-beta)的验证者,Docker 仅用于开发。
- 端口开放:8899/8900 属于可选对外开放端口,文档建议已质押的 mainnet-beta 验证者出于安全考虑不要对互联网开放它们;而 8000-10000 的动态端口范围(脚本中收窄为 8000-8020)是入站和出站都必须开放的。
- 监控:可以在另一台机器上运行
solana-watchtower监控本节点,详见 monitoring 最佳实践。
完成上述验证——ps aux中能看到带全部参数的进程、solana gossip和solana validators都能 grep 到自己的公钥、日志无_ERROR_——这个 RPC 节点就按预期完成了部署。之后如果调整--account-index或--rpc-port,修改validator.sh后重启 systemd 服务即可。
【免费下载链接】solanaWeb-Scale Blockchain for fast, secure, scalable, decentralized apps and marketplaces.项目地址: https://gitcode.com/GitHub_Trending/so/solana
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考