LithosDocs
ProtocolPayoutsTokenStatsDocs
Start mining
Documentation home
Protocol
  • Lithos Protocol
  • LFSM
    • Rollups
    • NISPs
    • Emissions
    • Mining on Lithos
    • Candidate building
    • Ergo Voting
  • LithosDex
    • Trading with orders
    • Providing liquidity
Run Lithos
  • Startup guide
    • Setting up an Ergo testnet node
  • Configuration
    • Node connection and security
    • Stratum and difficulty
    • Block packages
    • Batching and orders
    • Collateral and emission
    • Wallet and consolidation
    • Statistics and web panels
    • Synchronization and storage
    • Tasks and dispatchers
    • Failure modes
    • Reporting issues
Client API
  • Overview
    • getLithos client information
    • getList UTXO ids for blocks
    • getUTXO ids by block height
    • getBlock info by UTXO id
    • postBlock info for multiple UTXO ids
    • getGet a block's miner set
    • getList all pool blocks
    • getGet Lithos payouts
    • getStatistics overview
    • getMining and payment totals
    • getMining statistics by hour or day
    • getEstimate Lithos hashrate
    • getNetwork difficulty by epoch
    • getThis client's own hashrate
    • getThis client's hashrate over time
    • getThis client's payouts and claims
    • getCollateral inventory
    • getLocal mining activity
    • getCollateral market snapshot
    • getList queue boxes
    • getList the active set
    • getPermit price history
    • getYour locked block rewards
    • postClaim unlocked block rewards
    • postQuote joining the queue
    • postJoin the collateral queue
    • getLithosDex pool state
    • getLithosDex fee vault state
    • getList your outstanding orders
    • postQuote a swap order
    • postPlace a swap order
    • postQuote a deposit order
    • postPlace a deposit order
    • postQuote a redeem order
    • postPlace a redeem order
    • postCancel an order
    • postQuote a swap
    • postQuote a swap by desired output
    • postExecute a swap
    • postQuote a liquidity deposit
    • postDeposit liquidity
    • postQuote a liquidity redemption
    • postRedeem liquidity
    • getList liquidity provisions
    • postClaim settled fees for a provision
    • postQuote a provision resize
    • postResize a provision
    • postCheck a pending fee flush
    • postFlush pending fees to the vault
    • getPool-wide fee history
    • getPool price history
    • getRecent pool activity
    • getFee history for one provision
    • getWallet balances and lending status
    • getGet Stratum information
    • getGet candidate settings
    • getGet difficulty commitment
    • postCommit a difficulty
    • getGet best NISP at height
Lithos

A decentralized mining pool protocol on Ergo. Miners build their own blocks; contracts pay them for proven work.

Live on Ergo mainnet
Protocol
  • How Lithos works
  • Mining on Lithos
  • NISPs
  • Emissions
  • LFSM contracts
Run Lithos
  • Startup guide
  • Configuration
  • LithosDex
  • Client API
  • Failure modes
Network
  • Live stats
  • Public stats API
  • Ergo Platform↗
  • SOAT Miner↗
Community
  • Telegram↗
  • X / Twitter↗
  • GitHub↗
Lithos
© 2026 Lithos Protocol. Open source under the MIT licence.λίθος — stone
Docs/Run Lithos/Configuration

Synchronization and storage

Following the chain, persisting rollup state, and recovering from forks and faults.

Expert5 min readAssumes you understand reorganizations, authenticated dictionaries and checkpointed state. Most miners never change anything on this page.

The sync block controls how the client follows the chain, how it stores what it learns, and how it recovers when something goes wrong. It is the largest block and provides in depth control over how your client interacts with historical and live blockchain data.

The defaults are the tested configuration. Every value here has been exercised under fixed-heap budget gates and crash campaigns at its shipped setting. Changing one moves you off that evidence.

Following the chain#

SettingDefaultRangeWhat it does
sync.startHeight5675002 to 2000000000. RequiredBlock height to start synchronizing from
sync.pollInterval5 seconds1000 to 600000 ms. RequiredHow often the node is polled for new blocks
sync.catchUpBatchBlocks161 to 64Whole blocks fetched per catch-up request
sync.revalidationChecks30 seconds1000 to 3600000 ms. RequiredHow often the committed header is re-read while idle at the tip
sync.retriesBeforeAlarm121 to 10000Consecutive failures at one height before a stalled cursor is logged
sync.cursorWindow2001 to 16000Canonical cursors retained for locating a fork

pollInterval is the largest single term in both node load and block latency. Raise it for a remote or shared node and accept slower tip following.

catchUpBatchBlocks looks like a pure throughput knob and is not. Every block arrives with each of its input boxes in full, so the response grows with the blocks' contents rather than with the count alone.

Re-reading the committed header is what detects a same-height fork, which a height comparison alone cannot show. A fork is rolled back in memory when it is shallow enough, and deeper forks recover from a snapshot instead. The default cursorWindow of 200 matches the Ergo node's default keepVersions, the deepest rollback the node itself can follow, so a larger window adds no reach. Each fork reads one header per cursor from the node.

