Appearance
Run an RPC Node
A Zink RPC node serves JSON-RPC and WebSocket traffic without participating in consensus. It is the right choice for applications, explorers, bots, analytics systems, and backend services that need reliable access to Zink state.
Why run your own RPC?
Running a dedicated RPC node gives you control over:
- request latency
- rate limits
- account indexing
- historical-data retention
- network placement near your application stack
- optional plugin/runtime features such as Geyser
Upstream-compatible
A Zink RPC node is still just agave-validator running with --no-voting. The same operational model used on Solana applies here.
When an RPC node is better than a validator
Prefer an RPC node if you:
- need a private endpoint for a production application
- want to avoid shared RPC throttling
- need account indexes or full transaction history
- are not participating in Zink consensus
If you only need local development, use solana-test-validator instead of a full RPC node.
Baseline RPC shape
The most important RPC-specific flags are:
--no-voting--full-rpc-api--private-rpcwhen you do not want the port discoverable through gossip--rpc-port--rpc-bind-address--ledger--accounts--account-index
Example baseline launch:
bash
agave-validator --no-voting --full-rpc-api --private-rpc --rpc-bind-address 0.0.0.0 --rpc-port 8899 --ledger /mnt/ledger --accounts /mnt/accounts --entrypoint <ZINK_ENTRYPOINT_1> --entrypoint <ZINK_ENTRYPOINT_2> --known-validator <KNOWN_VALIDATOR_PUBKEY_1> --known-validator <KNOWN_VALIDATOR_PUBKEY_2> --only-known-rpc --expected-genesis-hash <ZINK_GENESIS_HASH> --dynamic-port-range 8000-10000Public vs private RPC
- Use
--private-rpcwhen the node is only for your own systems or sits behind a load balancer/proxy. - Omit
--private-rpconly if you explicitly want the node advertised as an RPC service.
Zink recommendation
For production application backends, prefer private RPC behind your own edge or service mesh. Public exposure should be a conscious product decision, not the default.
Account indexing and data strategy
RPC nodes often carry heavier storage requirements than validators because operators enable indexes and history.
Common options include:
- account indexing for token-owner or program-owner lookups
- longer ledger retention windows
- WebSocket subscriptions for live application updates
- plugin-based export via Geyser
Example account-index shape:
bash
agave-validator --no-voting --full-rpc-api --account-index program-id --account-index spl-token-owner --account-index spl-token-mint ...Only enable the indexes you actually need; every extra index costs RAM, CPU, and disk.
Startup verification
After boot, confirm the node is alive and caught up enough to serve requests.
bash
# Local node health
curl -s http://127.0.0.1:8899/health
# Current slot from your node
solana --url http://127.0.0.1:8899 slot
# Compare with cluster view
solana slot
# Confirm RPC API answers normally
solana --url http://127.0.0.1:8899 block-heightIf the node is far behind cluster head, it is not ready to serve production traffic.
Systemd example
ini
[Unit]
Description=Zink RPC Node
After=network-online.target
Wants=network-online.target
[Service]
User=sage
LimitNOFILE=1000000
Restart=always
RestartSec=3
ExecStart=/home/sage/.local/share/solana/install/active_release/bin/agave-validator --no-voting --full-rpc-api --private-rpc --rpc-bind-address 0.0.0.0 --rpc-port 8899 --ledger /mnt/ledger --accounts /mnt/accounts --entrypoint <ZINK_ENTRYPOINT_1> --known-validator <KNOWN_VALIDATOR_PUBKEY_1> --only-known-rpc --expected-genesis-hash <ZINK_GENESIS_HASH>
[Install]
WantedBy=multi-user.targetCommon tuning decisions
Ledger retention
If you care about storage pressure more than long-range history, consider limiting retained ledger data.
bash
agave-validator --limit-ledger-size ...RPC isolation
If application workloads are heavy, place RPC nodes close to application compute and keep them separate from operator-validator hosts.
Snapshot handling
Large snapshot downloads will consume disk bandwidth and network bandwidth. Plan for this when restarting or rebuilding nodes.