From 605c5729c3cbee88788902ddd76b52c40b988a32 Mon Sep 17 00:00:00 2001 From: Marcin Szamotulski Date: Sun, 2 Feb 2025 09:32:55 +0100 Subject: [PATCH 1/4] ouroboros-network-framework: simpleSingletonsVersions Take a callback which receives negotiated `vData`. Co-authored-by: Armando Santos Co-authored-by: Marcin Szamotulski --- ouroboros-network-framework/CHANGELOG.md | 2 + .../Network/Protocol/Handshake/Unversioned.hs | 11 +++-- .../Network/Protocol/Handshake/Version.hs | 7 +++- ouroboros-network/demo/chain-sync.hs | 8 ++-- .../io-tests/Test/Ouroboros/Network/Socket.hs | 4 +- .../Ouroboros/Network/Testnet/Internal.hs | 6 +-- .../Ouroboros/Network/Testnet/Node/Kernel.hs | 18 ++++++++ .../Network/Testnet/Node/MiniProtocols.hs | 42 ++++++++++--------- .../src/Ouroboros/Network/NodeToClient.hs | 3 +- .../src/Ouroboros/Network/NodeToNode.hs | 39 ++++++++--------- 10 files changed, 86 insertions(+), 54 deletions(-) diff --git a/ouroboros-network-framework/CHANGELOG.md b/ouroboros-network-framework/CHANGELOG.md index 085f55db2b2..0573caf929a 100644 --- a/ouroboros-network-framework/CHANGELOG.md +++ b/ouroboros-network-framework/CHANGELOG.md @@ -4,6 +4,8 @@ ### Breaking changes +* `simpleSingletonVersions`: takes a callback which receives negotiated version data. + ### Non-breaking changes ## 0.15.0.0 -- 2025-01-02 diff --git a/ouroboros-network-framework/src/Ouroboros/Network/Protocol/Handshake/Unversioned.hs b/ouroboros-network-framework/src/Ouroboros/Network/Protocol/Handshake/Unversioned.hs index c74ec555c28..b69b3a5a09c 100644 --- a/ouroboros-network-framework/src/Ouroboros/Network/Protocol/Handshake/Unversioned.hs +++ b/ouroboros-network-framework/src/Ouroboros/Network/Protocol/Handshake/Unversioned.hs @@ -70,7 +70,10 @@ unversionedProtocol :: app -> Versions UnversionedProtocol UnversionedProtocolData app -unversionedProtocol = simpleSingletonVersions UnversionedProtocol UnversionedProtocolData +unversionedProtocol app = + simpleSingletonVersions UnversionedProtocol + UnversionedProtocolData + (\_ -> app) -- | Alternative for 'UnversionedProtocolData' which contains 'DataFlow'. @@ -119,8 +122,10 @@ dataFlowProtocol :: DataFlow -> Versions UnversionedProtocol DataFlowProtocolData app -dataFlowProtocol dataFlow = - simpleSingletonVersions UnversionedProtocol (DataFlowProtocolData dataFlow PeerSharingDisabled) +dataFlowProtocol dataFlow app = + simpleSingletonVersions UnversionedProtocol + (DataFlowProtocolData dataFlow PeerSharingDisabled) + (\_ -> app) -- | 'Handshake' codec used in various tests. -- diff --git a/ouroboros-network-framework/src/Ouroboros/Network/Protocol/Handshake/Version.hs b/ouroboros-network-framework/src/Ouroboros/Network/Protocol/Handshake/Version.hs index d6836a623c1..7ea8382a1d4 100644 --- a/ouroboros-network-framework/src/Ouroboros/Network/Protocol/Handshake/Version.hs +++ b/ouroboros-network-framework/src/Ouroboros/Network/Protocol/Handshake/Version.hs @@ -101,10 +101,13 @@ data VersionMismatch vNum where -- simpleSingletonVersions :: vNum + -- ^ version number -> vData - -> r + -- ^ proposed version data + -> (vData -> r) + -- ^ callback which receives negotiated version data -> Versions vNum vData r simpleSingletonVersions vNum vData r = Versions $ Map.singleton vNum - (Version (\_ -> r) vData) + (Version r vData) diff --git a/ouroboros-network/demo/chain-sync.hs b/ouroboros-network/demo/chain-sync.hs index 042701b820e..f704d3ce425 100644 --- a/ouroboros-network/demo/chain-sync.hs +++ b/ouroboros-network/demo/chain-sync.hs @@ -247,7 +247,7 @@ clientChainSync sockPaths maxSlotNo = withIOManager $ \iocp -> (simpleSingletonVersions UnversionedProtocol UnversionedProtocolData - app) + (\_ -> app)) Nothing (localAddressFromPath sockPath) @@ -287,7 +287,7 @@ serverChainSync sockAddr slotLength seed = withIOManager $ \iocp -> do (simpleSingletonVersions UnversionedProtocol UnversionedProtocolData - (SomeResponderApplication (app prng))) + (\_ -> SomeResponderApplication (app prng))) nullErrorPolicies $ \_ serverAsync -> wait serverAsync -- block until async exception @@ -494,7 +494,7 @@ clientBlockFetch sockAddrs maxSlotNo = withIOManager $ \iocp -> do (simpleSingletonVersions UnversionedProtocol UnversionedProtocolData - app) + (\_ -> app)) Nothing (localAddressFromPath sockAddr) | sockAddr <- sockAddrs ] @@ -561,7 +561,7 @@ serverBlockFetch sockAddr slotLength seed = withIOManager $ \iocp -> do (simpleSingletonVersions UnversionedProtocol UnversionedProtocolData - (SomeResponderApplication (app prng))) + (\_ -> SomeResponderApplication (app prng))) nullErrorPolicies $ \_ serverAsync -> wait serverAsync -- block until async exception diff --git a/ouroboros-network/io-tests/Test/Ouroboros/Network/Socket.hs b/ouroboros-network/io-tests/Test/Ouroboros/Network/Socket.hs index c48bd1a070d..5101621d014 100644 --- a/ouroboros-network/io-tests/Test/Ouroboros/Network/Socket.hs +++ b/ouroboros-network/io-tests/Test/Ouroboros/Network/Socket.hs @@ -175,7 +175,7 @@ demo chain0 updates = withIOManager $ \iocp -> do diffusionMode = InitiatorAndResponderDiffusionMode, peerSharing = PeerSharingDisabled, query = False }) - (SomeResponderApplication responderApp)) + (\_ -> SomeResponderApplication responderApp)) nullErrorPolicies $ \realProducerAddress _ -> do withAsync @@ -197,7 +197,7 @@ demo chain0 updates = withIOManager $ \iocp -> do diffusionMode = InitiatorOnlyDiffusionMode, peerSharing = PeerSharingDisabled, query = False }) - initiatorApp) + (\_ -> initiatorApp)) (Just consumerAddress) realProducerAddress) $ \ _connAsync -> do diff --git a/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/Testnet/Internal.hs b/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/Testnet/Internal.hs index 0f5b9bc791c..389ddc726e0 100644 --- a/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/Testnet/Internal.hs +++ b/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/Testnet/Internal.hs @@ -80,6 +80,7 @@ import Ouroboros.Network.ConsensusMode import Ouroboros.Network.Diffusion.P2P qualified as Diff.P2P import Ouroboros.Network.Driver.Limits (ProtocolSizeLimits (..), ProtocolTimeLimits (..)) +import Ouroboros.Network.Handshake.Acceptable (Acceptable (acceptableVersion)) import Ouroboros.Network.InboundGovernor qualified as IG import Ouroboros.Network.Mux (MiniProtocolLimits (..)) import Ouroboros.Network.NodeToNode.Version (DiffusionMode (..)) @@ -96,7 +97,6 @@ import Ouroboros.Network.Protocol.BlockFetch.Codec (byteLimitsBlockFetch, timeLimitsBlockFetch) import Ouroboros.Network.Protocol.ChainSync.Codec (ChainSyncTimeout (..), byteLimitsChainSync, timeLimitsChainSync) -import Ouroboros.Network.Protocol.Handshake.Version (Accept (Accept)) import Ouroboros.Network.Protocol.KeepAlive.Codec (byteLimitsKeepAlive, timeLimitsKeepAlive) import Ouroboros.Network.Protocol.Limits (shortWait, smallByteLimit) @@ -1092,9 +1092,7 @@ diffusionSimulation readLocalRootPeers = readTVar lrpVar readPublicRootPeers = return publicRoots readUseLedgerPeers = return (UseLedgerPeers (After 0)) - - acceptVersion = \_ v -> Accept v - + acceptVersion = acceptableVersion defaultMiniProtocolsLimit :: MiniProtocolLimits defaultMiniProtocolsLimit = MiniProtocolLimits { maximumIngressQueue = 64000 } diff --git a/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/Testnet/Node/Kernel.hs b/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/Testnet/Node/Kernel.hs index 7ce29dbfc32..f78a17fb9e0 100644 --- a/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/Testnet/Node/Kernel.hs +++ b/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/Testnet/Node/Kernel.hs @@ -61,6 +61,7 @@ import Ouroboros.Network.AnchoredFragment (Anchor (..)) import Ouroboros.Network.Block (HasFullHeader, SlotNo) import Ouroboros.Network.Block qualified as Block import Ouroboros.Network.BlockFetch +import Ouroboros.Network.Handshake.Acceptable (Accept (..), Acceptable (..)) import Ouroboros.Network.NodeToNode.Version (DiffusionMode (..)) import Ouroboros.Network.Protocol.Handshake.Unversioned import Ouroboros.Network.Snocket (TestAddress (..)) @@ -141,6 +142,23 @@ data NtNVersionData = NtNVersionData , ntnPeerSharing :: PeerSharing } deriving Show + +instance Acceptable NtNVersionData where + acceptableVersion + NtNVersionData { + ntnDiffusionMode, + ntnPeerSharing + } + NtNVersionData { + ntnDiffusionMode = ntnDiffusionMode', + ntnPeerSharing = ntnPeerSharing' + } + = + Accept $ NtNVersionData { + ntnDiffusionMode = ntnDiffusionMode `min` ntnDiffusionMode', + ntnPeerSharing = ntnPeerSharing <> ntnPeerSharing' + } + type NtCAddr = TestAddress Int type NtCVersion = UnversionedProtocol type NtCVersionData = UnversionedProtocolData diff --git a/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/Testnet/Node/MiniProtocols.hs b/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/Testnet/Node/MiniProtocols.hs index fb57179fda4..e8d80238ba2 100644 --- a/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/Testnet/Node/MiniProtocols.hs +++ b/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/Testnet/Node/MiniProtocols.hs @@ -265,15 +265,15 @@ applications debugTracer nodeKernel { Diff.daApplicationInitiatorMode = simpleSingletonVersions UnversionedProtocol (NtNVersionData InitiatorOnlyDiffusionMode aaOwnPeerSharing) - initiatorApp + (\NtNVersionData {ntnPeerSharing} -> initiatorApp ntnPeerSharing) , Diff.daApplicationInitiatorResponderMode = simpleSingletonVersions UnversionedProtocol (NtNVersionData aaDiffusionMode aaOwnPeerSharing) - initiatorAndResponderApp + (\NtNVersionData {ntnPeerSharing} -> initiatorAndResponderApp ntnPeerSharing) , Diff.daLocalResponderApplication = simpleSingletonVersions UnversionedProtocol UnversionedProtocolData - localResponderApp + (\_ -> localResponderApp) , Diff.daLedgerPeersCtx = aaLedgerPeersConsensusInterface , Diff.daUpdateOutboundConnectionsState = @@ -281,9 +281,10 @@ applications debugTracer nodeKernel } where initiatorApp - :: OuroborosBundleWithExpandedCtx Mx.InitiatorMode NtNAddr ByteString m () Void + :: PSTypes.PeerSharing + -> OuroborosBundleWithExpandedCtx Mx.InitiatorMode NtNAddr ByteString m () Void -- initiator mode will never run a peer sharing responder side - initiatorApp = fmap f <$> initiatorAndResponderApp + initiatorApp peerSharing = fmap f <$> initiatorAndResponderApp peerSharing where f :: MiniProtocolWithExpandedCtx Mx.InitiatorResponderMode NtNAddr ByteString m () () -> MiniProtocolWithExpandedCtx Mx.InitiatorMode NtNAddr ByteString m () Void @@ -299,8 +300,9 @@ applications debugTracer nodeKernel } initiatorAndResponderApp - :: OuroborosBundleWithExpandedCtx Mx.InitiatorResponderMode NtNAddr ByteString m () () - initiatorAndResponderApp = TemperatureBundle + :: PSTypes.PeerSharing + -> OuroborosBundleWithExpandedCtx Mx.InitiatorResponderMode NtNAddr ByteString m () () + initiatorAndResponderApp peerSharing = TemperatureBundle { withHot = WithHot [ MiniProtocol { miniProtocolNum = chainSyncMiniProtocolNum @@ -330,7 +332,7 @@ applications debugTracer nodeKernel } ] , withEstablished = WithEstablished $ - [ MiniProtocol + MiniProtocol { miniProtocolNum = keepAliveMiniProtocolNum , miniProtocolLimits = keepAliveLimits limits , miniProtocolRun = @@ -338,17 +340,19 @@ applications debugTracer nodeKernel keepAliveInitiator keepAliveResponder } - ] ++ if aaOwnPeerSharing /= PSTypes.PeerSharingDisabled - then [ MiniProtocol - { miniProtocolNum = peerSharingMiniProtocolNum - , miniProtocolLimits = peerSharingLimits limits - , miniProtocolRun = - InitiatorAndResponderProtocol - peerSharingInitiator - (peerSharingResponder (nkPeerSharingAPI nodeKernel)) - } - ] - else [] + : case peerSharing of + PSTypes.PeerSharingEnabled -> + [ MiniProtocol + { miniProtocolNum = peerSharingMiniProtocolNum + , miniProtocolLimits = peerSharingLimits limits + , miniProtocolRun = + InitiatorAndResponderProtocol + peerSharingInitiator + (peerSharingResponder (nkPeerSharingAPI nodeKernel)) + } + ] + PSTypes.PeerSharingDisabled -> + [] } localResponderApp diff --git a/ouroboros-network/src/Ouroboros/Network/NodeToClient.hs b/ouroboros-network/src/Ouroboros/Network/NodeToClient.hs index 3e546d183fb..716936f2cc7 100644 --- a/ouroboros-network/src/Ouroboros/Network/NodeToClient.hs +++ b/ouroboros-network/src/Ouroboros/Network/NodeToClient.hs @@ -164,8 +164,9 @@ data NodeToClientProtocols appType ntcAddr bytes m a b = NodeToClientProtocols { nodeToClientProtocols :: NodeToClientProtocols appType addr bytes m a b -> NodeToClientVersion + -> NodeToClientVersionData -> OuroborosApplicationWithMinimalCtx appType addr bytes m a b -nodeToClientProtocols protocols _version = +nodeToClientProtocols protocols _version _versionData = OuroborosApplication $ case protocols of NodeToClientProtocols { diff --git a/ouroboros-network/src/Ouroboros/Network/NodeToNode.hs b/ouroboros-network/src/Ouroboros/Network/NodeToNode.hs index 69e0a7a34ff..c4a6506adb8 100644 --- a/ouroboros-network/src/Ouroboros/Network/NodeToNode.hs +++ b/ouroboros-network/src/Ouroboros/Network/NodeToNode.hs @@ -244,9 +244,13 @@ nodeToNodeProtocols :: MiniProtocolParameters -> NodeToNodeProtocols muxMode initiatorCtx responderCtx bytes m a b -> NodeToNodeVersion - -> PeerSharing -- ^ Node's own PeerSharing value + -- ^ negotiated version number + -> NodeToNodeVersionData + -- ^ negotiated version data -> OuroborosBundle muxMode initiatorCtx responderCtx bytes m a b -nodeToNodeProtocols miniProtocolParameters protocols _version ownPeerSharing = +nodeToNodeProtocols miniProtocolParameters protocols + _version NodeToNodeVersionData { peerSharing } + = TemperatureBundle -- Hot protocols: 'chain-sync', 'block-fetch' and 'tx-submission'. (WithHot $ @@ -278,27 +282,24 @@ nodeToNodeProtocols miniProtocolParameters protocols _version ownPeerSharing = -- Established protocols: 'keep-alive'. (WithEstablished $ case protocols of - NodeToNodeProtocols { keepAliveProtocol, peerSharingProtocol } - | ownPeerSharing /= PeerSharingDisabled -> - [ MiniProtocol { + NodeToNodeProtocols { keepAliveProtocol, + peerSharingProtocol } -> + MiniProtocol { miniProtocolNum = keepAliveMiniProtocolNum, miniProtocolLimits = keepAliveProtocolLimits miniProtocolParameters, miniProtocolRun = keepAliveProtocol } - , MiniProtocol { - miniProtocolNum = peerSharingMiniProtocolNum, - miniProtocolLimits = peerSharingProtocolLimits miniProtocolParameters, - miniProtocolRun = peerSharingProtocol - } - ] - NodeToNodeProtocols { keepAliveProtocol } - | otherwise -> - [ MiniProtocol { - miniProtocolNum = keepAliveMiniProtocolNum, - miniProtocolLimits = keepAliveProtocolLimits miniProtocolParameters, - miniProtocolRun = keepAliveProtocol - } - ]) + : case peerSharing of + PeerSharingEnabled -> + [ MiniProtocol { + miniProtocolNum = peerSharingMiniProtocolNum, + miniProtocolLimits = peerSharingProtocolLimits miniProtocolParameters, + miniProtocolRun = peerSharingProtocol + } + ] + PeerSharingDisabled -> + [] + ) addSafetyMargin :: Int -> Int addSafetyMargin x = x + x `div` 10 From 275d4a6c800a7c8018b606ec002cd0f69a1dcd7e Mon Sep 17 00:00:00 2001 From: Karl Knutsson Date: Fri, 31 Jan 2025 09:01:20 +0100 Subject: [PATCH 2/4] TEST: test that we don't peershare with unwilling peers Make sure that we don't use run peersharing protocols against peers who didn't agree to it. --- .../Test/Ouroboros/Network/Testnet.hs | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/Testnet.hs b/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/Testnet.hs index decb1017422..805be5cfecb 100644 --- a/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/Testnet.hs +++ b/ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/Testnet.hs @@ -44,6 +44,7 @@ import GHC.IO.Exception as GHC (IOErrorType (..), IOException (..)) import System.Random (mkStdGen) import Network.DNS.Types qualified as DNS +import Network.Mux.Trace qualified as Mx import Ouroboros.Network.BlockFetch (PraosFetchMode (..), TraceFetchClientState (..)) @@ -226,6 +227,7 @@ tests = , testGroup "Peer Sharing" [ testProperty "share a peer" unit_peer_sharing + , testProperty "don't peershare the unwilling" (testWithIOSim prop_no_peershare_unwilling 100000) ] , testGroup "Churn" [ testProperty "no timeouts" @@ -4328,6 +4330,32 @@ unit_local_root_diffusion_mode diffusionMode = ) ] +prop_no_peershare_unwilling:: SimTrace Void + -> Int + -> Property +prop_no_peershare_unwilling ioSimTrace traceNumber = + let events = Trace.toList + . fmap (\(WithTime t (WithName _ b)) -> (t, b)) + . withTimeNameTraceEvents + @DiffusionTestTrace + @NtNAddr + . Trace.take traceNumber + $ ioSimTrace + in counterexample (List.intercalate "\n" $ map show events) + $ foldMap + (\case + (_, DiffusionInboundGovernorTrace (IG.TrMuxErrored _ err)) -> + case fromException err of + -- Technically we fail on more than the peersharing protocol. + -- Which is fine. + Just (Mx.UnknownMiniProtocol num) -> All + $ counterexample (show num) False + Just _ -> All True + Nothing -> All True + _ -> All True + ) + events + -- Utils -- From 06e8f1b3aba6223c3c8f4a7fd8c2cd98e53334e1 Mon Sep 17 00:00:00 2001 From: Marcin Szamotulski Date: Mon, 3 Feb 2025 12:11:40 +0100 Subject: [PATCH 3/4] Bump package versions --- cardano-client/cardano-client.cabal | 2 +- ouroboros-network-framework/CHANGELOG.md | 8 ++++++-- .../ouroboros-network-framework.cabal | 2 +- ouroboros-network/CHANGELOG.md | 2 ++ ouroboros-network/ouroboros-network.cabal | 4 ++-- 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/cardano-client/cardano-client.cabal b/cardano-client/cardano-client.cabal index 91c3bf81505..fc3fe5e4914 100644 --- a/cardano-client/cardano-client.cabal +++ b/cardano-client/cardano-client.cabal @@ -29,7 +29,7 @@ library network-mux ^>=0.6, ouroboros-network ^>=0.19, ouroboros-network-api ^>=0.12, - ouroboros-network-framework ^>=0.15, + ouroboros-network-framework ^>=0.15 || ^>=0.16, si-timers, ghc-options: diff --git a/ouroboros-network-framework/CHANGELOG.md b/ouroboros-network-framework/CHANGELOG.md index 0573caf929a..a7d75d14a2d 100644 --- a/ouroboros-network-framework/CHANGELOG.md +++ b/ouroboros-network-framework/CHANGELOG.md @@ -4,10 +4,14 @@ ### Breaking changes -* `simpleSingletonVersions`: takes a callback which receives negotiated version data. - ### Non-breaking changes +## 0.16.0.0 -- 2025-02-03 + +### Breaking changes + +* `simpleSingletonVersions`: takes a callback which receives negotiated version data. + ## 0.15.0.0 -- 2025-01-02 ### Breaking changes diff --git a/ouroboros-network-framework/ouroboros-network-framework.cabal b/ouroboros-network-framework/ouroboros-network-framework.cabal index 44b0158fb3a..75c1ea358cb 100644 --- a/ouroboros-network-framework/ouroboros-network-framework.cabal +++ b/ouroboros-network-framework/ouroboros-network-framework.cabal @@ -1,6 +1,6 @@ cabal-version: 3.0 name: ouroboros-network-framework -version: 0.15.0.0 +version: 0.16.0.0 synopsis: Ouroboros network framework description: Ouroboros network framework. license: Apache-2.0 diff --git a/ouroboros-network/CHANGELOG.md b/ouroboros-network/CHANGELOG.md index 3dd26da1488..495a3dbb9ba 100644 --- a/ouroboros-network/CHANGELOG.md +++ b/ouroboros-network/CHANGELOG.md @@ -6,6 +6,8 @@ ### Non-breaking changes +## 0.19.0.2 -- 2025-02-03 + ## 0.19.0.1 -- 2025-01-15 ### Breaking changes diff --git a/ouroboros-network/ouroboros-network.cabal b/ouroboros-network/ouroboros-network.cabal index e193ce070b4..478e418c9a9 100644 --- a/ouroboros-network/ouroboros-network.cabal +++ b/ouroboros-network/ouroboros-network.cabal @@ -1,6 +1,6 @@ cabal-version: 3.0 name: ouroboros-network -version: 0.19.0.1 +version: 0.19.0.2 synopsis: A networking layer for the Ouroboros blockchain protocol description: A networking layer for the Ouroboros blockchain protocol. license: Apache-2.0 @@ -165,7 +165,7 @@ library network-mux, nothunks, ouroboros-network-api ^>=0.12, - ouroboros-network-framework ^>=0.15, + ouroboros-network-framework ^>=0.16, ouroboros-network-protocols ^>=0.13, psqueues >=0.2.3 && <0.3, random, From e4ddba62dd1687141d2b9dae7706105366bba8d7 Mon Sep 17 00:00:00 2001 From: Marcin Szamotulski Date: Mon, 3 Feb 2025 16:53:26 +0100 Subject: [PATCH 4/4] handshake: cleaned up Acceptable instance --- .../src/Ouroboros/Network/PeerSelection/PeerSharing.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ouroboros-network-api/src/Ouroboros/Network/PeerSelection/PeerSharing.hs b/ouroboros-network-api/src/Ouroboros/Network/PeerSelection/PeerSharing.hs index d4bf2781a42..9033311ed9b 100644 --- a/ouroboros-network-api/src/Ouroboros/Network/PeerSelection/PeerSharing.hs +++ b/ouroboros-network-api/src/Ouroboros/Network/PeerSelection/PeerSharing.hs @@ -28,7 +28,7 @@ instance Semigroup PeerSharing where (<>) :: PeerSharing -> PeerSharing -> PeerSharing PeerSharingDisabled <> _ = PeerSharingDisabled _ <> PeerSharingDisabled = PeerSharingDisabled - _ <> _ = PeerSharingEnabled + PeerSharingEnabled <> PeerSharingEnabled = PeerSharingEnabled -- | The Monoid laws are witnessed by the following denotation function: --