For the complete documentation index, see llms.txt. This page is also available as Markdown.

Alpha Mainnet (L2) Full Node from Snapshot

Bootstrap a Gravity Alpha Mainnet (L2) full node by downloading a public GCS chaindata snapshot and starting nitro in non-archive mode.

This guide is for operators who want to run a full node (non-archive) against Gravity Alpha Mainnet (L2) and would like to skip the multi-day catch-up from the Conduit snapshot. It walks through downloading a public Google Cloud Storage (GCS) snapshot of the chaindata and starting nitro in full-node mode.

If you instead want an archive node — required for full historical eth_call / debug_traceTransaction against old blocks — follow Alpha Mainnet (L2) Archive Node Setup instead. The two flows share the same image, chain config, parent-chain URLs, DA committee URL, feed URL, and forwarder; only the snapshot source and a couple of --execution.caching flags differ.

Snapshot

A public, anonymously-readable snapshot of the Gravity Alpha Mainnet (L2) chaindata is hosted on Google Cloud Storage.

Property
Value

GCS bucket path

gs://gravity-public-bucket/nitro-data-20260526/

Anonymous file URL pattern

https://storage.googleapis.com/gravity-public-bucket/nitro-data-20260526/<path>

Total size

~350 GB across 4,803 objects

Contents

conduit-orbit-deployer/nitro/ chaindata only — no logs, no keys, no jwtsecret

Snapshot label / date

20260526 (snapshot taken 2026-05-26)

The bucket is publicly readable. No Google account is required, and the snapshot is reachable from gcloud storage, gsutil, plain curl/wget, or any S3/GCS-compatible mirror tool.

Prerequisites

  1. A local directory with at least ~400 GB of free space for the chaindata (the snapshot is ~350 GB before nitro's pebble overhead).

  2. An Ethereum mainnet RPC endpoint with unlimited rate limit for eth_getLogs.

  3. An Ethereum beacon chain RPC endpoint.

Step 1 — Download the snapshot

Pick whichever transfer tool you already have. The gcloud storage client is recommended because it parallelises transfers and is resumable; plain wget works if you don't want to install gcloud.

rsync is idempotent and safe to re-run if the transfer is interrupted.

Option B — gsutil

Option C — plain HTTPS with wget

Anonymous HTTPS works for every object. List the bucket via the XML listing URL, then wget each key. Example one-liner using curl + xmllint to enumerate keys:

gcloud storage is strongly preferred over this loop — it handles pagination, retries, and parallelism for you.

Step 2 — Post-rsync fixups

Two things need to be fixed up after the rsync, both because gcloud storage rsync does not carry over filesystem metadata that nitro relies on.

The source filesystem has conduit-orbit-deployer/nitro/geth/chaindata as a symlink pointing to ../l2chaindata. gcloud storage does not preserve symbolic links and skips otherwise-empty directories, so after the rsync both the symlink and the geth/ directory that holds it are missing. Recreate both:

Match the in-container uid

The offchainlabs/nitro-node image runs as the in-image user user (uid 1000). The rsync wrote the snapshot as the operator's uid, so unless that uid happens to be 1000 the container will exit within a second of launch with Failed to prepare jwt secret file ... permission denied when it tries to create jwtsecret and nodekey under the mounted volume. Match the owning uid:

Alternatively, add --user $(id -u):$(id -g) to the docker run in Step 3 so the container runs as your operator uid instead.

No other fixups are needed — the snapshot does not include nodekey, jwtsecret, or pebble log files, so nitro will generate them on first start.

Step 3 — Run the full node

Save the following as run-gravity-fullnode.sh, make it executable with chmod +x run-gravity-fullnode.sh, and update the TODO variables. The image, chain config, DA committee, and feed are identical to the archive-mode setup.

What's different from the archive-mode script

Compared to the archive-mode setup in Alpha Mainnet (L2) Archive Node Setup, this command:

  • Removes --execution.caching.archive=true — full nodes only retain recent state.

  • Omits --execution.rpc.max-recreate-state-depth=-1 — that flag is only meaningful in archive mode for unlimited historical state recreation.

  • Leaves --execution.rpc.gas-cap=0 off; you may add it back if you want to lift the default RPC gas cap.

  • Replace <YOUR_GRAVITY_ALPHA_MAINNET_RPC> with whatever upstream RPC you want write transactions forwarded to — the public https://rpc.gravity.xyz works (this is what the archive-mode setup hardcodes), or any other Gravity Alpha Mainnet (L2) RPC you operate. This flag is only consulted for outbound write transactions; reads served by this full node never touch the forwarder.

  • Everything else — Docker image (offchainlabs/nitro-node:v3.9.5-66e42c4), --chain.id=1625, --chain.info-json, parent-chain URL, blob-client beacon URL, DA committee REST aggregator, and sequencer feed URL — is identical to the archive setup.

Step 4 — Verify the node is healthy

  1. Watch the container logs for pebble bringing the cache up:

    The first useful line is Allocated cache and file handles ... cache=2.00GiB. Shortly after, created block l2Block=... lines should begin scrolling several times per second while the node catches up to tip.

  2. Query the local RPC for the head block:

    The returned block number should increase on each call until it converges with the public tip.

  3. Confirm there are no MissingTrieNode errors during catch-up:

    Validated against this snapshot, the node catches up cleanly at roughly seven blocks per second with no MissingTrieNode errors.

Notes

  • The snapshot only contains chaindata. The container will generate its own nodekey, jwtsecret, and logs on first boot.

  • The snapshot was prepared in full-node shape; archive-only state tries that would otherwise pad the dataset are not included, so this snapshot is not suitable for an archive node. Use the Conduit-hosted snapshot referenced in Alpha Mainnet (L2) Archive Node Setup if you need archive mode.

  • Once started, this node participates in the standard Gravity Alpha Mainnet (L2) Anytrust DA committee and reads ordering from the Conduit sequencer feed — there is no operational difference at the network level from a node bootstrapped via the archive-mode flow.

Last updated

Was this helpful?