ouroboros-consensus-0.1.0.0: Consensus layer for the Ouroboros blockchain protocol
Safe HaskellNone
LanguageHaskell2010

Ouroboros.Consensus.Storage.ImmutableDB.API

Synopsis

API

data ImmutableDB m blk Source #

API for the ImmutableDB.

The ImmutableDB stores blocks in SlotNos. Nevertheless, lookups use RealPoint, primarily because Epoch Boundary Blocks (EBBs) have the same SlotNo as the regular block after them (unless that slot is empty), so that we have to use the hash of the block to distinguish the two (hence RealPoint). But also to avoid reading the wrong block, i.e., when we expect a block with a different hash.

The database is append-only, so you cannot append a block to a slot in the past. You can, however, skip slots, e.g., append to slot 0 and then to slot 5, but afterwards, you can no longer append to slots 1-4. You can only store at most one block in each slot, except for EBBs, which are stored separately, at the start of each epoch/chunk.

The block stored in a slot can be queried with getBlockComponent. Block components can also be streamed using Iterators, see stream.

The Tip of the database can be queried with getTip. This tip will always point to a filled slot or an EBB that is present.

The database can be explicitly closed, but can also be automatically closed in case of an UnexpectedFailure.

Constructors

ImmutableDB 

Fields

Instances

Instances details
NoThunks (ImmutableDB m blk) Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

Iterator API

data Iterator m blk b Source #

An Iterator is a handle which can be used to efficiently stream block components from the ImmutableDB.

Constructors

Iterator 

Fields

Instances

Instances details
Functor m => Functor (Iterator m blk) Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

Methods

fmap :: (a -> b) -> Iterator m blk a -> Iterator m blk b #

(<$) :: a -> Iterator m blk b -> Iterator m blk a #

NoThunks (Iterator m blk b) Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

data IteratorResult b Source #

The result of stepping an Iterator.

Instances

Instances details
Functor IteratorResult Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

Methods

fmap :: (a -> b) -> IteratorResult a -> IteratorResult b #

(<$) :: a -> IteratorResult b -> IteratorResult a #

Foldable IteratorResult Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

Methods

fold :: Monoid m => IteratorResult m -> m #

foldMap :: Monoid m => (a -> m) -> IteratorResult a -> m #

foldMap' :: Monoid m => (a -> m) -> IteratorResult a -> m #

foldr :: (a -> b -> b) -> b -> IteratorResult a -> b #

foldr' :: (a -> b -> b) -> b -> IteratorResult a -> b #

foldl :: (b -> a -> b) -> b -> IteratorResult a -> b #

foldl' :: (b -> a -> b) -> b -> IteratorResult a -> b #

foldr1 :: (a -> a -> a) -> IteratorResult a -> a #

foldl1 :: (a -> a -> a) -> IteratorResult a -> a #

toList :: IteratorResult a -> [a] #

null :: IteratorResult a -> Bool #

length :: IteratorResult a -> Int #

elem :: Eq a => a -> IteratorResult a -> Bool #

maximum :: Ord a => IteratorResult a -> a #

minimum :: Ord a => IteratorResult a -> a #

sum :: Num a => IteratorResult a -> a #

product :: Num a => IteratorResult a -> a #

Traversable IteratorResult Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

Methods

traverse :: Applicative f => (a -> f b) -> IteratorResult a -> f (IteratorResult b) #

sequenceA :: Applicative f => IteratorResult (f a) -> f (IteratorResult a) #

mapM :: Monad m => (a -> m b) -> IteratorResult a -> m (IteratorResult b) #

sequence :: Monad m => IteratorResult (m a) -> m (IteratorResult a) #

Eq b => Eq (IteratorResult b) Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

Show b => Show (IteratorResult b) Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

Generic (IteratorResult b) Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

Associated Types

type Rep (IteratorResult b) :: Type -> Type #

type Rep (IteratorResult b) Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

