Documentation
Titan Snapshots is a daily, compressed copy of a running Robinhood Chain (chain ID 4663) archive node's data directory. This page covers running the node in Docker and restoring it from a snapshot instead of syncing from genesis — which for an archive node can take a long time and requires an L1 beacon that retains historical blob data most public providers prune after ~18 days.
Requirements
| Requirement | Minimum |
|---|---|
| CPU | 8+ cores, strong single-core performance |
| RAM | 64GB (128GB recommended) |
| Storage | NVMe SSD, ~68GB+ for archive mode |
| L1 access | Ethereum execution RPC + beacon (consensus) API, same or agreeing providers |
| Software | Docker + Docker Compose, zstd for extraction |
| Node image | offchainlabs/nitro-node:v3.11.2-3599aca |
Prerequisites
Docker and Docker Compose installed. An Ethereum L1 endpoint providing bothan execution RPC and a beacon (consensus) API — required to read blob data. Hardware: an 8+ core CPU with strong single-core performance, 64GB RAM (128GB recommended), and an NVMe SSD — archive nodes need substantially more headroom than Robinhood's general sizing formula of
(2 × current chain size) + 20%.Set up the node files
Create a
node/directory with adocker-compose.yml, an env file, and the mainnet genesis file. This compose file mirrors the one running the archive node behind this snapshot service:# Robinhood Chain (4663) archive node — Arbitrum Orbit / Nitro. # # cd node # cp node.env.example node.env # fill in your L1 endpoint # docker compose up -d # docker compose logs -f # # Serves: HTTP http://localhost:8547 WS ws://localhost:8548 services: rhc-node: image: offchainlabs/nitro-node:v3.11.2-3599aca container_name: rhc-node restart: unless-stopped env_file: node.env ports: - "8547:8547" # HTTP JSON-RPC - "8548:8548" # WebSocket volumes: - ${DATA_DIR:-./data}:/home/user/.arbitrum - ./robinhood-genesis.json:/config/robinhood-genesis.json:ro command: - --parent-chain.connection.url=${L1_EXECUTION_RPC} - --parent-chain.blob-client.beacon-url=${L1_BEACON_URL} - --chain.id=4663 - --chain.name=Robinhood Chain - --init.genesis-json-file=/config/robinhood-genesis.json - --http.addr=0.0.0.0 - --http.port=8547 - --http.vhosts=* - --http.corsdomain=* - --http.api=net,web3,eth,debug - --ws.addr=0.0.0.0 - --ws.port=8548 - --ws.api=net,web3,eth # ---- low-latency sequencer feed (optional, remove if you don't want it) ---- - --node.feed.input.url=${FEED_URL} # ---- remove these two lines for a full (non-archive) node ---- - --execution.caching.archive - --execution.caching.state-scheme=path ulimits: nofile: soft: 65536 hard: 65536Copy to
node.envand fill in your own L1 endpoint:# L1 execution RPC (Ethereum mainnet) — needs both endpoints below from the same # provider or two providers that agree on chain state. L1_EXECUTION_RPC=https://YOUR-ETH-MAINNET-RPC/YOUR-KEY # L1 beacon / consensus API (required to read EIP-4844 blob data). L1_BEACON_URL=https://YOUR-ETH-MAINNET-BEACON/YOUR-KEY # Low-latency sequencer feed (optional — lowers head latency vs L1-only polling). FEED_URL=wss://feed.mainnet.chain.robinhood.com # Host path for the node's database. Point this at your snapshot extraction # target — see step 2 below. DATA_DIR=./data
Grab the canonical
robinhood-genesis.json(and, if you prefer the--chain.info-filesinvocation style instead of--init.genesis-json-file, the chain-info JSON too) from Robinhood's own node guide linked at the bottom of this page.Skip the sync — restore from a snapshot
Download the latest archive and verify it wasn't corrupted or tampered with in transit:
download & verifycurl -LO https://snapshot.titandeployer.com/snapshots/robinhood-snapshot-latest.tar.zst && \ curl -LO https://snapshot.titandeployer.com/snapshots/robinhood-snapshot-latest.tar.zst.sha256 && \ sha256sum -c robinhood-snapshot-latest.tar.zst.sha256Extract it into your
node/directory — the archive's top-leveldata/folder matches the compose file's defaultDATA_DIRexactly, since it's a direct copy of the same volume the running archive node mounts at/home/user/.arbitrum:tar -I zstd -xf robinhood-snapshot-latest.tar.zst -C /path/to/your/node
Robinhood's node image also supports an
--init.url=<URL>flag to fetch and initialize a snapshot automatically on first boot. We haven't verified our.tar.zstlayout against Nitro's built-in fetcher, so the manual extract above is the path we've actually tested end-to-end.Bring your own secrets
Snapshots deliberately exclude
jwtsecret, keystores, and anything matching*secret*/*private*as a safety measure. None of these live inside a Nitro node's data directory in normal operation, but the exclusion costs nothing and removes any doubt.Start the node
From your
node/directory:docker compose up -d docker compose logs -f
Confirm it's serving chain 4663:
curl -s -X POST http://localhost:8547 -H 'content-type: application/json' \ -d '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}' # -> {"result":"0x1237"} (4663)
Troubleshooting
Node won't start after extracting the snapshot
Confirm the extracted data/ directory sits directly inside your node/ folder (next to docker-compose.yml), matching DATA_DIR=./data in node.env. If you extracted into a different path, update DATA_DIR to match.
sha256sum reports a checksum mismatch
The archive was corrupted or truncated in transit — usually an interrupted download. Delete the partial file and re-download both the .tar.zst and its .sha256 sidecar together.
Sync stalls or errors on historical blob data
This happens when syncing from genesis (not from a snapshot) against an L1 beacon that has already pruned old blob data — most public beacons retain only ~18 days. Use a blob-archive beacon, or avoid the problem entirely by restoring from a snapshot as described above.
This page covers mainnet plus restoring from a Titan snapshot specifically. For the canonical setup instructions, testnet (chain ID 46630), and official genesis/chain-info files, see Robinhood's own run-a-full-node guide.