Skip to content

Commit 12a8428

Browse files
authored
Merge pull request #58 from IntersectMBO/coot/ouroboros-network-update
Updated ouroboros-network version, signature validation simplification
2 parents fdbdd30 + 0ceb96d commit 12a8428

23 files changed

Lines changed: 497 additions & 288 deletions

File tree

cabal.project

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ repository cardano-haskell-packages
1515
-- repeat the index-state for hackage to work around haskell.nix parsing limitation
1616
index-state:
1717
-- Bump this if you need newer packages from Hackage
18-
, hackage.haskell.org 2026-02-17T10:15:41Z
18+
, hackage.haskell.org 2026-05-13T07:31:22Z
1919

2020
-- Bump this if you need newer packages from CHaP
21-
, cardano-haskell-packages 2026-04-07T08:02:00Z
21+
, cardano-haskell-packages 2026-05-11T20:15:43Z
2222

2323
active-repositories:
2424
, :rest
@@ -44,11 +44,31 @@ if impl(ghc >= 9.12.0)
4444
-- rejecting: cardano-crypto-class-2.3.1.0 (conflict: cardano-crypto-tests => cardano-crypto-class>=2.2.2 && <2.2.4)
4545
-- allow-newer: cardano-crypto-tests:cardano-crypto-class
4646

47+
-- ouroboros-network with PR#5376, but without contra-tracer-0.2.1.0 (PR#5368)
4748
source-repository-package
4849
type: git
4950
location: https://github.com/IntersectMBO/ouroboros-network
50-
tag: f2d88695147d9f236669caa214e11dba6b75eadc
51-
--sha256: sha256-mRP9WxZ4xPOus/nFzSOMXCYopBGZcERDk+QqOD1LmQc=
52-
subdir: ouroboros-network
51+
tag: 5a80699bca834a4de47aca4fe4d322832309e374
52+
--sha256: sha256-FXp0gIfsUDVEE4ZuEM5y55qx0I7d5+/wQ7AjUz6UDcE=
53+
subdir: network-mux
54+
cardano-diffusion
55+
ouroboros-network
56+
57+
source-repository-package
58+
type: git
59+
location: https://github.com/IntersectMBO/ouroboros-consensus
60+
tag: ec9df6ee1d7ab918e75219107fc17e1b2cf1a0e9
61+
--sha256: sha256-c+yGPftvlas2CcnFLUPPqjnitz5yTu/Qud5LaSMyY34=
62+
63+
-- https://github.com/bgamari/monoidal-containers/pull/112
64+
source-repository-package
65+
type: git
66+
location: https://github.com/coot/monoidal-containers
67+
tag: 8319c34e260c7b44adaf0ac04074b3e37e510cea
68+
--sha256: sha256-HkQC2Hb1OAyN8mI2BPcIylcUYF0Mts4DrffJ7Fkkh6Q=
69+
70+
constraints: semialign >= 1.4,
71+
validation < 1.2
72+
allow-newer: hedgehog-quickcheck:QuickCheck,
73+
monoidal-containers:semialign
5374

54-
allow-newer: ouroboros-network:trace-dispatcher

dmq-node/CHANGELOG.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,33 @@
22

33
<!-- scriv-insert-here -->
44

5+
<a id='changelog-0.6.0.0'></a>
6+
## 0.6.0.0 -- 2026-06-04
7+
8+
### Breaking
9+
10+
- Default network magic used by dmq-node is the mainnet network magic for mithril network.
11+
- Tighter sig-submission codec size limits (derived from `maxSigsInflight` and `maxSigSize`).
12+
- Using `KeepAliveRegistry` instead of `FetchClientRegistry` introduced in
13+
a recent `ouroboros-network` PR. The `fetchClientRegistry` field of
14+
`NodeKernel` was replaced with `keepAliveRegistry` field.
15+
- Using set snapshot in the pool eligibility (signature validation).
16+
- Added `dmqcShelleyGenesisFile` and `dmqcShelleyGenesisHash` fields to
17+
`Configuration`. The default value are `genesis-shelley.json` and
18+
`Nothing` (e.g. hash is not verified against expected value).
19+
- Signature validation is using maximum KES evolutions from the genesis file.
20+
- Signature validation changed, we're no longer using the `mark set`, pools
21+
with no stake will be able to mint signatures as long as they have non zero
22+
stake in the `set set`.
23+
24+
### Non-Breaking
25+
26+
- Added `PrettyShow` instances for
27+
- `NodeToNodeVersion`
28+
- `NodeToNodeVersionData`
29+
- `NodeToClientVersion`
30+
- `NodeToClientVersionData`
31+
532
<a id='changelog-0.5.0.0'></a>
633
## 0.5.0.0 -- 2026-05-19
734