type Rep (IteratorResult b) = D1 ('MetaData "IteratorResult" "Ouroboros.Consensus.Storage.ImmutableDB.API" "ouroboros-consensus-0.1.0.0-GfJNvFcM6lj2s5utKAUPEp" 'False) (C1 ('MetaCons "IteratorExhausted" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "IteratorResult" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 b)))

traverseIterator :: Monad m => (b -> m b') -> Iterator m blk b -> Iterator m blk b' Source #

Variant of traverse instantiated to Iterator m blk m that executes the monadic function when calling iteratorNext.

iteratorToList :: (HasCallStack, Monad m) => Iterator m blk b -> m [b] Source #

Consume an Iterator by stepping until it is exhausted. A list of all the IteratorResults (excluding the final IteratorExhausted) produced by the Iterator is returned.

Types

data Tip blk Source #

Information about the tip of the ImmutableDB.

Constructors

Tip 

Instances

Instances details
StandardHash blk => Eq (Tip blk) Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

Methods

(==) :: Tip blk -> Tip blk -> Bool #

(/=) :: Tip blk -> Tip blk -> Bool #

StandardHash blk => Show (Tip blk) Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

Methods

showsPrec :: Int -> Tip blk -> ShowS #

show :: Tip blk -> String #

showList :: [Tip blk] -> ShowS #

Generic (Tip blk) Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

Associated Types

type Rep (Tip blk) :: Type -> Type #

Methods

from :: Tip blk -> Rep (Tip blk) x #

to :: Rep (Tip blk) x -> Tip blk #

StandardHash blk => NoThunks (Tip blk) Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

type Rep (Tip blk) Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

type Rep (Tip blk) = D1 ('MetaData "Tip" "Ouroboros.Consensus.Storage.ImmutableDB.API" "ouroboros-consensus-0.1.0.0-GfJNvFcM6lj2s5utKAUPEp" 'False) (C1 ('MetaCons "Tip" 'PrefixI 'True) ((S1 ('MetaSel ('Just "tipSlotNo") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 SlotNo) :*: S1 ('MetaSel ('Just "tipIsEBB") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 IsEBB)) :*: (S1 ('MetaSel ('Just "tipBlockNo") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 BlockNo) :*: S1 ('MetaSel ('Just "tipHash") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (HeaderHash blk)))))

tipToAnchor :: WithOrigin (Tip blk) -> Anchor blk Source #

blockToTip :: (HasHeader blk, GetHeader blk) => blk -> Tip blk Source #

newtype CompareTip blk Source #

newtype with an Ord instance that only uses tipSlotNo and tipIsEBB and ignores the other fields.

Constructors

CompareTip 

Fields

Instances

Instances details
Eq (CompareTip blk) Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

Methods

(==) :: CompareTip blk -> CompareTip blk -> Bool #

(/=) :: CompareTip blk -> CompareTip blk -> Bool #

Ord (CompareTip blk) Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

Methods

compare :: CompareTip blk -> CompareTip blk -> Ordering #

(<) :: CompareTip blk -> CompareTip blk -> Bool #

(<=) :: CompareTip blk -> CompareTip blk -> Bool #

(>) :: CompareTip blk -> CompareTip blk -> Bool #

(>=) :: CompareTip blk -> CompareTip blk -> Bool #

max :: CompareTip blk -> CompareTip blk -> CompareTip blk #

min :: CompareTip blk -> CompareTip blk -> CompareTip blk #

Errors

data ImmutableDBError Source #

Errors that might arise when working with this database.

Constructors

ApiMisuse ApiMisuse PrettyCallStack

An error thrown because of incorrect usage of the immutable database by the user.

UnexpectedFailure UnexpectedFailure

An unexpected error thrown because something went wrong on a lower layer.

Instances

Instances details
Show ImmutableDBError Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

Generic ImmutableDBError Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

Associated Types

type Rep ImmutableDBError :: Type -> Type #

Exception ImmutableDBError Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

type Rep ImmutableDBError Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

type Rep ImmutableDBError = D1 ('MetaData "ImmutableDBError" "Ouroboros.Consensus.Storage.ImmutableDB.API" "ouroboros-consensus-0.1.0.0-GfJNvFcM6lj2s5utKAUPEp" 'False) (C1 ('MetaCons "ApiMisuse" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 ApiMisuse) :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 PrettyCallStack)) :+: C1 ('MetaCons "UnexpectedFailure" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 UnexpectedFailure)))

data ApiMisuse Source #

Constructors

forall blk.(Typeable blk, StandardHash blk) => AppendBlockNotNewerThanTipError (RealPoint blk) (Point blk)

When trying to append a new block, it was not newer than the current tip, i.e., the slot was older than or equal to the current tip's slot.

The RealPoint corresponds to the new block and the Point to the current tip.

forall blk.(Typeable blk, StandardHash blk) => InvalidIteratorRangeError (StreamFrom blk) (StreamTo blk)

When the chosen iterator range was invalid, i.e. the start (first parameter) came after the end (second parameter).

ClosedDBError

When performing an operation on a closed DB that is only allowed when the database is open.

OpenDBError

When performing an operation on an open DB that is only allowed when the database is closed.

Instances

Instances details
Show ApiMisuse Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

data UnexpectedFailure Source #

Constructors

FileSystemError FsError

An IO operation on the file-system threw an error.

InvalidFileError FsPath String PrettyCallStack

When loading an epoch or index file, its contents did not pass validation.

MissingFileError FsPath PrettyCallStack

A missing epoch or index file.

forall blk.(Typeable blk, StandardHash blk) => ChecksumMismatchError (RealPoint blk) CRC CRC FsPath PrettyCallStack

There was a checksum mismatch when reading the block with the given point. The first CRC is the expected one, the second one the actual one.

forall blk.(Typeable blk, StandardHash blk) => ParseError FsPath (RealPoint blk) DeserialiseFailure

A block failed to parse

forall blk.(Typeable blk, StandardHash blk) => TrailingDataError FsPath (RealPoint blk) ByteString

When parsing a block we got some trailing data

forall blk.(Typeable blk, StandardHash blk) => MissingBlockError (MissingBlock blk)

Block missing

This exception gets thrown when a block that we know it should be in the ImmutableDB, nonetheless was not found.

forall blk.(Typeable blk, StandardHash blk) => CorruptBlockError (RealPoint blk)

A (parsed) block did not pass the integrity check.

This exception gets thrown when a block doesn't pass the integrity check done for GetVerifiedBlock.

NOTE: we do not check the integrity of a block when it is added to the ImmutableDB. While this exception typically means the block has been corrupted, it could also mean the block didn't pass the check at the time it was added.

data MissingBlock blk Source #

This type can be part of an exception, but also returned as part of an Either, because it can be expected in some cases.

Constructors

EmptySlot (RealPoint blk)

There is no block in the slot of the given point.

WrongHash (RealPoint blk) (NonEmpty (HeaderHash blk))

The block and/or EBB in the slot of the given point have a different hash.

NewerThanTip (RealPoint blk) (Point blk)

The requested point is in the future, i.e., its slot is greater than that of the tip. We record the tip as the second argument.

Instances

Instances details
StandardHash blk => Eq (MissingBlock blk) Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

Methods

(==) :: MissingBlock blk -> MissingBlock blk -> Bool #

(/=) :: MissingBlock blk -> MissingBlock blk -> Bool #

StandardHash blk => Show (MissingBlock blk) Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

Generic (MissingBlock blk) Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

Associated Types

type Rep (MissingBlock blk) :: Type -> Type #

Methods

from :: MissingBlock blk -> Rep (MissingBlock blk) x #

to :: Rep (MissingBlock blk) x -> MissingBlock blk #

type Rep (MissingBlock blk) Source # 
Instance details

Defined in Ouroboros.Consensus.Storage.ImmutableDB.API

missingBlockPoint :: MissingBlock blk -> RealPoint blk Source #

Return the RealPoint of the block that was missing.

Wrappers that preserve HasCallStack

appendBlock :: HasCallStack => ImmutableDB m blk -> blk -> m () Source #

stream :: HasCallStack => ImmutableDB m blk -> ResourceRegistry m -> BlockComponent blk b -> StreamFrom blk -> StreamTo blk -> m (Either (MissingBlock blk) (Iterator m blk b)) Source #

Derived functionality

withDB Source #

Arguments

:: (HasCallStack, MonadThrow m) 
=> m (ImmutableDB m blk)

How to open the database

-> (ImmutableDB m blk -> m a)

Action to perform using the database

-> m a 

Open the database using the given function, perform the given action using the database, and closes the database using its closeDB function, in case of success or when an exception was raised.

streamAfterKnownPoint :: (MonadSTM m, MonadThrow m, HasHeader blk, HasCallStack) => ImmutableDB m blk -> ResourceRegistry m -> BlockComponent blk b -> Point blk -> m (Iterator m blk b) Source #

Variant of streamAfterPoint that throws a MissingBlockError when the point is not in the ImmutableDB (or genesis).

streamAfterPoint :: (MonadSTM m, HasHeader blk, HasCallStack) => ImmutableDB m blk -> ResourceRegistry m -> BlockComponent blk b -> Point blk -> m (Either (MissingBlock blk) (Iterator m blk b)) Source #

Open an iterator with the given point as lower exclusive bound and the current tip as the inclusive upper bound.

Returns a MissingBlock when the point is not in the ImmutableDB.

getTipAnchor :: (MonadSTM m, HasCallStack) => ImmutableDB m blk -> STM m (Anchor blk) Source #