Skip to main content
The [ledger] section configures storage for the ledger (recent unconfirmed blocks) and accounts database. The [snapshots] section controls snapshot creation and retention.

Ledger Storage

ledger.path
string
default:""
Absolute directory path to place the ledger. Firedancer currently spawns an Agave validator to execute transactions that it receives.If no ledger path is provided, it defaults to the ledger subdirectory of the scratch directory. Supports {user} and {name} substitutions.This option is passed to the Agave client with the --ledger argument.
ledger.accounts_path
string
default:""
Absolute directory path to place the accounts database in. If this is empty, it will default to the accounts subdirectory of the ledger path above.Supports {user} and {name} substitutions. This option is passed to the Agave client with the --accounts argument.
ledger.limit_size
integer
default:"200000000"
Maximum number of shreds to keep in root slots in the ledger before discarding.The default is chosen to allow enough time for a validator to download a snapshot from a peer and boot from it, and to make sure that if a validator needs to reboot from its own snapshot, it has enough slots locally to catch back up. Works out to around 400GB of space.This option is passed to the Agave client with the --limit-ledger-size argument.

Account Indexes

ledger.account_indexes
array
default:"[]"
If nonempty, enable an accounts index indexed by the specified field. The account field must be one of:
  • "program-id"
  • "spl-token-owner"
  • "spl-token-mint"
These options are passed to the Agave client with the --account-index argument.
ledger.account_index_exclude_keys
array
default:"[]"
If account indexes are enabled, exclude these keys from the index.These options are passed to the Agave client with the --account-index-exclude-key argument.
ledger.account_index_include_keys
array
default:"[]"
If account indexes are enabled, only include these keys in the index. This overrides account_index_exclude_keys if specified.These options are passed to the Agave client with the --account-index-include-key argument.
ledger.enable_accounts_disk_index
boolean
default:"false"
If account indexes are enabled, they are flushed to disk periodically. Otherwise, the entire index is kept in memory. Setting this to false may reduce disk I/O strain.This option is passed to the Agave client with the --enable-accounts-disk-index argument.
ledger.accounts_index_path
string
default:""
If account indexes are enabled, this is the absolute directory path to place the accounts index in. If this is empty, it will default to the accounts_index subdirectory of the ledger path.Setting this will automatically set enable_accounts_disk_index to true. This option is passed to the Agave client with the --accounts-index-path argument.
ledger.accounts_hash_cache_path
string
default:""
Absolute directory path to place the accounts hash cache data in. If this is empty, it will default to the accounts_hash_cache subdirectory of the ledger path.Every epoch, the client calculates a hash of all the accounts on-chain called the Epoch Accounts Hash. This cache stores intermediate hash data.This option is passed to the Agave client with the --accounts-hash-cache-path argument.

Tower and Archive Format

ledger.snapshot_archive_format
string
default:"zstd"
Whether to use compression when storing snapshots.This option is passed to the Agave client with the --snapshot-archive-format argument.
ledger.require_tower
boolean
default:"false"
Refuse to start if saved tower state is not found.This option is passed to the Agave client with the --require-tower argument.

Snapshots Configuration

The [snapshots] section controls snapshot creation, retention, and download behavior.
snapshots.enabled
boolean
default:"true"
If false, all snapshots (both full and incremental) will not be produced.This option is passed to the Agave client (inverted) with the --no-snapshots argument.
snapshots.incremental_snapshots
boolean
default:"true"
Enable incremental snapshots by setting this flag.This option is passed to the Agave client (inverted) with the --no-incremental-snapshots argument.
snapshots.full_snapshot_interval_slots
integer
default:"25000"
Set how frequently full snapshots are taken, measured in slots, where one slot is about 400ms on production chains.It’s recommended to leave this to the default or to set it to the same value that the known validators are using. Must be a multiple of the incremental snapshot interval.This option is passed to the Agave client with the --full-snapshot-interval-slots argument.
snapshots.incremental_snapshot_interval_slots
integer
default:"100"
Set how frequently incremental snapshots are taken, measured in slots. Must be a multiple of the accounts hash interval (which is 100 by default).This option is passed to the Agave client with the --snapshot-interval-slots argument.
snapshots.maximum_full_snapshots_to_retain
integer
default:"2"
Set the maximum number of full snapshot archives to keep when purging older snapshots.This option is passed to the Agave client with the --maximum-full-snapshots-to-retain argument.
snapshots.maximum_incremental_snapshots_to_retain
integer
default:"4"
Set the maximum number of incremental snapshot archives to keep when purging older snapshots.This option is passed to the Agave client with the --maximum-incremental-snapshots-to-retain argument.
snapshots.minimum_snapshot_download_speed
integer
default:"10485760"
Set the minimum snapshot download speed in bytes per second. If the initial download speed falls below this threshold, the validator will retry the download against a different RPC node.The default value is 10MB/s. This option is passed to the Agave client with the --minimum-snapshot-download-speed argument.
snapshots.maximum_snapshot_download_abort
integer
default:"5"
The maximum number of times to abort and retry when encountering a slow snapshot download.The default value is 5 retries. This option is passed to the Agave client with the --maximum-snapshot-download-abort argument.
snapshots.path
string
default:""
Absolute directory path for storing snapshots. If no path is provided, it defaults to the [ledger.path] option.Supports {user} and {name} substitutions. This option is passed to the Agave client with the --snapshots argument.
snapshots.incremental_path
string
default:""
Absolute directory path for storing incremental snapshots. If no path is provided, defaults to the [snapshots.path] option above, or if that is not provided, the [ledger.path] option.Supports {user} and {name} substitutions. This option is passed to the Agave client with the --incremental-snapshot-archive-path argument.

Configuration Examples

[ledger]
    path = "/mnt/ledger"
    accounts_path = "/mnt/accounts"
    limit_size = 200000000
    snapshot_archive_format = "zstd"

Storage Recommendations

The ledger and accounts database require significant disk space and high I/O performance. Use fast NVMe SSDs for best results.

Disk Space Requirements

  • Ledger: ~400GB with default limit_size of 200M shreds
  • Accounts Database: 100-300GB depending on network
  • Snapshots: 50-100GB per full snapshot
  • Account Indexes (if enabled): 10-50GB depending on index type

Performance Considerations

For optimal performance:
  • Use separate NVMe drives for ledger and accounts
  • Enable account indexes only if needed by your RPC workload
  • Set enable_accounts_disk_index = false to keep indexes in memory if you have sufficient RAM
  • Consider separate volumes for snapshots to isolate I/O

Snapshot Strategy

The default snapshot settings are optimized for most validators:
  • Full snapshots every 25,000 slots (~2.8 hours)
  • Incremental snapshots every 100 slots (~40 seconds)
  • Keep 2 full and 4 incremental snapshots
Adjust retention based on your storage capacity and disaster recovery needs.

Build docs developers (and LLMs) love