Skip to content

Commit 3d9c4b1

Browse files
committed
Add codec for PerasCert and PerasCertDiffusion
1 parent cd32fac commit 3d9c4b1

File tree

5 files changed

+92
-26
lines changed

5 files changed

+92
-26
lines changed

ouroboros-consensus-diffusion/src/ouroboros-consensus-diffusion/Ouroboros/Consensus/Network/NodeToNode.hs

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,6 @@ import Ouroboros.Consensus.Util.IOLike
8585
import Ouroboros.Consensus.Util.Orphans ()
8686
import Ouroboros.Network.Block
8787
( Serialised (..)
88-
, decodePoint
89-
, decodeTip
90-
, encodePoint
91-
, encodeTip
9288
)
9389
import Ouroboros.Network.BlockFetch
9490
import Ouroboros.Network.BlockFetch.Client
@@ -128,6 +124,10 @@ import Ouroboros.Network.Protocol.KeepAlive.Client
128124
import Ouroboros.Network.Protocol.KeepAlive.Codec
129125
import Ouroboros.Network.Protocol.KeepAlive.Server
130126
import Ouroboros.Network.Protocol.KeepAlive.Type
127+
import Ouroboros.Network.Protocol.ObjectDiffusion.Codec
128+
( codecObjectDiffusion
129+
, codecObjectDiffusionId
130+
)
131131
import Ouroboros.Network.Protocol.PeerSharing.Client
132132
( PeerSharingClient
133133
, peerSharingClientPeer
@@ -337,14 +337,15 @@ mkHandlers
337337
-------------------------------------------------------------------------------}
338338

339339
-- | Node-to-node protocol codecs needed to run 'Handlers'.
340-
data Codecs blk addr e m bCS bSCS bBF bSBF bTX bKA bPS = Codecs
340+
data Codecs blk addr e m bCS bSCS bBF bSBF bTX bPCD bKA bPS = Codecs
341341
{ cChainSyncCodec :: Codec (ChainSync (Header blk) (Point blk) (Tip blk)) e m bCS
342342
, cChainSyncCodecSerialised ::
343343
Codec (ChainSync (SerialisedHeader blk) (Point blk) (Tip blk)) e m bSCS
344344
, cBlockFetchCodec :: Codec (BlockFetch blk (Point blk)) e m bBF
345345
, cBlockFetchCodecSerialised ::
346346
Codec (BlockFetch (Serialised blk) (Point blk)) e m bSBF
347347
, cTxSubmission2Codec :: Codec (TxSubmission2 (GenTxId blk) (GenTx blk)) e m bTX
348+
, cPerasCertDiffusionCodec :: Codec (PerasCertDiffusion blk) e m bPCD
348349
, cKeepAliveCodec :: Codec KeepAlive e m bKA
349350
, cPeerSharingCodec :: Codec (PeerSharing addr) e m bPS
350351
}
@@ -372,49 +373,53 @@ defaultCodecs ::
372373
ByteString
373374
ByteString
374375
ByteString
376+
ByteString
375377
defaultCodecs ccfg version encAddr decAddr nodeToNodeVersion =
376378
Codecs
377379
{ cChainSyncCodec =
378380
codecChainSync
379381
enc
380382
dec
381-
(encodePoint (encodeRawHash p))
382-
(decodePoint (decodeRawHash p))
383-
(encodeTip (encodeRawHash p))
384-
(decodeTip (decodeRawHash p))
383+
enc
384+
dec
385+
enc
386+
dec
385387
, cChainSyncCodecSerialised =
386388
codecChainSync
387389
enc
388390
dec
389-
(encodePoint (encodeRawHash p))
390-
(decodePoint (decodeRawHash p))
391-
(encodeTip (encodeRawHash p))
392-
(decodeTip (decodeRawHash p))
391+
enc
392+
dec
393+
enc
394+
dec
393395
, cBlockFetchCodec =
394396
codecBlockFetch
395397
enc
396398
dec
397-
(encodePoint (encodeRawHash p))
398-
(decodePoint (decodeRawHash p))
399+
enc
400+
dec
399401
, cBlockFetchCodecSerialised =
400402
codecBlockFetch
401403
enc
402404
dec
403-
(encodePoint (encodeRawHash p))
404-
(decodePoint (decodeRawHash p))
405+
enc
406+
dec
405407
, cTxSubmission2Codec =
406408
codecTxSubmission2
407409
enc
408410
dec
409411
enc
410412
dec
413+
, cPerasCertDiffusionCodec =
414+
codecObjectDiffusion
415+
enc
416+
dec
417+
enc
418+
dec
411419
, cKeepAliveCodec = codecKeepAlive_v2
412420
, cPeerSharingCodec = codecPeerSharing (encAddr nodeToNodeVersion) (decAddr nodeToNodeVersion)
413421
}
414422
where
415-
p :: Proxy blk
416-
p = Proxy
417-
418423
enc :: SerialiseNodeToNode blk a => a -> Encoding
419424
enc = encodeNodeToNode ccfg version
420425

