diff --git a/ouroboros-network/CHANGELOG.md b/ouroboros-network/CHANGELOG.md index def1223c058..aa61f9d6bde 100644 --- a/ouroboros-network/CHANGELOG.md +++ b/ouroboros-network/CHANGELOG.md @@ -2,6 +2,20 @@ ## 0.7.0.1 +### Breaking changes + +* Renamed `UseLedgerAfter` flag to `UseLedgerCloseToTip`. + + This is part of the effort of getting rid of UseLedgerAfter and use an automatic way to + distribute the load of locally configured root peers to ledger peers. However this needs + to be done carefully, one shouldn't start using ledger peers if it's not safe to do so. + A good time to switch and start using ledger peers is determined by choosing the point + so that the probability that a 50% stake adversarial would be chosen k times to produce + a block is sufficiently low. + +- Given the text above, `lpGetPeers` got refactored to `lpGetPeersAfterSafeSlot` and its + type got changed as well. + ### Non-breaking changes * Updated to use `ouroboros-network-api-0.5.0.0`. diff --git a/ouroboros-network/src/Ouroboros/Network/PeerSelection/LedgerPeers.hs b/ouroboros-network/src/Ouroboros/Network/PeerSelection/LedgerPeers.hs index 1b3151f4d29..39a92a52e8e 100644 --- a/ouroboros-network/src/Ouroboros/Network/PeerSelection/LedgerPeers.hs +++ b/ouroboros-network/src/Ouroboros/Network/PeerSelection/LedgerPeers.hs @@ -43,7 +43,6 @@ import Data.Word import qualified Network.Socket as Socket import System.Random -import Cardano.Slotting.Slot (SlotNo) import Ouroboros.Network.PeerSelection.LedgerPeers.Type (AccPoolStake (..), PoolStake (..)) import Ouroboros.Network.PeerSelection.RootPeersDNS @@ -51,7 +50,9 @@ import Ouroboros.Network.PeerSelection.RootPeersDNS import Text.Printf -- | Only use the ledger after the given slot number. -data UseLedgerAfter = DontUseLedger | UseLedgerAfter SlotNo deriving (Eq, Show) +data UseLedgerAfter = DontUseLedger + | UseLedgerCloseToTip + deriving (Eq, Show) isLedgerPeersEnabled :: UseLedgerAfter -> Bool isLedgerPeersEnabled DontUseLedger = False @@ -63,8 +64,19 @@ data IsLedgerPeer = IsLedgerPeer | IsNotLedgerPeer newtype NumberOfPeers = NumberOfPeers Word16 deriving Show -newtype LedgerPeersConsensusInterface m = LedgerPeersConsensusInterface { - lpGetPeers :: SlotNo -> STM m (Maybe [(PoolStake, NonEmpty RelayAccessPoint)]) +data LedgerPeersConsensusInterface m = LedgerPeersConsensusInterface { + -- | Return ledger peer information from given slot number. + -- + -- The concrete implementation of this function comes from the consensus + -- layer. It plays a crucial role in managing these peers, by distributing + -- the load among locally configured root peers to ledger peers. + -- + -- It's important to use this functionality carefully. We should not + -- start leveraging ledger peers unless it's absolutely safe. While the + -- likelihood of a successful long-range attack by a powerful adversary is + -- relatively low, precautions should be taken to avoid becoming a victim. + -- + lpGetPeersAfterSafeSlot :: STM m (Maybe [(PoolStake, NonEmpty RelayAccessPoint)]) } -- | Trace LedgerPeers events. @@ -244,8 +256,8 @@ ledgerPeersThread inRng toPeerAddr tracer readUseLedgerAfter LedgerPeersConsensu DontUseLedger -> do traceWith tracer DisabledLedgerPeers return (Map.empty, now) - UseLedgerAfter slot -> do - peers_m <- atomically $ lpGetPeers slot + UseLedgerCloseToTip -> do + peers_m <- atomically lpGetPeersAfterSafeSlot let peers = maybe Map.empty accPoolStake peers_m traceWith tracer $ FetchingNewLedgerState $ Map.size peers return (peers, now) diff --git a/ouroboros-network/test/Test/LedgerPeers.hs b/ouroboros-network/test/Test/LedgerPeers.hs index fee0f56e553..e19fe707f8c 100644 --- a/ouroboros-network/test/Test/LedgerPeers.hs +++ b/ouroboros-network/test/Test/LedgerPeers.hs @@ -110,7 +110,7 @@ prop_pick100 seed = sim :: IOSim s [RelayAccessPoint] sim = withLedgerPeers rng (curry IP.toSockAddr) verboseTracer - (pure (UseLedgerAfter 0)) + (pure UseLedgerCloseToTip) interface (\_ -> pure Map.empty) -- we're not relying on domain name resolution in this simulation (\request _ -> do @@ -124,7 +124,9 @@ prop_pick100 seed = ] ) where - interface = LedgerPeersConsensusInterface $ \_ -> pure (Just (Map.elems (accPoolStake sps))) + interface = + LedgerPeersConsensusInterface + (pure (Just (Map.elems (accPoolStake sps)))) in ioProperty $ do tr' <- evaluateTrace (runSimTrace sim) @@ -148,7 +150,7 @@ prop_pick (LedgerPools lps) count seed = sim :: IOSim s [RelayAccessPoint] sim = withLedgerPeers rng (curry IP.toSockAddr) verboseTracer - (pure (UseLedgerAfter 0)) + (pure UseLedgerCloseToTip) interface resolve (\request _ -> do threadDelay 1900 -- we need to invalidate ledger peer's cache @@ -162,7 +164,8 @@ prop_pick (LedgerPools lps) count seed = ) where interface :: LedgerPeersConsensusInterface (IOSim s) - interface = LedgerPeersConsensusInterface $ \_ -> pure (Just (Map.elems (accPoolStake lps))) + interface = LedgerPeersConsensusInterface + (pure (Just (Map.elems (accPoolStake lps)))) domainMap :: Map Domain (Set IP) domainMap = Map.fromList [("relay.iohk.example", Set.singleton (read "2.2.2.2"))] diff --git a/ouroboros-network/test/Test/Ouroboros/Network/Testnet/Simulation/Node.hs b/ouroboros-network/test/Test/Ouroboros/Network/Testnet/Simulation/Node.hs index 9af44ebd18b..4f9a6facbc7 100644 --- a/ouroboros-network/test/Test/Ouroboros/Network/Testnet/Simulation/Node.hs +++ b/ouroboros-network/test/Test/Ouroboros/Network/Testnet/Simulation/Node.hs @@ -818,7 +818,7 @@ diffusionSimulation diffusionMode = InitiatorAndResponderDiffusionMode readLocalRootPeers = readTVar lrpVar readPublicRootPeers = return raps - readUseLedgerAfter = return (UseLedgerAfter 0) + readUseLedgerAfter = return UseLedgerCloseToTip acceptVersion = \_ v -> Accept v @@ -883,7 +883,7 @@ diffusionSimulation , NodeKernel.iDomainMap = dMapVar , NodeKernel.iLedgerPeersConsensusInterface = LedgerPeersConsensusInterface - $ \_ -> return Nothing + (return Nothing) } shouldChainSyncExit :: StrictTVar m (Maybe BlockNo) -> BlockHeader -> m Bool