ouroboros-consensus
Safe HaskellNone
LanguageHaskell2010

Test.Consensus.Committee.WFALS.Model

Description

Model implementing committee selection based on the Fait Accompli scheme.

This is based on the paper:

Peter Gaži, Aggelos Kiayias, and Alexander Russell. 2023. Fait Accompli Committee Selection: Improving the Size-Security Tradeoff of Stake-Based Committees. In Proceedings of the 2023 ACM SIGSAC Conference on Computer and Communications Security (CCS '23). Association for Computing Machinery, New York, NY, USA, 845–858. https://doi.org/10.1145/3576915.3623194

PDF: https://eprint.iacr.org/2023/1273.pdf

Synopsis

Auxiliary types

data StakeRole Source #

The role of a given stake.

NOTE: used mostly to better document type signatures in this module.

Constructors

Ledger

Stake as recorded on the ledger. Used for inputs to the committee selection algorithm.

Weight

Stake used when casting a new vote. This may be derived from the ledger stake via some transformation. Used for outputs of the committee selection algorithm.

data StakeType Source #

Extra type information about a given stake.

NOTE: used mostly to better document type signatures in this module.

data family StakeStakeRoleStakeTypeType Source #

Stake types annotated with their role and type information

Instances

Instances details
Generic (Stake 'Ledger 'Cumulative) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Associated Types

type Rep (Stake 'Ledger 'Cumulative) 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

type Rep (Stake 'Ledger 'Cumulative) = D1 ('MetaData "Stake" "Test.Consensus.Committee.WFALS.Model" "ouroboros-consensus-3.0.0.0-inplace-consensus-test" 'True) (C1 ('MetaCons "StakeLedgerCumulative" 'PrefixI 'False) (S1 ('MetaSel ('NothingMaybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Rational)))
Generic (Stake 'Ledger 'Global) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Associated Types

type Rep (Stake 'Ledger 'Global) 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

type Rep (Stake 'Ledger 'Global) = D1 ('MetaData "Stake" "Test.Consensus.Committee.WFALS.Model" "ouroboros-consensus-3.0.0.0-inplace-consensus-test" 'True) (C1 ('MetaCons "StakeLedgerGlobal" 'PrefixI 'False) (S1 ('MetaSel ('NothingMaybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Rational)))

Methods

fromStake 'Ledger 'GlobalRep (Stake 'Ledger 'Global) x #

toRep (Stake 'Ledger 'Global) x → Stake 'Ledger 'Global #

Generic (Stake 'Ledger 'Persistent) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Associated Types

type Rep (Stake 'Ledger 'Persistent) 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

type Rep (Stake 'Ledger 'Persistent) = D1 ('MetaData "Stake" "Test.Consensus.Committee.WFALS.Model" "ouroboros-consensus-3.0.0.0-inplace-consensus-test" 'True) (C1 ('MetaCons "StakeLedgerPersistent" 'PrefixI 'False) (S1 ('MetaSel ('NothingMaybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Rational)))
Generic (Stake 'Ledger 'Residual) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Associated Types

type Rep (Stake 'Ledger 'Residual) 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

type Rep (Stake 'Ledger 'Residual) = D1 ('MetaData "Stake" "Test.Consensus.Committee.WFALS.Model" "ouroboros-consensus-3.0.0.0-inplace-consensus-test" 'True) (C1 ('MetaCons "StakeLedgerResidual" 'PrefixI 'False) (S1 ('MetaSel ('NothingMaybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Rational)))
Generic (Stake 'Weight 'Global) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Associated Types

type Rep (Stake 'Weight 'Global) 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

type Rep (Stake 'Weight 'Global) = D1 ('MetaData "Stake" "Test.Consensus.Committee.WFALS.Model" "ouroboros-consensus-3.0.0.0-inplace-consensus-test" 'True) (C1 ('MetaCons "StakeWeightGlobal" 'PrefixI 'False) (S1 ('MetaSel ('NothingMaybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Rational)))

Methods

fromStake 'Weight 'GlobalRep (Stake 'Weight 'Global) x #

toRep (Stake 'Weight 'Global) x → Stake 'Weight 'Global #

Generic (Stake 'Weight 'Persistent) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Associated Types

type Rep (Stake 'Weight 'Persistent) 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

type Rep (Stake 'Weight 'Persistent) = D1 ('MetaData "Stake" "Test.Consensus.Committee.WFALS.Model" "ouroboros-consensus-3.0.0.0-inplace-consensus-test" 'True) (C1 ('MetaCons "StakeWeightPersistent" 'PrefixI 'False) (S1 ('MetaSel ('NothingMaybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Rational)))
Generic (Stake 'Weight 'Residual) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Associated Types

type Rep (Stake 'Weight 'Residual) 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

type Rep (Stake 'Weight 'Residual) = D1 ('MetaData "Stake" "Test.Consensus.Committee.WFALS.Model" "ouroboros-consensus-3.0.0.0-inplace-consensus-test" 'True) (C1 ('MetaCons "StakeWeightResidual" 'PrefixI 'False) (S1 ('MetaSel ('NothingMaybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Rational)))
Num (Stake 'Ledger 'Cumulative) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Num (Stake 'Ledger 'Global) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Num (Stake 'Ledger 'Persistent) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Num (Stake 'Ledger 'Residual) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Num (Stake 'Weight 'Global) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Num (Stake 'Weight 'Persistent) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Num (Stake 'Weight 'Residual) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Show (Stake 'Ledger 'Cumulative) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Show (Stake 'Ledger 'Global) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Show (Stake 'Ledger 'Persistent) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Show (Stake 'Ledger 'Residual) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Show (Stake 'Weight 'Global) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Show (Stake 'Weight 'Persistent) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Show (Stake 'Weight 'Residual) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Eq (Stake 'Ledger 'Cumulative) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Eq (Stake 'Ledger 'Global) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Eq (Stake 'Ledger 'Persistent) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Eq (Stake 'Ledger 'Residual) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Eq (Stake 'Weight 'Global) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Eq (Stake 'Weight 'Persistent) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Eq (Stake 'Weight 'Residual) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Ord (Stake 'Ledger 'Cumulative) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Ord (Stake 'Ledger 'Global) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Ord (Stake 'Ledger 'Persistent) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Ord (Stake 'Ledger 'Residual) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Ord (Stake 'Weight 'Global) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Ord (Stake 'Weight 'Persistent) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Ord (Stake 'Weight 'Residual) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

IsStake (Stake 'Ledger 'Cumulative) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

IsStake (Stake 'Ledger 'Global) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

IsStake (Stake 'Ledger 'Persistent) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

IsStake (Stake 'Ledger 'Residual) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

IsStake (Stake 'Weight 'Global) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

IsStake (Stake 'Weight 'Persistent) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

IsStake (Stake 'Weight 'Residual) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

newtype Stake 'Ledger 'Cumulative Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

newtype Stake 'Ledger 'Global Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

newtype Stake 'Ledger 'Persistent Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

newtype Stake 'Ledger 'Residual Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

newtype Stake 'Weight 'Global Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

newtype Stake 'Weight 'Persistent Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

newtype Stake 'Weight 'Residual Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

type Rep (Stake 'Ledger 'Cumulative) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

type Rep (Stake 'Ledger 'Cumulative) = D1 ('MetaData "Stake" "Test.Consensus.Committee.WFALS.Model" "ouroboros-consensus-3.0.0.0-inplace-consensus-test" 'True) (C1 ('MetaCons "StakeLedgerCumulative" 'PrefixI 'False) (S1 ('MetaSel ('NothingMaybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Rational)))
type Rep (Stake 'Ledger 'Global) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

type Rep (Stake 'Ledger 'Global) = D1 ('MetaData "Stake" "Test.Consensus.Committee.WFALS.Model" "ouroboros-consensus-3.0.0.0-inplace-consensus-test" 'True) (C1 ('MetaCons "StakeLedgerGlobal" 'PrefixI 'False) (S1 ('MetaSel ('NothingMaybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Rational)))
type Rep (Stake 'Ledger 'Persistent) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

type Rep (Stake 'Ledger 'Persistent) = D1 ('MetaData "Stake" "Test.Consensus.Committee.WFALS.Model" "ouroboros-consensus-3.0.0.0-inplace-consensus-test" 'True) (C1 ('MetaCons "StakeLedgerPersistent" 'PrefixI 'False) (S1 ('MetaSel ('NothingMaybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Rational)))
type Rep (Stake 'Ledger 'Residual) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

type Rep (Stake 'Ledger 'Residual) = D1 ('MetaData "Stake" "Test.Consensus.Committee.WFALS.Model" "ouroboros-consensus-3.0.0.0-inplace-consensus-test" 'True) (C1 ('MetaCons "StakeLedgerResidual" 'PrefixI 'False) (S1 ('MetaSel ('NothingMaybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Rational)))
type Rep (Stake 'Weight 'Global) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

type Rep (Stake 'Weight 'Global) = D1 ('MetaData "Stake" "Test.Consensus.Committee.WFALS.Model" "ouroboros-consensus-3.0.0.0-inplace-consensus-test" 'True) (C1 ('MetaCons "StakeWeightGlobal" 'PrefixI 'False) (S1 ('MetaSel ('NothingMaybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Rational)))
type Rep (Stake 'Weight 'Persistent) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

type Rep (Stake 'Weight 'Persistent) = D1 ('MetaData "Stake" "Test.Consensus.Committee.WFALS.Model" "ouroboros-consensus-3.0.0.0-inplace-consensus-test" 'True) (C1 ('MetaCons "StakeWeightPersistent" 'PrefixI 'False) (S1 ('MetaSel ('NothingMaybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Rational)))
type Rep (Stake 'Weight 'Residual) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

type Rep (Stake 'Weight 'Residual) = D1 ('MetaData "Stake" "Test.Consensus.Committee.WFALS.Model" "ouroboros-consensus-3.0.0.0-inplace-consensus-test" 'True) (C1 ('MetaCons "StakeWeightResidual" 'PrefixI 'False) (S1 ('MetaSel ('NothingMaybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Rational)))

class (Num stake, Ord stake) ⇒ IsStake stake where Source #

Type class with operations needed over stakes

Methods

stakeToRational ∷ stake → Rational Source #

rationalToStakeRational → stake Source #

Instances

Instances details
IsStake (Stake 'Ledger 'Cumulative) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

IsStake (Stake 'Ledger 'Global) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

IsStake (Stake 'Ledger 'Persistent) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

IsStake (Stake 'Ledger 'Residual) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

IsStake (Stake 'Weight 'Global) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

IsStake (Stake 'Weight 'Persistent) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

IsStake (Stake 'Weight 'Residual) Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

coerceStake ∷ ∀ stake' stake. (IsStake stake, IsStake stake') ⇒ stake → stake' Source #

Retag a stake with a different origin and type.

NOTE: type parameters are arranged so that one can use type applications to specify the parameters of the resulting type first.

adjustStake ∷ ∀ stake' stake. (IsStake stake, IsStake stake') ⇒ (RationalRational) → stake → stake' Source #

Adjust a stake via a function on rationals

type SeatIndex = Natural Source #

Seat index (0-based)

type VoterId = String Source #

Voter identifier

type family NumSeats (st ∷ StakeType) Source #

Number of seats in the committee

Instances

Instances details
type NumSeats 'Global Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

type NumSeats 'Persistent Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

type NumSeats 'Residual Source # 
Instance details

Defined in Test.Consensus.Committee.WFALS.Model

Stake Distribution

type StakeDistr (sr ∷ StakeRole) (st ∷ StakeType) = Map VoterId (Stake sr st) Source #

Stake distribution mapping voters to their stakes

stakeDistrToDecreasingStakes ∷ ∀ (sr ∷ StakeRole) (st ∷ StakeType). IsStake (Stake sr st) ⇒ StakeDistr sr st → [(VoterId, Stake sr st)] Source #

View a stake distribution as a non-increasing list of stakes

stakeDistrTotalStake ∷ ∀ (sr ∷ StakeRole) (st ∷ StakeType). IsStake (Stake sr st) ⇒ StakeDistr sr st → Stake sr st Source #

Get the total stake in a stake distribution

Fait Accompli Committee Selection

weightedFaitAccompliWith Source #

Arguments

∷ (NumSeats 'ResidualStakeDistr 'Ledger 'ResidualStakeDistr 'Weight 'Residual)

Fallback function for non-persistent seats

NumSeats 'Global

Total number of seats

StakeDistr 'Ledger 'Global

Stake distribution

→ (StakeDistr 'Weight 'Persistent, StakeDistr 'Weight 'Residual)

Selected persistent and non-persistent seats with their corresponding voting stakes

Weighted Fait Accompli committee selection with a fallback mechanism.

This is mostly just plumbing to connect the result of weightedFaitAccompliPersistentSeats with a given fallback scheme.

weightedFaitAccompliPersistentSeatsNumSeats 'GlobalStakeDistr 'Ledger 'Global → (StakeDistr 'Weight 'Persistent, NumSeats 'Residual, StakeDistr 'Ledger 'Residual) Source #

First step of the weighted Fait Accompli committee selection.

This step selects the persistent seats deterministically via the weighted Fait Accompli threshold, and returns the remaining stake distribution for the non-persistent seats selection.

weightedFaitAccompliThreshold Source #

Arguments

NumSeats 'Global

Total number of seats

SeatIndex

Voter seat index (0-based)

Stake 'Ledger 'Global

Voter ledger stake

Stake 'Ledger 'Cumulative

Cumulative ledger stake from the right (including the current voter stake)

Bool

Whether the voter qualifies for a persistent seat

Weighted Fait Accompli threshold for persistent seats

For more details, see (Section 4, Figure 7) of the paper: https://eprint.iacr.org/2023/1273.pdf

localSortition Source #

Arguments

∷ ∀ (st ∷ StakeType) rng. (IsStake (Stake 'Ledger st), IsStake (Stake 'Weight st), Integral (NumSeats st), RandomGen rng) 
⇒ rng

Random number generator

NumSeats st

Expected number of non-persistent seats

StakeDistr 'Ledger st

Non-persistent stake distribution candidate (not necessarily normalized)

StakeDistr 'Weight st

Selected non-persistent seats with their correspoinding voting stakes

Local sortition fallback

makeStakeDistrVotingGlobalStakeDistr 'Weight 'PersistentStakeDistr 'Weight 'ResidualStakeDistr 'Weight 'Global Source #

Combine the resulting persistent and non-persistent stake distributions into a single global one