Complete guide for setting up and running a BEAM Network validator on Bittensor Subnet 304 (testnet) or Subnet 105 (mainnet).
- Overview
- Hardware Requirements
- Software Stack
- Prerequisites
- Installation
- Configuration
- Running the Validator
- Monitoring & Maintenance
- Troubleshooting
- Rewards & Economics
BEAM validators are responsible for:
- Verifying Proof-of-Bandwidth (PoB) - Read and verify proofs submitted to BeamCore
- Setting Weights - Determine how emissions are distributed to orchestrators based on their performance
- SLA Scoring - Calculate orchestrator scores based on uptime, bandwidth, latency, and success rates
- Cross-Verification - Participate in peer verification to prevent score manipulation
Note: Validators read all data from BeamCore API. They do not connect directly to workers or orchestrators.
BITTENSOR NETWORK
│
┌──────┴──────┐
│ Subtensor │
└──────┬──────┘
│
┌──────────────────────────────────────┼──────────────────────────────────────┐
│ ▼ │
│ ┌──────────────┐ │
│ │ VALIDATOR │ │
│ │ (You) │ │
│ └───────┬──────┘ │
│ │ │
│ ┌──────────────────────┼──────────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │
│ │ 1. Fetch PoB │ │ 2. Calculate │ │ 3. Set Weights │ │
│ │ Proofs │ │ SLA Scores │ │ on Bittensor │ │
│ └───────┬────────┘ └───────┬────────┘ └───────┬────────┘ │
│ │ │ │ │
│ └─────────────────────┼─────────────────────┘ │
│ ▼ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ BEAMCORE │ │ SUBTENSOR │ │
│ │ (API) │ │ (Chain) │ │
│ └──────────────┘ └──────────────┘ │
│ │
│ BEAM NETWORK │
└─────────────────────────────────────────────────────────────────────────────┘
VALIDATION CYCLE (every ~20 minutes):
┌─────────────────────────────────────────────────────────────────────────────┐
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Fetch │───▶│ Verify │───▶│ Score │───▶│ Set │───▶│ Receive │ │
│ │ Proofs │ │ PoB │ │ SLAs │ │ Weights │ │ Rewards │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
Flow:
- Validator fetches Proof-of-Bandwidth proofs from BeamCore API
- Verifies cryptographic signatures and timing data
- Calculates SLA scores for each orchestrator (uptime, bandwidth, latency, success)
- Sets weights on Bittensor blockchain based on scores
- Receives validator emissions for participation
| Network | Subnet UID | Subtensor | BeamCore URL |
|---|---|---|---|
| Testnet | 304 | test |
https://beamcore-dev.b1m.ai |
| Mainnet | 105 | finney |
https://beamcore.b1m.ai |
| Component | Minimum | Recommended |
|---|---|---|
| CPU | 4 cores | 8+ cores |
| RAM | 8 GB | 16 GB |
| Storage | 50 GB SSD | 100 GB NVMe SSD |
| Network | 100 Mbps | 1 Gbps+ |
| Public IP | Required | Static IP preferred |
- CPU: PoB verification involves cryptographic operations (signature verification, hash checks)
- RAM: Metagraph sync and state management require memory
- Storage: Checkpoints, logs, and verification data
- Network: API communication with BeamCore
- Public IP: Required for validator API endpoints
| Software | Version | Purpose |
|---|---|---|
| Python | 3.10+ | Runtime |
| Bittensor | 8.0+ | Blockchain interaction |
| Fiber | Latest | Weight setting & chain ops |
| Git | 2.0+ | Code deployment |
| Software | Purpose |
|---|---|
| Redis | Caching (improves performance) |
| Prometheus + Grafana | Monitoring |
| systemd | Process management |
- Ubuntu 22.04 LTS (recommended)
- Debian 12
- Ubuntu 24.04 LTS
macOS and Windows are supported for development but not recommended for production.
You need a Bittensor wallet with:
- A coldkey (keeps your TAO safe, stays offline)
- A hotkey (used for signing, can be on the validator server)
# Install bittensor CLI
pip install bittensor
# Create a new wallet (if you don't have one)
btcli wallet new_coldkey --wallet.name validator
btcli wallet new_hotkey --wallet.name validator --wallet.hotkey default
# Or import existing wallet
btcli wallet regen_coldkey --wallet.name validator --mnemonic "your 12 words here"Testnet (recommended for first-time validators):
# Check registration cost
btcli subnet register --netuid 304 --subtensor.network test --wallet.name validator
# Register (requires TAO for registration fee)
btcli subnet register --netuid 304 --subtensor.network test \
--wallet.name validator --wallet.hotkey defaultMainnet:
btcli subnet register --netuid 105 --subtensor.network finney \
--wallet.name validator --wallet.hotkey default# Check your UID
btcli wallet overview --wallet.name validator --subtensor.network test
# Should show your UID on subnet 304 (testnet) or 105 (mainnet)Validators need stake to set weights. More stake = more influence on consensus.
# Add stake to your validator hotkey
btcli stake add --wallet.name validator --wallet.hotkey default \
--subtensor.network test --amount 100Minimum recommended stake: 100 TAO (testnet), 1000+ TAO (mainnet)
# 1. Clone the repository
git clone https://github.com/Beam-Network/beam.git
cd beam
# 2. Create virtual environment
python3 -m venv .venv
source .venv/bin/activate
# 3. Install dependencies
pip install -e .
# 4. Navigate to validator
cd neurons/validatorCreate /etc/systemd/system/beam-validator.service:
[Unit]
Description=BEAM Validator
After=network.target
[Service]
Type=simple
User=beam
WorkingDirectory=/home/beam/beam/neurons/validator
Environment="PATH=/home/beam/beam/.venv/bin:/usr/local/bin:/usr/bin:/bin"
EnvironmentFile=/home/beam/beam/neurons/validator/.env
ExecStart=/home/beam/beam/.venv/bin/python main.py
Restart=always
RestartSec=10
# Security hardening
NoNewPrivileges=true
ProtectSystem=strict
ReadWritePaths=/home/beam /var/log/beam /tmp/beam_logs
[Install]
WantedBy=multi-user.targetEnable and start:
sudo systemctl daemon-reload
sudo systemctl enable beam-validator
sudo systemctl start beam-validatorCreate .env in neurons/validator/:
# =============================================================================
# BITTENSOR WALLET (BEAM_VALIDATOR_ prefix)
# =============================================================================
BEAM_VALIDATOR_WALLET_NAME=validator
BEAM_VALIDATOR_WALLET_HOTKEY=default
# BEAM_VALIDATOR_WALLET_PATH=~/.bittensor/wallets
# =============================================================================
# SUBNET CONFIGURATION (BEAM_ prefix - shared across components)
# =============================================================================
# Testnet
BEAM_NETUID=304
BEAM_SUBTENSOR_NETWORK=test
# Mainnet (uncomment for production)
# BEAM_NETUID=105
# BEAM_SUBTENSOR_NETWORK=finney
# =============================================================================
# BEAMCORE API (BEAM_VALIDATOR_ prefix)
# =============================================================================
# Testnet
BEAM_VALIDATOR_SUBNET_CORE_URL=https://beamcore-dev.b1m.ai
# Mainnet (uncomment for production)
# BEAM_VALIDATOR_SUBNET_CORE_URL=https://beamcore.b1m.ai
# =============================================================================
# NETWORK (BEAM_VALIDATOR_ prefix)
# =============================================================================
# Your server's public IP (required for spot checks)
BEAM_VALIDATOR_EXTERNAL_IP=YOUR_PUBLIC_IP_HERE
BEAM_VALIDATOR_PORT=8093
# =============================================================================
# VALIDATION SETTINGS (BEAM_VALIDATOR_ prefix)
# =============================================================================
BEAM_VALIDATOR_TASK_INTERVAL_SECONDS=12
BEAM_VALIDATOR_TASKS_PER_EPOCH=10
BEAM_VALIDATOR_CHUNK_SIZE_BYTES=10485760
# PoB Verification
BEAM_VALIDATOR_MAX_CLOCK_DRIFT_US=5000000
BEAM_VALIDATOR_MIN_TRANSFER_TIME_US=50000
# =============================================================================
# WEIGHT SETTING (BEAM_VALIDATOR_ prefix)
# =============================================================================
BEAM_VALIDATOR_BLOCKS_BETWEEN_WEIGHTS=100
BEAM_VALIDATOR_WEIGHT_ALPHA=0.3
BEAM_VALIDATOR_MIN_CONNECTION_STAKE=10.0
# =============================================================================
# REDIS (Optional - BEAM_VALIDATOR_ prefix)
# =============================================================================
BEAM_VALIDATOR_REDIS_HOST=localhost
BEAM_VALIDATOR_REDIS_PORT=6379
BEAM_VALIDATOR_REDIS_DB=1
# BEAM_VALIDATOR_REDIS_PASSWORD=your_redis_password
# =============================================================================
# LOGGING (BEAM_VALIDATOR_ prefix)
# =============================================================================
BEAM_VALIDATOR_LOG_LEVEL=INFO
BEAM_VALIDATOR_DEBUG=falseNote: Validator uses BEAM_VALIDATOR_ prefix for most settings. Shared subnet settings use BEAM_ prefix.
| Variable | Default | Description |
|---|---|---|
BEAM_VALIDATOR_WALLET_NAME |
default |
Bittensor wallet name |
BEAM_VALIDATOR_WALLET_HOTKEY |
default |
Hotkey name within wallet |
BEAM_NETUID |
304 |
Subnet UID (304=testnet, 105=mainnet) |
BEAM_SUBTENSOR_NETWORK |
test |
Network (test or finney) |
BEAM_VALIDATOR_SUBNET_CORE_URL |
http://localhost:8080 |
BeamCore API endpoint |
BEAM_VALIDATOR_EXTERNAL_IP |
Auto-detect | Your public IP for spot checks |
BEAM_VALIDATOR_PORT |
8093 |
Validator API port |
BEAM_VALIDATOR_BLOCKS_BETWEEN_WEIGHTS |
100 |
Blocks between weight updates (~20 min) |
BEAM_VALIDATOR_LOG_LEVEL |
INFO |
Logging verbosity |
Open required ports:
# Validator API (for spot check data reception)
sudo ufw allow 8093/tcp
# Optional: Prometheus metrics
sudo ufw allow 9090/tcpcd neurons/validator
source ../.venv/bin/activate
# Run
python main.py- Check logs:
tail -f /tmp/beam_logs/validator.log- Check health endpoint:
curl http://localhost:8093/healthExpected response:
{
"status": "healthy",
"uid": 5,
"hotkey": "5Gk...",
"is_registered": true,
"current_block": 12345678
}- Check scores:
curl http://localhost:8093/scores | jq- Verify weight setting:
# Check when last weights were set
curl http://localhost:8093/state | jq '.last_weight_block'INFO | Initializing validator...
INFO | Wallet: validator/default
INFO | Network: test (netuid: 304)
INFO | Syncing metagraph...
INFO | Metagraph synced: 10 neurons
INFO | Validator UID: 5
INFO | Stake: 500.0 TAO
INFO | Starting validation loop...
INFO | BeamCore connection: https://beamcore-dev.b1m.ai
INFO | Ready to validate
The validator exposes several endpoints:
| Endpoint | Description |
|---|---|
GET /health |
Basic health status |
GET /health/detailed |
Full component status |
GET /state |
Validator state and statistics |
GET /scores |
Current orchestrator scores |
GET /weights |
Weight setting history |
| Log | Location |
|---|---|
| Validator logs | /tmp/beam_logs/validator.log |
| systemd logs | journalctl -u beam-validator -f |
-
Weight Setting Success
- Weights should be set every ~100 blocks (~20 minutes)
- Check:
curl http://localhost:8093/state | jq '.weights_set_count'
-
Orchestrator Coverage
- Should see scores for all active orchestrators
- Check:
curl http://localhost:8093/scores | jq 'keys | length'
-
PoB Verification Rate
- Proofs should be verified regularly
- Check logs for verification stats
-
Memory Usage
- Should stay under 4GB normally
- Monitor:
htopor Prometheus
The validator automatically saves state checkpoints:
# Default checkpoint directory
ls /var/lib/beam/checkpoints/
# Configure via environment
VALIDATOR_CHECKPOINT_DIR=/var/lib/beam/checkpoints
CHECKPOINT_INTERVAL_SECONDS=300
MAX_CHECKPOINTS_KEPT=10cd beam
git pull origin main
# Restart
sudo systemctl restart beam-validator
# Or if running directly
# Ctrl+C and restartERROR | Hotkey not registered on subnet 304
Solution: Register your hotkey on the subnet:
btcli subnet register --netuid 304 --subtensor.network test \
--wallet.name validator --wallet.hotkey defaultERROR | Cannot set weights: insufficient stake
Solution: Add more stake:
btcli stake add --wallet.name validator --amount 100 --subtensor.network testERROR | Failed to connect to BeamCore: Connection refused
Solution:
- Verify
BEAM_VALIDATOR_SUBNET_CORE_URLis correct - Check if BeamCore is reachable:
curl https://beamcore-dev.b1m.ai/health
WARNING | Metagraph sync timed out after 30s
Solution:
- This is usually temporary network congestion
- Validator will retry automatically
- If persistent, check your subtensor network setting
ERROR | Failed to set weights: ...
Solutions:
- Ensure you have enough stake
- Verify wallet permissions: hotkey must be accessible
- Check network connectivity to subtensor
For detailed logging:
BEAM_VALIDATOR_LOG_LEVEL=DEBUG BEAM_VALIDATOR_DEBUG=true python main.py- Check logs:
/tmp/beam_logs/validator.log - Join Discord: BEAM Network Discord
- GitHub Issues: Report bugs at the repository
Validators earn TAO emissions from the Bittensor network for:
- Setting weights - Participating in consensus
- Accurate scoring - Correct orchestrator evaluations
- Cross-verification - Peer verification participation
Bittensor Emissions (per epoch)
│
▼
Subnet 304/105
│
├─► Validators (18%)
│ └─► Based on stake & activity
│
└─► Orchestrators (82%)
└─► Based on validator weights
- Maintain high uptime (99%+)
- Keep validator software updated
- Stake more TAO (increases weight influence)
- Fast, reliable network (better spot check success)
- Monitor and respond quickly to issues
Validators can have reduced rewards for:
- Extended downtime
- Incorrect weight setting
- Failed cross-verification consensus
- Manipulation attempts
Note: Stake is NEVER slashed - only rewards are reduced.
- Server meets hardware requirements
- Python 3.10+ installed
- Bittensor wallet created
- Hotkey registered on subnet (304 or 105 for mainnet)
- TAO staked to hotkey (100+ recommended)
- Repository cloned and dependencies installed
-
.envconfigured with correct values -
BEAM_VALIDATOR_EXTERNAL_IPset to your public IP - Firewall port 8093 open
- Validator started and health check passes
- Weights being set (check
/stateendpoint)
- Documentation: https://github.com/Beam-Network/beam
- Discord: BEAM Network Discord
- GitHub Issues: For bug reports and feature requests
Last updated: March 2026