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

Ouroboros.Consensus.Mempool.TxSeq

Description

Intended for qualified import.

import           Ouroboros.Consensus.Mempool.TxSeq (TxSeq (..))
import qualified Ouroboros.Consensus.Mempool.TxSeq as TxSeq
Synopsis

Documentation

newtype TicketNo Source #

We allocate each transaction a (monotonically increasing) ticket number as it enters the mempool.

Constructors

TicketNo Word64 

Instances

Instances details
Bounded TicketNo Source # 
Instance details

Defined in Ouroboros.Consensus.Mempool.TxSeq

Enum TicketNo Source # 
Instance details

Defined in Ouroboros.Consensus.Mempool.TxSeq

Show TicketNo Source # 
Instance details

Defined in Ouroboros.Consensus.Mempool.TxSeq

Methods

showsPrecIntTicketNoShowS #

showTicketNoString #

showList ∷ [TicketNo] → ShowS #

Eq TicketNo Source # 
Instance details

Defined in Ouroboros.Consensus.Mempool.TxSeq

Methods

(==)TicketNoTicketNoBool #

(/=)TicketNoTicketNoBool #

Ord TicketNo Source # 
Instance details

Defined in Ouroboros.Consensus.Mempool.TxSeq

NoThunks TicketNo Source # 
Instance details

Defined in Ouroboros.Consensus.Mempool.TxSeq

data TxSeq sz tx where Source #

The mempool is a sequence of transactions with their ticket numbers and size in bytes.

Transactions are allocated monotonically increasing ticket numbers as they are appended to the mempool sequence. Transactions can be removed from any position, not just the front.

The sequence is thus ordered by the ticket numbers. We can use the ticket numbers as a compact representation for a "reader" location in the sequence. If a reader knows it has seen all txs with a lower ticket number then it is only interested in transactions with higher ticket numbers.

The mempool sequence is represented by a fingertree. We use a fingertree measure to allow not just normal sequence operations but also efficient splitting and indexing by the ticket number.

Bundled Patterns

pattern EmptyMeasure sz ⇒ TxSeq sz tx

An empty mempool sequence.

pattern (:>)Measure sz ⇒ TxSeq sz tx → TxTicket sz tx → TxSeq sz tx infixl 5

\( O(1) \). Access or add a tx at the back of the mempool sequence.

New txs are always added at the back.

pattern (:<)Measure sz ⇒ TxTicket sz tx → TxSeq sz tx → TxSeq sz tx infixl 5

\( O(1) \). Access a tx at the front of the mempool sequence.

Note that we never add txs at the front. We access txs from front to back when forwarding txs to other peers, or when adding txs to blocks.

Instances

Instances details
Measure sz ⇒ Foldable (TxSeq sz) Source # 
Instance details

Defined in Ouroboros.Consensus.Mempool.TxSeq

Methods

foldMonoid m ⇒ TxSeq sz m → m #

foldMapMonoid m ⇒ (a → m) → TxSeq sz a → m #

foldMap'Monoid m ⇒ (a → m) → TxSeq sz a → m #

foldr ∷ (a → b → b) → b → TxSeq sz a → b #

foldr' ∷ (a → b → b) → b → TxSeq sz a → b #

foldl ∷ (b → a → b) → b → TxSeq sz a → b #

foldl' ∷ (b → a → b) → b → TxSeq sz a → b #

foldr1 ∷ (a → a → a) → TxSeq sz a → a #

foldl1 ∷ (a → a → a) → TxSeq sz a → a #

toListTxSeq sz a → [a] #

nullTxSeq sz a → Bool #

lengthTxSeq sz a → Int #

elemEq a ⇒ a → TxSeq sz a → Bool #

maximumOrd a ⇒ TxSeq sz a → a #

minimumOrd a ⇒ TxSeq sz a → a #

sumNum a ⇒ TxSeq sz a → a #

productNum a ⇒ TxSeq sz a → a #

(Show tx, Show sz) ⇒ Show (TxSeq sz tx) Source # 
Instance details

Defined in Ouroboros.Consensus.Mempool.TxSeq

Methods

showsPrecIntTxSeq sz tx → ShowS #

showTxSeq sz tx → String #

showList ∷ [TxSeq sz tx] → ShowS #

(NoThunks tx, NoThunks sz) ⇒ NoThunks (TxSeq sz tx) Source # 
Instance details

