Polkadot Solochain Task Service
Overview
The Polkadot Solochain task service provides a complete installation and configuration of a standalone Polkadot blockchain using the Polkadot SDK. A solochain operates independently of the Polkadot relay chain while leveraging the same runtime technology, making it perfect for private networks, testnets, and independent blockchain projects.
Features
Core Capabilities
- Independent Blockchain - Complete standalone blockchain using Polkadot SDK
- PVM Support - Full Polkadot Virtual Machine integration with WASM execution
- Custom Runtime - Modular pallet system with configurable features
- Consensus Mechanisms - Aura (block authoring) + GRANDPA (finality)
- Development & Production - Suitable for both environments
Runtime Features
- Substrate Framework - Built on Substrate with modern pallets
- WASM Runtime - WebAssembly runtime with native fallback
- Modular Pallets - Configurable system including balances, timestamp, sudo
- Transaction Pool - Configurable transaction management
- Block Production - Customizable block time and limits
Network Configuration
- P2P Networking - Configurable peer-to-peer networking
- Bootnodes - Support for bootstrap nodes
- Reserved Nodes - Trusted node connections
- Chain Specification - Automated chain spec generation
Consensus & Validation
- Aura Consensus - Authority-based block authoring
- ELVES Consensus - Ethereum-Like Validation Execution System for enhanced compatibility
- GRANDPA Finality - Byzantine fault-tolerant finality gadget
- Hybrid Consensus - Support for multiple consensus mechanisms simultaneously
- Session Key Management - Automated key generation and rotation
- Validator Support - Production validator configuration
Development Features
- Alice/Bob Keys - Built-in development accounts
- Telemetry - Optional network telemetry reporting
- RPC Services - WebSocket and HTTP endpoints
- Archive Mode - Complete historical data retention
Configuration
Basic Development Solochain
solochain: PolkadotSolochain = {
name: "dev-solochain"
version: "1.5.0"
run_user: {
name: "polkadot"
home: "/home/polkadot"
}
chain_id: "dev"
mode: "development"
base_path: "/var/lib/polkadot-solochain"
ports: {
p2p_port: 30333
ws_port: 9944
http_port: 9933
}
consensus: {
type: "aura" # Options: "aura", "elves", "hybrid"
aura_duration: 6000
grandpa_interval: 4
}
alice_validator: true
}
Production Solochain
solochain: PolkadotSolochain = {
name: "production-solochain"
version: "1.5.0"
run_user: {
name: "polkadot"
group: "polkadot"
home: "/opt/polkadot"
}
chain_id: "mychain"
mode: "production"
base_path: "/var/lib/polkadot-solochain"
build_path: "/opt/polkadot/solochain-build"
ports: {
p2p_port: 30333
ws_port: 9944
http_port: 9933
prometheus_port: 9615
}
consensus: {
type: "aura" # Options: "aura", "elves", "hybrid"
aura_duration: 12000
grandpa_interval: 8
}
runtime: {
pallets: [
"pallet-balances",
"pallet-timestamp",
"pallet-transaction-payment",
"pallet-sudo"
]
block_time: 12
block_length_max: 5242880
block_weights: {
base_block: 10000000
max_block: 2000000000000
}
}
bootnodes: [
"/ip4/198.51.100.1/tcp/30333/p2p/12D3KooW...",
"/ip4/198.51.100.2/tcp/30333/p2p/12D3KooW..."
]
session_keys: {
aura_key: "//Alice"
grandpa_key: "//Alice"
}
telemetry_enabled: true
log_level: "info"
}
Multi-Validator Network
solochain: PolkadotSolochain = {
name: "multi-validator-chain"
# ... base configuration
mode: "production"
consensus: {
aura_duration: 6000
grandpa_interval: 4
authorities: [
{
name: "validator-1"
aura_key: "0x1234..."
grandpa_key: "0x5678..."
},
{
name: "validator-2"
aura_key: "0xabcd..."
grandpa_key: "0xefgh..."
},
{
name: "validator-3"
aura_key: "0x9876..."
grandpa_key: "0x5432..."
}
]
}
reserved_nodes: [
"/ip4/10.0.1.1/tcp/30333/p2p/12D3KooW...",
"/ip4/10.0.1.2/tcp/30333/p2p/12D3KooW...",
"/ip4/10.0.1.3/tcp/30333/p2p/12D3KooW..."
]
max_peers: 25
archive_mode: false
}
ELVES Consensus Configuration
solochain: PolkadotSolochain = {
name: "elves-consensus-chain"
# ... base configuration
mode: "production"
consensus: {
type: "elves"
elves_config: {
block_time: 12000
epoch_duration: 2400 # blocks per epoch
validators_per_epoch: 21
proposal_timeout: 3000
prevote_timeout: 3000
precommit_timeout: 3000
commit_timeout: 1000
}
finality: {
type: "grandpa"
grandpa_interval: 8
}
}
ethereum_compatibility: {
enabled: true
chain_id: 1337
gas_limit_multiplier: 1.0
gas_price_multiplier: 1.0
evm_config: {
create_contract_limit: null
call_stack_limit: 1024
public_key_recovery: true
}
}
runtime: {
pallets: [
"pallet-evm",
"pallet-ethereum",
"pallet-dynamic-fee",
"pallet-base-fee",
"pallet-hotfix-sufficients",
"pallet-balances",
"pallet-timestamp",
"pallet-elves-consensus"
]
ethereum_block_time: 12
ethereum_gas_limit: 15000000
}
}
Hybrid Consensus Configuration (Aura + ELVES)
solochain: PolkadotSolochain = {
name: "hybrid-consensus-chain"
# ... base configuration
consensus: {
type: "hybrid"
primary_consensus: "aura"
secondary_consensus: "elves"
aura_duration: 6000
elves_config: {
fallback_enabled: true
activation_threshold: 5 # blocks without aura consensus
deactivation_threshold: 10 # consecutive elves blocks
}
transition_rules: {
aura_to_elves: {
trigger: "network_partition"
min_validators: 3
}
elves_to_aura: {
trigger: "network_recovery"
consensus_timeout: 30000
}
}
}
runtime: {
pallets: [
"pallet-aura",
"pallet-elves-consensus",
"pallet-consensus-manager",
"pallet-balances",
"pallet-timestamp",
"pallet-grandpa"
]
}
}
PVM Runtime Configuration
solochain: PolkadotSolochain = {
# ... base configuration
pvm: {
enabled: true
runtime_config: {
wasm_method: "Compiled"
default_heap_pages: 64
max_runtime_instances: 8
runtime_cache_size: 2
}
execution_strategies: {
syncing: "NativeElseWasm"
importing: "NativeElseWasm"
block_construction: "Native"
offchain_worker: "Native"
other: "Native"
}
}
runtime: {
pallets: [
"frame-system",
"pallet-balances",
"pallet-timestamp",
"pallet-aura",
"pallet-grandpa",
"pallet-transaction-payment",
"pallet-sudo",
"pallet-utility",
"pallet-multisig"
]
custom_types: {
"CustomStruct": {
"field1": "u32",
"field2": "Vec<u8>"
}
}
}
}
Usage
Deploy Solochain
./core/nulib/provisioning taskserv create polkadot-solochain --infra <infrastructure-name>
List Available Task Services
./core/nulib/provisioning taskserv list
SSH to Solochain Server
./core/nulib/provisioning server ssh <solochain-server>
Service Management
# Check solochain status
systemctl status polkadot-solochain
# Start/stop solochain
systemctl start polkadot-solochain
systemctl stop polkadot-solochain
systemctl restart polkadot-solochain
# View solochain logs
journalctl -u polkadot-solochain -f
# Check build status
systemctl status polkadot-solochain-build
Chain Operations
# Generate new session keys
curl -H "Content-Type: application/json" \
-d '{"id":1, "jsonrpc":"2.0", "method": "author_rotateKeys", "params":[]}' \
http://localhost:9933/
# Check chain info
curl -H "Content-Type: application/json" \
-d '{"id":1, "jsonrpc":"2.0", "method": "system_chain", "params":[]}' \
http://localhost:9933/
# Get latest block
curl -H "Content-Type: application/json" \
-d '{"id":1, "jsonrpc":"2.0", "method": "chain_getBlock", "params":[]}' \
http://localhost:9933/
# Check consensus mechanism (ELVES-specific)
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/
Development Operations
# Connect with Polkadot.js Apps
# Navigate to: https://polkadot.js.org/apps/?rpc=ws://localhost:9944
# Purge chain data (development)
sudo -u polkadot /opt/polkadot/target/release/solochain-node purge-chain \
--chain /var/lib/polkadot-solochain/chain-spec.json \
--base-path /var/lib/polkadot-solochain
# Export chain state
sudo -u polkadot /opt/polkadot/target/release/solochain-node export-state \
--chain /var/lib/polkadot-solochain/chain-spec.json \
--base-path /var/lib/polkadot-solochain
Key Management
# Generate new validator keys
sudo -u polkadot /opt/polkadot/scripts/generate-keys.sh
# Inspect session keys
sudo -u polkadot /opt/polkadot/target/release/solochain-node key inspect \
--scheme sr25519 \
--key-type aura
# Insert key into keystore
sudo -u polkadot /opt/polkadot/target/release/solochain-node key insert \
--key-type aura \
--scheme sr25519 \
--suri "//Alice" \
--base-path /var/lib/polkadot-solochain
Architecture
System Architecture
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ dApps & │────│ Solochain Node │────│ Blockchain │
│ Frontends │ │ │ │ Network │
│ │ │ • Runtime (WASM) │ │ │
│ • Polkadot.js │────│ • Consensus │────│ • Validators │
│ • Custom UIs │ │ • P2P Network │ │ • Full Nodes │
│ • Wallets │ │ • RPC Services │ │ • Archive Nodes │
└─────────────────┘ └──────────────────┘ └─────────────────┘
Runtime Architecture
┌─────────────────────────────────────────────────────────────┐
│ Solochain Runtime │
├─────────────────────────────────────────────────────────────┤
│ System Pallets │ Consensus │ Utility Pallets │
│ │ │ │
│ • frame-system │ • pallet-aura │ • pallet-balances │
│ • pallet-timestamp│ • pallet-elves │ • pallet-sudo │
│ • pallet-evm │ • pallet-grandpa │ • pallet-utility │
│ • pallet-ethereum│ • consensus-manager │ • pallet-dynamic-fee │
├─────────────────────────────────────────────────────────────┤
│ Substrate Framework │
├─────────────────────────────────────────────────────────────┤
│ Polkadot Virtual Machine (PVM) │
└─────────────────────────────────────────────────────────────┘
Network Ports
- P2P Port (30333) - Peer-to-peer blockchain network
- WebSocket Port (9944) - Real-time RPC and subscriptions
- HTTP Port (9933) - Standard RPC API calls
- Prometheus Port (9615) - Metrics and monitoring
File Structure
/var/lib/polkadot-solochain/ # Main data directory
├── chains/ # Chain-specific data
│ └── mychain/ # Custom chain data
├── keystore/ # Validator keys
├── chain-spec.json # Chain specification
└── node.key # Node identity
/opt/polkadot/ # Build directory
├── solochain-template/ # Source code
├── target/release/ # Compiled binaries
├── scripts/ # Management scripts
└── runtime/ # Runtime configuration
/etc/polkadot-solochain/ # Configuration
├── solochain.conf # Main configuration
└── runtime.toml # Runtime settings
Supported Operating Systems
- Ubuntu 20.04+ / Debian 11+
- CentOS 8+ / RHEL 8+ / Fedora 35+
System Requirements
Development Environment
- RAM: 4GB (8GB recommended)
- Storage: 50GB SSD (for build artifacts and chain data)
- CPU: 4 cores (compilation requirements)
- Network: Standard internet connection
Production Single Node
- RAM: 8GB (16GB recommended)
- Storage: 100GB SSD (200GB+ recommended)
- CPU: 4 cores (8 cores recommended)
- Network: Stable, low-latency connection
Production Multi-Validator Network
- RAM: 16GB+ per validator
- Storage: 200GB+ SSD per node
- CPU: 8+ cores per validator
- Network: Dedicated network with low latency between validators
Build Requirements
- RAM: 8GB+ (for Rust compilation)
- Storage: 10GB+ free space for build artifacts
- CPU: Multi-core for parallel compilation
- Time: 30-60 minutes for initial build
Troubleshooting
Build Issues
# Check build logs
journalctl -u polkadot-solochain-build -f
# Manual build
cd /opt/polkadot/solochain-template
sudo -u polkadot cargo build --release
# Clean build
sudo -u polkadot cargo clean
sudo -u polkadot cargo build --release
# Check Rust version
rustc --version
cargo --version
Runtime Issues
# Check runtime compilation
curl -H "Content-Type: application/json" \
-d '{"id":1, "jsonrpc":"2.0", "method": "state_getRuntimeVersion", "params":[]}' \
http://localhost:9933/
# Validate chain spec
sudo -u polkadot /opt/polkadot/target/release/solochain-node \
chain-spec-builder validate \
--chain /var/lib/polkadot-solochain/chain-spec.json
# Check pallet configuration
journalctl -u polkadot-solochain | grep -i pallet
Consensus Issues
# Check validator status
curl -H "Content-Type: application/json" \
-d '{"id":1, "jsonrpc":"2.0", "method": "author_hasSessionKeys", "params":["0x..."]}' \
http://localhost:9933/
# Monitor block production
curl -H "Content-Type: application/json" \
-d '{"id":1, "jsonrpc":"2.0", "method": "chain_subscribeFinalizedHeads", "params":[]}' \
ws://localhost:9944/
# Check session keys
ls -la /var/lib/polkadot-solochain/keystore/
# ELVES consensus troubleshooting
curl -H "Content-Type: application/json" \
-d '{"id":1, "jsonrpc":"2.0", "method": "elves_getConsensusHealth", "params":[]}' \
http://localhost:9933/
# Check ELVES validator participation
curl -H "Content-Type: application/json" \
-d '{"id":1, "jsonrpc":"2.0", "method": "elves_getValidatorParticipation", "params":[]}' \
http://localhost:9933/
# Monitor ELVES consensus transitions (hybrid mode)
curl -H "Content-Type: application/json" \
-d '{"id":1, "jsonrpc":"2.0", "method": "elves_getConsensusTransitions", "params":[]}' \
http://localhost:9933/
Network Issues
# Check connected peers
curl -H "Content-Type: application/json" \
-d '{"id":1, "jsonrpc":"2.0", "method": "system_peers", "params":[]}' \
http://localhost:9933/
# Test network connectivity
telnet target-node-ip 30333
# Check node identity
sudo -u polkadot /opt/polkadot/target/release/solochain-node key inspect-node-key \
--file /var/lib/polkadot-solochain/node.key
Performance Issues
# Check system resources
htop
df -h /var/lib/polkadot-solochain
iostat -x 1
# Monitor chain metrics
curl http://localhost:9615/metrics
# Check block times
curl -H "Content-Type: application/json" \
-d '{"id":1, "jsonrpc":"2.0", "method": "chain_getHeader", "params":[]}' \
http://localhost:9933/
Security Considerations
Validator Security
- Key Management - Secure storage of session keys
- Network Isolation - Isolate validators from public internet
- Access Control - Limit administrative access
- Monitoring - Comprehensive validator monitoring
Node Security
- User Isolation - Run as dedicated system user
- File Permissions - Secure keystore and configuration files
- System Updates - Keep OS and dependencies updated
- Firewall Rules - Limit network access to necessary ports
Runtime Security
- Code Review - Review all custom pallets and runtime code
- Testing - Comprehensive testing of runtime logic
- Upgrades - Secure runtime upgrade procedures
- Audit - Regular security audits of custom code
Performance Optimization
Build Optimization
- Parallel Builds - Use multiple CPU cores for compilation
- Target CPU - Optimize for target deployment hardware
- Link-Time Optimization - Enable LTO for better performance
- Profile-Guided Optimization - Use PGO for hot paths
Runtime Optimization
- Execution Strategy - Use native execution where possible
- Cache Configuration - Optimize database and state caches
- Block Parameters - Tune block time and weight limits
- Pallet Selection - Include only necessary pallets
System Optimization
- Storage Performance - Use high-IOPS NVMe storage
- Memory Allocation - Configure appropriate heap sizes
- Network Tuning - Optimize TCP settings for validator networks
- CPU Affinity - Pin processes to specific CPU cores
Development Workflow
Adding Custom Pallets
# 1. Add pallet to Cargo.toml
vim /opt/polkadot/solochain-template/runtime/Cargo.toml
# 2. Configure pallet in runtime
vim /opt/polkadot/solochain-template/runtime/src/lib.rs
# 3. Rebuild runtime
cd /opt/polkadot/solochain-template
cargo build --release
# 4. Restart node with new runtime
systemctl restart polkadot-solochain
Chain Spec Management
# Generate new chain spec
sudo -u polkadot /opt/polkadot/target/release/solochain-node build-spec \
--disable-default-bootnode > /tmp/plain-spec.json
# Convert to raw format
sudo -u polkadot /opt/polkadot/target/release/solochain-node build-spec \
--chain /tmp/plain-spec.json --raw > /var/lib/polkadot-solochain/chain-spec.json
# Update genesis configuration
vim /tmp/plain-spec.json # Edit genesis config
# Then convert to raw format
Testing and Debugging
# Run unit tests
cd /opt/polkadot/solochain-template
cargo test
# Run integration tests
cargo test --features runtime-benchmarks
# Enable debug logging
systemctl edit polkadot-solochain
# Add: Environment="RUST_LOG=debug"
# Runtime debugging
curl -H "Content-Type: application/json" \
-d '{"id":1, "jsonrpc":"2.0", "method": "state_call", "params":["Core_version", "0x"]}' \
http://localhost:9933/
Resources
- Substrate Documentation: docs.substrate.io
- Polkadot SDK: github.com/paritytech/polkadot-sdk
- Substrate Node Template: github.com/substrate-developer-hub/substrate-node-template
- Polkadot.js Documentation: polkadot.js.org/docs
- Substrate Stack Exchange: substrate.stackexchange.com