Node Operations Overview
The Elastos network is a multi-chain ecosystem. Running a node means operating one or more blockchain daemons, each serving a distinct purpose. The entire stack is managed by a single orchestrator script, node.sh, a ~5,700-line Bash script that handles downloading binaries, generating configuration, managing processes, rotating logs, and performing self-updates.
You do not need to run every component. Choose the deployment profile that matches your role.
For a guided setup experience, nodes.elastos.net provides a web-based 1-click deployer that generates and executes the node.sh commands for you. It supports all node types and handles configuration automatically.
Node Types
The Elastos network has three categories of node operators:
BPoS Supernodes (Validators)
Stake-based block producers on the ELA main chain. Require a 2,000 ELA deposit and 80,000+ voting rights to become active. The active validator set is variable under BPoS; it typically includes ~70 elected validators plus 12 Elastos Council nodes (see nodes.elastos.net). Rewards are split 25% to node owners and 75% to voters (active pledges to validators; locking stake alone does not earn).
Community validators run only the ELA mainchain. See BPoS Supernode Operations for registration and management.
Elastos Council Nodes
Members of the Elastos Council (formerly CR) run a full supernode stack — all chains, oracles, and the arbiter. Council members are elected through community voting and are responsible for governance decisions and maintaining the complete network infrastructure.
See Elastos Council Node for the full deployment guide.
BTC Miners (AuxPoW)
Bitcoin mining pools can merge-mine ELA at no additional cost. ELA blocks are anchored to Bitcoin blocks via Auxiliary Proof of Work. No ELA deposit is required.
See Merged Mining for pool integration.
Who Runs Nodes?
| Role | Node Type | Description |
|---|---|---|
| Community Members | BPoS Supernode | Stake 2,000 ELA, earn rewards as a validator |
| Elastos Council Members | Full Supernode | Run the complete stack for governance participation |
| Application Developers | ESC/EID RPC Node | Private EVM endpoint for dApps or DID services |
| Service Providers | ELA Full Node | Backend for explorers, wallets, and APIs |
| Mining Pools | ELA + btcpool | Add ELA merged mining alongside Bitcoin |
| Crypto Exchanges | ELA Full Node | Deposit/withdrawal processing |
Community Validator Requirements
Normal community members who want to become validators run BPoS nodes (ELA mainchain only):
| Requirement | Details |
|---|---|
| Stake | 2,000 ELA locked for 100–1,000 days |
| Server | VPS with 4GB+ RAM, 100GB+ SSD, Ubuntu 22.04 |
| Voting Rights | Must reach 80,000+ to become an active validator |
| Rewards | APR varies by network conditions; 25% to node owner, 75% to voters. See staking.elastos.net for current rates |
Staking ELA and voting for supernodes is done through the Elastos Essentials wallet or the staking portal, not via node.sh CLI commands.
Network Environments
| Environment | Purpose |
|---|---|
| Mainnet | Live production network |
| Testnet | Testing and development |
| Regtest | Private local development |
Select the environment during node.sh ela init.
Component Map
| Component | Binary | Language | Purpose |
|---|---|---|---|
| ELA | ela | Go | Main chain. AuxPoW+BPoS consensus. UTXO model. |
| ESC | esc (geth fork) | Go | Elastos Smart Contract chain. EVM-compatible. Chain ID 20. |
| EID | eid (geth fork) | Go | Elastos Identity chain. DID smart contracts. Chain ID 22. |
| ESC-Oracle | crosschain_oracle.js | Node.js | Cross-chain bridge relay for ESC. |
| EID-Oracle | crosschain_eid.js | Node.js | Cross-chain bridge relay for EID. |
| Arbiter | arbiter | Go | Cross-chain transaction coordinator. |
The ELA main chain is the root of trust. The sidechains (ESC, EID) run modified geth with a PBFT consensus layer that connects back to the main chain through the Arbiter daemon.
Deployment Profiles
| Profile | Components | Use Case |
|---|---|---|
| ELA Full Node | ELA | Block explorer backend, wallet backend, chain data queries |
| ESC RPC Node | ESC only | dApp developers needing an EVM RPC endpoint |
| EID RPC Node | EID only | DID service operators |
| BPoS Supernode | ELA | Block producers participating in BPoS consensus |
| Elastos Council Supernode | ELA + ESC + EID + Oracles + Arbiter | Elastos Council members running the full network stack |
| Mining Pool | ELA + btcpool components | Pool operators adding ELA merged mining to Bitcoin pools |
Directory Layout
Complete directory structure after a full supernode deployment:
~/node/ # SCRIPT_PATH (main installation)
├── node.sh # Orchestrator script (~5,700 lines)
├── version.txt # Build version
├── commit.txt # Git commit hashes per component
├── checksum.txt # SHA256 checksums of binaries
├── extern/
│ └── node-v23.10.0-linux-x64/ # Auto-downloaded Node.js runtime
├── .node-upload/ # Staging area for updates
│ ├── ela/
│ ├── esc/
│ └── ...
│
├── ela/ # ─── ELA Main Chain ───
│ ├── ela # Main chain binary
│ ├── ela-cli # CLI client for RPC calls
│ ├── config.json # Generated config (RPC creds, network)
│ ├── keystore.dat # P-256 encrypted keystore
│ ├── .init # Init completion sentinel file
│ ├── output # stderr capture file
│ └── elastos/
│ ├── data/ # Chain data (LevelDB)
│ │ ├── mainnet/ # Block and state databases
│ │ └── checkpoints/ # Consensus checkpoints
│ └── logs/
│ ├── node/ # Node operation logs
│ └── dpos/ # DPoS consensus logs
│
├── esc/ # ─── ESC (Elastos Smart Contract Chain) ───
│ ├── esc # ESC binary (modified geth)
│ ├── data/
│ │ ├── keystore/
│ │ │ └── UTC--2024-...--abcdef1234 # Ethereum-format keystore
│ │ ├── miner_address.txt # Optional: alternative reward address
│ │ └── geth/
│ │ ├── chaindata/ # Block and state data (LevelDB)
│ │ ├── nodes/ # Peer database
│ │ └── logs/dpos/ # PBFT consensus logs
│ └── logs/
│ ├── esc-2024-01-15-10_30_00.log # Rotated log files (20MB each)
│ └── esc-2024-01-15-10_30_00.log.gz # Compressed old logs
│
├── eid/ # ─── EID (Elastos Identity Chain) ───
│ └── (same structure as esc/)
│
├── pg/ # ─── PG (Public Gaming Chain) ───
│ └── (same structure as esc/)
│
├── esc-oracle/ # ─── ESC Cross-Chain Oracle ───
│ ├── crosschain_oracle.js # Oracle entry point
│ ├── *.js # Oracle modules
│ ├── package.json # npm package definition
│ ├── node_modules/ # npm dependencies
│ └── logs/
│ ├── esc-oracle_out-*.log # stdout (rotated)
│ └── esc-oracle_err.log # stderr
│
├── eid-oracle/ # ─── EID Cross-Chain Oracle ───
│ ├── crosschain_eid.js
│ └── (same structure as esc-oracle/)
│
├── pg-oracle/ # ─── PG Cross-Chain Oracle ───
│ └── (same structure as esc-oracle/)
│
└── arbiter/ # ─── Cross-Chain Arbiter ───
├── arbiter # Arbiter binary
├── config.json # Arbiter config (sidechain RPC endpoints)
├── keystore.dat # Copy of ELA keystore
├── ela-cli -> ../ela/ela-cli # Symlink to ELA CLI
└── elastos_arbiter/ # State database (SQLite)
~/.config/elastos/ # ─── Sensitive Credentials ─── (chmod 700)
├── node.json # Network type: {"chain-type":"mainnet"}
├── ela.txt # ELA keystore password (chmod 600)
├── esc.txt # ESC keystore password (chmod 600)
├── eid.txt # EID keystore password (chmod 600)
└── pg.txt # PG keystore password (chmod 600)
Command Reference
Global Commands
| Command | Description |
|---|---|
node.sh init | Initialize all chains (prompts for mainnet/testnet) |
node.sh start | Start all installed daemons (dependency order) |
node.sh stop | Stop all daemons (reverse dependency order) |
node.sh status | Show status of all chains |
node.sh update | Update all binaries to latest version |
node.sh set_path | Add node.sh to PATH via ~/.profile |
node.sh set_cron | Install cron jobs for auto-restart and log rotation |
node.sh update_script | Self-update node.sh from GitHub master |
Per-Chain Commands
Replace {chain} with: ela, esc, eid, esc-oracle, eid-oracle, arbiter.
| Command | Description |
|---|---|
node.sh {chain} init | Initialize a specific chain |
node.sh {chain} start | Start a specific chain daemon |
node.sh {chain} stop | Stop a specific chain daemon |
node.sh {chain} status | Show detailed status of a chain |
node.sh {chain} update | Update a chain's binary |
node.sh {chain} update -y | Update without confirmation prompts |
node.sh {chain} update -p | Update and purge checkpoints |
node.sh {chain} update -n | Update without auto-restart |
node.sh {chain} compress_log | Compress logs for a chain |
node.sh {chain} remove_log | Remove old logs for a chain |
BPoS Commands
| Command | Description |
|---|---|
node.sh ela register_bpos NAME URL BLOCKS [REGION] | Register or update supernode |
node.sh ela activate_bpos | Activate or reactivate supernode |
node.sh ela unregister_bpos | Unregister and return deposit |
node.sh ela claim_bpos AMOUNT|All [ADDRESS] | Claim accumulated BPoS rewards |
Elastos Council Commands
| Command | Description |
|---|---|
node.sh ela register_crc NAME URL [REGION] | Register as Elastos Council candidate |
node.sh ela activate_crc | Activate Elastos Council candidacy |
node.sh ela unregister_crc | Unregister Elastos Council candidacy |
node.sh ela impeach_crc | Initiate impeachment |
Maintenance Commands
| Command | Description |
|---|---|
node.sh compress_log | Compress all rotated log files across all chains |
node.sh remove_log | Remove old compressed logs to reclaim disk space |
node.sh set_cron | Install cron jobs for auto-restart on crash and log rotation |
Advanced: JSON-RPC via CLI
For debugging and advanced queries, node.sh wraps ela-cli to call the ELA JSON-RPC API directly:
node.sh ela jsonrpc getcurrentheight
node.sh ela jsonrpc getconnectioncount
node.sh ela jsonrpc getbestblockhash
See Configuration for the full RPC API reference.