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.
GCS bucket path
gs://gravity-public-bucket/nitro-data-20260526/
Anonymous HTTPS listing
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
A local directory with at least ~400 GB of free space for the chaindata (the snapshot is ~350 GB before nitro's pebble overhead).
An Ethereum mainnet RPC endpoint with unlimited rate limit for
eth_getLogs.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.
Option A — gcloud storage (recommended)
gcloud storage (recommended)rsync is idempotent and safe to re-run if the transfer is interrupted.
Option B — gsutil
gsutilOption C — plain HTTPS with wget
wgetAnonymous 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.
Recreate the geth/chaindata symlink
geth/chaindata symlinkThe 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=0off; 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 publichttps://rpc.gravity.xyzworks (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
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.Query the local RPC for the head block:
The returned block number should increase on each call until it converges with the public tip.
Confirm there are no
MissingTrieNodeerrors during catch-up:Validated against this snapshot, the node catches up cleanly at roughly seven blocks per second with no
MissingTrieNodeerrors.
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?

