Run Your Own Node
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.cloudflared-tcp-proxy: forwards block replay data to the node.proof-sync: periodically syncs proving artifacts from the foundation-hosted Azure Blob storage into your local<chain>_data/db/shared.
What it does not do:
It does not generate new proofs or participate as a validator/sequencer. It locally replays and verifies the chain state and serves RPC for your own queries. Proofs are downloaded, not produced.
It does not enable passing new transactions to the network currently, serving only as a read-only node
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:
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, read-only 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
