2025-10-07 11:20:26 +01:00
..
2025-10-07 11:05:08 +01:00
2025-10-07 11:20:26 +01:00
2025-10-07 11:05:08 +01:00
2025-10-07 11:05:08 +01:00

Polkadot Node Task Service

Overview

The Polkadot Node task service provides a complete installation and configuration of a Polkadot network node. This service supports multiple node types including full nodes, light clients, and archive nodes for the Polkadot, Kusama, and Westend networks. It's designed for both development and production environments with comprehensive configuration options.

Features

Node Types

  • Full Node - Complete blockchain synchronization with state pruning
  • Light Client - Minimal resource usage with header-only synchronization
  • Archive Node - Complete historical data retention without pruning
  • Validator Node - Production-ready validator configuration (see polkadot-validator service)

Network Support

  • Polkadot - Main Polkadot relay chain
  • Kusama - Polkadot's canary network
  • Westend - Test network for development
  • Custom Chains - Support for custom chain specifications

Consensus Support

  • GRANDPA Finality - Byzantine fault-tolerant finality gadget
  • Aura Consensus - Authority-based block authoring
  • ELVES Consensus - Ethereum-Like Validation Execution System for enhanced compatibility
  • Hybrid Consensus - Support for multiple consensus mechanisms simultaneously

Synchronization Modes

  • Full Sync - Downloads and validates all blocks
  • Fast Sync - Downloads recent state and validates headers
  • Warp Sync - Ultra-fast sync using finality proofs

Storage & Performance

  • State Pruning - Configurable historical state retention
  • Block Pruning - Optional old block data removal
  • Database Cache - Configurable memory caching for performance
  • Execution Strategies - Optimized runtime execution modes

Network & RPC Services

  • P2P Networking - Peer-to-peer network participation
  • WebSocket RPC - Real-time blockchain data access
  • HTTP RPC - Standard REST-like API access
  • Rate Limiting - Configurable request rate limiting
  • WSS Support - Secure WebSocket with SSL/TLS

Configuration

Basic Full Node

polkadot_node: PolkadotNode = {
    name: "polkadot-full-node"
    version: "1.5.0"
    run_user: {
        name: "polkadot"
        home: "/home/polkadot"
    }
    chain: "polkadot"
    node_type: "full"
    base_path: "/var/lib/polkadot"
    ports: {
        p2p_port: 30333
        ws_port: 9944
        http_port: 9933
    }
    sync_mode: "full"
    pruning: {
        mode: "state"
        blocks_to_keep: 256
    }
}

Archive Node Configuration

polkadot_node: PolkadotNode = {
    name: "polkadot-archive"
    version: "1.5.0"
    run_user: {
        name: "polkadot"
        group: "polkadot"
        home: "/opt/polkadot"
    }
    chain: "polkadot"
    node_type: "full"
    base_path: "/data/polkadot"
    archive_mode: true
    ports: {
        p2p_port: 30333
        ws_port: 9944
        http_port: 9933
    }
    sync_mode: "warp"
    max_peers: 50
    database_cache: 2048
    state_cache_size: 1073741824
    bootnodes: [
        "/dns/bootnode.polkadot.io/tcp/30333/p2p/12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp"
    ]
    telemetry_enabled: true
    telemetry_url: "wss://telemetry.polkadot.io/submit/ 0"
}

Production Node with WSS

polkadot_node: PolkadotNode = {
    name: "polkadot-prod-node"
    version: "1.5.0"
    run_user: {
        name: "polkadot"
        group: "polkadot"
        home: "/opt/polkadot"
    }
    chain: "polkadot"
    node_type: "full"
    base_path: "/var/lib/polkadot"
    ports: {
        p2p_port: 30333
        ws_port: 9944
        http_port: 9933
        prometheus_port: 9615
    }
    wss: {
        enabled: true
        domain: "node.company.com"
        rate_limit: 1000
    }
    ssl: {
        enabled: true
        cert_file: "/etc/ssl/certs/polkadot-node.crt"
        key_file: "/etc/ssl/private/polkadot-node.key"
    }
    rpc: {
        enabled: true
        cors: ["https://polkadot.js.org"]
        rate_limit: 2000
        max_connections: 100
        batch_config: {
            max_size: 100
            max_len: 1000000
        }
    }
    sync_mode: "warp"
    pruning: {
        mode: "state"
        blocks_to_keep: 256
    }
    max_peers: 75
    database_cache: 4096
    state_cache_size: 2147483648
    execution_strategies: {
        syncing: "NativeElseWasm"
        importing: "NativeElseWasm"
        block_construction: "Native"
        offchain_worker: "Native"
        other: "Native"
    }
    log_level: "info"
    telemetry_enabled: true
}

