1. Install Validator Agent
# Download the latest binary
sudo curl -L https://pipe.network/release/pipe-validator-agent/current/pipe-validator-agent \
-o /usr/local/bin/pipe-validator-agent
# Make it executable
sudo chmod +x /usr/local/bin/pipe-validator-agent
# Create config directory
sudo mkdir -p /etc/pipe-validator-agent
π‘ Pre-built binary: No Rust/compilation required! Works on Ubuntu 20.04+ and compatible Linux distributions.
2. Install Solana CLI & Generate Keypair
If you don't already have Solana CLI tools installed:
# Install Solana CLI tools
sh -c "$(curl -sSfL https://release.anza.xyz/v3.0.8/install)"
# Verify installation
solana --version
Generate a keypair for StatePipe (or use an existing one):
# Generate a new keypair
solana-keygen new --outfile /home/ubuntu/statepipe-keypair.json
# Or use your existing validator keypair
# Just note the path to your keypair file
π Security Note: You can use any Solana keypair for authentication. If you're a validator, you may use your validator identity keypair, or create a dedicated keypair just for StatePipe.
3. Configure with Auto-Registration
Create /etc/pipe-validator-agent/config.toml:
Auto-Registration
With auto_register = true, the agent automatically registers your node using your Solana keypair on first startup. No separate registration step needed!
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# PIPE Validator Agent - Production Configuration Example
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
[network]
# Control API for POP discovery and validator registration
control_api_url = "https://api.p1pipe.com"
# How often to re-discover nearest POP (seconds)
nearest_pop_cache_ttl = 300
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# OPERATING MODE
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
[mode]
blocks = false # Legacy block mode (not recommended)
shreds = true # Real-time shred acceleration (RECOMMENDED)
free_beta = true # Free during beta period
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SHRED COLLECTION (Upload your shreds to PIPE network)
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
[shred_collection]
enabled = true
solana_network = "mainnet-beta" # Options: "mainnet-beta", "testnet", "devnet"
# Network interface binding
bind_ip = "0.0.0.0"
gossip_port = 8001 # Must match your validator's gossip port
tvu_port = 8000 # Must match your validator's TVU port
# Capture method - IMPORTANT!
# "pcap" = Passive capture (RECOMMENDED - no port conflicts)
# Requires: sudo apt-get install -y libpcap-dev
# And: sudo setcap cap_net_raw+ep /path/to/pipe-validator-agent
capture = "pcap"
# Optional: Force specific network interface for pcap
# Useful if auto-detection picks wrong interface
# capture_device = "eth0"
[shred_upload]
# POP gateway address for uploading shreds (REQUIRED field)
# Options:
# - "127.0.0.1:14455" for local POP testing
# - "185.26.8.55:14455" for US/Europe production
# - "67.213.121.191:14455" for Asia production
# Can be overridden with --pop-gateway CLI flag
pop_address = "127.0.0.1:14455"
batch_size = 16 # Optimal batch size for uploads
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SHRED LISTENER (Receive accelerated shreds from PIPE network)
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
[shred_listener]
enabled = true
# POP subscription address (OPTIONAL - leave commented for auto-discovery)
# Uncomment and set if auto-discovery fails due to UDP blocking:
# pop_address = "185.26.8.55:14455"
# Multi-POP subscription (optional - for redundancy and lower latency)
# Uncomment to subscribe to multiple POPs simultaneously:
# pop_list = ["185.26.8.55:14455", "67.213.121.191:14455"]
# max_pop_subscriptions = 3
# Local address for receiving shreds from POP
bind_address = "0.0.0.0:14456"
# Your validator's TVU address (where to forward received shreds)
validator_tvu_address = "127.0.0.1:8000"
# Start receiving from current slot
min_slot = 0
# Keep-alive interval (milliseconds)
heartbeat_interval_ms = 10000
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# AUTHENTICATION & AUTO-REGISTRATION
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# Enable authentication (required for production POPs)
auth_enabled = true
# Path to your Solana validator identity keypair
validator_keypair_path = "/home/ubuntu/statepipe-keypair.json"
# Auto-registration with PIPE network (RECOMMENDED)
# Automatically registers your validator on first startup
auto_register = true
# Your validator metadata (required for auto-registration)
validator_name = "My Node" # Human-readable name
contact_email = "your@email.com" # Contact for operational issues
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# LEGACY BLOCK MODE (Not recommended - use shreds instead)
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
[upload]
enabled = false
[download]
enabled = false
poll_interval_ms = 100
delivery_dir = "/tmp/incoming-blocks"
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# QUICK START CHECKLIST
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
#
# 1. Install dependencies:
# sudo apt-get install -y libpcap-dev
#
# 2. Set capabilities for pcap capture:
# sudo setcap cap_net_raw+ep /usr/local/bin/pipe-validator-agent
#
# 3. Customize this config:
# βοΈ validator_keypair_path - path to your validator identity
# βοΈ validator_name - your validator's name
# βοΈ contact_email - your email address
# βοΈ pop_address in [shred_upload] - set to nearest POP
# βοΈ Verify tvu_port matches your validator (usually 8000)
# βοΈ Verify gossip_port matches your validator (usually 8001)
#
# 4. For production, update pop_address to nearest POP:
# US/Europe: 185.26.8.55:14455
# Asia: 67.213.121.191:14455
#
# 5. (Optional) For listener auto-discovery:
# Leave pop_address commented in [shred_listener] section
# If UDP probing fails, uncomment and set manually
#
# 6. Start the agent:
# pipe-validator-agent --config /etc/pipe-validator-agent/config.toml
#
# 7. Monitor logs:
# journalctl -u pipe-validator-agent -f
#
# 8. Check stats (printed every 10 seconds):
# Look for: π PIPE Stats: βX shreds βY shreds
#
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βοΈ Required Customizations:
- 1. Update
pop_addressin [shred_upload] to your nearest POP (see list above) - 2. Verify
validator_keypair_pathmatches your keypair from Step 2 - 3. Update
validator_nameandcontact_emailwith your details - 4. Install libpcap:
sudo apt-get install -y libpcap-dev - 5. Set capabilities:
sudo setcap cap_net_raw+ep /usr/local/bin/pipe-validator-agent
4. Create Systemd Service
Create /etc/systemd/system/pipe-validator-agent.service:
[Unit]
Description=Pipe Validator Agent
After=network.target
[Service]
Type=simple
User=sol
ExecStart=/usr/local/bin/pipe-validator-agent --config /etc/pipe-validator-agent/config.toml
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
π‘ Note: Replace User=sol with your system's user account.
5. Start the Agent
# Reload systemd to recognize the new service
sudo systemctl daemon-reload
# Enable and start the service
sudo systemctl enable pipe-validator-agent
sudo systemctl start pipe-validator-agent
# Check status
sudo systemctl status pipe-validator-agent
6. Verify Auto-Registration & Operation
# Watch logs
sudo journalctl -u pipe-validator-agent -f | grep -i shred
# Expected output:
# π Auto-registration enabled
# β
Node registered: YourPubkey...
# β
Shred collection mode
# β
PopUploader plugin started
# β
Shred receiver started
# β
Shreds being uploaded to POP
Success!
Your validator is now using StatePipe for accelerated data delivery.