Skip to main content

Run Validator

Setup and operate a Selendra validator node

Validators secure the Selendra network through block production and finality participation. Requires minimum stake of 25,000 SEL and reliable infrastructure. Current network: 4 validators. Expansion: 20 by end of 2027, 50+ by end of 2028.

Requirements

Staking & Hardware

RequirementSpecification
Minimum Stake25,000 SEL (self-stake + nominations)
CPU8 cores @ 3.0GHz+ (Intel Xeon or AMD Ryzen 9)
RAM16GB minimum (32GB recommended, ECC)
Storage200GB NVMe SSD (1TB for headroom)
Network100 Mbps upload min, 1 Gbps preferred
UPS30-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-node \
  --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:

  1. Bond tokens: Network → Staking → Accounts → Validator → Bond

    • Stash account: Account holding SEL
    • Controller: Account managing validator
    • Value: 25,000 SEL minimum
    • Payment destination: Stash (reinvest rewards)
  2. Set Session Keys: Paste session keys from RPC call

  3. 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,
    "25000000000000000000000", // 25,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

elections.committeeSize currently reads 4 reserved seats and 0 non-reserved.
All four validators hold reserved seats and are operated by SmallWorld.

Reserved (foundation nodes):

  • Participate every session
  • Cannot be banned
  • Reward adjustment for poor performance
  • Currently: 4 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: 0 seats open

Timing

  • Session: 15 minutes (900 blocks × 1-second block time)
  • Era: 24 hours (96 sessions × 15 minutes)

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-node /usr/local/bin/selendra-node.backup

# Prebuilt binaries are not published per release. Rebuild from source.
cd ~/selendra && git fetch origin master && git checkout master && git pull
git submodule update --init --recursive
cargo build --release
sudo install target/release/selendra-node /usr/local/bin/

sudo systemctl start selendra
sudo journalctl -u selendra -f

Plan updates during low-activity periods. Coordinate with other validators.

Unbond Validator

  1. Chill: api.tx.staking.chill().signAndSend(controller)
  2. Unbond: api.tx.staking.unbond('10000...').signAndSend(controller)
  3. Wait: 14 eras, so 14 days (BondingDuration)
  4. 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:

  • 25,000 SEL minimum self-stake
  • Operating cost coverage

Application Process

  1. Join community: Telegram (t.me/selendranetwork)
  2. Demonstrate capability: Run testnet validator 2+ weeks
  3. Submit application:
    • Technical setup description
    • Hardware specifications
    • Network location and ISP
    • Team background
    • Commitment timeline
  4. Governance review: Core team and community evaluation
  5. 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

Staking Guide | Hardware Requirements | Monitoring | Troubleshooting

Community

Telegram: t.me/selendranetwork | X: @selendranetwork | GitHub: github.com/selendra/selendra

Direct support available for validator candidates.

Run Validator - Selendra