Light Client Configuration

polkadot_node: PolkadotNode = {
    name: "polkadot-light"
    version: "1.5.0"
    run_user: {
        name: "polkadot"
        home: "/home/polkadot"
    }
    chain: "polkadot"
    node_type: "light"
    base_path: "/var/lib/polkadot-light"
    sync_mode: "fast"
    max_peers: 25
    database_cache: 256
    state_cache_size: 268435456
    log_level: "warn"
}

ELVES Consensus Node Configuration

polkadot_node: PolkadotNode = {
    name: "polkadot-elves-node"
    version: "1.5.0"
    run_user: {
        name: "polkadot"
        group: "polkadot"
        home: "/opt/polkadot"
    }
    chain: "polkadot"
    node_type: "full"
    base_path: "/var/lib/polkadot"
    ports: {
        p2p_port: 30333
        ws_port: 9944
        http_port: 9933
        prometheus_port: 9615
    }
    consensus: {
        type: "elves"
        elves_config: {
            epoch_duration: 2400  # blocks per epoch
            validators_per_epoch: 21
            proposal_timeout: 3000
            prevote_timeout: 3000
            precommit_timeout: 3000
            commit_timeout: 1000
            ethereum_compatibility: true
        }
        finality: {
            type: "grandpa"
            grandpa_interval: 8
        }
    }
    ethereum_compatibility: {
        enabled: true
        chain_id: 1
        evm_runtime: true
    }
    sync_mode: "warp"
    max_peers: 50
    database_cache: 2048
    state_cache_size: 2147483648
    log_level: "info"
    telemetry_enabled: true
}

Usage

Deploy Polkadot Node

./core/nulib/provisioning taskserv create polkadot-node --infra <infrastructure-name>

List Available Task Services

./core/nulib/provisioning taskserv list

SSH to Node Server

./core/nulib/provisioning server ssh <polkadot-node-server>

Service Management

# Check node status
systemctl status polkadot-node

# Start/stop node
systemctl start polkadot-node
systemctl stop polkadot-node
systemctl restart polkadot-node

# View node logs
journalctl -u polkadot-node -f

# Check sync status
curl -H "Content-Type: application/json" \
  -d '{"id":1, "jsonrpc":"2.0", "method": "system_syncState", "params":[]}' \
  http://localhost:9933/

Node Monitoring

# Check node health
curl http://localhost:9933/health

# Get node information
curl -H "Content-Type: application/json" \
  -d '{"id":1, "jsonrpc":"2.0", "method": "system_name", "params":[]}' \
  http://localhost:9933/

# Check connected peers
curl -H "Content-Type: application/json" \
  -d '{"id":1, "jsonrpc":"2.0", "method": "system_peers", "params":[]}' \
  http://localhost:9933/

# Monitor prometheus metrics
curl http://localhost:9615/metrics

RPC API Usage

# WebSocket connection
wscat -c ws://localhost:9944

# Get latest block
curl -H "Content-Type: application/json" \
  -d '{"id":1, "jsonrpc":"2.0", "method": "chain_getBlock", "params":[]}' \
  http://localhost:9933/

# Get chain head
curl -H "Content-Type: application/json" \
  -d '{"id":1, "jsonrpc":"2.0", "method": "chain_getHead", "params":[]}' \
  http://localhost:9933/

# ELVES Consensus Operations
# Check ELVES consensus state
curl -H "Content-Type: application/json" \
  -d '{"id":1, "jsonrpc":"2.0", "method": "elves_getConsensusState", "params":[]}' \
  http://localhost:9933/

