ouroboros-consensus- Consensus layer for the Ouroboros blockchain protocol
Safe Haskell None
Language Haskell2010




data Expr (f :: Type -> Type ) :: Type -> Type where Source #

Query expressions in PHOAS


EVar :: f a -> Expr f a
ELit :: Show a => a -> Expr f a
ELet :: Expr f a -> (f a -> Expr f b) -> Expr f b
EPair :: Expr f a -> Expr f b -> Expr f (a, b)
EFst :: Expr f (a, b) -> Expr f a
ESnd :: Expr f (a, b) -> Expr f b
EAbsToRelTime :: Expr f RelativeTime -> Expr f TimeInEra
EAbsToRelSlot :: Expr f SlotNo -> Expr f SlotInEra
EAbsToRelEpoch :: Expr f EpochNo -> Expr f EpochInEra
ERelToAbsTime :: Expr f TimeInEra -> Expr f RelativeTime
ERelToAbsSlot :: Expr f (SlotInEra, TimeInSlot) -> Expr f SlotNo
ERelToAbsEpoch :: Expr f (EpochInEra, SlotInEpoch) -> Expr f EpochNo
ERelTimeToSlot :: Expr f TimeInEra -> Expr f (SlotInEra, TimeInSlot)
ERelSlotToTime :: Expr f SlotInEra -> Expr f TimeInEra
ERelSlotToEpoch :: Expr f SlotInEra -> Expr f (EpochInEra, SlotInEpoch)
ERelEpochToSlot :: Expr f EpochInEra -> Expr f SlotInEra
ESlotLength :: Expr f SlotNo -> Expr f SlotLength
EEpochSize :: Expr f EpochNo -> Expr f EpochSize

qryFromExpr :: ( forall f. Expr f a) -> Qry a Source #

Construct a Qry from a closed Expr

runQuery :: forall a xs. HasCallStack => Qry a -> Summary xs -> Either PastHorizonException a Source #

Run a query

Unlike an Expr , which is evaluated in a single era, a Qry is evaluated against all eras. Only if all Expr s embedded in the Qry can be evaluated in the same era (we don't want to mix properties of different eras in one query) do we return the result. If there is no era in which we can evaluate all Expr s in the Qry , we report a PastHorizonException .

NOTE: this means that queries about separate eras have to be run separately, they should not be composed into a single query. How could we know to which era which relative slot/time refers?


data Qry :: Type -> Type Source #


Qry adds a monadic interface on top of Expr . Although means that Qry itself is not showable, the PastHorizonException can nonetheless show the offending expression alongside the Summary against which it was evaluated.


unsafeExtendSafeZone :: Interpreter xs -> Interpreter xs Source #

UNSAFE: extend the safe zone of the current era of the given Interpreter to be unbounded , ignoring any future hard forks.

This only has effect when the Interpreter was obtained in an era that was not the final one (in the final era, this is a no-op). The Interpreter will be made to believe that the current era is the final era, making its horizon unbounded, and thus never returning a PastHorizonException .

Use of this function is strongly discouraged , as it will ignore any future hard forks, and the results produced by the Interpreter can thus be incorrect.


Specific queries

epochToSlot :: EpochNo -> Qry ( SlotNo , EpochSize ) Source #

Translate EpochNo to the SlotNo of the first slot in that epoch

Additionally returns the size of the epoch.

slotToEpoch :: SlotNo -> Qry ( EpochNo , Word64 , Word64 ) Source #

Translate SlotNo to its corresponding EpochNo

Additionally returns the relative slot within this epoch and how many slots are left in this slot.

slotToEpoch' :: SlotNo -> Qry ( EpochNo , Word64 ) Source #

Convert SlotNo to EpochNo and the relative slot within the epoch

slotToWallclock :: SlotNo -> Qry ( RelativeTime , SlotLength ) Source #

Translate SlotNo to the UTCTime at the start of that slot

Additionally returns the length of the slot.

wallclockToSlot :: RelativeTime -> Qry ( SlotNo , NominalDiffTime , NominalDiffTime ) Source #

Translate UTCTime to SlotNo

Additionally returns the time spent and time left in this slot.