Skip to content

Commit

Permalink
Refactor UseLedgerAfter flag: UseLedgerCloseToTip
Browse files Browse the repository at this point in the history
Also refactors lpGetPeers to lpGetPeersAfterSafeSlot consensus interface function
  • Loading branch information
bolt12 committed Jun 1, 2023
1 parent 130d7aa commit 49fedcd
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 12 deletions.
14 changes: 14 additions & 0 deletions ouroboros-network/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,15 +43,16 @@ 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
(DomainAccessPoint (..), RelayAccessPoint (..))
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
Expand All @@ -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.
Expand Down Expand Up @@ -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)
Expand Down
11 changes: 7 additions & 4 deletions ouroboros-network/test/Test/LedgerPeers.hs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
Expand All @@ -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
Expand All @@ -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"))]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -818,7 +818,7 @@ diffusionSimulation
diffusionMode = InitiatorAndResponderDiffusionMode
readLocalRootPeers = readTVar lrpVar
readPublicRootPeers = return raps
readUseLedgerAfter = return (UseLedgerAfter 0)
readUseLedgerAfter = return UseLedgerCloseToTip

acceptVersion = \_ v -> Accept v

Expand Down Expand Up @@ -883,7 +883,7 @@ diffusionSimulation
, NodeKernel.iDomainMap = dMapVar
, NodeKernel.iLedgerPeersConsensusInterface
= LedgerPeersConsensusInterface
$ \_ -> return Nothing
(return Nothing)
}

shouldChainSyncExit :: StrictTVar m (Maybe BlockNo) -> BlockHeader -> m Bool
Expand Down

0 comments on commit 49fedcd

Please sign in to comment.