# Get ELVES epoch information
curl -H "Content-Type: application/json" \
  -d '{"id":1, "jsonrpc":"2.0", "method": "elves_getCurrentEpoch", "params":[]}' \
  http://localhost:9933/

# Check validator set for ELVES consensus
curl -H "Content-Type: application/json" \
  -d '{"id":1, "jsonrpc":"2.0", "method": "elves_getValidators", "params":[]}' \
  http://localhost:9933/

Architecture

System Architecture

┌─────────────────┐    ┌──────────────────┐    ┌─────────────────┐
│   Applications  │────│  Polkadot Node   │────│   Polkadot      │
│                 │    │                  │    │   Network       │
│ • Polkadot.js   │    │ • P2P (30333)    │    │                 │
│ • dApps         │────│ • WS (9944)      │────│ • Relay Chain   │
│ • Wallets       │    │ • HTTP (9933)    │    │ • Parachains    │
│ • Analytics     │    │ • Prometheus     │    │ • Validators    │
└─────────────────┘    └──────────────────┘    └─────────────────┘

Network Ports

  • P2P Port (30333) - Peer-to-peer network communication
  • WebSocket Port (9944) - Real-time RPC and subscriptions
  • HTTP Port (9933) - Standard RPC API calls
  • Prometheus Port (9615) - Metrics and monitoring data

File Structure

/var/lib/polkadot/          # Main data directory
├── chains/                 # Chain-specific data
│   ├── polkadot/          # Polkadot chain data
│   ├── ksmcc3/            # Kusama chain data
│   └── westend2/          # Westend chain data
├── node.key               # Node identity key
└── network/               # Network state

/etc/polkadot/             # Configuration directory
├── polkadot.conf          # Main configuration
└── ssl/                   # SSL certificates

/home/polkadot/            # Service user home
├── .local/                # Local binaries
└── logs/                  # Application logs

Supported Operating Systems

  • Ubuntu 20.04+ / Debian 11+
  • CentOS 8+ / RHEL 8+ / Fedora 35+

System Requirements

Light Client Requirements

  • RAM: 2GB (4GB recommended)
  • Storage: 10GB (minimal chain data)
  • CPU: 1 core (2 cores recommended)
  • Network: Standard internet connection

Full Node Requirements

  • RAM: 8GB (16GB recommended)
  • Storage: 200GB SSD (500GB+ recommended)
  • CPU: 4 cores (8 cores recommended)
  • Network: Good bandwidth and low latency

Archive Node Requirements

  • RAM: 32GB+ (for optimal performance)
  • Storage: 2TB+ NVMe SSD (grows over time)
  • CPU: 8+ cores with high clock speed
  • Network: High bandwidth dedicated connection

Network Requirements

  • Internet Access - Stable connection to Polkadot network
  • Port Access - P2P port (30333) must be accessible
  • Firewall - Proper firewall configuration for services
  • DNS - Reliable DNS resolution

Troubleshooting

Synchronization Issues

# Check sync status
curl -H "Content-Type: application/json" \
  -d '{"id":1, "jsonrpc":"2.0", "method": "system_syncState", "params":[]}' \
  http://localhost:9933/

# Check connected peers
curl -H "Content-Type: application/json" \
  -d '{"id":1, "jsonrpc":"2.0", "method": "system_peers", "params":[]}' \
  http://localhost:9933/

# Restart with fresh sync
systemctl stop polkadot-node
rm -rf /var/lib/polkadot/chains/polkadot/db/
systemctl start polkadot-node

Performance Issues

# Check system resources
htop
df -h /var/lib/polkadot
iostat -x 1

# Monitor Polkadot metrics
curl -s http://localhost:9615/metrics | grep polkadot_

# Check database size
du -sh /var/lib/polkadot/chains/polkadot/db/

# Analyze slow queries
journalctl -u polkadot-node | grep -i "slow"

Network Connectivity

# Check if ports are listening
netstat -tlnp | grep -E ':(30333|9944|9933)'

# Test P2P connectivity
telnet your-server-ip 30333

# Test WebSocket
wscat -c ws://localhost:9944

