ouroboros-network-api- A networking api shared with ouroboros-consensus
Safe HaskellSafe-Inferred




data FetchMode Source #



Use this mode when we are catching up on the chain but are stil well behind. In this mode the fetch logic will optimise for throughput rather than latency.


Use this mode for block-producing nodes that have a known deadline to produce a block and need to get the best chain before that. In this mode the fetch logic will optimise for picking the best chain within the given deadline.


Instances details
Show FetchMode Source # 
Instance details

Defined in Ouroboros.Network.BlockFetch.ConsensusInterface


showsPrecIntFetchModeShowS #

showFetchModeString #

showList ∷ [FetchMode] → ShowS #

Eq FetchMode Source # 
Instance details

Defined in Ouroboros.Network.BlockFetch.ConsensusInterface


(==)FetchModeFetchModeBool #

(/=)FetchModeFetchModeBool #

data BlockFetchConsensusInterface peer header block m Source #

The consensus layer functionality that the block fetch logic requires.

These are provided as input to the block fetch by the consensus layer.




  • readCandidateChainsSTM m (Map peer (AnchoredFragment header))

    Read the K-suffixes of the candidate chains.

    Assumptions: * Their headers must be already validated. * They may contain fewer than K blocks. * Their anchor does not have to intersect with the current chain.

  • readCurrentChainSTM m (AnchoredFragment header)

    Read the K-suffix of the current chain.

    This must contain info on the last K blocks (unless we're near the chain genesis of course).

  • readFetchModeSTM m FetchMode

    Read the current fetch mode that the block fetch logic should use.

    The fetch mode is a dynamic part of the block fetch policy. In FetchModeBulkSync it follows a policy that optimises for expected bandwidth over latency to fetch any particular block, whereas in FetchModeDeadline it follows a policy optimises for the latency to fetch blocks, at the expense of wasting bandwidth.

    This mode should be set so that when the node's current chain is near to "now" it uses the deadline mode, and when it is far away it uses the bulk sync mode.

  • readFetchedBlocksSTM m (Point block → Bool)

    Recent, only within last K

  • mkAddFetchedBlockWhetherReceivingTentativeBlocksSTM m (Point block → block → m ())

    This method allocates an addFetchedBlock function per client. That function and readFetchedBlocks are required to be linked. Upon successful completion of addFetchedBlock it must be the case that readFetchedBlocks reports the block.

  • readFetchedMaxSlotNoSTM m MaxSlotNo

    The highest stored/downloaded slot number.

    This is used to optimise the filtering of fragments in the block fetch logic: when removing already downloaded blocks from a fragment, the filtering (with a linear cost) is stopped as soon as a block has a slot number higher than this slot number, as it cannot have been downloaded anyway.

  • plausibleCandidateChainHasCallStackAnchoredFragment header → AnchoredFragment header → Bool

    Given the current chain, is the given chain plausible as a candidate chain. Classically for Ouroboros this would simply check if the candidate is strictly longer, but for Ouroboros with operational key certificates there are also cases where we would consider a chain of equal length to the current chain.

  • compareCandidateChainsHasCallStackAnchoredFragment header → AnchoredFragment header → Ordering

    Compare two candidate chains and return a preference ordering. This is used as part of selecting which chains to prioritise for downloading block bodies.

  • blockFetchSize ∷ header → SizeInBytes

    Much of the logic for deciding which blocks to download from which peer depends on making estimates based on recent performance metrics. These estimates of course depend on the amount of data we will be downloading.

  • blockMatchesHeader ∷ header → block → Bool

    Given a block header, validate the supposed corresponding block body.

  • headerForgeUTCTimeFromConsensus header → STM m UTCTime

    Calculate when a header's block was forged.

    PRECONDITION: This function will succeed and give a _correct_ result when applied to headers obtained via this interface (ie via Consensus, ie via readCurrentChain or readCandidateChains).

    WARNING: This function may fail or, worse, __give an incorrect result (!!)__ if applied to headers obtained from sources outside of this interface. The FromConsensus newtype wrapper is intended to make it difficult to make that mistake, so please pay that syntactic price and consider its meaning at each call to this function. Relatedly, preserve that argument wrapper as much as possible when deriving ancillary functions/interfaces from this function.

  • blockForgeUTCTimeFromConsensus block → STM m UTCTime

    Calculate when a block was forged.

    PRECONDITION: Same as headerForgeUTCTime.

    WARNING: Same as headerForgeUTCTime.

data WhetherReceivingTentativeBlocks Source #

Whether the block fetch peer is sending tentative blocks, which are understood to possibly be invalid

newtype FromConsensus a Source #

A new type used to emphasize the precondition of headerForgeUTCTime and blockForgeUTCTime at each call site.

At time of writing, the a is either a header or a block. The headers are literally from Consensus (ie provided by ChainSync). Blocks, on the other hand, are indirectly from Consensus: they were fetched only because we favored the corresponding header that Consensus provided.





Instances details
Applicative FromConsensus Source # 
Instance details

Defined in Ouroboros.Network.BlockFetch.ConsensusInterface


pure ∷ a → FromConsensus a #

(<*>)FromConsensus (a → b) → FromConsensus a → FromConsensus b #

liftA2 ∷ (a → b → c) → FromConsensus a → FromConsensus b → FromConsensus c #

(*>)FromConsensus a → FromConsensus b → FromConsensus b #

(<*)FromConsensus a → FromConsensus b → FromConsensus a #

Functor FromConsensus Source # 
Instance details

Defined in Ouroboros.Network.BlockFetch.ConsensusInterface


fmap ∷ (a → b) → FromConsensus a → FromConsensus b #

(<$) ∷ a → FromConsensus b → FromConsensus a #