@@ -22,6 +22,7 @@ module Cardano.Network.NodeToNode
2222 , keepAliveProtocolLimits
2323 , peerSharingProtocolLimits
2424 , perasCertDiffusionProtocolLimits
25+ , perasVoteDiffusionProtocolLimits
2526 , defaultMiniProtocolParameters
2627 , NodeToNodeVersion (.. )
2728 , NodeToNodeVersionData (.. )
@@ -71,6 +72,7 @@ module Cardano.Network.NodeToNode
7172 , keepAliveMiniProtocolNum
7273 , peerSharingMiniProtocolNum
7374 , perasCertDiffusionMiniProtocolNum
75+ , perasVoteDiffusionMiniProtocolNum
7476 ) where
7577
7678import Control.Exception (SomeException )
@@ -128,6 +130,10 @@ data NodeToNodeProtocols appType initiatorCtx responderCtx bytes m a b = NodeToN
128130 --
129131 perasCertDiffusionProtocol :: RunMiniProtocol appType initiatorCtx responderCtx bytes m a b ,
130132
133+ -- | Peras vote diffusion mini-protocol
134+ --
135+ perasVoteDiffusionProtocol :: RunMiniProtocol appType initiatorCtx responderCtx bytes m a b ,
136+
131137 -- | keep-alive mini-protocol
132138 --
133139 keepAliveProtocol :: RunMiniProtocol appType initiatorCtx responderCtx bytes m a b ,
@@ -164,7 +170,7 @@ data MiniProtocolParameters = MiniProtocolParameters {
164170 txDecisionPolicy :: ! TxDecisionPolicy ,
165171 -- ^ tx submission protocol decision logic parameters
166172
167- perasCertDiffusionMaxFifoLength :: ! NumObjectsOutstanding
173+ perasCertDiffusionMaxFifoLength :: ! NumObjectsOutstanding ,
168174 -- ^ Maximum number of PerasCerts in the outbound peer's outstanding FIFO.
169175 --
170176 -- This indirectly limits the number of pipelined requests from the inbound peer:
@@ -184,6 +190,11 @@ data MiniProtocolParameters = MiniProtocolParameters {
184190 -- So, the theoretical maximum pipeline size is
185191 -- @2 * perasCertDiffusionMaxFifoLength@, but in practice the pipeline size will
186192 -- be much smaller, as the inbound peer typically batches requests.
193+
194+ perasVoteDiffusionMaxFifoLength :: ! NumObjectsOutstanding
195+ -- ^ Maximum number of PerasVotes in the outbound peer's outstanding FIFO.
196+ -- See comment on 'perasCertDiffusionMaxFifoLength' for more details to
197+ -- understand why this indirectly limits the number of pipelined requests.
187198 }
188199
189200defaultMiniProtocolParameters :: MiniProtocolParameters
@@ -195,6 +206,9 @@ defaultMiniProtocolParameters = MiniProtocolParameters {
195206 -- | TODO: this value is still being discussed.
196207 -- See https://github.com/tweag/cardano-peras/issues/97 for reference.
197208 , perasCertDiffusionMaxFifoLength = 10
209+ -- | TODO: this value is still being discussed.
210+ -- See https://github.com/tweag/cardano-peras/issues/97 for reference.
211+ , perasVoteDiffusionMaxFifoLength = 10_000
198212 }
199213
200214-- | Make an 'OuroborosApplication' for the bundle of mini-protocols that
@@ -234,7 +248,8 @@ nodeToNodeProtocols featureFlags miniProtocolParameters protocols
234248 NodeToNodeProtocols { chainSyncProtocol,
235249 blockFetchProtocol,
236250 txSubmissionProtocol,
237- perasCertDiffusionProtocol
251+ perasCertDiffusionProtocol,
252+ perasVoteDiffusionProtocol
238253 } ->
239254 [ MiniProtocol {
240255 miniProtocolNum = chainSyncMiniProtocolNum,
@@ -264,6 +279,12 @@ nodeToNodeProtocols featureFlags miniProtocolParameters protocols
264279 miniProtocolLimits = perasCertDiffusionProtocolLimits miniProtocolParameters,
265280 miniProtocolRun = perasCertDiffusionProtocol
266281 }
282+ , MiniProtocol {
283+ miniProtocolNum = perasVoteDiffusionMiniProtocolNum,
284+ miniProtocolStart = StartOnDemand ,
285+ miniProtocolLimits = perasVoteDiffusionProtocolLimits miniProtocolParameters,
286+ miniProtocolRun = perasVoteDiffusionProtocol
287+ }
267288 ])
268289
269290 -- Warm protocols: reserved for 'tip-sample'.
@@ -301,7 +322,8 @@ chainSyncProtocolLimits
301322 , txSubmissionProtocolLimits
302323 , keepAliveProtocolLimits
303324 , peerSharingProtocolLimits
304- , perasCertDiffusionProtocolLimits :: MiniProtocolParameters -> MiniProtocolLimits
325+ , perasCertDiffusionProtocolLimits
326+ , perasVoteDiffusionProtocolLimits :: MiniProtocolParameters -> MiniProtocolLimits
305327
306328chainSyncProtocolLimits MiniProtocolParameters { chainSyncPipeliningHighMark } =
307329 MiniProtocolLimits {
@@ -431,6 +453,15 @@ perasCertDiffusionProtocolLimits MiniProtocolParameters { perasCertDiffusionMaxF
431453 fromIntegral perasCertDiffusionMaxFifoLength * 20_000
432454 }
433455
456+ perasVoteDiffusionProtocolLimits MiniProtocolParameters { perasVoteDiffusionMaxFifoLength } =
457+ MiniProtocolLimits {
458+ -- Peras votes are expected to be much smaller than Peras certificates.
459+ -- We assume an upper bound of 1 kB per vote.
460+ -- See https://github.com/tweag/cardano-peras/issues/97
461+ maximumIngressQueue = addSafetyMargin $
462+ fromIntegral perasVoteDiffusionMaxFifoLength * 1_000
463+ }
464+
434465chainSyncMiniProtocolNum :: MiniProtocolNum
435466chainSyncMiniProtocolNum = MiniProtocolNum 2
436467
@@ -449,6 +480,9 @@ peerSharingMiniProtocolNum = MiniProtocolNum 10
449480perasCertDiffusionMiniProtocolNum :: MiniProtocolNum
450481perasCertDiffusionMiniProtocolNum = MiniProtocolNum 16
451482
483+ perasVoteDiffusionMiniProtocolNum :: MiniProtocolNum
484+ perasVoteDiffusionMiniProtocolNum = MiniProtocolNum 17
485+
452486-- | A specialised version of @'Ouroboros.Network.Socket.connectToNode'@.
453487--
454488connectTo
0 commit comments