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

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

Eq TicketNo Source #
Instance details

Defined in Ouroboros.Consensus.Mempool.TxSeq

Ord TicketNo Source #
Instance details

Defined in Ouroboros.Consensus.Mempool.TxSeq

Show TicketNo Source #
Instance details

Defined in Ouroboros.Consensus.Mempool.TxSeq

NoThunks TicketNo Source #
Instance details

Defined in Ouroboros.Consensus.Mempool.TxSeq

data TxSeq 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 Empty :: TxSeq tx

An empty mempool sequence.

pattern (:>) :: TxSeq tx -> TxTicket tx -> TxSeq 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 (:<) :: TxTicket tx -> TxSeq tx -> TxSeq 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.

data TxTicket tx Source #

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

Constructors

TxTicket

Fields

Instances

Instances details
Eq tx => Eq ( TxTicket tx) Source #
Instance details

Defined in Ouroboros.Consensus.Mempool.TxSeq

Show tx => Show ( TxTicket tx) Source #
Instance details

Defined in Ouroboros.Consensus.Mempool.TxSeq

Generic ( TxTicket tx) Source #
Instance details

Defined in Ouroboros.Consensus.Mempool.TxSeq

Associated Types

type Rep ( TxTicket tx) :: Type -> Type Source #

NoThunks tx => NoThunks ( TxTicket tx) Source #
Instance details

Defined in Ouroboros.Consensus.Mempool.TxSeq

type Rep ( TxTicket tx) Source #
Instance details

Defined in Ouroboros.Consensus.Mempool.TxSeq

type Rep ( TxTicket tx) = D1 (' MetaData "TxTicket" "Ouroboros.Consensus.Mempool.TxSeq" "ouroboros-consensus-0.1.0.1-DT4Cvwf63DZKctsEvaJqCU" ' 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 "txTicketTxSizeInBytes") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 TxSizeInBytes ))))

fromList :: [ TxTicket tx] -> TxSeq tx Source #

Given a list of TxTicket s, construct a TxSeq .

lookupByTicketNo :: TxSeq tx -> TicketNo -> Maybe tx Source #

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

splitAfterTicketNo :: TxSeq tx -> TicketNo -> ( TxSeq tx, TxSeq 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.

splitAfterTxSize :: TxSeq tx -> TxSizeInBytes -> ( TxSeq tx, TxSeq tx) Source #

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

toTuples :: TxSeq tx -> [(tx, TicketNo )] Source #

Convert a TxSeq to a list of pairs of transactions and their associated TicketNo s.

zeroTicketNo :: TicketNo Source #

The transaction ticket number from which our counter starts.

Reference implementations for testing

splitAfterTxSizeSpec :: TxSeq tx -> TxSizeInBytes -> ( TxSeq tx, TxSeq 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.