What is AssumeUTXO?
AssumeUTXO enables you to start using a fully validating node much faster by:- Loading a snapshot of the UTXO set at a specific block height
- Immediately syncing from that point forward to the chain tip
- Validating the entire blockchain from genesis in the background
When to Use AssumeUTXO
AssumeUTXO is ideal when:- You need to get a node operational quickly
- You want full validation but can’t wait days for Initial Block Download (IBD)
- You’re setting up a new node and have access to a trusted snapshot
- You have limited time but don’t want to sacrifice security by using a pruned-only approach
Loading a Snapshot
Snapshots are verified against hardcoded hashes in the Bitcoin Core source code for security.Obtaining a Snapshot
Currently, there is no canonical source for snapshots. You can:- Download from a trusted source (verify it matches the hardcoded hash)
- Generate your own using an already-synced node (see Generating a Snapshot)
Loading the Snapshot
Use theloadtxoutset RPC command:
Set
-rpcclienttimeout=0 to prevent timeout during the loading process, which can take considerable time.Monitoring Progress
After loading, monitor both the snapshot chain sync and background IBD:- The snapshot chainstate (syncing to tip)
- The background IBD chainstate (validating from genesis)
Using with Pruning
AssumeUTXO works with pruned nodes:- Minimum prune setting is normally 550 MiB, but AssumeUTXO requires at least 1100 MiB
- You can delete the snapshot file immediately after
loadtxoutsetcompletes to save space - Temporarily, two chainstate directories will exist (each multiple gigabytes)
- Once background validation reaches the snapshot block, the duplicate data is removed
Working with Indexes
Indexes (transaction index, block filter index, etc.) don’t benefit from AssumeUTXO:- Indexes always build from the genesis block
- They can only apply blocks in sequential order
- They continue building once background validation reaches the snapshot block
Pruning Considerations
For indexes that support pruning:- Only already-indexed blocks can be pruned
- Blocks downloaded after the snapshot can’t be pruned until indexed
- If the snapshot is old, this may consume significant disk space temporarily
Generating a Snapshot
You can create snapshots from a fully synced node using thedumptxoutset RPC:
Verifying Hardcoded Hashes
The “rollback” type can verify hardcoded snapshot hashes:chainparams to verify correctness.
Using Custom Snapshots
To use a snapshot at a height without a hardcoded hash:- Generate the snapshot using
dumptxoutset - Note the snapshot hash from the output
- Modify
chainparamsin the source code to add the hash - Recompile Bitcoin Core
- Load the snapshot with the modified binary
This is primarily useful for testing or development. Production nodes should use snapshots with hashes already included in official releases.