Run Validator
Setup and operate a Selendra validator node
Validators secure the Selendra network through block production and finality participation. Requires minimum stake of 10,000 SEL and reliable infrastructure. Current network: 4 validators. Expansion: 20 by end of 2026, 50+ by end of 2027.
Requirements
Staking & Hardware
| Requirement | Specification |
|---|---|
| Minimum Stake | 10,000 SEL (self-stake + nominations) |
| CPU | 8 cores @ 3.0GHz+ (Intel Xeon or AMD Ryzen 9) |
| RAM | 16GB minimum (32GB recommended, ECC) |
| Storage | 200GB NVMe SSD (1TB for headroom) |
| Network | 100 Mbps upload min, 1 Gbps preferred |
| UPS | 30-60 minutes runtime |
Infrastructure & Technical
High availability essential: Block production timing critical. Missed blocks reduce rewards and trigger penalties.
Redundant internet recommended: Primary fiber + backup 4G/5G prevents single ISP failure.
Technical requirements:
- Linux server management via command line
- Systemd service management
- Firewall and network security configuration
- Resource monitoring and log analysis
- Binary upgrades with minimal downtime
- Governance event responses
Validator Setup
1. Initial Full Node
Run standard full node first. Verify synchronization before registering as validator. Follow full node setup guide.
2. Generate Session Keys
curl -H "Content-Type: application/json" \
-d '{"id":1, "jsonrpc":"2.0", "method":"author_rotateKeys"}' \
http://localhost:9933
Response returns hex-encoded session keys. Save securely - required for registration.
3. Configure Validator Mode
Update /etc/systemd/system/selendra.service:
[Unit]
Description=Selendra Validator Node
After=network.target
[Service]
Type=simple
User=selendra
WorkingDirectory=/var/lib/selendra
ExecStart=/usr/local/bin/selendra \
--base-path /var/lib/selendra \
--chain mainnet \
--validator \
--name "YourValidatorName" \
--pruning 256 \
--state-cache-size 4 \
--port 30333 \
--prometheus-port 9615 \
--prometheus-external
Restart=on-failure
RestartSec=10
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
Key changes: --validator flag enabled, RPC ports removed (security), Prometheus retained for monitoring.
sudo systemctl daemon-reload
sudo systemctl restart selendra
4. Secure Keys
sudo chmod 700 /var/lib/selendra
sudo chown -R selendra:selendra /var/lib/selendra
Controller account: Controls validator settings and stake. Store offline in hardware wallet.
Stash account: Holds bonded funds. Keep private key in cold storage.
Registration
Via Polkadot.js Apps
Navigate to portal.selendra.org:
-
Bond tokens: Network → Staking → Accounts → Validator → Bond
- Stash account: Account holding SEL
- Controller: Account managing validator
- Value: 10,000 SEL minimum
- Payment destination: Stash (reinvest rewards)
-
Set Session Keys: Paste session keys from RPC call
-
Validate: Set commission (0-100%), submit transaction
Via API
import { ApiPromise, WsProvider } from "@polkadot/api";
import { Keyring } from "@polkadot/keyring";
const wsProvider = new WsProvider("wss://rpc.selendra.org");
const api = await ApiPromise.create({ provider: wsProvider });
const keyring = new Keyring({ type: "sr25519" });
const controller = keyring.addFromUri("//YourSeedPhrase");
// Bond tokens
await api.tx.staking
.bond(
controller.address,
"10000000000000000000000", // 10,000 SEL
"Staked"
)
.signAndSend(controller);
// Set session keys
const sessionKeys = "0x1234...abcd";
await api.tx.session.setKeys(sessionKeys, "0x").signAndSend(controller);
// Start validating (5% commission)
await api.tx.staking
.validate({
commission: 50000000, // 5% (Perbill)
blocked: false,
})
.signAndSend(controller);
Validator Operations
Performance Monitoring
Track continuously:
- Block production: Assigned blocks must be produced within 1-second window
- Finality participation: AlephBFT requires active participation
- Peer connectivity: Maintain 25+ peer connections
- System resources: CPU, RAM, disk I/O under 80% usage
Rewards & Commission
Validator rewards earned each era (24 hours) based on:
- Era points for block production
- Finality participation
- Total stake backing validator
- Commission rate
Commission: Deducted from nominator rewards only. Self-stake rewards unaffected. Typical APR: ~15%.
Reserved vs Non-Reserved Validators
Reserved (foundation nodes):
- Participate every session
- Cannot be banned
- Reward adjustment for poor performance
- Currently: 2 of 4 validators
Non-reserved (community nodes):
- Rotating participation
- Can be banned for underperformance
- Performance thresholds: 50% block production minimum, 5000 finality threshold
- Underperformance for 3 sessions triggers 2-era ban
- Currently: 2 of 4 validators
Timing
- Session: 4 hours (validator set rotation interval)
- Era: 24 hours (reward distribution and stake updates)
Common Tasks
Change Commission
await api.tx.staking
.validate({
commission: 100000000, // 10%
blocked: false,
})
.signAndSend(controller);
Commission changes apply next era. Communicate changes to nominators.
Rotate Session Keys
sudo systemctl stop selendra
rm -rf /var/lib/selendra/chains/selendra/keystore
sudo systemctl start selendra
curl -H "Content-Type: application/json" \
-d '{"id":1, "jsonrpc":"2.0", "method":"author_rotateKeys"}' \
http://localhost:9933
# Update on-chain via portal: Staking → Set Session Keys
Update Node
sudo systemctl stop selendra
sudo cp /usr/local/bin/selendra /usr/local/bin/selendra.backup
wget https://github.com/selendra/selendra/releases/latest/download/selendra
chmod +x selendra
sudo mv selendra /usr/local/bin/
sudo systemctl start selendra
sudo journalctl -u selendra -f
Plan updates during low-activity periods. Coordinate with other validators.
Unbond Validator
- Chill:
api.tx.staking.chill().signAndSend(controller) - Unbond:
api.tx.staking.unbond('10000...').signAndSend(controller) - Wait: 28 days unbonding period
- Withdraw:
api.tx.staking.withdrawUnbonded(0).signAndSend(controller)
Validator Application
Current network operates permissioned mode. Applications required for new validators.
Application Requirements
Technical:
- Demonstrated Linux administration experience
- Blockchain operation experience (preferred)
- 24/7 monitoring capability
- Redundant infrastructure or HA setup
Network contribution:
- Geographic diversity valued
- Community engagement (documentation, support, development)
- Long-term commitment (minimum 1 year)
Financial:
- 10,000 SEL minimum self-stake
- Operating cost coverage
Application Process
- Join community: Telegram (t.me/selendranetwork)
- Demonstrate capability: Run testnet validator 2+ weeks
- Submit application:
- Technical setup description
- Hardware specifications
- Network location and ISP
- Team background
- Commitment timeline
- Governance review: Core team and community evaluation
- Onboarding: Guidance for mainnet setup
Timeline: 2-4 weeks from application to mainnet validator.
Security Best Practices
Critical security measures:
- Never expose validator RPC publicly
- Protect session keys with proper filesystem permissions
- Cold storage for controller and stash (hardware wallets)
- DDoS protection for public endpoints
- Regular security updates (OS and binary)
- Backup validator configuration
Network Security
# Configure firewall
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 30333/tcp # P2P port
sudo ufw enable
# Fail2ban for SSH protection
sudo apt-get install fail2ban
sudo systemctl enable fail2ban
Backup Strategy
# backup-validator.sh
BACKUP_DIR="/backup/selendra/$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR"
# Backup keystore
tar -czf "$BACKUP_DIR/keystore.tar.gz" \
/var/lib/selendra/chains/selendra/keystore
# Backup configs
cp /etc/systemd/system/selendra.service "$BACKUP_DIR/"
# Remote backup
aws s3 sync "$BACKUP_DIR" s3://selendra-backups/validator-$(hostname)/
Advanced Topics
Storage Optimization
# Optimize filesystem
sudo mkfs.ext4 -m 0 -b 4096 -L selendra /dev/nvme0n1
sudo tune2fs -o journal_data_writeback /dev/nvme0n1
# Mount with optimal flags
echo '/dev/nvme0n1 /var/lib/selendra ext4 noatime,nodiratime 0 1' | \
sudo tee -a /etc/fstab
Monitoring Alerts
Prometheus alerting rules:
groups:
- name: validator_critical
rules:
- alert: ValidatorOffline
expr: up{job="selendra-validator"} == 0
for: 1m
labels:
severity: critical
- alert: ValidatorMissedBlocks
expr: increase(substrate_block_proposals_total[5m]) < 5
for: 2m
labels:
severity: warning
- alert: LowPeerCount
expr: substrate_network_peers < 20
for: 5m
labels:
severity: warning
Related Documentation
Staking Guide | Hardware Requirements | Monitoring | Troubleshooting
Community
Telegram: t.me/selendranetwork | X: @selendranetwork | GitHub: github.com/selendra/selendra
Direct support available for validator candidates.
Found an issue or want to contribute?
Help us improve this documentation by editing this page on GitHub.
