-- | The storage layer is a highly specialized database for storing the blockchain.
--   It consists of five subcomponents:
-- * An abstract file system API, 'System.FS.API.HasFS',
--   that smooths out over some differences between the file systems of
--   different operating systems and, more importantly, allows us to simulate
--   all kinds of failures. This is then used for stress-testing the other
--   components below.
-- * The __[Immutable DB]("Ouroboros.Consensus.Storage.ImmutableDB")__, stores
--   the part of the chain that is immutable, that is, no longer subject to
--   rollback. It is an append-only database, providing efficient access to the
--   chain. 'Ouroboros.Consensus.Storage.ImmutableDB.API.ImmutableDB' defines the
--   immutable DB API.
-- * The __[Volatile DB]("Ouroboros.Consensus.Storage.VolatileDB")__, stores the
--   part of the chain near its tip. This doesn't really store a __chain__ as
--   such, but rather simply a collection of blocks from which we might
--   __construct__ a chain. 'Ouroboros.Consensus.Storage.VolatileDB.API.VolatileDB'
--   defines the volatile DB API.
-- * The ledger DB, stores the state of the ledger. The
--   __[on disk]("Ouroboros.Consensus.Storage.LedgerDB.OnDisk")__ part only stores
--   snapshots of the ledger state that correspond to immutable blocks. The
--   __[in memory]("Ouroboros.Consensus.Storage.LedgerDB.InMemory")__ part
--   stores various snapshots of the ledger state corresponding to blocks near
--   the current tip of the chain, and provides an efficient way of computing
--   any ledger state for the last @k@ blocks of the chain.
-- * The Chain DB finally combines all of these components. It makes decisions
--   about which chains to adopt (chain selection), switches to forks when
--   needed, deals with clock skew, and provides various interfaces to the rest
--   of the consensus layer for things like finding out which blocks were
--   invalid (so we can disconnect from the clients who sent them), cursors that
--   follow the tip of the chain (so that we can inform our downstream peers of
--   how our chain evolves), etc. In many ways, the chain DB is the component
--   that is responsible for "consensus": deciding which chain is the one true
--   chain. 'Ouroboros.Consensus.Storage.ChainDB.API.ChainDB' defines the chain
--   DB API.
module Ouroboros.Consensus.Storage.ChainDB (
    module Ouroboros.Consensus.Storage.ChainDB.API
  , module Ouroboros.Consensus.Storage.ChainDB.Impl
  ) where

import           Ouroboros.Consensus.Storage.ChainDB.API
import           Ouroboros.Consensus.Storage.ChainDB.Impl