@@ -434,6 +439,7 @@ identityCodecs ::
434439
(AnyMessage (BlockFetch blk (Point blk)))
435440
(AnyMessage (BlockFetch (Serialised blk) (Point blk)))
436441
(AnyMessage (TxSubmission2 (GenTxId blk) (GenTx blk)))
442+
(AnyMessage (PerasCertDiffusion blk))
437443
(AnyMessage KeepAlive)
438444
(AnyMessage (PeerSharing addr))
439445
identityCodecs =
@@ -443,6 +449,7 @@ identityCodecs =
443449
, cBlockFetchCodec = codecBlockFetchId
444450
, cBlockFetchCodecSerialised = codecBlockFetchId
445451
, cTxSubmission2Codec = codecTxSubmission2Id
452+
, cPerasCertDiffusionCodec = codecObjectDiffusionId
446453
, cKeepAliveCodec = codecKeepAliveId
447454
, cPeerSharingCodec = codecPeerSharingId
448455
}
@@ -620,7 +627,7 @@ byteLimits =
620627

621628
-- | Construct the 'NetworkApplication' for the node-to-node protocols
622629
mkApps ::
623-
forall m addrNTN addrNTC blk e bCS bBF bTX bKA bPS.
630+
forall m addrNTN addrNTC blk e bCS bBF bTX bPCD bKA bPS.
624631
( IOLike m
625632
, MonadTimer m
626633
, Ord addrNTN
@@ -635,7 +642,7 @@ mkApps ::
635642
NodeKernel m addrNTN addrNTC blk ->
636643
StdGen ->
637644
Tracers m addrNTN blk e ->
638-
(NodeToNodeVersion -> Codecs blk addrNTN e m bCS bCS bBF bBF bTX bKA bPS) ->
645+
(NodeToNodeVersion -> Codecs blk addrNTN e m bCS bCS bBF bBF bTX bPCD bKA bPS) ->
639646
ByteLimits bCS bBF bTX bKA ->
640647
-- Chain-Sync timeouts for chain-sync client (using `Header blk`) as well as
641648
-- the server (`SerialisedHeader blk`).

ouroboros-consensus-diffusion/src/unstable-diffusion-testlib/Test/ThreadNet/Network.hs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ import Ouroboros.Consensus.Mempool
8383
import qualified Ouroboros.Consensus.MiniProtocol.ChainSync.Client as CSClient
8484
import qualified Ouroboros.Consensus.MiniProtocol.ChainSync.Client.HistoricityCheck as HistoricityCheck
8585
import qualified Ouroboros.Consensus.MiniProtocol.ChainSync.Client.InFutureCheck as InFutureCheck
86+
import Ouroboros.Consensus.MiniProtocol.ObjectDiffusion.PerasCert (PerasCertDiffusion)
8687
import qualified Ouroboros.Consensus.Network.NodeToNode as NTN
8788
import Ouroboros.Consensus.Node.ExitPolicy
8889
import qualified Ouroboros.Consensus.Node.GSM as GSM
@@ -1180,6 +1181,7 @@ runThreadNetwork
11801181
Lazy.ByteString
11811182
Lazy.ByteString
11821183
(AnyMessage (TxSubmission2 (GenTxId blk) (GenTx blk)))
1184+
(AnyMessage (PerasCertDiffusion blk))
11831185
(AnyMessage KeepAlive)
11841186
(AnyMessage (PeerSharing NodeId))
11851187
customNodeToNodeCodecs cfg ntnVersion =
@@ -1199,6 +1201,9 @@ runThreadNetwork
11991201
, cTxSubmission2Codec =
12001202
mapFailureCodec CodecIdFailure $
12011203
NTN.cTxSubmission2Codec NTN.identityCodecs
1204+
, cPerasCertDiffusionCodec =
1205+
mapFailureCodec CodecIdFailure $
1206+
NTN.cPerasCertDiffusionCodec NTN.identityCodecs
12021207
, cKeepAliveCodec =
12031208
mapFailureCodec CodecIdFailure $
12041209
NTN.cKeepAliveCodec NTN.identityCodecs

ouroboros-consensus/src/ouroboros-consensus/Ouroboros/Consensus/Block/SupportsPeras.hs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
{-# LANGUAGE FlexibleContexts #-}
55
{-# LANGUAGE FlexibleInstances #-}
66
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
7+
{-# LANGUAGE RecordWildCards #-}
78
{-# LANGUAGE ScopedTypeVariables #-}
89
{-# LANGUAGE TypeFamilies #-}
910
{-# LANGUAGE UndecidableInstances #-}
@@ -16,6 +17,9 @@ module Ouroboros.Consensus.Block.SupportsPeras
1617
, PerasCert (..)
1718
) where
1819

20+
import Codec.Serialise (Serialise (..))
21+
import Codec.Serialise.Decoding (decodeListLenOf)
22+
import Codec.Serialise.Encoding (encodeListLen)
1923
import Data.Monoid (Sum (..))
2024
import Data.Word (Word64)
2125
import GHC.Generics (Generic)
@@ -27,7 +31,7 @@ import Quiet (Quiet (..))
2731
newtype PerasRoundNo = PerasRoundNo {unPerasRoundNo :: Word64}
2832
deriving Show via Quiet PerasRoundNo
2933
deriving stock Generic
30-
deriving newtype (Eq, Ord, NoThunks)
34+
deriving newtype (Eq, Ord, NoThunks, Serialise)
3135

3236
instance Condense PerasRoundNo where
3337
condense = show . unPerasRoundNo
@@ -66,3 +70,14 @@ instance StandardHash blk => BlockSupportsPeras blk where
6670

6771
perasCertRound = pcCertRound
6872
perasCertBoostedBlock = pcCertBoostedBlock
73+
74+
instance Serialise (HeaderHash blk) => Serialise (PerasCert blk) where
75+
encode PerasCert{..} =
76+
encodeListLen 2
77+
<> encode pcCertRound
78+
<> encode pcCertBoostedBlock
79+
decode = do
80+
decodeListLenOf 2
81+
pcCertRound <- decode
82+
pcCertBoostedBlock <- decode
83+
pure $ PerasCert pcCertRound pcCertBoostedBlock

ouroboros-consensus/src/ouroboros-consensus/Ouroboros/Consensus/MiniProtocol/ObjectDiffusion/PerasCert.hs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ module Ouroboros.Consensus.MiniProtocol.ObjectDiffusion.PerasCert
77
, PerasCertPoolWriter
88
, PerasCertDiffusionInboundPipelined
99
, PerasCertDiffusionOutbound
10+
, PerasCertDiffusion
1011
) where
1112

1213
import Ouroboros.Consensus.Block
@@ -16,6 +17,7 @@ import Ouroboros.Consensus.MiniProtocol.ObjectDiffusion.Outbound
1617
import Ouroboros.Consensus.Storage.PerasCertDB.API
1718
import Ouroboros.Network.Protocol.ObjectDiffusion.Inbound (ObjectDiffusionInboundPipelined)
1819
import Ouroboros.Network.Protocol.ObjectDiffusion.Outbound (ObjectDiffusionOutbound)
20+
import Ouroboros.Network.Protocol.ObjectDiffusion.Type (ObjectDiffusion, OutboundAgency)
1921

2022
type TracePerasCertDiffusionInbound blk =
2123
TraceObjectDiffusionInbound PerasRoundNo (PerasCert blk)
@@ -34,3 +36,6 @@ type PerasCertDiffusionInboundPipelined blk m a =
3436

3537
type PerasCertDiffusionOutbound blk m a =
3638
ObjectDiffusionOutbound PerasRoundNo (PerasCert blk) m a
39+
40+
type PerasCertDiffusion blk =
41+
ObjectDiffusion OutboundAgency PerasRoundNo (PerasCert blk)

ouroboros-consensus/src/ouroboros-consensus/Ouroboros/Consensus/Node/Serialisation.hs

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
{-# LANGUAGE MultiParamTypeClasses #-}
77
{-# LANGUAGE PolyKinds #-}
88
{-# LANGUAGE RankNTypes #-}
9+
{-# LANGUAGE RecordWildCards #-}
10+
{-# LANGUAGE ScopedTypeVariables #-}
911
{-# LANGUAGE StandaloneDeriving #-}
1012
{-# LANGUAGE StandaloneKindSignatures #-}
1113
{-# LANGUAGE UndecidableInstances #-}
@@ -33,8 +35,8 @@ module Ouroboros.Consensus.Node.Serialisation
3335
, Some (..)
3436
) where
3537

36-
import Codec.CBOR.Decoding (Decoder)
37-
import Codec.CBOR.Encoding (Encoding)
38+
import Codec.CBOR.Decoding (Decoder, decodeListLenOf)
39+
import Codec.CBOR.Encoding (Encoding, encodeListLen)
3840
import Codec.Serialise (Serialise (decode, encode))
3941
import Data.Kind
4042
import Data.SOP.BasicFunctors
@@ -47,7 +49,15 @@ import Ouroboros.Consensus.Ledger.SupportsMempool
4749
import Ouroboros.Consensus.Node.NetworkProtocolVersion
4850
import Ouroboros.Consensus.TypeFamilyWrappers
4951
import Ouroboros.Consensus.Util (Some (..))
50-
import Ouroboros.Network.Block (unwrapCBORinCBOR, wrapCBORinCBOR)
52+
import Ouroboros.Network.Block
53+
( Tip
54+
, decodePoint
55+
, decodeTip
56+
, encodePoint
57+
, encodeTip
58+
, unwrapCBORinCBOR
59+
, wrapCBORinCBOR
60+
)
5161

5262
{-------------------------------------------------------------------------------
5363
NodeToNode
@@ -173,6 +183,30 @@ deriving newtype instance
173183
SerialiseNodeToNode blk (GenTxId blk) =>
174184
SerialiseNodeToNode blk (WrapGenTxId blk)
175185

186+
-- TODO: move these orphan instances elsewhere
187+
instance ConvertRawHash blk => SerialiseNodeToNode blk (Point blk) where
188+
encodeNodeToNode _ccfg _version = encodePoint $ encodeRawHash (Proxy :: Proxy blk)
189+
decodeNodeToNode _ccfg _version = decodePoint $ decodeRawHash (Proxy :: Proxy blk)
190+
191+
instance ConvertRawHash blk => SerialiseNodeToNode blk (Tip blk) where
192+
encodeNodeToNode _ccfg _version = encodeTip $ encodeRawHash (Proxy :: Proxy blk)
193+
decodeNodeToNode _ccfg _version = decodeTip $ decodeRawHash (Proxy :: Proxy blk)
194+
195+
instance SerialiseNodeToNode blk PerasRoundNo where
196+
encodeNodeToNode _ccfg _version = encode
197+
decodeNodeToNode _ccfg _version = decode
198+
instance ConvertRawHash blk => SerialiseNodeToNode blk (PerasCert blk) where
199+
-- Consistent with the 'Serialise' instance for 'PerasCert' defined in Ouroboros.Consensus.Block.SupportsPeras
200+
encodeNodeToNode ccfg version PerasCert{..} =
201+
encodeListLen 2
202+
<> encodeNodeToNode ccfg version pcCertRound
203+
<> encodeNodeToNode ccfg version pcCertBoostedBlock
204+
decodeNodeToNode ccfg version = do
205+
decodeListLenOf 2
206+
pcCertRound <- decodeNodeToNode ccfg version
207+
pcCertBoostedBlock <- decodeNodeToNode ccfg version
208+
pure $ PerasCert pcCertRound pcCertBoostedBlock
209+
176210
deriving newtype instance
177211
SerialiseNodeToClient blk (GenTxId blk) =>
178212
SerialiseNodeToClient blk (WrapGenTxId blk)

0 commit comments

Comments
 (0)