{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Ouroboros.Consensus.MiniProtocol.BlockFetch.ClientInterface (
ChainDbView (..)
, defaultChainDbView
, mkBlockFetchConsensusInterface
, readFetchModeDefault
) where
import Cardano.Network.ConsensusMode (ConsensusMode)
import Cardano.Network.PeerSelection.Bootstrap (UseBootstrapPeers,
requiresBootstrapPeers)
import Cardano.Network.Types (LedgerStateJudgement)
import Control.Monad
import Control.Tracer (Tracer)
import Data.Map.Strict (Map)
import Data.Time.Clock (UTCTime)
import GHC.Stack (HasCallStack)
import Ouroboros.Consensus.Block hiding (blockMatchesHeader)
import qualified Ouroboros.Consensus.Block as Block
import Ouroboros.Consensus.BlockchainTime
import Ouroboros.Consensus.Config
import qualified Ouroboros.Consensus.Config.SupportsNode as SupportsNode
import Ouroboros.Consensus.HeaderValidation (HeaderWithTime (..))
import Ouroboros.Consensus.Ledger.SupportsProtocol
(LedgerSupportsProtocol)
import qualified Ouroboros.Consensus.MiniProtocol.ChainSync.Client as CSClient
import qualified Ouroboros.Consensus.MiniProtocol.ChainSync.Client.Jumping as CSJumping
import Ouroboros.Consensus.Storage.ChainDB.API (AddBlockPromise,
ChainDB)
import qualified Ouroboros.Consensus.Storage.ChainDB.API as ChainDB
import Ouroboros.Consensus.Storage.ChainDB.API.Types.InvalidBlockPunishment
(InvalidBlockPunishment)
import qualified Ouroboros.Consensus.Storage.ChainDB.API.Types.InvalidBlockPunishment as InvalidBlockPunishment
import Ouroboros.Consensus.Util.AnchoredFragment
import Ouroboros.Consensus.Util.IOLike
import Ouroboros.Consensus.Util.Orphans ()
import Ouroboros.Network.AnchoredFragment (AnchoredFragment)
import qualified Ouroboros.Network.AnchoredFragment as AF
import Ouroboros.Network.Block (MaxSlotNo)
import Ouroboros.Network.BlockFetch.ConsensusInterface
(BlockFetchConsensusInterface (..), ChainSelStarvation,
FetchMode (..), FromConsensus (..), PraosFetchMode (..),
mkReadFetchMode)
import Ouroboros.Network.SizeInBytes
data ChainDbView m blk = ChainDbView {
forall (m :: * -> *) blk.
ChainDbView m blk -> STM m (AnchoredFragment (Header blk))
getCurrentChain :: STM m (AnchoredFragment (Header blk))
, forall (m :: * -> *) blk.
ChainDbView m blk -> STM m (AnchoredFragment (HeaderWithTime blk))
getCurrentChainWithTime :: STM m (AnchoredFragment (HeaderWithTime blk))
, forall (m :: * -> *) blk.
ChainDbView m blk -> STM m (Point blk -> Bool)
getIsFetched :: STM m (Point blk -> Bool)
, forall (m :: * -> *) blk. ChainDbView m blk -> STM m MaxSlotNo
getMaxSlotNo :: STM m MaxSlotNo
, forall (m :: * -> *) blk.
ChainDbView m blk
-> InvalidBlockPunishment m -> blk -> m (AddBlockPromise m blk)
addBlockAsync :: InvalidBlockPunishment m -> blk -> m (AddBlockPromise m blk)
, forall (m :: * -> *) blk.
ChainDbView m blk -> STM m ChainSelStarvation
getChainSelStarvation :: STM m ChainSelStarvation
}
defaultChainDbView :: ChainDB m blk -> ChainDbView m blk
defaultChainDbView :: forall (m :: * -> *) blk. ChainDB m blk -> ChainDbView m blk
defaultChainDbView ChainDB m blk
chainDB = ChainDbView {
getCurrentChain :: STM m (AnchoredFragment (Header blk))
getCurrentChain = ChainDB m blk -> STM m (AnchoredFragment (Header blk))
forall (m :: * -> *) blk.
ChainDB m blk -> STM m (AnchoredFragment (Header blk))
ChainDB.getCurrentChain ChainDB m blk
chainDB
, getCurrentChainWithTime :: STM m (AnchoredFragment (HeaderWithTime blk))
getCurrentChainWithTime = ChainDB m blk -> STM m (AnchoredFragment (HeaderWithTime blk))
forall (m :: * -> *) blk.
ChainDB m blk -> STM m (AnchoredFragment (HeaderWithTime blk))
ChainDB.getCurrentChainWithTime ChainDB m blk
chainDB
, getIsFetched :: STM m (Point blk -> Bool)
getIsFetched = ChainDB m blk -> STM m (Point blk -> Bool)
forall (m :: * -> *) blk.
ChainDB m blk -> STM m (Point blk -> Bool)
ChainDB.getIsFetched ChainDB m blk
chainDB
, getMaxSlotNo :: STM m MaxSlotNo
getMaxSlotNo = ChainDB m blk -> STM m MaxSlotNo
forall (m :: * -> *) blk. ChainDB m blk -> STM m MaxSlotNo
ChainDB.getMaxSlotNo ChainDB m blk
chainDB
, addBlockAsync :: InvalidBlockPunishment m -> blk -> m (AddBlockPromise m blk)
addBlockAsync = ChainDB m blk
-> InvalidBlockPunishment m -> blk -> m (AddBlockPromise m blk)
forall (m :: * -> *) blk.
ChainDB m blk
-> InvalidBlockPunishment m -> blk -> m (AddBlockPromise m blk)
ChainDB.addBlockAsync ChainDB m blk
chainDB
, getChainSelStarvation :: STM m ChainSelStarvation
getChainSelStarvation = ChainDB m blk -> STM m ChainSelStarvation
forall (m :: * -> *) blk. ChainDB m blk -> STM m ChainSelStarvation
ChainDB.getChainSelStarvation ChainDB m blk
chainDB
}
readFetchModeDefault ::
(MonadSTM m, HasHeader blk)
=> ConsensusMode
-> BlockchainTime m
-> STM m (AnchoredFragment blk)
-> STM m UseBootstrapPeers
-> STM m LedgerStateJudgement
-> STM m FetchMode
readFetchModeDefault :: forall (m :: * -> *) blk.
(MonadSTM m, HasHeader blk) =>
ConsensusMode
-> BlockchainTime m
-> STM m (AnchoredFragment blk)
-> STM m UseBootstrapPeers
-> STM m LedgerStateJudgement
-> STM m FetchMode
readFetchModeDefault ConsensusMode
consensusMode BlockchainTime m
btime STM m (AnchoredFragment blk)
getCurrentChain
STM m UseBootstrapPeers
getUseBootstrapPeers STM m LedgerStateJudgement
getLedgerStateJudgement =
ConsensusMode
-> STM m LedgerStateJudgement
-> STM m PraosFetchMode
-> STM m FetchMode
forall (m :: * -> *).
Functor m =>
ConsensusMode
-> m LedgerStateJudgement -> m PraosFetchMode -> m FetchMode
mkReadFetchMode ConsensusMode
consensusMode STM m LedgerStateJudgement
getLedgerStateJudgement STM m PraosFetchMode
praosFetchMode
where
praosFetchMode :: STM m PraosFetchMode
praosFetchMode = do
mCurSlot <- BlockchainTime m -> STM m CurrentSlot
forall (m :: * -> *). BlockchainTime m -> STM m CurrentSlot
getCurrentSlot BlockchainTime m
btime
usingBootstrapPeers <- requiresBootstrapPeers <$> getUseBootstrapPeers
<*> getLedgerStateJudgement
case (usingBootstrapPeers, mCurSlot) of
(Bool
True, CurrentSlot
_) -> PraosFetchMode -> STM m PraosFetchMode
forall a. a -> STM m a
forall (m :: * -> *) a. Monad m => a -> m a
return PraosFetchMode
FetchModeBulkSync
(Bool
False, CurrentSlot
CurrentSlotUnknown) -> PraosFetchMode -> STM m PraosFetchMode
forall a. a -> STM m a
forall (m :: * -> *) a. Monad m => a -> m a
return PraosFetchMode
FetchModeBulkSync
(Bool
False, CurrentSlot SlotNo
curSlot) -> do
curChainSlot <- AnchoredFragment blk -> WithOrigin SlotNo
forall block.
HasHeader block =>
AnchoredFragment block -> WithOrigin SlotNo
AF.headSlot (AnchoredFragment blk -> WithOrigin SlotNo)
-> STM m (AnchoredFragment blk) -> STM m (WithOrigin SlotNo)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> STM m (AnchoredFragment blk)
getCurrentChain
let slotsBehind = case WithOrigin SlotNo
curChainSlot of
WithOrigin SlotNo
Origin -> SlotNo -> Word64
unSlotNo SlotNo
curSlot Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
+ Word64
1
NotOrigin SlotNo
slot -> SlotNo -> Word64
unSlotNo SlotNo
curSlot Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
- SlotNo -> Word64
unSlotNo SlotNo
slot
maxSlotsBehind = Word64
1000
return $ if slotsBehind < maxSlotsBehind
then FetchModeDeadline
else FetchModeBulkSync
mkBlockFetchConsensusInterface ::
forall m peer blk.
( IOLike m
, BlockSupportsDiffusionPipelining blk
, Ord peer
, LedgerSupportsProtocol blk
, SupportsNode.ConfigSupportsNode blk
)
=> Tracer m (CSJumping.TraceEventDbf peer)
-> BlockConfig blk
-> ChainDbView m blk
-> CSClient.ChainSyncClientHandleCollection peer m blk
-> (Header blk -> SizeInBytes)
-> STM m FetchMode
-> DiffusionPipeliningSupport
-> BlockFetchConsensusInterface peer (HeaderWithTime blk) blk m
mkBlockFetchConsensusInterface :: forall (m :: * -> *) peer blk.
(IOLike m, BlockSupportsDiffusionPipelining blk, Ord peer,
LedgerSupportsProtocol blk, ConfigSupportsNode blk) =>
Tracer m (TraceEventDbf peer)
-> BlockConfig blk
-> ChainDbView m blk
-> ChainSyncClientHandleCollection peer m blk
-> (Header blk -> SizeInBytes)
-> STM m FetchMode
-> DiffusionPipeliningSupport
-> BlockFetchConsensusInterface peer (HeaderWithTime blk) blk m
mkBlockFetchConsensusInterface
Tracer m (TraceEventDbf peer)
csjTracer BlockConfig blk
bcfg ChainDbView m blk
chainDB ChainSyncClientHandleCollection peer m blk
csHandlesCol Header blk -> SizeInBytes
blockFetchSize STM m FetchMode
readFetchMode DiffusionPipeliningSupport
pipelining =
BlockFetchConsensusInterface {blockFetchSize :: HeaderWithTime blk -> SizeInBytes
blockFetchSize = Header blk -> SizeInBytes
blockFetchSize (Header blk -> SizeInBytes)
-> (HeaderWithTime blk -> Header blk)
-> HeaderWithTime blk
-> SizeInBytes
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HeaderWithTime blk -> Header blk
forall blk. HeaderWithTime blk -> Header blk
hwtHeader, STM m (Map peer (AnchoredFragment (HeaderWithTime blk)))
STM m (AnchoredFragment (HeaderWithTime blk))
STM m MaxSlotNo
STM m ChainSelStarvation
STM m FetchMode
STM m (Point blk -> Bool)
STM m (Point blk -> blk -> m ())
peer -> m ()
HasCallStack =>
AnchoredFragment (HeaderWithTime blk)
-> AnchoredFragment (HeaderWithTime blk) -> Bool
HasCallStack =>
AnchoredFragment (HeaderWithTime blk)
-> AnchoredFragment (HeaderWithTime blk) -> Ordering
AnchoredFragment (HeaderWithTime blk)
-> AnchoredFragment (HeaderWithTime blk) -> Bool
AnchoredFragment (HeaderWithTime blk)
-> AnchoredFragment (HeaderWithTime blk) -> Ordering
FromConsensus (HeaderWithTime blk) -> STM m UTCTime
HeaderWithTime blk -> blk -> Bool
readFetchMode :: STM m FetchMode
readFetchMode :: STM m FetchMode
blockMatchesHeader :: HeaderWithTime blk -> blk -> Bool
readCandidateChains :: STM m (Map peer (AnchoredFragment (HeaderWithTime blk)))
readCurrentChain :: STM m (AnchoredFragment (HeaderWithTime blk))
readFetchedBlocks :: STM m (Point blk -> Bool)
mkAddFetchedBlock :: STM m (Point blk -> blk -> m ())
readFetchedMaxSlotNo :: STM m MaxSlotNo
plausibleCandidateChain :: HasCallStack =>
AnchoredFragment (HeaderWithTime blk)
-> AnchoredFragment (HeaderWithTime blk) -> Bool
compareCandidateChains :: AnchoredFragment (HeaderWithTime blk)
-> AnchoredFragment (HeaderWithTime blk) -> Ordering
headerForgeUTCTime :: FromConsensus (HeaderWithTime blk) -> STM m UTCTime
readChainSelStarvation :: STM m ChainSelStarvation
demoteChainSyncJumpingDynamo :: peer -> m ()
demoteChainSyncJumpingDynamo :: peer -> m ()
readChainSelStarvation :: STM m ChainSelStarvation
headerForgeUTCTime :: FromConsensus (HeaderWithTime blk) -> STM m UTCTime
blockMatchesHeader :: HeaderWithTime blk -> blk -> Bool
compareCandidateChains :: HasCallStack =>
AnchoredFragment (HeaderWithTime blk)
-> AnchoredFragment (HeaderWithTime blk) -> Ordering
plausibleCandidateChain :: HasCallStack =>
AnchoredFragment (HeaderWithTime blk)
-> AnchoredFragment (HeaderWithTime blk) -> Bool
readFetchedMaxSlotNo :: STM m MaxSlotNo
mkAddFetchedBlock :: STM m (Point blk -> blk -> m ())
readFetchedBlocks :: STM m (Point blk -> Bool)
readCurrentChain :: STM m (AnchoredFragment (HeaderWithTime blk))
readCandidateChains :: STM m (Map peer (AnchoredFragment (HeaderWithTime blk)))
..}
where
getCandidates :: STM m (Map peer (AnchoredFragment (HeaderWithTime blk)))
getCandidates :: STM m (Map peer (AnchoredFragment (HeaderWithTime blk)))
getCandidates = STM m (Map peer (ChainSyncClientHandle m blk))
-> (ChainSyncState blk -> AnchoredFragment (HeaderWithTime blk))
-> STM m (Map peer (AnchoredFragment (HeaderWithTime blk)))
forall (m :: * -> *) peer blk a.
IOLike m =>
STM m (Map peer (ChainSyncClientHandle m blk))
-> (ChainSyncState blk -> a) -> STM m (Map peer a)
CSClient.viewChainSyncState (ChainSyncClientHandleCollection peer m blk
-> STM m (Map peer (ChainSyncClientHandle m blk))
forall peer (m :: * -> *) blk.
ChainSyncClientHandleCollection peer m blk
-> STM m (Map peer (ChainSyncClientHandle m blk))
CSClient.cschcMap ChainSyncClientHandleCollection peer m blk
csHandlesCol) ChainSyncState blk -> AnchoredFragment (HeaderWithTime blk)
forall blk.
ChainSyncState blk -> AnchoredFragment (HeaderWithTime blk)
CSClient.csCandidate
blockMatchesHeader :: HeaderWithTime blk -> blk -> Bool
blockMatchesHeader :: HeaderWithTime blk -> blk -> Bool
blockMatchesHeader HeaderWithTime blk
hwt blk
b = Header blk -> blk -> Bool
forall blk. GetHeader blk => Header blk -> blk -> Bool
Block.blockMatchesHeader (HeaderWithTime blk -> Header blk
forall blk. HeaderWithTime blk -> Header blk
hwtHeader HeaderWithTime blk
hwt) blk
b
readCandidateChains :: STM m (Map peer (AnchoredFragment (HeaderWithTime blk)))
readCandidateChains :: STM m (Map peer (AnchoredFragment (HeaderWithTime blk)))
readCandidateChains = STM m (Map peer (AnchoredFragment (HeaderWithTime blk)))
getCandidates
readCurrentChain :: STM m (AnchoredFragment (HeaderWithTime blk))
readCurrentChain :: STM m (AnchoredFragment (HeaderWithTime blk))
readCurrentChain = ChainDbView m blk -> STM m (AnchoredFragment (HeaderWithTime blk))
forall (m :: * -> *) blk.
ChainDbView m blk -> STM m (AnchoredFragment (HeaderWithTime blk))
getCurrentChainWithTime ChainDbView m blk
chainDB
readFetchedBlocks :: STM m (Point blk -> Bool)
readFetchedBlocks :: STM m (Point blk -> Bool)
readFetchedBlocks = ChainDbView m blk -> STM m (Point blk -> Bool)
forall (m :: * -> *) blk.
ChainDbView m blk -> STM m (Point blk -> Bool)
getIsFetched ChainDbView m blk
chainDB
mkAddFetchedBlock ::
STM m (Point blk -> blk -> m ())
mkAddFetchedBlock :: STM m (Point blk -> blk -> m ())
mkAddFetchedBlock = do
pipeliningPunishment <- STM
m
(BlockConfig blk
-> Header blk
-> InvalidBlockPunishment m
-> InvalidBlockPunishment m)
forall (m :: * -> *) blk.
(IOLike m, BlockSupportsDiffusionPipelining blk) =>
STM
m
(BlockConfig blk
-> Header blk
-> InvalidBlockPunishment m
-> InvalidBlockPunishment m)
InvalidBlockPunishment.mkForDiffusionPipelining
pure $ mkAddFetchedBlock_ pipeliningPunishment pipelining
mkAddFetchedBlock_ ::
( BlockConfig blk
-> Header blk
-> InvalidBlockPunishment m
-> InvalidBlockPunishment m
)
-> DiffusionPipeliningSupport
-> Point blk
-> blk
-> m ()
mkAddFetchedBlock_ :: (BlockConfig blk
-> Header blk
-> InvalidBlockPunishment m
-> InvalidBlockPunishment m)
-> DiffusionPipeliningSupport -> Point blk -> blk -> m ()
mkAddFetchedBlock_ BlockConfig blk
-> Header blk
-> InvalidBlockPunishment m
-> InvalidBlockPunishment m
pipeliningPunishment DiffusionPipeliningSupport
enabledPipelining Point blk
_pt blk
blk = m (AddBlockPromise m blk) -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m (AddBlockPromise m blk) -> m ())
-> m (AddBlockPromise m blk) -> m ()
forall a b. (a -> b) -> a -> b
$ do
disconnect <- m (InvalidBlockPunishment m)
forall (m :: * -> *). IOLike m => m (InvalidBlockPunishment m)
InvalidBlockPunishment.mkPunishThisThread
let punishment = (Invalidity -> InvalidBlockPunishment m)
-> InvalidBlockPunishment m
forall (m :: * -> *).
(Invalidity -> InvalidBlockPunishment m)
-> InvalidBlockPunishment m
InvalidBlockPunishment.branch ((Invalidity -> InvalidBlockPunishment m)
-> InvalidBlockPunishment m)
-> (Invalidity -> InvalidBlockPunishment m)
-> InvalidBlockPunishment m
forall a b. (a -> b) -> a -> b
$ \case
Invalidity
InvalidBlockPunishment.BlockPrefix -> InvalidBlockPunishment m
disconnect
Invalidity
InvalidBlockPunishment.BlockItself -> case DiffusionPipeliningSupport
enabledPipelining of
DiffusionPipeliningSupport
DiffusionPipeliningOff -> InvalidBlockPunishment m
disconnect
DiffusionPipeliningSupport
DiffusionPipeliningOn ->
BlockConfig blk
-> Header blk
-> InvalidBlockPunishment m
-> InvalidBlockPunishment m
pipeliningPunishment BlockConfig blk
bcfg (blk -> Header blk
forall blk. GetHeader blk => blk -> Header blk
getHeader blk
blk) InvalidBlockPunishment m
disconnect
addBlockAsync
chainDB
punishment
blk
readFetchedMaxSlotNo :: STM m MaxSlotNo
readFetchedMaxSlotNo :: STM m MaxSlotNo
readFetchedMaxSlotNo = ChainDbView m blk -> STM m MaxSlotNo
forall (m :: * -> *) blk. ChainDbView m blk -> STM m MaxSlotNo
getMaxSlotNo ChainDbView m blk
chainDB
plausibleCandidateChain :: HasCallStack
=> AnchoredFragment (HeaderWithTime blk)
-> AnchoredFragment (HeaderWithTime blk)
-> Bool
plausibleCandidateChain :: HasCallStack =>
AnchoredFragment (HeaderWithTime blk)
-> AnchoredFragment (HeaderWithTime blk) -> Bool
plausibleCandidateChain AnchoredFragment (HeaderWithTime blk)
ours AnchoredFragment (HeaderWithTime blk)
cand
| AnchoredFragment (HeaderWithTime blk)
-> (WithOrigin BlockNo, WithOrigin SlotNo)
anchorBlockNoAndSlot AnchoredFragment (HeaderWithTime blk)
cand (WithOrigin BlockNo, WithOrigin SlotNo)
-> (WithOrigin BlockNo, WithOrigin SlotNo) -> Bool
forall a. Ord a => a -> a -> Bool
< AnchoredFragment (HeaderWithTime blk)
-> (WithOrigin BlockNo, WithOrigin SlotNo)
anchorBlockNoAndSlot AnchoredFragment (HeaderWithTime blk)
ours
= case (AnchoredFragment (HeaderWithTime blk) -> Bool
forall v a b. AnchoredSeq v a b -> Bool
AF.null AnchoredFragment (HeaderWithTime blk)
ours, AnchoredFragment (HeaderWithTime blk) -> Bool
forall v a b. AnchoredSeq v a b -> Bool
AF.null AnchoredFragment (HeaderWithTime blk)
cand) of
(Bool
False, Bool
False) -> BlockConfig blk
-> AnchoredFragment (HeaderWithTime blk)
-> AnchoredFragment (HeaderWithTime blk)
-> Bool
forall blk (h :: * -> *) (h' :: * -> *).
(BlockSupportsProtocol blk, HasCallStack, GetHeader1 h,
GetHeader1 h', HeaderHash (h blk) ~ HeaderHash (h' blk),
HasHeader (h blk), HasHeader (h' blk)) =>
BlockConfig blk
-> AnchoredFragment (h blk) -> AnchoredFragment (h' blk) -> Bool
preferAnchoredCandidate BlockConfig blk
bcfg AnchoredFragment (HeaderWithTime blk)
ours AnchoredFragment (HeaderWithTime blk)
cand
(Bool
_, Bool
True) -> Bool
False
(Bool
True, Bool
_) -> [Char] -> Bool
forall a. HasCallStack => [Char] -> a
error [Char]
"impossible"
| Bool
otherwise
= BlockConfig blk
-> AnchoredFragment (HeaderWithTime blk)
-> AnchoredFragment (HeaderWithTime blk)
-> Bool
forall blk (h :: * -> *) (h' :: * -> *).
(BlockSupportsProtocol blk, HasCallStack, GetHeader1 h,
GetHeader1 h', HeaderHash (h blk) ~ HeaderHash (h' blk),
HasHeader (h blk), HasHeader (h' blk)) =>
BlockConfig blk
-> AnchoredFragment (h blk) -> AnchoredFragment (h' blk) -> Bool
preferAnchoredCandidate BlockConfig blk
bcfg AnchoredFragment (HeaderWithTime blk)
ours AnchoredFragment (HeaderWithTime blk)
cand
where
anchorBlockNoAndSlot ::
AnchoredFragment (HeaderWithTime blk)
-> (WithOrigin BlockNo, WithOrigin SlotNo)
anchorBlockNoAndSlot :: AnchoredFragment (HeaderWithTime blk)
-> (WithOrigin BlockNo, WithOrigin SlotNo)
anchorBlockNoAndSlot AnchoredFragment (HeaderWithTime blk)
frag =
(Anchor (HeaderWithTime blk) -> WithOrigin BlockNo
forall block. Anchor block -> WithOrigin BlockNo
AF.anchorToBlockNo Anchor (HeaderWithTime blk)
a, Anchor (HeaderWithTime blk) -> WithOrigin SlotNo
forall block. Anchor block -> WithOrigin SlotNo
AF.anchorToSlotNo Anchor (HeaderWithTime blk)
a)
where
a :: Anchor (HeaderWithTime blk)
a = AnchoredFragment (HeaderWithTime blk)
-> Anchor (HeaderWithTime blk)
forall v a b. AnchoredSeq v a b -> a
AF.anchor AnchoredFragment (HeaderWithTime blk)
frag
compareCandidateChains :: AnchoredFragment (HeaderWithTime blk)
-> AnchoredFragment (HeaderWithTime blk)
-> Ordering
compareCandidateChains :: AnchoredFragment (HeaderWithTime blk)
-> AnchoredFragment (HeaderWithTime blk) -> Ordering
compareCandidateChains = BlockConfig blk
-> AnchoredFragment (HeaderWithTime blk)
-> AnchoredFragment (HeaderWithTime blk)
-> Ordering
forall blk (h :: * -> *).
(BlockSupportsProtocol blk, HasCallStack, GetHeader1 h,
HasHeader (h blk)) =>
BlockConfig blk
-> AnchoredFragment (h blk) -> AnchoredFragment (h blk) -> Ordering
compareAnchoredFragments BlockConfig blk
bcfg
headerForgeUTCTime :: FromConsensus (HeaderWithTime blk) -> STM m UTCTime
headerForgeUTCTime :: FromConsensus (HeaderWithTime blk) -> STM m UTCTime
headerForgeUTCTime = UTCTime -> STM m UTCTime
forall a. a -> STM m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
(UTCTime -> STM m UTCTime)
-> (FromConsensus (HeaderWithTime blk) -> UTCTime)
-> FromConsensus (HeaderWithTime blk)
-> STM m UTCTime
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SystemStart -> RelativeTime -> UTCTime
fromRelativeTime (BlockConfig blk -> SystemStart
forall blk.
ConfigSupportsNode blk =>
BlockConfig blk -> SystemStart
SupportsNode.getSystemStart BlockConfig blk
bcfg)
(RelativeTime -> UTCTime)
-> (FromConsensus (HeaderWithTime blk) -> RelativeTime)
-> FromConsensus (HeaderWithTime blk)
-> UTCTime
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HeaderWithTime blk -> RelativeTime
forall blk. HeaderWithTime blk -> RelativeTime
hwtSlotRelativeTime
(HeaderWithTime blk -> RelativeTime)
-> (FromConsensus (HeaderWithTime blk) -> HeaderWithTime blk)
-> FromConsensus (HeaderWithTime blk)
-> RelativeTime
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FromConsensus (HeaderWithTime blk) -> HeaderWithTime blk
forall a. FromConsensus a -> a
unFromConsensus
readChainSelStarvation :: STM m ChainSelStarvation
readChainSelStarvation = ChainDbView m blk -> STM m ChainSelStarvation
forall (m :: * -> *) blk.
ChainDbView m blk -> STM m ChainSelStarvation
getChainSelStarvation ChainDbView m blk
chainDB
demoteChainSyncJumpingDynamo :: peer -> m ()
demoteChainSyncJumpingDynamo :: peer -> m ()
demoteChainSyncJumpingDynamo = Tracer m (TraceEventDbf peer)
-> ChainSyncClientHandleCollection peer m blk -> peer -> m ()
forall peer blk (m :: * -> *).
(Ord peer, LedgerSupportsProtocol blk, MonadSTM m) =>
Tracer m (TraceEventDbf peer)
-> ChainSyncClientHandleCollection peer m blk -> peer -> m ()
CSJumping.rotateDynamo Tracer m (TraceEventDbf peer)
csjTracer ChainSyncClientHandleCollection peer m blk
csHandlesCol