* No commit suggestions generated * No commit suggestions generated * No commit suggestions generated
10 KiB
Sonr Testnet
Production-ready 3-validator testnet with validator-sentry architecture and Cloudflare tunnel integration via DockFlare.
Overview
This testnet provides:
- 3 Validators with isolated private networks
- 3 Sentry Nodes for public access and DDoS protection
- IPFS Node for distributed storage
- Cloudflare Tunnels for secure, zero-configuration public endpoints
- 14 Public Endpoints via
*.sonr.landdomains
Quick Start
Prerequisites
-
Docker & Docker Compose
docker --version docker compose version -
Devbox (provides snrd binary via Nix)
# Auto-install via Makefile make all # Or install manually curl -fsSL https://get.jetpack.io/devbox | bash -
DockFlare (for Cloudflare tunnels)
docker network create cloudflare-net docker run -d \ --name dockflare \ --restart unless-stopped \ --network cloudflare-net \ -v /var/run/docker.sock:/var/run/docker.sock \ -e CLOUDFLARE_API_TOKEN=your_token_here \ -e CLOUDFLARE_ACCOUNT_ID=your_account_id \ -e CLOUDFLARE_ZONE_ID=your_zone_id \ ghcr.io/sonr-io/dockflare:latestGet credentials from: https://dash.cloudflare.com
Setup
# 1. Clone repository
git clone https://github.com/sonr-io/testnet
cd testnet
# 2. Install devbox (if not already installed)
make all
# 3. Create environment configuration
make setup
# Optional: Edit .env to customize
# 4. Initialize testnet
make init
# 5. Start testnet
make start
# 6. Verify endpoints
make test
That's it! Your testnet is running with Cloudflare tunnels.
Commands
All testnet operations are managed via make:
make all # Check/install devbox
make setup # Create .env from template
make init # Initialize validators and sentries
make start # Start testnet
make stop # Stop testnet
make restart # Restart testnet
make clean # Clean all data (WARNING: destructive)
make status # Show status and endpoints
make logs # View logs
make test # Run basic tests
make help # Show available commands
Note: All commands use devbox under the hood, which provides the
snrdbinary via Nix.
Public Endpoints
All services are accessible via Cloudflare tunnels (no port conflicts):
Sentry Endpoints
Alice:
- RPC:
https://alice-rpc.sonr.land - REST:
https://alice-rest.sonr.land - gRPC:
https://alice-grpc.sonr.land - EVM:
https://alice-evm.sonr.land
Bob:
- RPC:
https://bob-rpc.sonr.land - REST:
https://bob-rest.sonr.land - gRPC:
https://bob-grpc.sonr.land - EVM:
https://bob-evm.sonr.land
Carol:
- RPC:
https://carol-rpc.sonr.land - REST:
https://carol-rest.sonr.land - gRPC:
https://carol-grpc.sonr.land - EVM:
https://carol-evm.sonr.land
IPFS Endpoints
- API:
https://ipfs-api.sonr.land - Gateway:
https://ipfs-gateway.sonr.land
Example Usage
# Query blockchain status
curl https://alice-rpc.sonr.land/status | jq
# Query account balance
curl https://alice-rest.sonr.land/cosmos/bank/v1beta1/balances/idx16wx7ye3ce060tjvmmpu8lm0ak5xr7gm2vjyh4k | jq
# Send transaction
snrd tx bank send alice idx1... 1000000usnr \
--node https://alice-rpc.sonr.land \
--chain-id sonrtest_1-1 \
--keyring-backend test \
--yes
# IPFS operations
curl -X POST https://ipfs-api.sonr.land/api/v0/version | jq
curl https://ipfs-gateway.sonr.land/ipfs/<CID>
Architecture
Cloudflare Tunnel (DockFlare)
│
▼
┌──────────────────────────────────────────────┐
│ net-public + cloudflare-net │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────┐
│ │sentry-alice │◄─►sentry-bob │◄─►sentry-carol │ │ IPFS │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ └──────────┘
└─────────┼──────────────────┼──────────────────┼──────────────────────┘
│ │ │
│ Private │ Private │ Private
│ │ │
┌─────────▼────────┐ ┌──────▼────────┐ ┌─────▼─────────┐
│ val-alice │ │ val-bob │ │ val-carol │
│ (net-alice) │ │ (net-bob) │ │ (net-carol) │
└──────────────────┘ └───────────────┘ └───────────────┘
Key Features
- Validator Isolation: Each validator on private network
- Sentry Protection: Public traffic filtered through sentries
- No Port Conflicts: All services via Cloudflare tunnels
- Auto-Discovery: DockFlare automatically creates tunnels
- TLS Encryption: All traffic encrypted via Cloudflare
Genesis Accounts
| Name | Address | Balance | Purpose |
|---|---|---|---|
| Alice | idx140fehngcrxvhdt84x729p3f0qmkmea8n570lrg |
100M SNR | Validator |
| Bob | idx1r6yue0vuyj9m7xw78npspt9drq2tmtvgcrf7sr |
100M SNR | Validator |
| Carol | idx1pe9mc2q72u94sn2gg52ramrt26x5efw6kslflg |
100M SNR | Validator |
| Faucet | idx16wx7ye3ce060tjvmmpu8lm0ak5xr7gm2vjyh4k |
250M SNR | Faucet |
Total Genesis Supply: 550M SNR (300M staked + 250M faucet)
Configuration
Configuration is managed via .env file:
cp .env.example .env
Quick setup:
make setup # Creates .env from .env.example
Key Variables:
CHAIN_ID=sonrtest_1-1- Chain identifierDENOM=usnr- Native token denominationBLOCK_TIME=5s- Target block timeVOTING_PERIOD=30s- Governance voting periodALICE_MNEMONIC,BOB_MNEMONIC,CAROL_MNEMONIC- Validator keysFAUCET_MNEMONIC- Faucet account keyDOCKER_IMAGE=onsonr/snrd:latest- Container image
⚠️ WARNING: Default mnemonics in .env.example are public. Generate new ones for production!
For complete configuration details, see docs/Environment.md
Documentation
Detailed Guides
-
Docker.md - Complete container documentation
- All 7 containers explained
- Network topology and security
- Volume management
- Health checks and troubleshooting
- Performance tuning
- Backup procedures
-
Cloudflare.md - DockFlare integration guide
- Complete domain mapping (14 endpoints)
- DockFlare setup and configuration
- DNS management
- Testing all endpoint types
- Access policies
- Troubleshooting tunnels
-
Environment.md - Environment variable reference
- Global configuration variables
- Container-specific variables
- DockFlare environment variables
- Runtime overrides
- Security best practices
-
Architecture.md - Architecture deep dive
-
CLAUDE.md - Quick reference for AI assistants
Troubleshooting
Initialization Takes 1-2 Minutes
This is normal. The script initializes 6 nodes, creates genesis, and configures peer connections.
Expected output:
- 📋 Initializing validators
- 🛡️ Initializing sentries
- 💰 Adding genesis accounts
- 🔗 Setting up peer connections
- ✅ Completion with validator addresses
If init fails:
make clean
make init
Validators Not Syncing
# Check logs
docker compose logs val-alice
# Verify peer connections
docker exec val-alice snrd tendermint show-node-id --home /root/.sonr
Cloudflare Tunnels Not Working
Check DockFlare logs:
docker logs dockflare
Common issues:
- Missing
cloudflare-netnetwork - Invalid API token
- Container not on
cloudflare-net
See docs/Cloudflare.md#troubleshooting for detailed help.
IPFS Port Conflict
If IPFS fails with "port 8080 already allocated":
- Stop the conflicting service
- Or modify
docker-compose.ymlto use different port
Production Deployment
Before deploying to production:
-
✅ Generate new mnemonics - Never use defaults
snrd keys add test --keyring-backend test --output json | jq -r .mnemonic -
✅ Use KMS for validator key management (e.g., tmkms)
-
✅ Configure firewall rules to restrict validator access
-
✅ Enable monitoring (Prometheus, Grafana)
-
✅ Set up backups of validator keys and state
tar -czf backup.tar.gz val-* sentry-* .env -
✅ Rotate Cloudflare API tokens regularly (every 90 days)
-
✅ Enable rate limiting in Cloudflare dashboard
-
✅ Use persistent volumes instead of bind mounts (optional)
Development
View Logs
# All services
make logs
# Specific service
docker compose logs -f sentry-alice
# Search logs
docker compose logs val-alice | grep -i error
Execute Commands
# Via docker compose (recommended)
docker compose exec sentry-alice snrd query bank total
# Direct docker exec
docker exec -it sentry-alice snrd keys list --keyring-backend test
Clean Restart
make clean # Remove all data (destructive!)
make init # Reinitialize
make start # Start fresh
Testing
# Run basic tests
make test
Manual Testing
# RPC
curl https://alice-rpc.sonr.land/status | jq
# REST
curl https://alice-rest.sonr.land/cosmos/base/tendermint/v1beta1/node_info | jq
# EVM JSON-RPC
curl -X POST https://alice-evm.sonr.land \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}' | jq
# IPFS
curl -X POST https://ipfs-api.sonr.land/api/v0/version | jq
Support
- Documentation: See docs/ directory
- Issues: https://github.com/sonr-io/testnet/issues
- Discord: https://discord.gg/sonr
License
Apache 2.0