ouroboros-consensus-0.21.0.0: Consensus layer for the Ouroboros blockchain protocol
Safe HaskellSafe-Inferred
LanguageHaskell2010

Ouroboros.Consensus.HardFork.History.Summary

Synopsis

Bounds

data Bound Source #

Detailed information about the time bounds of an era

Constructors

Bound 

Instances

Instances details
Generic Bound Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Associated Types

type Rep BoundTypeType #

Methods

fromBoundRep Bound x #

toRep Bound x → Bound #

Show Bound Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Methods

showsPrecIntBoundShowS #

showBoundString #

showList ∷ [Bound] → ShowS #

Eq Bound Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Methods

(==)BoundBoundBool #

(/=)BoundBoundBool #

NoThunks Bound Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Serialise Bound Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

type Rep Bound Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

type Rep Bound = D1 ('MetaData "Bound" "Ouroboros.Consensus.HardFork.History.Summary" "ouroboros-consensus-0.21.0.0-inplace" 'False) (C1 ('MetaCons "Bound" 'PrefixI 'True) (S1 ('MetaSel ('Just "boundTime") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 RelativeTime) :*: (S1 ('MetaSel ('Just "boundSlot") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 SlotNo) :*: S1 ('MetaSel ('Just "boundEpoch") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 EpochNo))))

mkUpperBound Source #

Arguments

HasCallStack 
EraParams 
Bound

Lower bound

EpochNo

Upper bound

Bound 

Compute upper bound given just the epoch number and era parameters

Per-era summary

data EraEnd Source #

Exclusive upper bound on the era

Constructors

EraEnd !Bound

Bounded era

EraUnbounded

Unbounded era

This arises from the use of UnsafeIndefiniteSafeZone.

Instances

Instances details
Generic EraEnd Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Associated Types

type Rep EraEndTypeType #

Methods

fromEraEndRep EraEnd x #

toRep EraEnd x → EraEnd #

Show EraEnd Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Methods

showsPrecIntEraEndShowS #

showEraEndString #

showList ∷ [EraEnd] → ShowS #

Eq EraEnd Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Methods

(==)EraEndEraEndBool #

(/=)EraEndEraEndBool #

NoThunks EraEnd Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Serialise EraEnd Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

type Rep EraEnd Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

type Rep EraEnd = D1 ('MetaData "EraEnd" "Ouroboros.Consensus.HardFork.History.Summary" "ouroboros-consensus-0.21.0.0-inplace" 'False) (C1 ('MetaCons "EraEnd" 'PrefixI 'False) (S1 ('MetaSel ('NothingMaybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Bound)) :+: C1 ('MetaCons "EraUnbounded" 'PrefixI 'False) (U1TypeType))

data EraSummary Source #

Information about a specific era

The eraEnd of the final era in the summary will be determined by the safe zone considerations discussed above.

Let the start of the summary be (t, s, e) (time, slot epoch), and the end of the summary be (t', s', e'). We have one invariant relating epochs and slots:

INV-1a  e' == e + ((s' - s) / epochSize)
INV-1b: s' == s + ((e' - e) * epochSize)

And another invariant relating time and slots:

INV-2a: s' == s + ((t' - t) / slotLen)
INV-2b: t' == t + ((s' - s) * slotLen)

