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

Hardware and network requirements for a Robinhood Chain archive node
RequirementMinimum
CPU8+ cores, strong single-core performance
RAM64GB (128GB recommended)
StorageNVMe SSD, ~68GB+ for archive mode
L1 accessEthereum execution RPC + beacon (consensus) API, same or agreeing providers
SoftwareDocker + Docker Compose, zstd for extraction
Node imageoffchainlabs/nitro-node:v3.11.2-3599aca
  1. 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%.

  2. Set up the node files

    Create a node/ directory with a docker-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: 65536

    Copy to node.env and 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-files invocation 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.

  3. Skip the sync — restore from a snapshot

    Download the latest archive and verify it wasn't corrupted or tampered with in transit:

    download & verify
    curl -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.sha256

    Extract it into your node/directory — the archive's top-level data/folder matches the compose file's default DATA_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.

  4. 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.

  5. 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.