dmq-node/app/Main.hs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import Control.Monad (unless, void, when)
1717
import Control.Monad.Class.MonadAsync
1818
import Control.Monad.Class.MonadThrow
1919
import Control.Monad.Class.MonadTimer.SI
20+
import Control.Monad.Trans.Except (runExceptT)
2021
import "contra-tracer" Control.Tracer (nullTracer, traceWith)
2122

2223
import Data.Act
@@ -48,6 +49,7 @@ import DMQ.Diffusion.Applications (diffusionApplications)
4849
import DMQ.Diffusion.Arguments
4950
import DMQ.Diffusion.NodeKernel as NodeKernel
5051
import DMQ.Diffusion.PeerSelectionPolicy (policy)
52+
import DMQ.Genesis
5153
import DMQ.Handlers.TopLevel (toplevelExceptionHandler)
5254
import DMQ.NodeToClient qualified as NtC
5355
import DMQ.NodeToClient.LocalStateQueryClient
@@ -57,6 +59,7 @@ import DMQ.Policy qualified as Policy
5759
import DMQ.Protocol.SigSubmission.Type (Sig (..))
5860
import DMQ.Protocol.SigSubmission.Validate
5961
import DMQ.Tracer (DMQStartupTrace (..), DMQTracers (..), mkDMQTracers)
62+
6063
import Ouroboros.Network.Diffusion qualified as Diffusion
6164
import Ouroboros.Network.PeerSelection.LedgerPeers.Type
6265
import Ouroboros.Network.PeerSelection.PeerSharing.Codec (decodeRemoteAddress,
@@ -94,7 +97,10 @@ runDMQ commandLineConfig = do
9497
dmqcTopologyFile = I topologyFile,
9598
dmqcCardanoNodeSocket = I socketPath,
9699
dmqcVersion = I version,
97-
dmqcLedgerPeers = I ledgerPeers
100+
dmqcLedgerPeers = I ledgerPeers,
101+
dmqcShelleyGenesisFile = I genesisFile,
102+
dmqcShelleyGenesisHash = I genesisHash
103+
98104
} = fromRight mempty config'
99105
<> commandLineConfig
100106
`act`
@@ -168,6 +174,9 @@ runDMQ commandLineConfig = do
168174
let (psRng, policyRng) = Random.splitGen stdGen
169175
policyRngVar <- newTVarIO policyRng
170176