Defined in Ouroboros.Consensus.Mempool.TxSeq

Methods

noThunksContextTxSeq sz tx → IO (Maybe ThunkInfo) Source #

wNoThunksContextTxSeq sz tx → IO (Maybe ThunkInfo) Source #

showTypeOfProxy (TxSeq sz tx) → String Source #

data TxTicket sz tx Source #

We associate transactions in the mempool with their ticket number and size in bytes.

Constructors

TxTicket 

Fields

Instances

Instances details
Generic (TxTicket sz tx) Source # 
Instance details

Defined in Ouroboros.Consensus.Mempool.TxSeq

Associated Types

type Rep (TxTicket sz tx) ∷ TypeType #

Methods

fromTxTicket sz tx → Rep (TxTicket sz tx) x #

toRep (TxTicket sz tx) x → TxTicket sz tx #

(Show tx, Show sz) ⇒ Show (TxTicket sz tx) Source # 
Instance details

Defined in Ouroboros.Consensus.Mempool.TxSeq

Methods

showsPrecIntTxTicket sz tx → ShowS #

showTxTicket sz tx → String #

showList ∷ [TxTicket sz tx] → ShowS #

(Eq tx, Eq sz) ⇒ Eq (TxTicket sz tx) Source # 
Instance details

Defined in Ouroboros.Consensus.Mempool.TxSeq

Methods

(==)TxTicket sz tx → TxTicket sz tx → Bool #

(/=)TxTicket sz tx → TxTicket sz tx → Bool #

(NoThunks tx, NoThunks sz) ⇒ NoThunks (TxTicket sz tx) Source # 
Instance details

Defined in Ouroboros.Consensus.Mempool.TxSeq

type Rep (TxTicket sz tx) Source # 
Instance details

Defined in Ouroboros.Consensus.Mempool.TxSeq

type Rep (TxTicket sz tx) = D1 ('MetaData "TxTicket" "Ouroboros.Consensus.Mempool.TxSeq" "ouroboros-consensus-0.21.0.0-inplace" 'False) (C1 ('MetaCons "TxTicket" 'PrefixI 'True) (S1 ('MetaSel ('Just "txTicketTx") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 tx) :*: (S1 ('MetaSel ('Just "txTicketNo") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 TicketNo) :*: S1 ('MetaSel ('Just "txTicketSize") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 sz))))

fromListMeasure sz ⇒ [TxTicket sz tx] → TxSeq sz tx Source #

Given a list of TxTickets, construct a TxSeq.

lookupByTicketNoMeasure sz ⇒ TxSeq sz tx → TicketNoMaybe tx Source #

\( O(\log(n)) \). Look up a transaction in the sequence by its TicketNo.

splitAfterTicketNoMeasure sz ⇒ TxSeq sz tx → TicketNo → (TxSeq sz tx, TxSeq sz tx) Source #

\( O(\log(n)) \). Split the sequence of transactions into two parts based on the given TicketNo. The first part has transactions with tickets less than or equal to the given ticket, and the second part has transactions with tickets strictly greater than the given ticket.

splitAfterTxSizeMeasure sz ⇒ TxSeq sz tx → sz → (TxSeq sz tx, TxSeq sz tx) Source #

\( O(\log(n)) \). Split the sequence of transactions into two parts based on the given sz. The first part has transactions whose summed sz is less than or equal to the given sz, and the second part has the remaining transactions in the sequence.

toListTxSeq sz tx → [TxTicket sz tx] Source #

Convert a TxSeq to a list of TxTickets.

toSizeMeasure sz ⇒ TxSeq sz tx → sz Source #

\( O(1) \). Return the total size of the given TxSeq.

toTuplesHasByteSize sz ⇒ TxSeq sz tx → [(tx, TicketNo, ByteSize32)] Source #

Convert a TxSeq to a list of pairs of transactions and their associated TicketNos and ByteSize32s.

zeroTicketNoTicketNo Source #

The transaction ticket number from which our counter starts.

Reference implementations for testing

splitAfterTxSizeSpec ∷ ∀ sz tx. Measure sz ⇒ TxSeq sz tx → sz → (TxSeq sz tx, TxSeq sz tx) Source #

\( O(n) \). Specification of splitAfterTxSize.

Use splitAfterTxSize as it should be faster.

This function is used to verify whether splitAfterTxSize behaves as expected.