gaiad start catches up in minutes rather than days.
Pick a method
Both practical methods leave the node without history before the snapshot height. For an archive node, restore an archive snapshot from a provider that publishes one and keep
pruning = "nothing".
Restore a snapshot
1
Pick a provider and check the backend
Providers below publish pruned Replace
cosmoshub-4 snapshots. Backend, cadence, compression, and checksum are what each provider’s page or API stated when checked on 2026-10-15. Cadence was confirmed by observing two consecutive files where “observed” is noted. Sizes were 9 to 19 GB compressed.PebbleDB snapshots (stated by the provider in the page, file name, or API):goleveldb snapshots, or backend not stated. Check the backend before restoring, since the archive must match your
db_backend:Checked 2026-10-15. Every page above returned HTTP 200 that day. The list is not an endorsement and has no ranking. It is the set of providers whose snapshot was recent, whose metadata could be verified, and whose download responded. Providers change their backend, pruning, and cadence without notice, so read the page before every restore.To confirm a backend before extracting, list the archive and look at
data/application.db. A PebbleDB directory has an OPTIONS-* file and .sst tables. A goleveldb directory has .ldb tables and no OPTIONS- file. Both have CURRENT and MANIFEST-*. Either can hold a LOG file, so ignore it:lz4 -dc with zstd -dc or gzip -dc to match the archive. Then set db_backend and app-db-backend to match, as on Database backends.2
Download and verify the checksum
OK. Providers that publish no checksum give you nothing to compare, which is the caveat in the second table. The exact URL comes from the provider page. Several publish a latest alias next to dated files.3
Stop the node and reset the data directory
unsafe-reset-all command empties data/ and writes a fresh priv_validator_state.json with height 0. The --keep-addr-book flag keeps the peer address book. Skip the systemctl lines on a node that has never run. 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 reset until systemctl is-active prints inactive.4
Extract into the home directory
data/ directory, so -C ~/.gaia puts it in place. Check the provider’s page if theirs is laid out differently. Some include wasm/ as well, which the node needs. Restoring priv_validator_state.json on a validator is the step that prevents double signing. The listing should show application.db, blockstore.db, state.db, and the other CometBFT stores.5
Start and watch it catch up
application.db or blockstore.db on the first start, the archive’s backend does not match db_backend in config.toml. Fix the setting and restart.State sync
State sync fetches a recent application snapshot from peers. It verifies the snapshot against a block header you trust. It needs two remote procedure call (RPC) servers for the light client and a trust height and hash that you fetch yourself from a source you trust. Fetch the values. Pick a height about 2000 blocks below the tip so the snapshot at the nearest multiple of 1000 already exists:92B8B6B8580D1AF937129A6D019E02883B1655F6FC3CBE237FD748008C1CC5C5 from both. Any block within the trust period works, but a stale height makes every peer’s snapshot unusable.
Write the configuration:
[statesync] keys in config.toml. The trust_period value is two thirds of the Hub’s 21 day unbonding time, which is the longest a header can be trusted before a validator who signed it could have unbonded. The default 168h also works but leaves less room. The two RPC servers above were live on 2026-10-15 (the polkachu node is an archive, the ccvalidators node serves from height 5200791). Swap in any providers you trust.
Start the node. Watch for Discovered new snapshot, then Applied snapshot chunk lines, then normal block execution. If it stops with State sync failed err="state sync aborted", the usual causes are a trust height outside the peers’ snapshot window or too few peers serving snapshots. Refetch the height and hash, then restart. Once synced, set statesync.enable back to false so a later restart does not try again.
Serve snapshots to others
Every node takes state sync snapshots by default:snapshot-interval = 1000 and snapshot-keep-recent = 10 in the [state-sync] section of app.toml. Leave the interval at 1000 so your snapshots line up with everyone else’s and peers can find them. The local snapshot store is managed with gaiad snapshots list, dump, load, restore, and delete. On v28.3.1 a dump, load, restore round trip into a fresh home fills the application store only. The node then panics on start with state.AppHash does not match AppHash after replay because CometBFT has no state or blocks yet. Those commands serve peers. To bootstrap your own second node, state sync it from the first one as above. Publishing full data directory archives for the public is covered on Snapshots.
Verify
earliest field is one above the snapshot height, the first block the node applied itself (a snapshot at 400 gives 401). The height field climbs toward the public height, and catching_up becomes false at the tip.