Production-grade, horizontally scalable relay mining service for Pocket Network.
- Multi-Transport Support: JSON-RPC (HTTP), WebSocket, gRPC, REST/Streaming (SSE)
- Horizontal Scaling: Stateless relayers scale independently behind load balancers
- High Availability: Redis-backed shared state with automatic leader election
- Relay Validation: Ring signature verification, session validation, supplier signing
- Relay Metering: Rate limiting based on application stake
- Observability: Prometheus metrics, pprof profiling, structured logging
┌─────────────────┐
│ Load Balancer │
└────────┬────────┘
┌───────────────┼───────────────┐
│ │ │
┌─────┴─────┐ ┌─────┴─────┐ ┌─────┴─────┐
│ Relayer 1 │ │ Relayer 2 │ │ Relayer N │ (stateless, scales horizontally)
└─────┬─────┘ └─────┬─────┘ └─────┬─────┘
└───────────────┼───────────────┘
│
┌──────┴──────┐
│ Redis │ (shared state)
└──────┬──────┘
│
┌────────────┴────────────┐
│ │
┌─────┴─────┐ ┌─────┴─────┐
│ Miner │ │ Miner │ (leader election)
│ (Leader) │ │ (Standby) │
└───────────┘ └───────────┘
Relayer: Validates relay requests, signs responses, publishes to Redis Streams Miner: Consumes relays, builds SMST trees, submits claims/proofs to blockchain
- Go 1.24.3+
- Redis 8.2+ (required for XACKDEL command)
- Access to Pocket Network Shannon endpoints
make build # Development build
make build-release # Optimized release build# Start miner (claim/proof submission)
pocket-relay-miner miner --config config.miner.yaml
# Start relayer (relay proxy)
pocket-relay-miner relayer --config config.relayer.yamlExample configurations with full documentation:
- Relayer:
config.relayer.example.yaml - Miner:
config.miner.example.yaml - Schema:
config.relayer.schema.yaml,config.miner.schema.yaml
This project uses Tilt for local development with two environment options.
# Start Kubernetes dev environment (requires kind cluster)
make tilt-up-k8s
# Stop environment
make tilt-down-k8sFor environments without Kubernetes:
# Start Docker Compose dev environment
make tilt-up-docker
# Stop environment
make tilt-down-dockerWhen running either environment:
- PATH Gateway:
localhost:3069 - Relayer:
localhost:8180 - Prometheus:
localhost:9091 - Grafana:
localhost:3000
See tilt/README.md for detailed setup instructions.
pocket-relay-miner <command>
Commands:
relayer Start the relayer service
miner Start the miner service
relay Test relay requests (supports load testing)
redis Debug Redis state and HA components
version Display version information# Single relay test
pocket-relay-miner relay jsonrpc --localnet --service develop-http
# Load test
pocket-relay-miner relay jsonrpc --localnet --service develop-http \
--load-test --count 1000 --concurrency 50pocket-relay-miner redis leader # Check leader election
pocket-relay-miner redis sessions --supplier <addr> # Inspect sessions
pocket-relay-miner redis smst --session <id> # View SMST tree
pocket-relay-miner redis keys --pattern "ha:*" --stats # List all keysmake test # Run all tests
make test_miner # Run miner tests with race detection
make test-coverage # Generate coverage reportTest Quality Standards (Rule #1 - Cannot be broken):
- ✅ All tests use real miniredis (no mocks)
- ✅ All tests pass with
-raceflag (no race conditions) - ✅ All tests are deterministic (no flaky behavior)
- ✅ No arbitrary timeouts or sleeps
make fmt # Format code
make lint # Run lintersSee CONTRIBUTING.md for development workflow and guidelines.
docs/PROTOCOL_SPEC.md- Relay protocol specificationdocs/REDIS.md- Redis architecture and key patternsdocs/TESTING.md- Testing guidedocs/WEBSOCKET_HANDSHAKE_PROTOCOL.md- WebSocket protocol detailsCLAUDE.md- Technical reference for contributorsCONTRIBUTING.md- Contribution guidelinestilt/README.md- Local development setup
MIT License - see LICENSE