677 lines
21 KiB
Markdown
Raw Permalink Normal View History

2025-10-07 11:05:08 +01:00
# Polkadot Solochain Task Service
## Overview
The Polkadot Solochain task service provides a complete installation and configuration of a standalone [Polkadot](https://polkadot.network/) 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
```kcl
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
```kcl
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
```kcl
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
```kcl
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)
```kcl
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
```kcl
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
```bash
./core/nulib/provisioning taskserv create polkadot-solochain --infra <infrastructure-name>
```
### List Available Task Services
```bash
./core/nulib/provisioning taskserv list
```
### SSH to Solochain Server
```bash
./core/nulib/provisioning server ssh <solochain-server>
```
### Service Management
```bash
# 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
```bash
# 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
```bash
# 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
```bash
# 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
```bash
# 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
```bash
# 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
```bash
# 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
```bash
# 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
```bash
# 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
```bash
# 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
```bash
# 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
```bash
# 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](https://docs.substrate.io)
- **Polkadot SDK**: [github.com/paritytech/polkadot-sdk](https://github.com/paritytech/polkadot-sdk)
- **Substrate Node Template**: [github.com/substrate-developer-hub/substrate-node-template](https://github.com/substrate-developer-hub/substrate-node-template)
- **Polkadot.js Documentation**: [polkadot.js.org/docs](https://polkadot.js.org/docs)
- **Substrate Stack Exchange**: [substrate.stackexchange.com](https://substrate.stackexchange.com)