Note that these aren't really two sets of independent invariants. INV-1a follows from INV-1b:

      s'                   == s + ((e' - e) * epochSize)
      s' - s               ==     ((e' - e) * epochSize)
     (s' - s) / epochSize  ==       e' - e
e + ((s' - s) / epochSize) ==       e'

Similarly, INV-2a follows from INV-2b:

      t'                 == t + ((s' - s) * slotLen)
      t' - t             ==     ((s' - s) * slotLen)
     (t' - t) / slotLen  ==       s' - s
s + ((t' - t) / slotLen) ==       s'

Constructors

EraSummary 

Fields

Instances

Instances details
Generic EraSummary Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Associated Types

type Rep EraSummaryTypeType #

Show EraSummary Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Eq EraSummary Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Methods

(==)EraSummaryEraSummaryBool #

(/=)EraSummaryEraSummaryBool #

NoThunks EraSummary Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Given EraParamsFormatSerialise EraSummary Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

type Rep EraSummary Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

type Rep EraSummary = D1 ('MetaData "EraSummary" "Ouroboros.Consensus.HardFork.History.Summary" "ouroboros-consensus-0.21.0.0-inplace" 'False) (C1 ('MetaCons "EraSummary" 'PrefixI 'True) (S1 ('MetaSel ('Just "eraStart") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Bound) :*: (S1 ('MetaSel ('Just "eraEnd") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 EraEnd) :*: S1 ('MetaSel ('Just "eraParams") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 EraParams))))

mkEraEnd Source #

Arguments

EraParams 
Bound

Lower bound

Maybe EpochNo

Upper bound

EraEnd 

Version of mkUpperBound when the upper bound may not be known

If passed Nothing, assumes EraUnbounded. This is NOT suitable for eras where the transition is simply unknown.

Overall summary

newtype Summary xs Source #

Summary of the confirmed part of the ledger

The summary zips Shape with Forks, and provides detailed information about the start and end of each era.

We have at most one summary for each era, and at least one

Constructors

Summary 

Instances

Instances details
Show (Summary xs) Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Methods

showsPrecIntSummary xs → ShowS #

showSummary xs → String #

showList ∷ [Summary xs] → ShowS #

Eq (Summary xs) Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Methods

(==)Summary xs → Summary xs → Bool #

(/=)Summary xs → Summary xs → Bool #

NoThunks (Summary xs) Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

(SListI xs, Given EraParamsFormat) ⇒ Serialise (Summary xs) Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Construction

neverForksSummaryEpochSizeSlotLengthGenesisWindowSummary '[x] Source #

Summary for a ledger that never forks

summaryWithExactlyExactly (x ': xs) EraSummarySummary (x ': xs) Source #

Construct Summary with an exact number of EraSummary

Primarily useful for tests.

Summarize

newtype Shape xs Source #

The shape of the chain (old to new)

The shape determines how many hard forks we expect as well as the parameters for each era. The type argument is a type-level list containing one entry per era, emphasizing that this information is statically known.

The entry indices themselves are not used here, but the idea is that they look something like '[ByronBlock, ShelleyBlock, GoguenBlock] and do affect the hard fork combinator. So far this is a list of block types, since most of consensus is indexed by block types.

Constructors

Shape 

Fields

Instances

Instances details
Show (Shape xs) Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Methods

showsPrecIntShape xs → ShowS #

showShape xs → String #

showList ∷ [Shape xs] → ShowS #

NoThunks (Shape xs) Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

data Transitions ∷ [Type] → Type where Source #

The exact point of each confirmed hard fork transition (old to new)

Unlike the Shape of the chain, which is statically known, the Transitions are derived from the state of the ledger (hard fork transition points only become known after a voting procedure).

Any transition listed here must be "certain". How certainty is established is ledger dependent, but it should imply that this is no longer subject to rollback.

Constructors

TransitionsAtMost xs EpochNoTransitions (x ': xs)

If the indices are, say, '[Byron, Shelley, Goguen], then we can have have at most two transitions: one to Shelley, and one to Goguen. There cannot be a transition to the initial ledger.

Instances

Instances details
Show (Transitions xs) Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Methods

showsPrecIntTransitions xs → ShowS #

showTransitions xs → String #

showList ∷ [Transitions xs] → ShowS #

invariantShapeShape xs → Except String () Source #

Check Shape invariants

The only part of the Shape that must make sense is the safeBeforeEpoch values (they must be strictly increasing).

NOTE: We assume eras cannot be empty. This will be satisfied by any ledger we are interested in since transitions must be voted on (safe zones will be non-empty).

invariantSummarySummary xs → Except String () Source #

Check Summary invariants

singletonShapeEraParamsShape '[x] Source #

There is only one era

summarize Source #

Arguments

WithOrigin SlotNo

Slot at the tip of the ledger

Shape xs 
Transitions xs 
Summary xs 

Construct hard fork Summary

NOTE (on epoch to slot translation). In order to translate SlotNo to EpochNo, we simply "line up" all slots. For example, suppose we have an initial EpochSize of 10, and then an EpochSize of 20 from EpochNo 3 onwards. We end up with something like

Epoch | 0      | 1        | 2        | 3        | 4        | ..
Slot  | 0 .. 9 | 10 .. 19 | 20 .. 29 | 30 .. 49 | 50 .. 69 | ..

We do this translation independent from the minimumPossibleSlotNo for a particular ledger. This means that for ledgers where the minimumPossibleSlotNo is not zero (e.g., some ledgers might set it to 1), the maximum number of blocks (aka filled slots) in an epoch is just 1 (or more) less than the other epochs.

transitionsUnknownTransitions (x ': xs) Source #

No known transitions yet

Query

summaryBoundsSummary xs → (Bound, EraEnd) Source #

Outer bounds of the summary

summaryInitSummary xs → (Maybe (Summary xs), EraSummary) Source #

Analogue of init for Summary (i.e., split off the final era)

This is primarily useful for tests.