177+
(shelleyGenesis, _) <-
178+
runExceptT (readGenesis genesisFile genesisHash) >>= either throwIO pure
179+
171180
-- TODO: this might not work, since `ouroboros-network` creates its own IO Completion Port.
172181
withIOManager \iocp -> do
173182
let localSnocket' = localSnocket iocp
@@ -180,6 +189,7 @@ runDMQ commandLineConfig = do
180189
withNodeKernel @StandardCrypto
181190
dmqTracers
182191
dmqConfig
192+
shelleyGenesis
183193
psRng
184194
mkStakePoolMonitor $ \nodeKernel -> do
185195
dmqDiffusionConfiguration <-
@@ -193,7 +203,7 @@ runDMQ commandLineConfig = do
193203
Mempool.getWriter SigDuplicate
194204
sigId
195205
(\now sigs ->
196-
withPoolValidationCtx (stakePools nodeKernel) (validateSig now sigs)
206+
withPoolValidationCtx (stakePools nodeKernel) now (validateSig sigs)
197207
)
198208
(traverse_ $ \(sigid, reason) -> do
199209
traceWith sigValidationTracer $ InvalidSignature sigid reason
@@ -222,7 +232,7 @@ runDMQ commandLineConfig = do
222232
Mempool.getWriter SigDuplicate
223233
sigId
224234
(\now sigs ->
225-
withPoolValidationCtx (stakePools nodeKernel) (validateSig now sigs)
235+
withPoolValidationCtx (stakePools nodeKernel) now (validateSig sigs)
226236
)
227237
(traverse_ $ \(sigid, reason) ->
228238
traceWith localSigValidationTracer $ InvalidSignature sigid reason

dmq-node/dmq-node.cabal

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cabal-version: 3.4
22
name: dmq-node
3-
version: 0.5.0.0
3+
version: 0.6.0.0
44
synopsis: Decentralised Message Queue Node
55
description:
66
Decentralised Message Queue Node based on Cardano Diffusion
@@ -66,6 +66,7 @@ library
6666
DMQ.Diffusion.NodeKernel.Types
6767
DMQ.Diffusion.PeerSelection.PeerMetric
6868
DMQ.Diffusion.PeerSelectionPolicy
69+
DMQ.Genesis
6970
DMQ.Handlers.TopLevel
7071
DMQ.NodeToClient
7172
DMQ.NodeToClient.LocalMsgNotification
@@ -125,13 +126,14 @@ library
125126
io-classes:{io-classes, si-timers, strict-mvar, strict-stm} ^>=1.8.0.1,
126127
iproute ^>=1.7.15,
127128
kes-agent-crypto ^>=1.1.0.0,
129+
mmap,
128130
mtl,
129131
network ^>=3.2.7,
130132
network-mux ^>=0.10,
131133
nothunks,
132134
optparse-applicative >=0.18 && <0.20,
133135
ouroboros-consensus:{ouroboros-consensus, cardano, diffusion},
134-
ouroboros-network:{ouroboros-network, api, framework, framework-tracing, orphan-instances, protocols, tracing} ^>=1.1.0.0,
136+
ouroboros-network:{ouroboros-network, api, framework, orphan-instances, protocols, tracing} ^>=1.1.0.0,
135137
psqueues,
136138
quiet,
137139
random ^>=1.3,
@@ -140,6 +142,7 @@ library
140142
time >=1.12 && <1.15,
141143
trace-dispatcher ^>=2.12.1,
142144
transformers,
145+
transformers-except,
143146
typed-protocols:{typed-protocols, cborg} ^>=1.2,
144147

145148
hs-source-dirs: src
@@ -174,6 +177,7 @@ executable dmq-node
174177
random,
175178
text,
176179
trace-dispatcher,
180+
transformers,
177181

178182
hs-source-dirs: app
179183
default-language: Haskell2010

dmq-node/src/DMQ/Configuration.hs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ import Ouroboros.Network.Server.RateLimiting (AcceptedConnectionsLimit (..))
7575
import Ouroboros.Network.Snocket (LocalAddress (..), RemoteAddress)
7676

7777
import DMQ.Configuration.Topology (NoExtraConfig (..), NoExtraFlags (..))
78+
import DMQ.Genesis
7879

7980
-- | Configuration comes in two flavours depending on the `f` functor:
8081
-- `PartialConfig` is using `Last` and `Configuration` is using an identity
@@ -91,6 +92,12 @@ data Configuration' f =
9192
dmqcNetworkMagic :: f NetworkMagic,
9293
-- | Network magic for local connections to a cardano-node
9394
dmqcCardanoNetworkMagic :: f NetworkMagic,
95+
-- | shelley genesis file, e.g.
96+
-- `/configuration/cardano/mainnet-shelley-genesis.json` in `cardano-node`
97+
-- repo.
98+
dmqcShelleyGenesisFile :: f GenesisFile,
99+
-- | Hash of the genesis file.
100+
dmqcShelleyGenesisHash :: f (Maybe GenesisHash),
94101

95102
-- | IPv4 address to bind to for `node-to-node` communication.
96103
dmqcIPv4 :: f (Maybe IPv4),
@@ -187,12 +194,15 @@ defaultConfiguration = Configuration {
187194
dmqcIPv4 = I Nothing,
188195
dmqcIPv6 = I Nothing,
189196
dmqcLocalAddress = I (LocalAddress "dmq-node.socket"),
190-
dmqcNetworkMagic = I NetworkMagic { unNetworkMagic = 3_141_592 },
197+
-- mainnet dmq protocol magic according to CIP#137
198+
dmqcNetworkMagic = I NetworkMagic { unNetworkMagic = 2_912_307_721 },
191199
dmqcCardanoNetworkMagic =
192200
I (NetworkMagic . unProtocolMagicId $ mainnetProtocolMagicId),
193201
dmqcPortNumber = I 3_141,
194202
dmqcConfigFile = I "dmq.config.json",
195203
dmqcTopologyFile = I "dmq.topology.json",
204+
dmqcShelleyGenesisFile = I (GenesisFile "mainnet-shelley-genesis.json"),
205+
dmqcShelleyGenesisHash = I Nothing,
196206
dmqcAcceptedConnectionsLimit = I defaultAcceptedConnectionsLimit,
197207
dmqcDiffusionMode = I InitiatorAndResponderDiffusionMode,
198208
dmqcCardanoNodeSocket = I "cardano-node.socket",
@@ -246,6 +256,9 @@ instance FromJSON PartialConfig where
246256
dmqcPeerSharing <- Last <$> v .:? "PeerSharing"
247257
dmqcCardanoNodeSocket <- Last <$> v .:? "CardanoNodeSocket"
248258

259+
dmqcShelleyGenesisFile <- Last . fmap GenesisFile <$> v .:? "ShelleyGenesisFile"
260+
dmqcShelleyGenesisHash <- Last <$> v .:? "ShelleyGenesisHash"
261+
249262
dmqcTargetOfRootPeers <- Last <$> v .:? "TargetNumberOfRootPeers"
250263
dmqcTargetOfKnownPeers <- Last <$> v .:? "TargetNumberOfKnownPeers"
251264
dmqcTargetOfEstablishedPeers <- Last <$> v .:? "TargetNumberOfEstablishedPeers"
@@ -279,6 +292,8 @@ instance ToJSON Configuration where
279292
, "ConfigFile" .= unI dmqcConfigFile
280293
, "CardanoNodeSocket" .= unI dmqcCardanoNodeSocket
281294
, "TopologyFile" .= unI dmqcTopologyFile
295+
, "ShelleyGenesisFile" .= unGenesisFile (unI dmqcShelleyGenesisFile)
296+
, "ShelleyGenesisHash" .= unI dmqcShelleyGenesisHash
282297
, "AcceptedConnectionsLimit" .= unI dmqcAcceptedConnectionsLimit
283298
, "DiffusionMode" .= unI dmqcDiffusionMode
284299
, "TargetOfRootPeers" .= unI dmqcTargetOfRootPeers

dmq-node/src/DMQ/Diffusion/NodeKernel.hs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import Data.Void (Void)
2828
import System.Random (StdGen)
2929
import System.Random qualified as Random
3030

31-
import Ouroboros.Network.BlockFetch (newFetchClientRegistry)
31+
import Ouroboros.Network.KeepAlive (newKeepAliveRegistry)
3232
import Ouroboros.Network.Magic (NetworkMagic (..))
3333
import Ouroboros.Network.PeerSelection.Governor.Types
3434
(makePublicPeerSelectionStateVar)
@@ -42,6 +42,7 @@ import Ouroboros.Network.TxSubmission.Mempool.Simple qualified as Mempool
4242
import DMQ.Configuration
4343
import DMQ.Diffusion.NodeKernel.Types
4444
import DMQ.Diffusion.PeerSelection.PeerMetric (mkPeerMetric)
45+
import DMQ.Genesis
4546
import DMQ.Policy qualified as Policy
4647
import DMQ.Protocol.SigSubmission.Type (Sig (sigExpiresAt, sigId), SigId)
4748
import DMQ.Tracer
@@ -52,31 +53,34 @@ newNodeKernel :: forall crypto ntnAddr m.
5253
, Ord ntnAddr
5354
)
5455
=> StdGen
56+
-> ShelleyGenesis
5557
-> m (NodeKernel crypto ntnAddr m)
56-
newNodeKernel rng = do
58+
newNodeKernel rng ShelleyGenesis {sgMaxKESEvolutions} = do
5759
publicPeerSelectionStateVar <- makePublicPeerSelectionStateVar
5860

59-
fetchClientRegistry <- newFetchClientRegistry
61+
keepAliveRegistry <- newKeepAliveRegistry
6062
peerSharingRegistry <- newPeerSharingRegistry
6163

6264
mempool <- Mempool.empty
6365
sigChannelVar <- newTxChannelsVar
6466
sigMempoolSem <- newTxMempoolSem
6567
let (rng', rng'') = Random.splitGen rng
6668
sigSharedTxStateVar <- newSharedTxStateVar rng'
67-
(nextEpochVar, ocertCountersVar, stakePoolsVar, ledgerBigPeersVar, ledgerPeersVar) <- atomically $
68-
(,,,,) <$> newTVar Nothing
69+
(readinessVar, ocertCountersVar, stakePoolsVar, ledgerBigPeersVar, ledgerPeersVar) <- atomically $
70+
(,,,,) <$> newTVar NotReady
6971
<*> newTVar Map.empty
7072
<*> newTVar Map.empty
7173
<*> newTVar Nothing
7274
<*> newEmptyTMVar
7375

7476
let withPoolValidationCtx
75-
:: forall a. (PoolValidationCtx -> (a, PoolValidationCtx)) -> STM m a
76-
withPoolValidationCtx f = do
77-
ctx <- PoolValidationCtx <$> readTVar nextEpochVar
78-
<*> readTVar stakePoolsVar
79-
<*> readTVar ocertCountersVar
77+
:: forall a. UTCTime -> (PoolValidationCtx -> (a, PoolValidationCtx)) -> STM m a
78+
withPoolValidationCtx now f = do
79+
ctx <- PoolValidationCtx now
80+
<$> readTVar readinessVar
81+
<*> readTVar stakePoolsVar
82+
<*> readTVar ocertCountersVar
83+
<*> pure sgMaxKESEvolutions
8084
let (a, PoolValidationCtx {vctxOcertMap}) = f ctx
8185
writeTVar ocertCountersVar vctxOcertMap
8286
return a
@@ -97,14 +101,14 @@ newNodeKernel rng = do
97101

98102
peerMetric <- mkPeerMetric
99103

100-
pure NodeKernel { fetchClientRegistry
104+
pure NodeKernel { keepAliveRegistry
101105
, peerSharingRegistry
102106
, peerSharingAPI
103107
, mempool
104108
, sigChannelVar
105109
, sigMempoolSem
106110
, sigSharedTxStateVar
107-
, nextEpochVar
111+
, readinessVar
108112
, stakePools
109113
, peerMetric
110114
}
@@ -123,6 +127,7 @@ withNodeKernel :: forall crypto ntnAddr ntcAddr m a.
123127
)
124128
=> DMQTracers crypto ntnAddr ntcAddr m
125129
-> Configuration
130+
-> ShelleyGenesis
126131
-> StdGen
127132
-> (NetworkMagic -> NodeKernel crypto ntnAddr m -> m (Either SomeException Void))
128133
-> (NodeKernel crypto ntnAddr m -> m a)
@@ -133,13 +138,14 @@ withNodeKernel DMQTracers { sigSubmissionLogicTracer }
133138
Configuration {
134139
dmqcCardanoNetworkMagic = I networkMagic
135140
}
141+
shelleyGenesis
136142
rng
137143
mkStakePoolMonitor k = do
138144
nodeKernel@NodeKernel { mempool,
139145
sigChannelVar,
140146
sigSharedTxStateVar
141147
}
142-
<- newNodeKernel rng
148+
<- newNodeKernel rng shelleyGenesis
143149
withAsync (mempoolWorker mempool)
144150
$ \mempoolThread ->
145151
withAsync (decisionLogicThreads

0 commit comments

Comments
 (0)