Note
The minimum start height is 2

The seed reads the header below the start height, so height 1 has nothing beneath it.

The mempool view#

SettingDefaultRangeWhat it does
sync.mempool.maxTransactions100001 to 100000Unconfirmed transactions read before a complete revision is abandoned
sync.mempool.refreshInterval5 seconds1000 to 600000 ms. RequiredHow often the relevant mempool is re-read

The mempool view provides a list of all transactions currently in your node's mempool. The mempool view takes snapshots, or observations of the mempool at every refreshInterval. Because mempools can be spammed, maxTransactions can be set to lower memory load from spammed pools.

The refresh interval is separate from pollInterval on purpose: it trades submission freshness against node load.

Materialized dictionaries#

SettingDefaultRangeWhat it does
sync.materializedDictionaryCacheEntries41 to 64Authenticated dictionary provers retained after lazy materialization

The client's persistent state is rollup metadata along with digests. A dictionary's prover nodes are reconstructed only when a block or a consumer actually touches that dictionary, and this bounds how many stay cached for re-usage afterwards.

Raising it trades memory for fewer reconstructions. The cache also has a fixed internal byte budget that this setting does not override, so a dictionary larger than that budget may serve its current operation without being cached at all.

Snapshots#

SettingDefaultRangeWhat it does
sync.snapshots.enabledtruetrue or falseWrite persistent checkpoints at all
sync.snapshots.intervalBlocks101 to 10000000Committed blocks between ordinary checkpoints
sync.snapshots.retention242 to 100Complete snapshot generations retained
sync.snapshots.maxEntryBytes671088641048576 to 536870912Largest single subtree, header or metadata entry
sync.storage.backendleveldbA backend the client can resolve. RequiredWhich key-value store to use
sync.storage.path.lithos/syncAny path. RequiredWhere that store lives

A checkpoint may intentionally lag the tip. The retained volatile suffix between the checkpoint and the tip is what bounds routine replay and keeps short reorgs cheap, at the cost of memory.

At the defaults, 24 generations at 10 blocks apart span 240 blocks of history.

Dictionaries are content-addressed and streamed, so maxEntryBytes bounds one subtree rather than a whole dictionary or generation.

Warning
Snapshot schema changes force a full re-sync

The schema version is checked on every read and a mismatch aborts the load rather than misreading it. That is deliberate, and it means a client upgrade that changes the stored layout re-syncs from startHeight rather than migrating.

Quarantine and repair#

When one rollup fails to transform, it is quarantined rather than taking the whole client down. Unrelated rollups and the canonical cursor keep committing.

SettingDefaultRangeWhat it does
sync.quarantine.repairAttempts30 to 100Rebuilds attempted from the indexed chain before a rollup is dropped for good
sync.quarantine.retentionBlocks7201 to 10000000Blocks a terminal or exhausted fault stays visible for diagnostics
sync.quarantine.maintenanceCheckpointstruetrue or falseFreeze catch-up periodically so a repair can install at an exact cursor
sync.quarantine.checkpointIntervalBlocks101 to 100000Committed catch-up blocks between those checkpoints
sync.quarantine.maxTransforms1000001 to 10000000Rollup spends followed during one rebuild
sync.quarantine.repairTimeout3 minutes1000 to 3600000 ms. RequiredLongest one walk may hold a maintenance checkpoint

repairAttempts at 0 never rebuilds. Faults that re-reading cannot clear are dropped regardless of the count.

The checkpoint interval is a direct trade. At 1, every catch-up block pauses for at least a quarantine-list round trip, and for a repair walk when a fault exists. Lower values improve repair latency by giving up catch-up throughput. Disabling checkpoints entirely favours throughput, but a long repair may then not install until the client reaches the tip.

On timeout, catch-up resumes. The worker stays exclusive, and a late result still has to satisfy its original cursor before it can install.

Miner Dictionary bootstrap#

SettingDefaultRangeWhat it does
sync.minerDictionary.bootstraptruetrue or falseRebuild the dictionary from its singleton spend chain
sync.minerDictionary.maxTransforms1000001 to 10000000Dictionary spends followed during bootstrap
sync.minerDictionary.repairInterval5 minutes30000 to 86400000 ms. RequiredHow often a failed bootstrap is retried

A failed bootstrap records a capability fault rather than stopping the client. Canonical and rollup synchronization continue.

What you lose until it succeeds is registration and any fraud proof that depends on the dictionary. Mining and submission to existing rollups are unaffected, which is why this degrades rather than failing.

Next steps#

  • Tasks and dispatchers: the remaining runtime blocks.
  • Configuration overview: how validation reports a bad value here.
Edit this page on GitHubsynced from e0ca86a
← PreviousStatistics and web panelsNext →Tasks and dispatchers
On this page
  • Following the chain
  • The mempool view
  • Materialized dictionaries
  • Snapshots
  • Quarantine and repair
  • Miner Dictionary bootstrap
  • Next steps