# Check external connectivity
curl -4 ifconfig.co  # Get public IP

RPC Issues

# Test RPC health
curl http://localhost:9933/health

# Check RPC configuration
curl -H "Content-Type: application/json" \
  -d '{"id":1, "jsonrpc":"2.0", "method": "rpc_methods", "params":[]}' \
  http://localhost:9933/

# Test WebSocket RPC
wscat -c ws://localhost:9944
# Send: {"id":1, "jsonrpc":"2.0", "method": "chain_getHead", "params":[]}

Storage Issues

# Check disk space
df -h /var/lib/polkadot

# Check database integrity
sudo -u polkadot polkadot check-block --chain polkadot

# Purge old data (if pruning enabled)
sudo -u polkadot polkadot purge-chain --chain polkadot

# Database statistics
du -sh /var/lib/polkadot/chains/polkadot/db/*

Security Considerations

Node Security

  • User Isolation - Run node as dedicated system user
  • File Permissions - Secure node key and configuration files
  • System Updates - Keep OS and Polkadot binary updated
  • Firewall Rules - Limit access to necessary ports only

RPC Security

  • Access Control - Restrict RPC access to trusted networks
  • Rate Limiting - Implement proper rate limiting
  • CORS Configuration - Configure CORS for web applications
  • SSL/TLS - Use HTTPS for production RPC endpoints

Network Security

  • DDoS Protection - Implement connection limits and rate limiting
  • Monitoring - Monitor for unusual network activity
  • Peer Filtering - Use reserved nodes for trusted connections
  • Regular Audits - Regularly audit node configuration and logs

Performance Optimization

Hardware Optimization

  • Storage - Use NVMe SSDs for best I/O performance
  • Memory - Allocate sufficient RAM for database caching
  • CPU - Use processors with good single-thread performance
  • Network - Ensure low-latency, high-bandwidth connection

Configuration Tuning

  • Database Cache - Increase cache size based on available RAM
  • State Cache - Configure appropriate state cache size
  • Pruning - Use state pruning to manage disk usage
  • Execution Strategy - Use native execution where possible

System Tuning

  • File Descriptors - Increase ulimit for network connections
  • TCP Configuration - Tune TCP settings for high-throughput
  • Disk I/O - Optimize filesystem and disk scheduler
  • Memory Management - Configure swappiness and memory overcommit

Backup and Recovery

Backup Procedure

# Stop node service
systemctl stop polkadot-node

# Backup node key (critical!)
cp /var/lib/polkadot/node.key /backup/node-key-$(date +%Y%m%d).key

# Backup configuration
tar -czf /backup/polkadot-config-$(date +%Y%m%d).tar.gz \
    /etc/polkadot/ \
    /var/lib/polkadot/node.key

# For archive nodes, backup database (optional, can re-sync)
tar -czf /backup/polkadot-db-$(date +%Y%m%d).tar.gz \
    /var/lib/polkadot/chains/

# Restart service
systemctl start polkadot-node

Recovery Procedure

  1. Stop node service
  2. Restore node key to maintain same peer identity
  3. Restore configuration files
  4. Restore database (optional, can re-sync from network)
  5. Verify file permissions and ownership
  6. Start node service
  7. Monitor synchronization progress

Integration Examples

Polkadot.js Integration

// Connect to local node
import { ApiPromise, WsProvider } from '@polkadot/api';

const provider = new WsProvider('ws://localhost:9944');
const api = await ApiPromise.create({ provider });

// Get latest block
const lastHeader = await api.rpc.chain.getHeader();
console.log(`Latest block: ${lastHeader.number}`);

Monitoring with Prometheus

# prometheus.yml
scrape_configs:
  - job_name: 'polkadot-node'
    static_configs:
      - targets: ['localhost:9615']
    scrape_interval: 30s
    metrics_path: '/metrics'

Load Balancer Configuration

upstream polkadot_rpc {
    server node1.company.com:9933;
    server node2.company.com:9933;
    server node3.company.com:9933;
}

server {
    listen 80;
    server_name api.company.com;
    
    location / {
        proxy_pass http://polkadot_rpc;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Resources