Node Operator Guide
Node Operator Guide
This guide covers installing, configuring, and operating an UltraDAG node in production. For a quick setup, see the Quick Start.
Installation
Pre-Built Binary
Download the latest release binary from GitHub:
curl -L -o ultradag-node.tar.gz \
https://github.com/UltraDAGcom/core/releases/download/latest/ultradag-node-linux-x86_64.tar.gz
tar -xzf ultradag-node.tar.gz
chmod +x ultradag-node-linux-x86_64
mv ultradag-node-linux-x86_64 /usr/local/bin/ultradag-node
The binary is under 2 MB and has zero runtime dependencies.
Build from Source
git clone https://github.com/UltraDAGcom/core.git
cd core
cargo build --release -p ultradag-node
cp target/release/ultradag-node /usr/local/bin/
Requires Rust 1.75+ and a working C compiler (for ed25519-dalek).
Docker
docker pull ghcr.io/ultradagcom/ultradag-node:latest
See the Docker Guide for complete container deployment instructions.
Configuration
CLI Flags
All configuration is done through CLI flags:
| Flag | Default | Description |
|---|---|---|
--port | 9333 | P2P listening port |
--rpc-port | P2P + 1000 | HTTP RPC port |
--seed | (bootstrap) | Seed peer addresses (host:port, repeatable) |
--validate | true | Enable validator mode (set to false for observer) |
--round-ms | 5000 | Round duration in milliseconds |
--validators | auto | Expected validator count (fixes quorum threshold) |
--validator-key | none | Path to allowlist file (one address per line) |
--data-dir | ~/.ultradag/node | Data persistence directory |
--no-bootstrap | false | Disable auto-connection to bootstrap nodes |
--pruning-depth | 1000 | Rounds to keep before pruning |
--archive | false | Disable pruning (keep full history) |
--skip-fast-sync | false | Skip checkpoint fast-sync on startup |
--pkey | none | Validator private key (64-char hex) |
--auto-stake | none | Auto-stake N UDAG after startup and sync |
--testnet | true | Enable testnet mode (exposes convenience endpoints) |
Key Priority
When loading the validator identity:
--pkeyflag (highest priority)validator.keyfile in data directory- Auto-generated new keypair (lowest priority)
Running Modes
Validator
Produces DAG vertices and participates in consensus:
ultradag-node --port 9333 --validate --pkey YOUR_KEY_HEX
Requirements: minimum 10,000 UDAG staked, stable network connectivity.
Observer
Follows the chain without producing vertices. No staking required:
ultradag-node --port 9333
Observers sync the DAG, maintain state, and serve RPC queries.
Archive
Full history mode. Retains all DAG vertices without pruning:
ultradag-node --port 9333 --archive
Useful for block explorers and historical analysis. Requires more storage.
State Persistence
Data Directory Structure
| File | Format | Purpose |
|---|---|---|
dag.bin | postcard binary | DAG vertices, tips, rounds |
finality.bin | postcard binary | Finality tracker state |
state.redb | redb ACID database | Accounts, stakes, governance |
mempool.json | postcard binary | Pending transactions |
validator.key | hex text | Validator private key |
checkpoints/ | directory | Checkpoint snapshots |
Persistence Triggers
State is saved:
- Every 10 rounds during normal operation
- On graceful shutdown (SIGTERM/SIGINT)
- Atomically via temp file + rename (crash-safe)
Startup Sequence
- Parse CLI arguments and validate
- Load or generate validator keypair
- Load persisted state from data directory (DAG, finality, redb, mempool)
- Verify genesis checkpoint hash
- Apply validator allowlist (if
--validator-keyspecified) - Start P2P listener
- Connect to seed peers or bootstrap nodes
- Attempt checkpoint fast-sync (unless
--skip-fast-sync) - Auto-stake (if
--auto-stakespecified, waits 20s for sync) - Start RPC server
- Start validator loop (if
--validate) - Install graceful shutdown handler
Graceful Shutdown
The node handles SIGTERM and SIGINT signals:
- Stops the validator loop (no more vertex production)
- Saves DAG state to
dag.bin - Saves finality tracker to
finality.bin - Saves state engine to
state.redb - Saves mempool to
mempool.json - Exits with code 0
SIGTERM or SIGINT for graceful shutdown. SIGKILL (kill -9) prevents state saving and may require a longer sync on restart.Backup and Restore
Backup
Stop the node and copy the data directory:
systemctl stop ultradag
cp -r ~/.ultradag/node ~/.ultradag/node-backup-$(date +%Y%m%d)
systemctl start ultradag
Restore
Replace the data directory with a backup:
systemctl stop ultradag
rm -rf ~/.ultradag/node
cp -r ~/.ultradag/node-backup-20260317 ~/.ultradag/node
systemctl start ultradag
The node will resume from the backed-up state and sync any missed vertices from peers.
Upgrading
Binary upgrades follow a simple swap-and-restart pattern:
# Download new binary
curl -L -o /tmp/ultradag-node.tar.gz \
https://github.com/UltraDAGcom/core/releases/download/latest/ultradag-node-linux-x86_64.tar.gz
tar -xzf /tmp/ultradag-node.tar.gz -C /tmp/
chmod +x /tmp/ultradag-node-linux-x86_64
# Swap and restart
systemctl stop ultradag
cp /tmp/ultradag-node-linux-x86_64 /usr/local/bin/ultradag-node
systemctl start ultradag
Troubleshooting
Node won’t start
- Port in use: check with
ss -tlnp | grep 9333 - Corrupted state: try
--skip-fast-syncor delete data directory for fresh sync - Permission denied: verify data directory is writable
Finality stuck
- Check peer count:
curl http://localhost:10333/peers - Check finality lag:
curl http://localhost:10333/health/detailed - Verify validators are producing:
curl http://localhost:10333/status
No peers connecting
- Ensure P2P port is reachable (check firewall rules)
- Try explicit seeds:
--seed known-peer:9333 - Check bootstrap connectivity:
curl https://ultradag-node-1.fly.dev/status
High memory usage
- Verify pruning is enabled (default: 1000 rounds)
- Check
RUST_LOGlevel (trace can cause memory growth) - Monitor with
/health/detailedendpoint
Transaction pending forever
- Verify nonce matches:
curl http://localhost:10333/balance/ADDRESS - Check mempool:
curl http://localhost:10333/mempool - Ensure sufficient fee (>= 10,000 sats for transfers)
systemd Service File
For production deployments:
[Unit]
Description=UltraDAG Node
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=ultradag
ExecStart=/usr/local/bin/ultradag-node \
--port 9333 \
--validate \
--data-dir /var/lib/ultradag \
--pkey YOUR_VALIDATOR_KEY_HEX
Restart=on-failure
RestartSec=10
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
Next Steps
- Validator Handbook — detailed validator operations
- Monitoring — set up metrics and alerts
- CLI Reference — all flags and environment variables