Skip to content

Commit eecc50f

Browse files
committed
Add tx sybmission V2 protocol to the testnet sim
1 parent 3f32750 commit eecc50f

File tree

9 files changed

+194
-22
lines changed

9 files changed

+194
-22
lines changed

ouroboros-network-api/src/Ouroboros/Network/SizeInBytes.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import Quiet (Quiet (..))
1717
newtype SizeInBytes = SizeInBytes { getSizeInBytes :: Word32 }
1818
deriving (Eq, Ord)
1919
deriving Show via Quiet SizeInBytes
20+
deriving Bounded via Word32
2021
deriving Enum via Word32
2122
deriving Num via Word32
2223
deriving Real via Word32

ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/Diffusion/Node.hs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ import Ouroboros.Network.Testing.Data.Script (Script (..), stepScriptSTM')
9191

9292
import Simulation.Network.Snocket (AddressType (..), FD)
9393

94+
import Ouroboros.Network.BlockFetch.ClientRegistry (readPeerGSVs)
9495
import Ouroboros.Network.PeerSelection.Bootstrap (UseBootstrapPeers)
9596
import Ouroboros.Network.PeerSelection.LedgerPeers.Type
9697
(LedgerPeersConsensusInterface, UseLedgerPeers)
@@ -103,6 +104,8 @@ import Ouroboros.Network.PeerSelection.RelayAccessPoint (DomainAccessPoint,
103104
import Ouroboros.Network.PeerSelection.RootPeersDNS.DNSActions (DNSLookupType)
104105
import Ouroboros.Network.PeerSelection.State.LocalRootPeers (HotValency,
105106
WarmValency)
107+
import Ouroboros.Network.TxSubmission.Inbound.Policy (TxDecisionPolicy)
108+
import Ouroboros.Network.TxSubmission.Inbound.Registry (decisionLogicThread)
106109
import Test.Ouroboros.Network.Diffusion.Node.ChainDB (addBlock,
107110
getBlockPointSet)
108111
import Test.Ouroboros.Network.Diffusion.Node.MiniProtocols qualified as Node
@@ -155,6 +158,7 @@ data Arguments m = Arguments
155158
, aDNSTimeoutScript :: Script DNSTimeout
156159
, aDNSLookupDelayScript :: Script DNSLookupDelay
157160
, aDebugTracer :: Tracer m String
161+
, aTxDecisionPolicy :: TxDecisionPolicy
158162
}
159163

160164
-- The 'mockDNSActions' is not using \/ specifying 'resolverException', thus we
@@ -277,9 +281,17 @@ run blockGeneratorArgs limits ni na tracersExtra tracerBlockFetch =
277281
(mkArgsExtra useBootstrapPeersScriptVar) apps appsExtra)
278282
$ \ diffusionThread ->
279283
withAsync (blockFetch nodeKernel) $ \blockFetchLogicThread ->
280-
wait diffusionThread
281-
<> wait blockFetchLogicThread
282-
<> wait nodeKernelThread
284+
285+
withAsync (decisionLogicThread
286+
nullTracer
287+
(aTxDecisionPolicy na)
288+
(readPeerGSVs (nkFetchClientRegistry nodeKernel))
289+
(nkTxChannelsVar nodeKernel)
290+
(nkSharedTxStateVar nodeKernel)) $ \decLogicThread ->
291+
wait diffusionThread
292+
<> wait blockFetchLogicThread
293+
<> wait nodeKernelThread
294+
<> wait decLogicThread
283295
where
284296
blockFetch :: NodeKernel BlockHeader Block s m
285297
-> m Void
@@ -415,6 +427,7 @@ run blockGeneratorArgs limits ni na tracersExtra tracerBlockFetch =
415427
, Node.aaOwnPeerSharing = aOwnPeerSharing na
416428
, Node.aaUpdateOutboundConnectionsState =
417429
iUpdateOutboundConnectionsState ni
430+
, Node.aaTxDecisionPolicy = aTxDecisionPolicy na
418431
}
419432

420433
--- Utils

ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/Diffusion/Node/MiniProtocols.hs

Lines changed: 109 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ import Pipes qualified
8686

