Node Prerequisites
Hardware Requirements
Elastos Council Supernode (Full Stack, All Components)
| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 8 cores (dedicated, not shared) | 16 cores |
| RAM | 48 GB | 64 GB |
| Storage | 1 TB SSD | 1 TB NVMe SSD |
| Network | 100 Mbps symmetrical | 1 Gbps |
| IP | Static public IPv4 | Static public IPv4 |
node.sh setup initializes ELA, ESC, EID, PG, and the Arbiter in parallel. Servers with fewer than 8 dedicated cores must initialize the chains one at a time — see Set Up Your Council Node → Server requirements for the workaround. Shared-CPU / burstable VPS plans will struggle to keep up with sustained operation regardless of declared core count.
BPoS Supernode (ELA Only)
| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 4 cores | 8 cores |
| RAM | 16 GB | 32 GB |
| Storage | 200 GB SSD | 500 GB SSD |
| Network | 50 Mbps | 100 Mbps |
| IP | Static public IPv4 | Static public IPv4 |
ESC/EID RPC Node
| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 4 cores | 8 cores |
| RAM | 16 GB | 32 GB |
| Storage | 200 GB SSD | 500 GB SSD |
| Network | 50 Mbps | 100 Mbps |
Storage grows over time. Plan for ~50 GB/year for ELA chain data and ~100 GB/year for each EVM sidechain. Monitor disk usage and provision accordingly.
Financial Requirements
Running a BPoS supernode requires a financial commitment:
| Requirement | Amount | Notes |
|---|---|---|
| Node deposit | 2,000 ELA | Locked for the duration you choose at registration |
| Transaction fees | ~0.001 ELA | For registration, activation, and claiming transactions |
| Penalty buffer | 200+ ELA (recommended) | Covers one potential slash without causing jailing |
You need the Elastos Essentials wallet (iOS) to manage your ELA, register your node, vote, and claim rewards.
If you plan to self-stake, keep extra ELA beyond the 2,000 deposit. Self-staking increases your voting rights and helps you reach the 80,000 voting rights activation threshold faster.
VPS Providers
Any reputable VPS provider with the hardware specifications above will work. Community-tested options:
| Provider | Approximate Cost | Notes |
|---|---|---|
| Contabo | $70–120/year | Best value for high-RAM plans |
| Vultr | $120–200/year | Predictable pricing, many regions |
| DigitalOcean | $120–200/year | Developer-friendly, good monitoring |
| Linode (Akamai) | $120–200/year | Reliable uptime, good network |
Prices vary by region and configuration. A BPoS-only node can run on plans starting around $10-15/month.
Operating System
Supported (minimum: Ubuntu 22.04 LTS):
- Ubuntu 22.04 LTS (recommended)
- Ubuntu 24.04 LTS
Experimental / unsupported:
- Any Linux distribution with Bash 4+ and x86_64 architecture — you assume responsibility for dependency compatibility
- ARM64 (aarch64): behind feature flag; oracle compilation requires
make,gcc,g++
Older Council and BPoS guides referenced Ubuntu 20.04 LTS. As of mid-2026, node.sh requires Ubuntu 22.04 or newer — running on 20.04 may install but is not tested against current chain releases. Upgrade before deploying a production validator.
Do not run as root. The script explicitly warns against sudo execution. Create a dedicated service user:
sudo adduser --disabled-password --gecos "" elastos
sudo su - elastos
System Packages
sudo apt-get update
sudo apt-get install -y \
jq \
lsof \
apache2-utils \
curl \
openssl
| Package | Why |
|---|---|
jq | JSON parsing for config generation and RPC responses |
lsof | Process/port inspection for status commands |
apache2-utils | Provides rotatelogs for log rotation |
curl | Binary downloads, RPC calls, external IP detection |
openssl | Keystore password generation via openssl rand |
Node.js v23.10.0 is auto-downloaded by node.sh when initializing Oracle services. You do not need to install it separately.
Network & Firewall
Your server needs a static public IP address. The external IP is detected automatically via https://checkip.amazonaws.com and embedded in configuration files.
Opening ports is a separate, explicit step. Run ~/node/node.sh firewall (after init): it detects your real SSH port (from sshd -T and $SSH_CONNECTION, so a non-22 session is never locked out), allows the chain peer/consensus ports for your profile, shows the resulting rules, and asks for confirmation before enabling ufw. The RPC ports stay bound to 127.0.0.1 and are never opened.
If you prefer to open ports by hand instead, the rules below match what node.sh firewall applies. See the Port Reference for the complete port table.
Minimum for ELA full node:
sudo ufw allow 20338/tcp # ELA P2P (required — peer discovery)
sudo ufw allow 20339/tcp # ELA BPoS (required for supernodes)
For ESC RPC node (standalone — no ELA needed):
sudo ufw allow 20636/tcp # ESC JSON-RPC
sudo ufw allow 20638/tcp # ESC P2P
sudo ufw allow 20638/udp # ESC P2P discovery
Do NOT expose RPC ports to the public internet unless you are intentionally running a public RPC endpoint. By default, ELA RPC binds to 127.0.0.1 with a whitelist.
System Tuning
The node.sh script sets ulimit -n 40960 at startup to increase the open file descriptor limit. For persistence across reboots, add to /etc/security/limits.conf:
elastos soft nofile 40960
elastos hard nofile 40960
For high-throughput ESC/EID RPC nodes, also tune:
# /etc/sysctl.conf
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 65535
vm.swappiness = 10
Apply with sudo sysctl -p.
Swap Configuration
If your server has the minimum RAM (16 GB for BPoS, 48 GB for full supernode), configure swap space to prevent out-of-memory kills during chain sync or high load:
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Verify the swap is active:
free -h
You should see 8 GB under the Swap row. Combined with vm.swappiness = 10 from the System Tuning section above, the kernel will prefer RAM but use swap as a safety net.