Run Your Own Node
How to run an ADI external node and monitor sync.
The ADI Stack Setup repository provides a one-command setup for running an ADI (external) node (ZK rollup follower) plus two helper sidecars:
external_node: replays L2 blocks from the canonical main node, maintains local state/RPC, and serves JSON-RPC + status/metrics.proof-sync: periodically syncs proving artifacts from the foundation-hosted Azure Blob storage into your local<chain>_data/db/shared.
Requirements
Docker + Docker Compose.
An archive-capable Ethereum L1 RPC endpoint (required to fetch historical state for genesis/upgrade discovery).
Sufficient disk space for
<chain>_data(RocksDB + synced proofs).
Network Selection
Default network:
mainnet.Prefer CLI flags:
--testnet/--network testnet. You may exportNETWORK=testnetif you like, but the flag avoids lingering env state.Network-specific defaults (L2 RPC, replay host, proof storage URL, container prefix, data dir) are injected automatically; no need to swap compose files.
Quickstart (mainnet)
Single Command
Start the stack:
Stepwise
Export an archive L1 RPC URL:
(Optional) Prefetch proofs to speed first start:
If you skip this, the
proof-syncsidecar will pull proofs automatically after start.Start the stack:
Watch logs (optional):
Check RPC tip matches the canonical RPC (requires
ADI_RPC_URL):When both hex values match, you are synced.
Quickstart (testnet)
Testnet may upgrade frequently; join Discord for announcements.
Single Command
Start with testnet flag:
(Optional) If you prefer envs:
export NETWORK=testnetthen run the same commands without the flag.
Stepwise
Provide an archive L1 RPC URL:
(Optional) Prefetch proofs (respects the selected network):
Start:
Transaction forwarding
The Docker Compose setting general_main_node_rpc_url controls the transaction forwarding target. The default points to the ADI sequencer endpoint.
When this setting is unset, the node accepts transactions into its local mempool. It does not forward them, so they remain local-only.
Monitoring
JSON-RPC:
http://localhost:3050eth_syncing→ should returnfalsewhen caught up.eth_blockNumber→ compare with the ADI RPC.
Metrics:
http://localhost:3312/metrics(Prometheus text format). Search forreplay,last_block,state_block_range, ortree_last_blockto infer replay progress.Logs: look for
Replay block <n>lines; once they stop andeth_blockNumbermatches, the node is at tip.
Data Locations
CHAIN_DATA_DIRdefaults per network (./mainnet_dataor./testnet_data); overridable via env. Mapped to/chainin the containers.Proofs:
chain_data/db/shared(synced byproof-sync).RocksDB state:
chain_data/db/node1/....
Common Issues
Pruned L1 RPC: startup panics with
... state at block is pruned ...then use an archive L1 RPC.Permissions: ensure the host data directory is writable (the script
ensure_container_dirsets permissive permissions).Behind on replay: allow time to catch up (monitor via
eth_blockNumberand logs).
What This Node Provides You
A self-hosted ADI L2 RPC endpoint, backed by locally replayed and verified state.
Locally stored proofs (synced from the foundation blob), not generated locally.
No participation in sequencing, proving, or validator duties; it is for verification, data availability, and private querying.
Last updated
