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

Ouroboros.Consensus.HardFork.History.Summary

Synopsis

Bounds

data Bound Source #

Detailed information about the time bounds of an era

Instances

Instances details
Eq Bound Source #
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Show Bound Source #
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Generic Bound Source #
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

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

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
Eq EraEnd Source #
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Show EraEnd Source #
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Generic EraEnd Source #
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

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.1.0.1-DT4Cvwf63DZKctsEvaJqCU" ' False ) ( C1 (' MetaCons "EraEnd" ' PrefixI ' False ) ( S1 (' MetaSel (' Nothing :: Maybe Symbol ) ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 Bound )) :+: C1 (' MetaCons "EraUnbounded" ' PrefixI ' False ) ( U1 :: Type -> Type ))

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
Eq EraSummary Source #
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Show EraSummary Source #
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Generic EraSummary Source #
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

NoThunks EraSummary Source #
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

Serialise EraSummary Source #
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

type Rep EraSummary Source #
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Summary

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

Construction

summaryWithExactly :: Exactly (x ': xs) EraSummary -> Summary (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.

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

Transitions :: AtMost xs EpochNo -> Transitions (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.

invariantShape :: Shape 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).

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.

transitionsUnknown :: Transitions (x ': xs) Source #

No known transitions yet

Query

summaryBounds :: Summary xs -> ( Bound , EraEnd ) Source #

Outer bounds of the summary

summaryInit :: Summary xs -> ( Maybe ( Summary xs), EraSummary ) Source #

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

This is primarily useful for tests.