8787
import Ouroboros.Network.NodeToNode (blockFetchMiniProtocolNum,
8888
chainSyncMiniProtocolNum, keepAliveMiniProtocolNum,
89-
peerSharingMiniProtocolNum)
89+
peerSharingMiniProtocolNum, txSubmissionMiniProtocolNum)
9090
import Ouroboros.Network.PeerSelection.LedgerPeers
9191
import Ouroboros.Network.PeerSelection.LocalRootPeers (OutboundConnectionsState)
9292
import Ouroboros.Network.PeerSelection.PeerSharing qualified as PSTypes
@@ -96,7 +96,19 @@ import Ouroboros.Network.Protocol.PeerSharing.Client (peerSharingClientPeer)
9696
import Ouroboros.Network.Protocol.PeerSharing.Codec (codecPeerSharing)
9797
import Ouroboros.Network.Protocol.PeerSharing.Server (peerSharingServerPeer)
9898
import Ouroboros.Network.Protocol.PeerSharing.Type (PeerSharing)
99+
import Ouroboros.Network.Protocol.TxSubmission2.Client (txSubmissionClientPeer)
100+
import Ouroboros.Network.Protocol.TxSubmission2.Server
101+
(txSubmissionServerPeerPipelined)
102+
import Ouroboros.Network.Protocol.TxSubmission2.Type (NumTxIdsToAck (..),
103+
NumTxIdsToReq (..), TxSubmission2)
104+
import Ouroboros.Network.TxSubmission.Inbound.Policy (TxDecisionPolicy (..))
105+
import Ouroboros.Network.TxSubmission.Inbound.Registry (SharedTxStateVar,
106+
TxChannelsVar, withPeer)
107+
import Ouroboros.Network.TxSubmission.Inbound.Server (txSubmissionInboundV2)
108+
import Ouroboros.Network.TxSubmission.Outbound (txSubmissionOutbound)
99109
import Test.Ouroboros.Network.Diffusion.Node.NodeKernel
110+
import Test.Ouroboros.Network.TxSubmission.Common (Mempool, Tx,
111+
getMempoolReader, getMempoolWriter, txSubmissionCodec2)
100112

101113

102114
-- | Protocol codecs.
@@ -112,6 +124,8 @@ data Codecs addr header block m = Codecs
112124
CBOR.DeserialiseFailure m ByteString
113125
, peerSharingCodec :: Codec (PeerSharing addr)
114126
CBOR.DeserialiseFailure m ByteString
127+
, txSubmissionCodec :: Codec (TxSubmission2 Int (Tx Int))
128+
CBOR.DeserialiseFailure m ByteString
115129
}
116130

117131
cborCodecs :: MonadST m => Codecs NtNAddr BlockHeader Block m
@@ -125,6 +139,7 @@ cborCodecs = Codecs
125139
, keepAliveCodec = codecKeepAlive_v2
126140
, pingPongCodec = codecPingPong
127141
, peerSharingCodec = codecPeerSharing encodeNtNAddr decodeNtNAddr
142+
, txSubmissionCodec = txSubmissionCodec2
128143
}
129144

130145

@@ -178,6 +193,14 @@ data LimitsAndTimeouts header block = LimitsAndTimeouts
178193
:: ProtocolTimeLimits (PeerSharing NtNAddr)
179194
, peerSharingSizeLimits
180195
:: ProtocolSizeLimits (PeerSharing NtNAddr) ByteString
196+
197+
-- tx submission
198+
, txSubmissionLimits
199+
:: MiniProtocolLimits
200+
, txSubmissionTimeLimits
201+
:: ProtocolTimeLimits (TxSubmission2 Int (Tx Int))
202+
, txSubmissionSizeLimits
203+
:: ProtocolSizeLimits (TxSubmission2 Int (Tx Int)) ByteString
181204
}
182205

183206

@@ -208,6 +231,8 @@ data AppArgs header block m = AppArgs
208231
:: PSTypes.PeerSharing
209232
, aaUpdateOutboundConnectionsState
210233
:: OutboundConnectionsState -> STM m ()
234+
235+
, aaTxDecisionPolicy :: TxDecisionPolicy
211236
}
212237

213238

