module Ouroboros.Consensus.Node.InitStorage (NodeInitStorage (..)) where

import           Ouroboros.Consensus.Block.Abstract
import           Ouroboros.Consensus.Storage.ChainDB.Init (InitChainDB)
import           Ouroboros.Consensus.Storage.ImmutableDB (ChunkInfo)
import           Ouroboros.Consensus.Util.IOLike

-- | Functionality needed to initialise the storage layer of the node.
class NodeInitStorage blk where
  -- | The 'ChunkInfo' to use for the ImmutableDB, i.e., how many slots to put
  -- together in a single chunk file.
  -- For example, for Byron, one would use the epoch size.
  nodeImmutableDbChunkInfo :: StorageConfig blk -> ChunkInfo

  -- | Check the integrity of a block, i.e., that it has not been corrupted by
  -- a bitflip.
  -- Check this by, e.g., verifying whether the block has a valid signature
  -- and that the hash of the body matches the body hash stores in the header.
  -- This does not check the validity of the contents of the block, e.g.,
  -- whether the transactions are valid w.r.t. the ledger, or whether it's
  -- sent by a malicious node.
  nodeCheckIntegrity :: StorageConfig blk -> blk -> Bool

  -- | This function is called when starting up the node, right after the
  -- ChainDB was opened, and before we connect to other nodes and start block
  -- production.
  -- This function can be used to, for example, create the genesis EBB in case
  -- the chain(DB) is empty.
  -- We only provide a limited interface to the chain DB. This is primarily
  -- useful for the definition of combinators (which may need to turn a
  -- 'InitChainDB' for one type of block into an 'InitChainDB' for a closely
  -- related type of block).
  nodeInitChainDB :: IOLike m => StorageConfig blk -> InitChainDB m blk -> m ()
  nodeInitChainDB StorageConfig blk
_ InitChainDB m blk
_ = () -> m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()