Skip to content

Commit fc58da3

Browse files
peer-selection: verify peer snapshot with hash
1 parent e423d72 commit fc58da3

File tree

5 files changed

+69
-72
lines changed

5 files changed

+69
-72
lines changed

cardano-diffusion/lib/Cardano/Network/LedgerPeerConsensusInterface.hs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,14 @@ module Cardano.Network.LedgerPeerConsensusInterface
88

99
import Control.Concurrent.Class.MonadSTM (MonadSTM (..))
1010

11-
import Ouroboros.Network.BlockFetch.ConsensusInterface (FetchMode (..))
12-
1311
import Cardano.Network.LedgerStateJudgement
12+
import Ouroboros.Network.PeerSelection.LedgerPeers.Type (LedgerPeerSnapshot)
1413
import Cardano.Network.PeerSelection.LocalRootPeers
1514
(OutboundConnectionsState (..))
15+
import Ouroboros.Network.BlockFetch.ConsensusInterface (FetchMode (..))
16+
import Ouroboros.Network.Block (HeaderHash, SlotNo)
17+
import Ouroboros.Network.Point (Block)
18+
1619

1720
-- | Cardano Node specific consensus interface actions.
1821
--
@@ -31,4 +34,6 @@ data LedgerPeersConsensusInterface m =
3134
-- it only has local peers.
3235
--
3336
, updateOutboundConnectionsState :: OutboundConnectionsState -> STM m ()
37+
38+
, lpGetBlockInfo :: SlotNo -> STM m (Block SlotNo (HeaderHash LedgerPeerSnapshot))
3439
}

cardano-diffusion/lib/Cardano/Network/PeerSelection/Governor/Monitor.hs