@@ -245,6 +270,7 @@ applications debugTracer nodeKernel
245270
Codecs { chainSyncCodec, blockFetchCodec
246271
, keepAliveCodec, pingPongCodec
247272
, peerSharingCodec
273+
, txSubmissionCodec
248274
}
249275
limits
250276
AppArgs
@@ -257,6 +283,7 @@ applications debugTracer nodeKernel
257283
, aaChainSyncEarlyExit
258284
, aaOwnPeerSharing
259285
, aaUpdateOutboundConnectionsState
286+
, aaTxDecisionPolicy
260287
}
261288
toHeader =
262289
Diff.Applications
@@ -316,6 +343,17 @@ applications debugTracer nodeKernel
316343
blockFetchInitiator
317344
blockFetchResponder
318345
}
346+
347+
, MiniProtocol {
348+
miniProtocolNum = txSubmissionMiniProtocolNum,
349+
miniProtocolLimits = txSubmissionLimits limits,
350+
miniProtocolRun =
351+
InitiatorAndResponderProtocol
352+
(txSubmissionInitiator aaTxDecisionPolicy (nkMempool nodeKernel))
353+
(txSubmissionResponder (nkMempool nodeKernel)
354+
(nkTxChannelsVar nodeKernel)
355+
(nkSharedTxStateVar nodeKernel))
356+
}
319357
]
320358
, withWarm = WithWarm
321359
[ MiniProtocol
@@ -600,6 +638,76 @@ applications debugTracer nodeKernel
600638
$ peerSharingServerPeer
601639
$ peerSharingServer psAPI
602640

641+
txSubmissionInitiator
642+
:: TxDecisionPolicy
643+
-> Mempool m Int
644+
-> MiniProtocolCb (ExpandedInitiatorContext NtNAddr m) ByteString m ()
645+
txSubmissionInitiator txDecisionPolicy mempool =
646+
MiniProtocolCb $
647+
\ ExpandedInitiatorContext {
648+
eicConnectionId = connId,
649+
eicControlMessage = controlMessageSTM
650+
}
651+
channel
652+
-> do
653+
let client = txSubmissionOutbound
654+
((show . (connId,)) `contramap` debugTracer)
655+
(NumTxIdsToAck $ getNumTxIdsToReq
656+
$ maxUnacknowledgedTxIds
657+
$ txDecisionPolicy)
658+
(getMempoolReader mempool)
659+
maxBound
660+
controlMessageSTM
661+
labelThisThread "TxSubmissionClient"
662+
runPeerWithLimits
663+
((show . (connId,)) `contramap` debugTracer)
664+
txSubmissionCodec
665+
(txSubmissionSizeLimits limits)
666+
(txSubmissionTimeLimits limits)
667+
channel
668+
(txSubmissionClientPeer client)
669+
670+
txSubmissionResponder
671+
:: Mempool m Int
672+
-> TxChannelsVar m NtNAddr Int (Tx Int)
673+
-> SharedTxStateVar m NtNAddr Int (Tx Int)
674+
-> MiniProtocolCb (ResponderContext NtNAddr) ByteString m ()
675+
txSubmissionResponder mempool txChannelsVar sharedTxStateVar =
676+
MiniProtocolCb $
677+
\ ResponderContext { rcConnectionId = connId@ConnectionId { remoteAddress = them }} channel
678+
-> do
679+
withPeer ((show . (connId,)) `contramap` debugTracer)
680+
txChannelsVar
681+
sharedTxStateVar
682+
(getMempoolReader mempool)
683+
them $ \api -> do
684+
let server = txSubmissionInboundV2
685+
((show . (connId,)) `contramap` debugTracer)
686+
(getMempoolWriter mempool)
687+
api
688+
labelThisThread "TxSubmissionServer"
689+
runPipelinedPeerWithLimits
690+
((show . (connId,)) `contramap` debugTracer)
691+
txSubmissionCodec
692+
(txSubmissionSizeLimits limits)
693+
(txSubmissionTimeLimits limits)
694+
channel
695+
(txSubmissionServerPeerPipelined server)
696+
697+
-- aTxSubmission2Server
698+
-- :: NodeToNodeVersion
699+
-- -> ResponderContext addrNTN
700+
-- -> Channel m bTX
701+
-- -> m ((), Maybe bTX)
702+
-- aTxSubmission2Server version ResponderContext { rcConnectionId = them } channel = do
703+
-- labelThisThread "TxSubmissionServer"
704+
-- runPipelinedPeerWithLimits
705+
-- (contramap (TraceLabelPeer them) tTxSubmission2Tracer)
706+
-- (cTxSubmission2Codec (mkCodecs version))
707+
-- blTxSubmission2
708+
-- timeLimitsTxSubmission2
709+
-- channel
710+
-- (txSubmissionServerPeerPipelined (hTxSubmissionServer version them))
603711

604712
--
605713
-- Orphaned Instances

ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/Diffusion/Node/NodeKernel.hs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ import Test.Ouroboros.Network.Orphans ()
7676

7777
import Codec.CBOR.Decoding qualified as CBOR
7878
import Codec.CBOR.Encoding qualified as CBOR
79+
import Control.Concurrent.Class.MonadMVar.Strict qualified as Strict
7980
import Ouroboros.Network.Mock.Chain (Chain (..))
8081
import Ouroboros.Network.NodeToNode ()
8182
import Ouroboros.Network.PeerSelection.Governor (PublicPeerSelectionState,
@@ -85,8 +86,11 @@ import Ouroboros.Network.PeerSelection.RelayAccessPoint (RelayAccessPoint (..))
8586
import Ouroboros.Network.PeerSharing (PeerSharingAPI, PeerSharingRegistry (..),
8687
newPeerSharingAPI, newPeerSharingRegistry,
8788
ps_POLICY_PEER_SHARE_MAX_PEERS, ps_POLICY_PEER_SHARE_STICKY_TIME)
89+
import Ouroboros.Network.TxSubmission.Inbound.Registry (SharedTxStateVar,
90+
TxChannels (..), TxChannelsVar, newSharedTxStateVar)
8891
import Test.Ouroboros.Network.Diffusion.Node.ChainDB (ChainDB (..))
8992
import Test.Ouroboros.Network.Diffusion.Node.ChainDB qualified as ChainDB
93+
import Test.Ouroboros.Network.TxSubmission.Common (Mempool, Tx, emptyMempool)
9094
import Test.QuickCheck (Arbitrary (..), choose, chooseInt, frequency, oneof)
9195

9296

@@ -268,10 +272,17 @@ data NodeKernel header block s m = NodeKernel {
268272

269273
nkPeerSharingAPI :: PeerSharingAPI NtNAddr s m,
270274

271-
nkPublicPeerSelectionVar :: StrictTVar m (PublicPeerSelectionState NtNAddr)
275+
nkPublicPeerSelectionVar :: StrictTVar m (PublicPeerSelectionState NtNAddr),
276+
277+
nkMempool :: Mempool m Int,
278+
279+
nkTxChannelsVar :: TxChannelsVar m NtNAddr Int (Tx Int),
280+
281+
nkSharedTxStateVar :: SharedTxStateVar m NtNAddr Int (Tx Int)
272282
}
273283

274284
newNodeKernel :: ( MonadSTM m
285+
, Strict.MonadMVar m
275286
, RandomGen s
276287
)
277288
=> s -> m (NodeKernel header block s m)
@@ -287,6 +298,9 @@ newNodeKernel rng = do
287298
ps_POLICY_PEER_SHARE_STICKY_TIME
288299
ps_POLICY_PEER_SHARE_MAX_PEERS
289300
<*> pure publicStateVar
301+
<*> emptyMempool
302+
<*> Strict.newMVar (TxChannels Map.empty)
303+
<*> newSharedTxStateVar
290304

291305
-- | Register a new upstream chain-sync client.
292306
--
@@ -364,6 +378,7 @@ withNodeKernelThread
364378
, MonadTimer m
365379
, MonadThrow m
366380
, MonadThrow (STM m)
381+
, Strict.MonadMVar m
367382
, HasFullHeader block
368383
, RandomGen seed
369384
)

ouroboros-network/sim-tests-lib/Test/Ouroboros/Network/Testnet.hs

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ import Test.Ouroboros.Network.LedgerPeers (LedgerPools (..))
100100
import Control.Monad.Class.MonadTest (exploreRaces)
101101
import Ouroboros.Network.PeerSelection.Bootstrap (requiresBootstrapPeers)
102102
import Ouroboros.Network.PeerSelection.LedgerPeers
103+
import Ouroboros.Network.TxSubmission.Inbound.Policy (defaultTxDecisionPolicy)
103104

104105
tests :: TestTree
105106
tests =
@@ -734,6 +735,7 @@ unit_4177 = prop_inbound_governor_transitions_coverage absNoAttenuation script
734735
Nothing
735736
False
736737
(Script (FetchModeDeadline :| []))
738+
defaultTxDecisionPolicy
737739
, [JoinNetwork 1.742857142857
738740
,Reconfigure 6.33333333333 [(1,1,Map.fromList [(RelayAccessDomain "test2" 65535,(DoAdvertisePeer, IsNotTrustable))]),
739741
(1,1,Map.fromList [(RelayAccessAddress "0:6:0:3:0:6:0:5" 65530,(DoAdvertisePeer, IsNotTrustable))
@@ -766,6 +768,7 @@ unit_4177 = prop_inbound_governor_transitions_coverage absNoAttenuation script
766768
Nothing
767769
False
768770
(Script (FetchModeDeadline :| []))
771+
defaultTxDecisionPolicy
769772
, [JoinNetwork 0.183783783783
770773
,Reconfigure 4.533333333333 [(1,1,Map.fromList [])]
771774
]
@@ -1347,6 +1350,7 @@ unit_4191 = testWithIOSim prop_diffusion_dns_can_recover 125000 absInfo script
13471350
Nothing
13481351
False
13491352
(Script (FetchModeDeadline :| []))
1353+
defaultTxDecisionPolicy
13501354
, [ JoinNetwork 6.710144927536
13511355
, Kill 7.454545454545
13521356
, JoinNetwork 10.763157894736
@@ -2275,7 +2279,8 @@ async_demotion_network_script =
22752279
naChainSyncEarlyExit
22762280
= False,
22772281
naPeerSharing = PeerSharingDisabled,
2278-
naFetchModeScript = singletonScript FetchModeDeadline
2282+
naFetchModeScript = singletonScript FetchModeDeadline,
2283+
naTxDecisionPolicy = defaultTxDecisionPolicy
22792284
}
22802285

22812286

@@ -2719,6 +2724,7 @@ prop_unit_4258 =
27192724
Nothing
27202725
False
27212726
(Script (FetchModeDeadline :| []))
2727+
defaultTxDecisionPolicy
27222728
, [ JoinNetwork 4.166666666666,
27232729
Kill 0.3,
27242730
JoinNetwork 1.517857142857,
@@ -2759,6 +2765,7 @@ prop_unit_4258 =
27592765
Nothing
27602766
False
27612767
(Script (FetchModeDeadline :| []))
2768+
defaultTxDecisionPolicy
27622769
, [ JoinNetwork 3.384615384615,
27632770
Reconfigure 3.583333333333 [(1,1,Map.fromList [(RelayAccessAddress "0.0.0.4" 9,(DoNotAdvertisePeer, IsNotTrustable))])],
27642771
Kill 15.55555555555,
@@ -2821,6 +2828,7 @@ prop_unit_reconnect =
28212828
Nothing
28222829
False
28232830
(Script (FetchModeDeadline :| []))
2831+
defaultTxDecisionPolicy
28242832
, [ JoinNetwork 0
28252833
])
28262834
, (NodeArgs
@@ -2843,11 +2851,12 @@ prop_unit_reconnect =
28432851
targetNumberOfEstablishedBigLedgerPeers = 0,
28442852
targetNumberOfActiveBigLedgerPeers = 0
28452853
}
2846-
(Script (DNSTimeout {getDNSTimeout = 10} :| [ ]))
2847-
(Script (DNSLookupDelay {getDNSLookupDelay = 0} :| []))
2848-
Nothing
2849-
False
2850-
(Script (FetchModeDeadline :| []))
2854+
(Script (DNSTimeout {getDNSTimeout = 10} :| [ ]))
2855+
(Script (DNSLookupDelay {getDNSLookupDelay = 0} :| []))
2856+
Nothing
2857+
False
2858+
(Script (FetchModeDeadline :| []))
2859+
defaultTxDecisionPolicy
28512860
, [ JoinNetwork 10
28522861
])
28532862
]
@@ -3253,7 +3262,8 @@ unit_peer_sharing =
32533262
naDNSLookupDelayScript = singletonScript (DNSLookupDelay 0.01),
32543263
naChainSyncEarlyExit = False,
32553264
naChainSyncExitOnBlockNo = Nothing,
3256-
naFetchModeScript = singletonScript FetchModeDeadline
3265+
naFetchModeScript = singletonScript FetchModeDeadline,
3266+
naTxDecisionPolicy = defaultTxDecisionPolicy
32573267
}
32583268

32593269
script = DiffusionScript

0 commit comments

Comments
 (0)