From 6385d563480d14e9dd5b49a4aa0079323106c462 Mon Sep 17 00:00:00 2001 From: Sandy Maguire Date: Tue, 11 Nov 2025 08:05:17 -0800 Subject: [PATCH 1/7] =?UTF-8?q?=E2=88=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From dbb4411475df1fc75c3371c47be307d5ac1e7aa1 Mon Sep 17 00:00:00 2001 From: Sandy Maguire Date: Thu, 13 Nov 2025 07:51:15 -0800 Subject: [PATCH 2/7] Hack to get cardano-node to connect --- .../src/unstable-mock-block/Ouroboros/Consensus/Mock/Node.hs | 4 ++-- .../Ouroboros/Consensus/Mock/Node/Abstract.hs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ouroboros-consensus/src/unstable-mock-block/Ouroboros/Consensus/Mock/Node.hs b/ouroboros-consensus/src/unstable-mock-block/Ouroboros/Consensus/Mock/Node.hs index 9eccd4e07..a11a5c2bb 100644 --- a/ouroboros-consensus/src/unstable-mock-block/Ouroboros/Consensus/Mock/Node.hs +++ b/ouroboros-consensus/src/unstable-mock-block/Ouroboros/Consensus/Mock/Node.hs @@ -38,8 +38,8 @@ import Ouroboros.Consensus.Util.RedundantConstraints -------------------------------------------------------------------------------} instance SupportedNetworkProtocolVersion (SimpleBlock SimpleMockCrypto ext) where - supportedNodeToNodeVersions _ = Map.singleton maxBound () - supportedNodeToClientVersions _ = Map.singleton maxBound () + supportedNodeToNodeVersions _ = foldMap (flip Map.singleton ()) [minBound .. maxBound] + supportedNodeToClientVersions _ = foldMap (flip Map.singleton ()) [minBound .. maxBound] latestReleasedNodeVersion = latestReleasedNodeVersionDefault diff --git a/ouroboros-consensus/src/unstable-mock-block/Ouroboros/Consensus/Mock/Node/Abstract.hs b/ouroboros-consensus/src/unstable-mock-block/Ouroboros/Consensus/Mock/Node/Abstract.hs index 7a5287ecb..b3487cd82 100644 --- a/ouroboros-consensus/src/unstable-mock-block/Ouroboros/Consensus/Mock/Node/Abstract.hs +++ b/ouroboros-consensus/src/unstable-mock-block/Ouroboros/Consensus/Mock/Node/Abstract.hs @@ -39,7 +39,7 @@ class -- different IDs from each other and from regular protocols. constructMockNetworkMagic :: HasCallStack => NetworkMagic constructMockNetworkMagic = - NetworkMagic $ fromIntegral $ hash (prettyCallStack callStack) + NetworkMagic $ fromIntegral $ 764824073 instance RunMockBlock c ext => From e4713580087460874e06b285c7aa1e0cd0eeee64 Mon Sep 17 00:00:00 2001 From: Sandy Maguire Date: Thu, 13 Nov 2025 07:51:15 -0800 Subject: [PATCH 3/7] read instead of take --- .../app/conformance-test-runner/Main.hs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ouroboros-consensus-diffusion/app/conformance-test-runner/Main.hs b/ouroboros-consensus-diffusion/app/conformance-test-runner/Main.hs index 93cffc782..3af8bb956 100644 --- a/ouroboros-consensus-diffusion/app/conformance-test-runner/Main.hs +++ b/ouroboros-consensus-diffusion/app/conformance-test-runner/Main.hs @@ -99,8 +99,12 @@ runServer = do -- NUT has connected. _peerChannels <- atomically $ do for peerServers $ \((csChanTMV, bfChanTMV), _thread) -> do - csChan <- takeTMVar csChanTMV - bfChan <- takeTMVar bfChanTMV + csChan <- readTMVar csChanTMV + bfChan <- readTMVar bfChanTMV pure (csChan, bfChan) + for_ peerServers $ uninterruptibleCancel . snd + + putStrLn "took everything" + pure () From aca74cc07e7deb7dc6b4a7325dcb2614a6e46ff3 Mon Sep 17 00:00:00 2001 From: Sandy Maguire Date: Fri, 14 Nov 2025 09:26:00 -0800 Subject: [PATCH 4/7] pass resources through --- .../app/conformance-test-runner/Main.hs | 21 ++++++++++---- .../conformance-test-runner/MiniProtocols.hs | 29 ++++++++++++------- .../app/conformance-test-runner/Server.hs | 9 ++++-- 3 files changed, 39 insertions(+), 20 deletions(-) diff --git a/ouroboros-consensus-diffusion/app/conformance-test-runner/Main.hs b/ouroboros-consensus-diffusion/app/conformance-test-runner/Main.hs index 3af8bb956..91db56ef6 100644 --- a/ouroboros-consensus-diffusion/app/conformance-test-runner/Main.hs +++ b/ouroboros-consensus-diffusion/app/conformance-test-runner/Main.hs @@ -1,5 +1,9 @@ module Main (main) where +import qualified Data.Map.Merge.Lazy as M +import Test.Consensus.PeerSimulator.Resources (PeerSimulatorResources(..), makePeerSimulatorResources) +import Control.Tracer (nullTracer) +import qualified Data.List.NonEmpty as NonEmpty import Data.Aeson (encode, throwDecode) import qualified Data.ByteString.Lazy.Char8 as BSL8 import Data.Coerce @@ -78,29 +82,34 @@ main = do let simPeerMap = buildPeerMap (optPort opts) pointSchedule BSL8.writeFile (optOutputTopologyFile opts) (encode $ makeTopology simPeerMap) +zipMaps :: Ord k => Map k a -> Map k b -> Map k (a, b) +zipMaps = M.merge M.dropMissing M.dropMissing $ M.zipWithMatched $ const (,) + runServer :: IO () runServer = do let peerMap = buildPeerMap 6001 testPointSchedule + peerSim <- makePeerSimulatorResources nullTracer undefined $ NonEmpty.fromList $ M.keys peerMap + peerServers <- - for peerMap $ \port -> do + for (zipMaps peerMap $ psrPeers peerSim) $ \(port, res) -> do -- Make a TMVar for the chainsync and blockfetch channels exposed through -- the miniprotocols. These get threaded into the server, which will fill -- them once the NUT has connected. - csChannelTMV <- newEmptyTMVarIO - bfChannelTMV <- newEmptyTMVarIO + csChannelTMV <- newTVarIO False + bfChannelTMV <- newTVarIO False putStrLn $ "starting server on " <> show port let sockAddr = Socket.SockAddrInet port $ Socket.tupleToHostAddress (127, 0, 0, 1) - thread <- async $ run csChannelTMV bfChannelTMV sockAddr + thread <- async $ run res csChannelTMV bfChannelTMV sockAddr pure ((csChannelTMV, bfChannelTMV), thread) -- Now, take each of the resulting TMVars. This effectively blocks until the -- NUT has connected. _peerChannels <- atomically $ do for peerServers $ \((csChanTMV, bfChanTMV), _thread) -> do - csChan <- readTMVar csChanTMV - bfChan <- readTMVar bfChanTMV + csChan <- readTVar csChanTMV + bfChan <- readTVar bfChanTMV pure (csChan, bfChan) for_ peerServers $ uninterruptibleCancel . snd diff --git a/ouroboros-consensus-diffusion/app/conformance-test-runner/MiniProtocols.hs b/ouroboros-consensus-diffusion/app/conformance-test-runner/MiniProtocols.hs index 9cc8a2016..99c3c8fc5 100644 --- a/ouroboros-consensus-diffusion/app/conformance-test-runner/MiniProtocols.hs +++ b/ouroboros-consensus-diffusion/app/conformance-test-runner/MiniProtocols.hs @@ -16,6 +16,10 @@ -- picked up by the peer simulator. module MiniProtocols (peerSimServer) where +import Ouroboros.Network.Protocol.BlockFetch.Server +import Ouroboros.Network.Util.ShowProxy (ShowProxy) +import Ouroboros.Network.Protocol.ChainSync.Server +import Test.Consensus.PeerSimulator.Resources (PeerResources (..), ChainSyncResources (..), BlockFetchResources (..)) import qualified Codec.CBOR.Decoding as CBOR import qualified Codec.CBOR.Encoding as CBOR import Control.Monad (forever) @@ -59,10 +63,13 @@ peerSimServer :: ( IOLike m , SerialiseNodeToNodeConstraints blk , SupportedNetworkProtocolVersion blk + , ShowProxy blk + , ShowProxy (Header blk) , MonadSay m ) => - StrictTMVar m (Mux.Channel m BL.ByteString) -> - StrictTMVar m (Mux.Channel m BL.ByteString) -> + PeerResources m blk -> + StrictTVar m Bool -> + StrictTVar m Bool -> CodecConfig blk -> (NodeToNodeVersion -> addr -> CBOR.Encoding) -> (NodeToNodeVersion -> forall s. CBOR.Decoder s addr) -> @@ -71,7 +78,7 @@ peerSimServer :: NodeToNodeVersion NodeToNodeVersionData (OuroborosApplicationWithMinimalCtx 'Mux.ResponderMode addr BL.ByteString m Void ()) -peerSimServer csChanTMV bfChanTMV codecCfg encAddr decAddr networkMagic = do +peerSimServer res csChanTMV bfChanTMV codecCfg encAddr decAddr networkMagic = do forAllVersions application where forAllVersions :: @@ -115,9 +122,9 @@ peerSimServer csChanTMV bfChanTMV codecCfg encAddr decAddr networkMagic = do $ MiniProtocolCb $ \_ctx channel -> do say "hello from cs" - atomically $ - putTMVar csChanTMV channel - pure ((), Nothing) + atomically $ writeTVar csChanTMV True + runPeer nullTracer cChainSyncCodec channel + $ chainSyncServerPeer $ csrServer $ prChainSync res , mkMiniProtocol Mux.StartOnDemand N2N.blockFetchMiniProtocolNum @@ -125,9 +132,9 @@ peerSimServer csChanTMV bfChanTMV codecCfg encAddr decAddr networkMagic = do $ MiniProtocolCb $ \_ctx channel -> do say "hello from bf" - atomically $ - putTMVar bfChanTMV channel - pure ((), Nothing) + atomically $ writeTVar bfChanTMV True + runPeer nullTracer cBlockFetchCodec channel + $ blockFetchServerPeer $ bfrServer $ prBlockFetch res , mkMiniProtocol Mux.StartOnDemand N2N.txSubmissionMiniProtocolNum @@ -138,8 +145,8 @@ peerSimServer csChanTMV bfChanTMV codecCfg encAddr decAddr networkMagic = do where Consensus.N2N.Codecs { cKeepAliveCodec - -- , cChainSyncCodecSerialised - -- , cBlockFetchCodecSerialised + , cChainSyncCodec + , cBlockFetchCodec } = Consensus.N2N.defaultCodecs codecCfg blockVersion encAddr decAddr version diff --git a/ouroboros-consensus-diffusion/app/conformance-test-runner/Server.hs b/ouroboros-consensus-diffusion/app/conformance-test-runner/Server.hs index f135a5e5b..9984640b8 100644 --- a/ouroboros-consensus-diffusion/app/conformance-test-runner/Server.hs +++ b/ouroboros-consensus-diffusion/app/conformance-test-runner/Server.hs @@ -7,6 +7,7 @@ module Server (run) where +import Test.Consensus.PeerSimulator.Resources (PeerResources) import Control.ResourceRegistry import Control.Tracer import qualified Data.ByteString.Lazy as BL @@ -69,15 +70,17 @@ run :: , ConfigSupportsNode blk , blk ~ SimpleBlock SimpleMockCrypto SimplePraosRuleExt ) => + PeerResources IO blk -> -- | A TMVar for the chainsync channel that we will fill in once the node connects. - StrictTMVar IO (Mux.Channel IO BL.ByteString) -> + StrictTVar IO Bool -> -- | A TMVar for the blockfetch channel that we will fill in once the node connects. - StrictTMVar IO (Mux.Channel IO BL.ByteString) -> + StrictTVar IO Bool -> SockAddr -> IO Void -run csChanTMV bfChanTMV sockAddr = withRegistry \_registry -> +run res csChanTMV bfChanTMV sockAddr = withRegistry \_registry -> serve sockAddr $ peerSimServer @_ @(SimpleBlock SimpleMockCrypto SimplePraosRuleExt) + res csChanTMV bfChanTMV SimpleCodecConfig From bd996fda83e7671d887c873e3231a3183f655078 Mon Sep 17 00:00:00 2001 From: Sandy Maguire Date: Fri, 14 Nov 2025 10:17:42 -0800 Subject: [PATCH 5/7] wrong block --- .../app/conformance-test-runner/Main.hs | 9 +++++++++ .../app/conformance-test-runner/Server.hs | 12 ++++++++---- .../Test/Util/TestBlock.hs | 7 +++++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/ouroboros-consensus-diffusion/app/conformance-test-runner/Main.hs b/ouroboros-consensus-diffusion/app/conformance-test-runner/Main.hs index 91db56ef6..130da8357 100644 --- a/ouroboros-consensus-diffusion/app/conformance-test-runner/Main.hs +++ b/ouroboros-consensus-diffusion/app/conformance-test-runner/Main.hs @@ -1,3 +1,7 @@ +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE MultiParamTypeClasses #-} +{-# LANGUAGE TypeSynonymInstances #-} + module Main (main) where import qualified Data.Map.Merge.Lazy as M @@ -30,6 +34,9 @@ import System.Environment (getArgs) import Test.Consensus.OrphanInstances () import Test.Consensus.PointSchedule (PointSchedule (..)) import Test.Consensus.PointSchedule.Peers (PeerId (..), Peers (Peers), getPeerIds) +import Test.Util.TestBlock +import Ouroboros.Consensus.Node.Serialisation +import Ouroboros.Consensus.Block.Abstract testPointSchedule :: PointSchedule blk testPointSchedule = @@ -85,6 +92,8 @@ main = do zipMaps :: Ord k => Map k a -> Map k b -> Map k (a, b) zipMaps = M.merge M.dropMissing M.dropMissing $ M.zipWithMatched $ const (,) +instance SerialiseNodeToNode TestBlock (Header TestBlock) + runServer :: IO () runServer = do let peerMap = buildPeerMap 6001 testPointSchedule diff --git a/ouroboros-consensus-diffusion/app/conformance-test-runner/Server.hs b/ouroboros-consensus-diffusion/app/conformance-test-runner/Server.hs index 9984640b8..fb934b14b 100644 --- a/ouroboros-consensus-diffusion/app/conformance-test-runner/Server.hs +++ b/ouroboros-consensus-diffusion/app/conformance-test-runner/Server.hs @@ -7,6 +7,8 @@ module Server (run) where +import Ouroboros.Consensus.Node.Serialisation +import Ouroboros.Consensus.Node.ProtocolInfo (NumCoreNodes (..)) import Test.Consensus.PeerSimulator.Resources (PeerResources) import Control.ResourceRegistry import Control.Tracer @@ -35,6 +37,8 @@ import qualified Ouroboros.Network.Protocol.Handshake as Handshake import qualified Ouroboros.Network.Server.Simple as Server import qualified Ouroboros.Network.Snocket as Snocket import Ouroboros.Network.Socket (SomeResponderApplication (..), configureSocket) +import Test.Util.TestBlock (TestBlock) +import qualified Test.Util.TestBlock as TB -- | Glue code for using just the bits from the Diffusion Layer that we need in -- this context. @@ -68,7 +72,7 @@ run :: ( SupportedNetworkProtocolVersion blk , SerialiseNodeToNodeConstraints blk , ConfigSupportsNode blk - , blk ~ SimpleBlock SimpleMockCrypto SimplePraosRuleExt + , blk ~ TestBlock ) => PeerResources IO blk -> -- | A TMVar for the chainsync channel that we will fill in once the node connects. @@ -79,11 +83,11 @@ run :: IO Void run res csChanTMV bfChanTMV sockAddr = withRegistry \_registry -> serve sockAddr - $ peerSimServer @_ @(SimpleBlock SimpleMockCrypto SimplePraosRuleExt) + $ peerSimServer @_ @TestBlock res csChanTMV bfChanTMV - SimpleCodecConfig + TB.TestBlockCodecConfig encodeRemoteAddress decodeRemoteAddress - $ getNetworkMagic @(SimpleBlock SimpleMockCrypto SimplePraosRuleExt) SimpleBlockConfig + $ getNetworkMagic @TestBlock $ TB.TestBlockConfig $ NumCoreNodes 0 diff --git a/ouroboros-consensus/src/unstable-consensus-testlib/Test/Util/TestBlock.hs b/ouroboros-consensus/src/unstable-consensus-testlib/Test/Util/TestBlock.hs index 27a8d0c64..1679fe292 100644 --- a/ouroboros-consensus/src/unstable-consensus-testlib/Test/Util/TestBlock.hs +++ b/ouroboros-consensus/src/unstable-consensus-testlib/Test/Util/TestBlock.hs @@ -226,6 +226,13 @@ data Validity = Valid | Invalid deriving stock (Show, Eq, Ord, Enum, Bounded, Generic) deriving anyclass (Serialise, NoThunks, ToExpr) + +instance SupportedNetworkProtocolVersion (TestBlockWith ptype) where + supportedNodeToNodeVersions _ = foldMap (flip Map.singleton ()) [minBound .. maxBound] + supportedNodeToClientVersions _ = foldMap (flip Map.singleton ()) [minBound .. maxBound] + + latestReleasedNodeVersion = latestReleasedNodeVersionDefault + -- | Test block parametrized on the payload type -- -- For blocks without payload see the 'TestBlock' type alias. From 90e4978a69de16efc07aafc15ea0e296d5387a1f Mon Sep 17 00:00:00 2001 From: Sandy Maguire Date: Tue, 18 Nov 2025 08:55:16 -0800 Subject: [PATCH 6/7] connect back --- .../app/conformance-test-runner/Main.hs | 9 +++------ .../app/conformance-test-runner/Server.hs | 11 +++++++---- .../ouroboros-consensus-diffusion.cabal | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/ouroboros-consensus-diffusion/app/conformance-test-runner/Main.hs b/ouroboros-consensus-diffusion/app/conformance-test-runner/Main.hs index 130da8357..64431e200 100644 --- a/ouroboros-consensus-diffusion/app/conformance-test-runner/Main.hs +++ b/ouroboros-consensus-diffusion/app/conformance-test-runner/Main.hs @@ -34,9 +34,6 @@ import System.Environment (getArgs) import Test.Consensus.OrphanInstances () import Test.Consensus.PointSchedule (PointSchedule (..)) import Test.Consensus.PointSchedule.Peers (PeerId (..), Peers (Peers), getPeerIds) -import Test.Util.TestBlock -import Ouroboros.Consensus.Node.Serialisation -import Ouroboros.Consensus.Block.Abstract testPointSchedule :: PointSchedule blk testPointSchedule = @@ -92,14 +89,14 @@ main = do zipMaps :: Ord k => Map k a -> Map k b -> Map k (a, b) zipMaps = M.merge M.dropMissing M.dropMissing $ M.zipWithMatched $ const (,) -instance SerialiseNodeToNode TestBlock (Header TestBlock) - runServer :: IO () runServer = do let peerMap = buildPeerMap 6001 testPointSchedule peerSim <- makePeerSimulatorResources nullTracer undefined $ NonEmpty.fromList $ M.keys peerMap + incomingTMV <- newEmptyTMVarIO + peerServers <- for (zipMaps peerMap $ psrPeers peerSim) $ \(port, res) -> do -- Make a TMVar for the chainsync and blockfetch channels exposed through @@ -110,7 +107,7 @@ runServer = do putStrLn $ "starting server on " <> show port let sockAddr = Socket.SockAddrInet port $ Socket.tupleToHostAddress (127, 0, 0, 1) - thread <- async $ run res csChannelTMV bfChannelTMV sockAddr + thread <- async $ run res incomingTMV csChannelTMV bfChannelTMV sockAddr pure ((csChannelTMV, bfChannelTMV), thread) -- Now, take each of the resulting TMVars. This effectively blocks until the diff --git a/ouroboros-consensus-diffusion/app/conformance-test-runner/Server.hs b/ouroboros-consensus-diffusion/app/conformance-test-runner/Server.hs index fb934b14b..d27262d7b 100644 --- a/ouroboros-consensus-diffusion/app/conformance-test-runner/Server.hs +++ b/ouroboros-consensus-diffusion/app/conformance-test-runner/Server.hs @@ -43,13 +43,14 @@ import qualified Test.Util.TestBlock as TB -- | Glue code for using just the bits from the Diffusion Layer that we need in -- this context. serve :: + StrictTMVar IO SockAddr -> SockAddr -> N2N.Versions N2N.NodeToNodeVersion N2N.NodeToNodeVersionData (OuroborosApplicationWithMinimalCtx 'Mux.ResponderMode SockAddr BL.ByteString IO Void ()) -> IO Void -serve sockAddr application = withIOManager \iocp -> +serve incomingTV sockAddr application = withIOManager \iocp -> Server.with (Snocket.socketSnocket iocp) Snocket.makeSocketBearer @@ -65,7 +66,7 @@ serve sockAddr application = withIOManager \iocp -> , haTimeLimits = Handshake.timeLimitsHandshake } (SomeResponderApplication <$> application) - (\_ serverAsync -> wait serverAsync) + (\incoming serverAsync -> atomically (tryPutTMVar incomingTV incoming) *> wait serverAsync) run :: forall blk. @@ -75,14 +76,16 @@ run :: , blk ~ TestBlock ) => PeerResources IO blk -> + -- | A TMVar for the connecting peer + StrictTMVar IO SockAddr -> -- | A TMVar for the chainsync channel that we will fill in once the node connects. StrictTVar IO Bool -> -- | A TMVar for the blockfetch channel that we will fill in once the node connects. StrictTVar IO Bool -> SockAddr -> IO Void -run res csChanTMV bfChanTMV sockAddr = withRegistry \_registry -> - serve sockAddr +run res incomingTV csChanTMV bfChanTMV sockAddr = withRegistry \_registry -> + serve incomingTV sockAddr $ peerSimServer @_ @TestBlock res csChanTMV diff --git a/ouroboros-consensus-diffusion/ouroboros-consensus-diffusion.cabal b/ouroboros-consensus-diffusion/ouroboros-consensus-diffusion.cabal index e630036f7..ff32156ca 100644 --- a/ouroboros-consensus-diffusion/ouroboros-consensus-diffusion.cabal +++ b/ouroboros-consensus-diffusion/ouroboros-consensus-diffusion.cabal @@ -90,7 +90,7 @@ library network-mux ^>=0.9, ouroboros-consensus ^>=0.28, ouroboros-consensus-protocol ^>=0.13, - ouroboros-network:{cardano-diffusion, ouroboros-network} ^>=0.22.1, + ouroboros-network:{cardano-diffusion, ouroboros-network} >=0.22.1, ouroboros-network-api ^>=0.16, ouroboros-network-framework ^>=0.19, ouroboros-network-protocols ^>=0.15, From 2c2fe6e638293179e7c67f472e3c471c22c1b9f0 Mon Sep 17 00:00:00 2001 From: Sandy Maguire Date: Thu, 13 Nov 2025 07:51:15 -0800 Subject: [PATCH 7/7] feat: wip connect to peersim