Skip to main content
This page is for operators who want a Cosmos Hub node synced in hours rather than days, and for operators who publish snapshots. It assumes gaia is installed and the home directory is initialized (see Join mainnet). At the end the node starts from a recent height and catches up from peers. Two things are both called snapshots on the Hub. A data snapshot is a tar archive of the data directory that you download and extract. A state sync snapshot is produced inside the node ([state-sync] in app.toml) and fetched over peer-to-peer (P2P) by state sync. This page covers data snapshots. The last section covers producing state sync snapshots for others.

Pick a snapshot that matches your backend

The snapshot’s database format must match the app-db-backend in app.toml and the db_backend in config.toml of the node that restores it. A PebbleDB node cannot open goleveldb files, and a goleveldb node cannot open PebbleDB files. Provider pages do not always state the backend. When they do not, assume goleveldb or ask. Backend choice and migration are explained on Database and pruning.
Providers that state PebbleDB for cosmoshub-4, checked 2026-10-15:Set the backend before extracting:
Then set the same backend in ~/.gaia/config/config.toml:
Snapshot archives are made from pruned nodes. A pruned snapshot cannot be turned into an archive node. For that, see Archive nodes.

Restore a data snapshot

A restore is a stop, a reset that keeps the validator state file, an extract into data/, and a start. The validator state file is the step that matters. The commands use ~/.gaia. On a node set up with Run gaiad as a service, use /var/lib/gaia/.gaia and run them as the gaia user. The systemctl and journalctl lines name the plain gaiad unit. If the node runs under the Cosmovisor unit from Run gaiad as a service, use cosmovisor instead. Do not touch data/ until systemctl is-active prints inactive.
  1. Stop the node and back up the validator state file. On a validator this file is what stops the node from double signing after a restore.
  1. Reset the data directory, keeping the address book so the node reconnects quickly:
  1. Download the archive and its checksum, and compare them before extracting. The file names and checksum formats are on the provider’s page.
  1. Extract into the home directory. Most archives contain data/, and some also contain wasm/. A PebbleDB provider that ships wasm as a separate archive needs both extracted.
  1. Put the validator state back and start:
On a validator, always restore your own copy of priv_validator_state.json. Restoring a snapshot that contains someone else’s copy, or starting with a fresh one, can make the node sign a height it already signed. That is a double sign. The slash is 5 percent of stake plus permanent tombstoning.

Make snapshots for others

A snapshot node is a pruned full node that is stopped on a schedule, tarred, and started again. A common pruning setting is pruning = "custom", pruning-keep-recent = "100", pruning-interval = "10". Stop the node first, because archiving a live database produces a corrupt snapshot. Read the height before stopping, because gaiad status needs the running node. Use cosmovisor in place of gaiad in the systemctl lines if the node runs under that unit. The archive step only runs once the unit reports inactive.
Publish next to each archive: the height, the gaia version, the database backend (pebbledb or goleveldb), the pruning settings, whether wasm is included, and a SHA-256 checksum. Strip data/priv_validator_state.json from the archive, or document that it is included.

Serve state sync snapshots

State sync snapshots are made by the running node and need no stop. Enable them in app.toml:
The snapshot-interval value is in heights. The default that gaiad init writes is 1000, with 10 kept. Snapshots are only taken at heights that are a multiple of the interval. Pruning does not block them. The node keeps the state at a snapshot height until that snapshot is written, whatever the pruning settings. List what the node holds:
The output is empty on a fresh node. Once snapshots exist, it lists height, format, and chunks. The command gaiad snapshots export --height <h> takes one on demand. Then gaiad snapshots dump <height> <format> writes it to an archive file. Other nodes consume these snapshots through state sync. They need two RPC endpoints serving them to configure [statesync]. See State sync. Do not start a new node with gaiad snapshots load <archive-file> and gaiad snapshots restore <height> <format>. On v28.3.1 they fill only the application store, and the node then panics on start with state.AppHash does not match AppHash after replay because CometBFT has no state yet.

Verify

After a restore, the node should report the snapshot height and then advance:
The latest_block_height value starts at the snapshot height. The catching_up value turns false once the node is within a few blocks of the network. If the node logs panic: ... pebble or leveldb read errors at start, the archive did not match the configured backend.

Next