A lightweight Ergo blockchain indexer and explorer that runs alongside your node. Provides all Explorer API endpoints without the complexity of the full Explorer stack.
- Full Explorer API Compatibility - All 49 endpoints from the official Explorer API
- Lightweight - Single binary + DuckDB (2-5 GB vs 50+ GB for full Explorer)
- Node Agnostic - Works with any Ergo node, easy to upgrade nodes independently
- Parallel Sync - Connect to multiple nodes for faster indexing
- Real-time Status - Monitor sync progress, connected nodes, and database stats
- Wallet Integration - Built-in wallet UI connected to your node
- Docker Ready - Multiple deployment options out of the box
If you already have an Ergo node running:
# Clone the repo
git clone https://github.com/andrehafner/indexed_node_explorer_replacement.git
cd indexed_node_explorer_replacement
# Start (assumes node is at localhost:9053)
docker-compose up -d
# Or specify a different node
ERGO_NODES=http://your-node:9053 docker-compose up -dSpin up both node and indexer together:
docker-compose -f docker-compose.yml -f docker-compose.embedded.yml up -d# Install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Build
cargo build --release
# Run
./target/release/ergo-index --nodes http://localhost:9053| Environment Variable | Default | Description |
|---|---|---|
ERGO_NODES |
http://localhost:9053 |
Comma-separated list of node URLs |
NODE_API_KEY |
- | Node API key (for wallet operations) |
DATABASE_PATH |
./data/ergo-index.duckdb |
Path to DuckDB database file |
PORT |
8080 |
HTTP server port |
NETWORK |
mainnet |
Network type (mainnet/testnet) |
SYNC_BATCH_SIZE |
100 |
Blocks per sync batch |
SYNC_INTERVAL |
10 |
Seconds between sync checks |
# Connect to multiple nodes for parallel fetching
docker-compose -f docker-compose.yml -f docker-compose.multi-node.yml up -d
# Or via environment variable
ERGO_NODES=http://node1:9053,http://node2:9053,http://node3:9053 docker-compose up -dhttp://localhost:8080/- Explorer UIhttp://localhost:8080/docs- Swagger API Documentationhttp://localhost:8080/status- System status and sync progress
GET /api/v1/blocks- List blocksGET /api/v1/blocks/{id}- Get block by ID or heightGET /api/v1/blocks/headers- Get recent headersGET /api/v1/blocks/at/{height}- Get block at heightGET /api/v1/blocks/byMiner/{address}- Get blocks by miner
GET /api/v1/transactions- List transactionsGET /api/v1/transactions/{id}- Get transactionGET /api/v1/transactions/byBlock/{blockId}- Get transactions in blockGET /api/v1/transactions/byAddress/{address}- Get transactions for addressPOST /api/v1/transactions/submit- Submit transaction
GET /api/v1/addresses/{address}- Get address infoGET /api/v1/addresses/{address}/balance/total- Get total balanceGET /api/v1/addresses/{address}/balance/confirmed- Get confirmed balanceGET /api/v1/addresses/{address}/transactions- Get address transactions
GET /api/v1/boxes/{boxId}- Get box by IDGET /api/v1/boxes/byAddress/{address}- Get boxes by addressGET /api/v1/boxes/unspent/byAddress/{address}- Get unspent boxesGET /api/v1/boxes/byTokenId/{tokenId}- Get boxes containing tokenGET /api/v1/boxes/unspent/byTokenId/{tokenId}- Get unspent boxes with tokenPOST /api/v1/boxes/search- Search boxesPOST /api/v1/boxes/unspent/search- Search unspent boxes
GET /api/v1/tokens- List tokensGET /api/v1/tokens/{tokenId}- Get token infoGET /api/v1/tokens/search- Search tokens by nameGET /api/v1/tokens/{tokenId}/holders- Get token holdersGET /api/v1/tokens/byAddress/{address}- Get tokens held by address
GET /api/v1/mempool/transactions- Get mempool transactionsGET /api/v1/mempool/transactions/{txId}- Get mempool transactionGET /api/v1/mempool/transactions/byAddress/{address}- Get mempool txs for addressGET /api/v1/mempool/size- Get mempool size
GET /api/v1/info- Get API infoGET /api/v1/stats- Get explorer statisticsGET /api/v1/stats/network- Get network statisticsGET /api/v1/epochs- Get epochsGET /api/v1/epochs/{index}- Get specific epoch
GET /api/v1/search?query={query}- Universal search
GET /api/v1/wallet/status- Get wallet statusGET /api/v1/wallet/addresses- Get wallet addressesGET /api/v1/wallet/balances- Get wallet balancesPOST /api/v1/wallet/unlock- Unlock walletPOST /api/v1/wallet/lock- Lock walletPOST /api/v1/wallet/transaction/generate- Generate transactionPOST /api/v1/wallet/transaction/send- Send transaction
┌─────────────────────────────────────────────────────────────────┐
│ ergo-index │
│ │
│ ┌─────────────────┐ ┌─────────────────┐ ┌────────────────┐ │
│ │ Axum API │ │ DuckDB │ │ Web UI │ │
│ │ (49 endpoints)│ │ (2-5 GB) │ │ (Svelte-like) │ │
│ └─────────────────┘ └─────────────────┘ └────────────────┘ │
│ ▲ │
│ │ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Sync Service │ │
│ │ (parallel fetching from multiple nodes) │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
│ HTTP
▼
┌──────────────────────────────┐
│ Ergo Node(s) │
│ (unchanged, any version) │
│ │
│ RocksDB │
└──────────────────────────────┘
The indexer maintains the following tables in DuckDB:
blocks- Block headers and metadatatransactions- Transaction recordsboxes- UTXO boxes with ErgoTree and registersbox_assets- Token amounts in boxestokens- Token registry with metadatainputs- Input referencesdata_inputs- Data input referencesaddress_stats- Pre-computed address statisticsnetwork_stats- Time-series network statistics
| Metric | ergo-index | Full Explorer |
|---|---|---|
| Database size | 2-5 GB | 50+ GB |
| Memory usage | 512MB - 1GB | 8GB+ |
| Sync speed | ~100-500 blocks/sec | ~50-100 blocks/sec |
| Components | 1 binary | 5+ services |
| Node dependency | HTTP only | Internal |
# Run in development mode
cargo run -- --nodes http://localhost:9053
# Run tests
cargo test
# Build release
cargo build --releaseContributions are welcome! Please open an issue or submit a pull request.
MIT License - see LICENSE for details.
- Ergo Platform
- explorer-backend - API design inspiration
- explorer_perl - Original explorer implementation