The SSDN Gossip Client is part of a solution to decouple snapshot serving from validator operations in the Solana network. It enables scalable snapshot distribution without impacting validator performance.
Current snapshot distribution has several limitations:
- Everyone (generally) uses the same 4 recommended KVs from the recommended command lines, effectively centralizing the network
- Those same validators stop serving snapshots effectively once there is more than 2 or 3 concurrent requests
- Existing validators and RPC providers are overwhelmed with snapshot requests, and they are limited in number due to the added performance overhead
- Snapshot serving impacts critical validator operations
- Snapshot serving impacts critical RPC provider operations
- No scalability during high-demand periods (e.g., network restarts)
- No dedicated infrastructure for snapshot distribution
This project, along with agave-snapshot-uploader, provides a scalable snapshot delivery network by:
- Decoupling snapshot distribution from validator/RPC operations
- Reusing the existing discovery mechanism for snapshot sources
- Maintaining compatibility with existing validator clients
- Supporting flexible deployment options
- Gossip network integration for discovery
- Can be used as an entrypoint for the gossip network
- Minimum required JSONRPC endpoint compatibility for snapshot distribution (
getSlot,getVersion,getGenesisHash) - Additional non-standard JSONRPC methods (
getNumPeers,getShredVersion,getPublicKey) - Native Agave support for
ip_echopublic IP and shred version discovery (client and server) - Health endpoint on http://localhost:8899/health
- STUN support for public IP detection
- UPnP support for NAT traversal
The system supports three deployment models:
-
Independent Gossip Client
- Separate gossip client (or RPC server only)
- Uploader sidecar on validator
-
Independent Client + Reverse Proxy
- Separate gossip client (or RPC server only)
- Reverse proxy
- Uploader sidecar on validator
-
Simplified Legacy Setup - No Gossip Client
- No separate gossip client
- All components on single host
- Reverse proxy
- Uploader sidecar
-
Generate a keypair (if needed):
solana-keygen new -o keypair.json
-
Create a
config.tomlfile (optional, see example-config.toml)
- The only required setting is the
storage_pathto the snapshot location. The default isstoragein the current working directory (/var/wwwin Debian packages), and not a remote host. - To use a different network, simply set the
networkfield to "devnet", "testnet", or "mainnet". The correct entrypoints and expected genesis hash will be automatically configured. - For advanced users, you can still manually configure
entrypointsandexpected_genesis_hashif needed.
- Run the client:
or for minimal logging:
cargo run -r
or for more verbose logging:RUST_LOG=warn cargo run -r
RUST_LOG=h2=off,hyper_util=off,solana_metrics=off,solana_gossip::cluster_info=off,debug cargo run -r
See the Installation Guide file for more information on installing the Debian package or using docker.
Use --config <path> to specify a custom config file location. Default is config.toml in the current working directory.
| Option | Default/Debian default | Description |
|---|---|---|
network |
testnet |
"devnet", "testnet", or "mainnet" |
entrypoints |
Follow network |
Gossip entrypoint override |
expected_genesis_hash |
Follow network |
Expected genesis hash override |
shred_version |
None | Expected shred version override |
keypair_path |
keypair.json |
Path to keypair file |
listen_ip |
0.0.0.0 |
Local bind/listen IP |
public_ip |
Auto (STUN) | Public IP address |
enable_stun |
false |
Use STUN to discover public IP instead of ip_echo |
stun_server |
stun.l.google.com:3478 |
STUN server address |
disable_gossip |
false/true |
Disable gossip client. See RPC-Only Mode. |
gossip_port |
8001 |
Gossip listen port |
rpc_port |
8899 |
RPC listen port |
enable_upnp |
false |
Enable UPnP port forwarding |
storage_path |
storage//var/www |
Redirect/proxy target dir or URL |
enable_proxy |
false |
Reverse proxy GET requests instead of redirecting |
shred_version is used when joining the gossip network. If you have issues
connecting to gossip, try setting it to the correct network value. If not
specified, the gossip client will attempt to autodetect it, but that is
unreliable.
expected_genesis_hash is used to verify the given storage_path is valid for
the network. If not specified, no checking will be done.
See Solana Cluster Information for the correct values.
- 4GB to 8GB RAM
- 4 to 8 CPU Cores
- 100Mbps to 200Mbps connection
- 50Mbps sustained bi-directional bandwidth (16TB per month)
- Static public IP address
- Ingress allow/forward list:
- TCP/UDP port 8001 (gossip) - if you need to be a publicly reachable gossip entrypoint (optional)
- TCP port 8899 (RPC) - A publicly reachable RPC endpoint is required for validators to accept snapshots from you
Note: STUN-based IP detection and UPnP port forwarding are not recommended for production.
Configure port firewall/forwarding rules manually. IP detection will be done via ip_echo to each entrypoint by default.
IP resolution preference order:
public_ipfrom user config (if provided)- IP echo result (if
public_ipnot provided) - STUN result (only if IP echo fails and STUN is enabled)
Shred version resolution:
- If both configured and discovered versions exist and differ, it's an error
- Use whichever version is available (either configured or discovered)
- Return None if neither version is available
Note that even when public_ip is configured, IP echo is still attempted to get the shred version.
Explicit public_ip and shred_version configuration is always checked against ip_echo results.
--debugbuilds may be unstable and have significantly higher memory and CPU usage. Use-ror--releaseto avoid this.- Large crate dependency footprint (900+).
- Excessive memory and CPU usage for large gossip networks (Issue 53).
- We do not periodically renew the UPnP port mappings, so if the router expires it, you may lose connectivity if you rely on on it (issue #11).
- For a detailed analysis of the benefits, limitations, and production considerations of the SSDN implementation, please see Design Tradeoffs.