Lines changed: 46 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
{-# LANGUAGE LambdaCase #-}
2-
{-# LANGUAGE NamedFieldPuns #-}
3-
{-# LANGUAGE ScopedTypeVariables #-}
1+
{-# LANGUAGE DisambiguateRecordFields #-}
2+
{-# LANGUAGE LambdaCase #-}
3+
{-# LANGUAGE NamedFieldPuns #-}
4+
{-# LANGUAGE ScopedTypeVariables #-}
45

56
-- | This module contains governor decisions for monitoring tasks:
67
--
@@ -18,14 +19,17 @@ module Cardano.Network.PeerSelection.Governor.Monitor
1819
, ExtraTrace (..)
1920
) where
2021

21-
import Data.Set qualified as Set
22-
22+
import Control.Concurrent.JobPool (Job (..))
23+
import Control.Exception (assert)
2324
import Control.Monad.Class.MonadSTM
2425
import Control.Monad.Class.MonadTime.SI
2526
import Control.Monad.Class.MonadTimer.SI
27+
import Data.Map.Strict (Map)
28+
import Data.Map.Strict qualified as Map
29+
import Data.Set (Set)
30+
import Data.Set qualified as Set
2631

2732
import Cardano.Network.ConsensusMode
28-
import Cardano.Network.Diffusion.Configuration qualified as Cardano (srvPrefix)
2933
import Cardano.Network.LedgerPeerConsensusInterface qualified as Cardano
3034
import Cardano.Network.LedgerStateJudgement
3135
import Cardano.Network.PeerSelection.Bootstrap (UseBootstrapPeers (..),
@@ -37,17 +41,13 @@ import Cardano.Network.PeerSelection.Governor.PeerSelectionState qualified as Ca
3741
import Cardano.Network.PeerSelection.PeerTrustable (PeerTrustable (..))
3842
import Cardano.Network.PeerSelection.PublicRootPeers qualified as Cardano.PublicRootPeers
3943
import Cardano.Network.PeerSelection.State.LocalRootPeers qualified as LocalRootPeers
40-
import Control.Exception (assert)
41-
import Data.Map.Strict (Map)
42-
import Data.Map.Strict qualified as Map
43-
import Data.Set (Set)
44+
import Ouroboros.Network.Block (HeaderHash, Point (..), SlotNo)
4445
import Ouroboros.Network.PeerSelection.Governor.ActivePeers
4546
(jobDemoteActivePeer)
46-
import Ouroboros.Network.PeerSelection.Governor.Monitor (jobVerifyPeerSnapshot)
4747
import Ouroboros.Network.PeerSelection.Governor.Types hiding
4848
(PeerSelectionCounters)
4949
import Ouroboros.Network.PeerSelection.LedgerPeers.Type
50-
(LedgerPeersConsensusInterface (..))
50+
(LedgerPeersConsensusInterface (..), LedgerPeerSnapshot (..))
5151
import Ouroboros.Network.PeerSelection.PublicRootPeers qualified as PublicRootPeers
5252
import Ouroboros.Network.PeerSelection.State.EstablishedPeers qualified as EstablishedPeers
5353
import Ouroboros.Network.PeerSelection.State.KnownPeers qualified as KnownPeers
@@ -496,8 +496,8 @@ monitorLedgerStateJudgement
496496
(TimedDecision m Cardano.ExtraState extraDebugState extraFlags
497497
(Cardano.ExtraPeers peeraddr) ExtraTrace peeraddr peerconn)
498498
monitorLedgerStateJudgement PeerSelectionActions{
499-
getLedgerStateCtx = ledgerCtx@LedgerPeersConsensusInterface {
500-
lpExtraAPI = Cardano.LedgerPeersConsensusInterface {
499+
getLedgerStateCtx = LedgerPeersConsensusInterface {
500+
lpExtraAPI = lpExtraAPI@Cardano.LedgerPeersConsensusInterface {
501501
Cardano.getLedgerStateJudgement = readLedgerStateJudgement
502502
}
503503
}
@@ -524,8 +524,9 @@ monitorLedgerStateJudgement PeerSelectionActions{
524524
Decision {
525525
decisionTrace = [ExtraTrace (TraceLedgerStateJudgementChanged lsj)],
526526
decisionJobs = case (lsj, ledgerPeerSnapshot) of
527-
(TooOld, Just ledgerPeerSnapshot') ->
528-
[jobVerifyPeerSnapshot Cardano.srvPrefix ledgerPeerSnapshot' ledgerCtx]
527+
(TooOld, Just (LedgerPeerSnapshotV3 point _pools))
528+
| Point (At Block { blockPointSlot, blockPointHash } ) <- point ->
529+
[jobVerifyPeerSnapshot (blockPointSlot, blockPointHash) lpExtraAPI]
529530
_otherwise -> [],
530531
decisionState = st {
531532
extraState = cpst {
@@ -676,6 +677,35 @@ waitForSystemToQuiesce st@PeerSelectionState{
676677
| otherwise = GuardedSkip Nothing
677678

678679

680+
-- |This job, which is initiated by monitorLedgerStateJudgement job,
681+
-- verifies whether the provided big ledger pools match up with the
682+
-- ledger state once the node catches up to the slot at which the
683+
-- snapshot was ostensibly taken
684+
--
685+
jobVerifyPeerSnapshot :: (MonadSTM m)
686+
=> (SlotNo, HeaderHash LedgerPeerSnapshot)
687+
-> Cardano.LedgerPeersConsensusInterface m
688+
-> Job () m (Completion m extraState extraDebugState extraFlags extraPeers extraTrace peeraddr peerconn)
689+
jobVerifyPeerSnapshot (slotNo, theHash)
690+
Cardano.LedgerPeersConsensusInterface { lpGetBlockInfo }
691+
= Job job (const (completion False)) () "jobVerifyPeerSnapshot"
692+
where
693+
completion result = return . Completion $ \st _now ->
694+
Decision {
695+
decisionTrace = [TraceVerifyPeerSnapshot result],
696+
decisionState = st,
697+
decisionJobs = [] }
698+
699+
job = do
700+
Block { blockPointHash } <- atomically $ lpGetBlockInfo slotNo
701+
let result = theHash == blockPointHash
702+
return . Completion $ \st _now ->
703+
Decision {
704+
decisionTrace = [TraceVerifyPeerSnapshot result],
705+
decisionState = st,
706+
decisionJobs = [] }
707+
708+
679709
-- | Extra trace points for `TracePeerSelection`.
680710
--
681711
-- TODO: it ought to be moved to `Types`, but that introduces a circular

ouroboros-network/lib/Ouroboros/Network/PeerSelection/Governor/Monitor.hs

Lines changed: 4 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
module Ouroboros.Network.PeerSelection.Governor.Monitor
1212
( targetPeers
1313
, jobs
14-
, jobVerifyPeerSnapshot
1514
, connections
1615
, localRoots
1716
, ledgerPeerSnapshotChange
@@ -23,27 +22,21 @@ import Data.Maybe (fromMaybe, isJust)
2322
import Data.Set (Set)
2423
import Data.Set qualified as Set
2524

26-
import Control.Concurrent.JobPool (Job (..), JobPool)
25+
import Control.Concurrent.JobPool (JobPool)
2726
import Control.Concurrent.JobPool qualified as JobPool
2827
import Control.Exception (assert)
2928
import Control.Monad.Class.MonadSTM
3029
import Control.Monad.Class.MonadTime.SI
3130
import Control.Monad.Class.MonadTimer.SI
3231
import System.Random (randomR)
3332

34-
import Ouroboros.Network.Block (HeaderHash, SlotNo)
3533
import Ouroboros.Network.ExitPolicy (RepromoteDelay)
3634
import Ouroboros.Network.ExitPolicy qualified as ExitPolicy
3735
import Ouroboros.Network.PeerSelection.Governor.ActivePeers
3836
(jobDemoteActivePeer)
3937
import Ouroboros.Network.PeerSelection.Governor.Types hiding
4038
(PeerSelectionCounters)
41-
import Ouroboros.Network.PeerSelection.LedgerPeers.Type
42-
(LedgerPeerSnapshot (..), LedgerPeersConsensusInterface (..),
43-
SRVPrefix, compareLedgerPeerSnapshotApproximate,
44-
getRelayAccessPointsFromLedger,
45-
getRelayAccessPointsFromLedgerPeerSnapshot)
46-
import Ouroboros.Network.PeerSelection.LedgerPeers.Utils
39+
import Ouroboros.Network.PeerSelection.LedgerPeers.Type (LedgerPeerSnapshot (..))
4740
import Ouroboros.Network.PeerSelection.PublicRootPeers qualified as PublicRootPeers
4841
import Ouroboros.Network.PeerSelection.State.EstablishedPeers qualified as EstablishedPeers
4942
import Ouroboros.Network.PeerSelection.State.KnownPeers qualified as KnownPeers
@@ -410,38 +403,6 @@ localRoots actions@PeerSelectionActions{ readLocalRootPeers
410403
| (peeraddr, peerconn) <- Map.assocs selectedToDemote' ]
411404
}
412405

413-
-- |This job, which is initiated by monitorLedgerStateJudgement job,
414-
-- verifies whether the provided big ledger pools match up with the
415-
-- ledger state once the node catches up to the slot at which the
416-
-- snapshot was ostensibly taken
417-
--
418-
jobVerifyPeerSnapshot :: MonadSTM m
419-
=> SRVPrefix
420-
-> LedgerPeerSnapshot
421-
-> LedgerPeersConsensusInterface extraAPI m
422-
-> Job () m (Completion m extraState extraDebugState extraFlags extraPeers extraTrace peeraddr peerconn)
423-
jobVerifyPeerSnapshot srvPrefix
424-
ledgerPeerSnapshot
425-
ledgerCtx@LedgerPeersConsensusInterface { lpGetLatestSlot }
426-
= Job job (const (completion False)) () "jobVerifyPeerSnapshot"
427-
where
428-
(slot, snapshotPeers) =
429-
getRelayAccessPointsFromLedgerPeerSnapshot srvPrefix ledgerPeerSnapshot
430-
431-
completion result = return . Completion $ \st _now ->
432-
Decision {
433-
decisionTrace = [TraceVerifyPeerSnapshot result],
434-
decisionState = st,
435-
decisionJobs = [] }
436-
437-
job = do
438-
ledgerPeers <-
439-
atomically $ do
440-
check . (>= slot) =<< lpGetLatestSlot
441-
accumulateBigLedgerStake <$> getRelayAccessPointsFromLedger srvPrefix ledgerCtx
442-
completion $ snapshotPeers
443-
`compareLedgerPeerSnapshotApproximate`
444-
ledgerPeers
445406

446407
-- |This job monitors for any changes in the big ledger peer snapshot
447408
-- and flips ledger state judgement private state so that monitoring action
@@ -464,8 +425,8 @@ ledgerPeerSnapshotChange extraStateChange
464425
ledgerPeerSnapshot' <- readLedgerPeerSnapshot
465426
case (ledgerPeerSnapshot', ledgerPeerSnapshot) of
466427
(Nothing, _) -> retry
467-
(Just (LedgerPeerSnapshot (slot, _)), Just (LedgerPeerSnapshot (slot', _)))
468-
| slot == slot' -> retry
428+
(Just (LedgerPeerSnapshot point _), Just (LedgerPeerSnapshot point' _))
429+
| point == point' -> retry
469430
_otherwise ->
470431
return $ \_now ->
471432
Decision { decisionTrace = [],

ouroboros-network/lib/Ouroboros/Network/PeerSelection/Governor/Types.hs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ module Ouroboros.Network.PeerSelection.Governor.Types
7070
, DemotionTimeoutException (..)
7171
) where
7272

73+
import Control.Applicative (Alternative)
74+
import Control.Concurrent.Class.MonadSTM.Strict
75+
import Control.Concurrent.JobPool (Job)
76+
import Control.Exception (Exception (..), SomeException, assert)
77+
import Control.Monad.Class.MonadTime.SI
7378
import Data.Map.Strict (Map)
7479
import Data.Map.Strict qualified as Map
7580
import Data.Maybe (fromMaybe)
@@ -81,12 +86,7 @@ import Data.Set qualified as Set
8186
import GHC.Stack (HasCallStack)
8287
import System.Random (StdGen)
8388

84-
import Control.Applicative (Alternative)
85-
import Control.Concurrent.Class.MonadSTM.Strict
86-
import Control.Concurrent.JobPool (Job)
87-
import Control.Exception (Exception (..), SomeException, assert)
88-
import Control.Monad.Class.MonadTime.SI
89-
89+
import Ouroboros.Network.Block
9090
import Ouroboros.Network.DiffusionMode
9191
import Ouroboros.Network.ExitPolicy
9292
import Ouroboros.Network.PeerSelection.LedgerPeers.Type
@@ -1839,4 +1839,5 @@ deriving instance ( Show extraState
18391839
, Show extraPeers
18401840
, Ord peeraddr
18411841
, Show peeraddr
1842+
, StandardHash LedgerPeerSnapshot
18421843
) => Show (DebugPeerSelection extraState extraFlags extraPeers peeraddr)

ouroboros-network/lib/Ouroboros/Network/PeerSelection/LedgerPeers.hs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,12 @@ module Ouroboros.Network.PeerSelection.LedgerPeers
3636
, resolveLedgerPeers
3737
) where
3838

39+
import Control.Concurrent.Class.MonadSTM.Strict
3940
import Control.Monad (when)
4041
import Control.Monad.Class.MonadAsync
4142
import Control.Monad.Class.MonadFork
4243
import Control.Monad.Class.MonadTime.SI
44+
import Control.Monad.Class.MonadThrow
4345
import Control.Tracer (Tracer, traceWith)
4446
import Data.IP qualified as IP
4547
import Data.List as List (foldl')
@@ -49,16 +51,14 @@ import Data.Map.Strict (Map)
4951
import Data.Map.Strict qualified as Map
5052
import Data.Maybe (isJust)
5153
import Data.Ratio
52-
import System.Random
53-
import Text.Printf
54-
55-
import Control.Concurrent.Class.MonadSTM.Strict
56-
import Control.Monad.Class.MonadThrow
5754
import Data.Set (Set)
5855
import Data.Set qualified as Set
5956
import Data.Void (Void)
6057
import Data.Word (Word16, Word64)
6158
import Network.DNS qualified as DNS
59+
import System.Random
60+
import Text.Printf
61+
6262
import Ouroboros.Network.Block (SlotNo)
6363
import Ouroboros.Network.PeerSelection.LedgerPeers.Type
6464
import Ouroboros.Network.PeerSelection.LedgerPeers.Utils

0 commit comments

Comments
 (0)