| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Ouroboros.Consensus.Ledger.Basics
Description
Definition is IsLedger
Normally this is imported from Ouroboros.Consensus.Ledger.Abstract. We pull this out to avoid circular module dependencies.
Synopsis
- class GetTip l where
- getTipHash :: GetTip l => l -> ChainHash l
- getTipSlot :: GetTip l => l -> WithOrigin SlotNo
- type family LedgerCfg l :: Type
- class (Show l, Eq l, NoThunks l, NoThunks (LedgerCfg l), Show (LedgerErr l), Eq (LedgerErr l), NoThunks (LedgerErr l), GetTip l, GetTip (Ticked l)) => IsLedger l where
- data family LedgerState blk :: Type
- type LedgerConfig blk = LedgerCfg (LedgerState blk)
- type LedgerError blk = LedgerErr (LedgerState blk)
- type TickedLedgerState blk = Ticked (LedgerState blk)
GetTip
Methods
getTip :: l -> Point l Source #
Point of the most recently applied block
Should be genesisPoint when no blocks have been applied yet
Instances
getTipHash :: GetTip l => l -> ChainHash l Source #
getTipSlot :: GetTip l => l -> WithOrigin SlotNo Source #
Definition of a ledger independent of a choice of block
type family LedgerCfg l :: Type Source #
Static environment required for the ledger
Instances
| type LedgerCfg (LedgerState (DualBlock m a)) Source # | |
Defined in Ouroboros.Consensus.Ledger.Dual | |
| type LedgerCfg (LedgerState (HardForkBlock xs)) Source # | |
| type LedgerCfg (ExtLedgerState blk) Source # | |
Defined in Ouroboros.Consensus.Ledger.Extended | |
| type LedgerCfg (LedgerDB l r) Source # | |
class (Show l, Eq l, NoThunks l, NoThunks (LedgerCfg l), Show (LedgerErr l), Eq (LedgerErr l), NoThunks (LedgerErr l), GetTip l, GetTip (Ticked l)) => IsLedger l where Source #
Associated Types
type LedgerErr l :: Type Source #
Errors that can arise when updating the ledger
This is defined here rather than in ApplyBlock, since the type of
these errors does not depend on the type of the block.
Methods
applyChainTick :: LedgerCfg l -> SlotNo -> l -> Ticked l Source #
Apply "slot based" state transformations
When a block is applied to the ledger state, a number of things happen purely based on the slot number of that block. For example:
- In Byron, scheduled updates are applied, and the update system state is updated.
- In Shelley, delegation state is updated (on epoch boundaries).
The consensus layer must be able to apply such a "chain tick" function, primarily when validating transactions in the mempool (which, conceptually, live in "some block in the future") or when extracting valid transactions from the mempool to insert into a new block to be produced.
This is not allowed to throw any errors. After all, if this could fail, it would mean a previous block set up the ledger state in such a way that as soon as a certain slot was reached, any block would be invalid.
PRECONDITION: The slot number must be strictly greater than the slot at the tip of the ledger (except for EBBs, obviously..).
NOTE: applyChainTick should not change the tip of the underlying ledger
state, which should still refer to the most recent applied block. In
other words, we should have
ledgerTipPoint (applyChainTick cfg slot st) == ledgerTipPoint st
Instances
Link block to its ledger
data family LedgerState blk :: Type Source #
Ledger state associated with a block
Instances
type LedgerConfig blk = LedgerCfg (LedgerState blk) Source #
type LedgerError blk = LedgerErr (LedgerState blk) Source #
type TickedLedgerState blk = Ticked (LedgerState blk) Source #