Skip to content

Commit a89c583

Browse files
Merge pull request #1 from IntersectMBO/mw/with-cardano
Enhance validation logic
2 parents 6bc56de + cb11c96 commit a89c583

File tree

19 files changed

+817
-325
lines changed

19 files changed

+817
-325
lines changed

cabal.project

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,36 @@ multi-repl: True
3232
if(os(windows))
3333
constraints:
3434
bitvec -simd
35+
36+
-- kes-agent is not yet in CHaP, so we pull it from its GitHub repo
37+
source-repository-package
38+
type: git
39+
location: https://github.com/crocodile-dentist/kes-agent
40+
tag: c0ef04dde5582a28415ff7c8c1bb197adeec6fc8
41+
--sha256: sha256-slF7zuBy2DKWKlQfhBPW5FDRhueWrFcJkrHW4jEEELs=
42+
subdir:
43+
kes-agent
44+
kes-agent-crypto
45+
46+
source-repository-package
47+
type: git
48+
location: https://github.com/IntersectMBO/ouroboros-consensus
49+
tag: a24a5618678bcdabe042fcad7e47569285e964a2
50+
--sha256: sha256-1iW9i2UqaiopbluG9T22Hz7QwXY6+qCgqqmjDXlIp40=
51+
subdir:
52+
ouroboros-consensus-cardano
53+
ouroboros-consensus-diffusion
54+
sop-extras
55+
ouroboros-consensus-protocol
56+
ouroboros-consensus
57+
58+
source-repository-package
59+
type: git
60+
location: https://github.com/IntersectMBO/ouroboros-network
61+
tag: b87b35827c309d168af77571b6d44198136f1199
62+
--sha256: sha256-SVsAcfyIpNGNI9x5MFUybhwjIZ+6nU4kdECCdVmfdeE=
63+
subdir:
64+
acts-generic
65+
cardano-diffusion
66+
ouroboros-network
67+
network-mux

dmq-node/app/Main.hs

Lines changed: 93 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
1-
{-# LANGUAGE MultiWayIf #-}
2-
{-# LANGUAGE OverloadedStrings #-}
3-
{-# LANGUAGE ScopedTypeVariables #-}
4-
{-# LANGUAGE TemplateHaskell #-}
5-
{-# LANGUAGE TypeApplications #-}
1+
{-# LANGUAGE DataKinds #-}
2+
{-# LANGUAGE DisambiguateRecordFields #-}
3+
{-# LANGUAGE MultiWayIf #-}
4+
{-# LANGUAGE OverloadedRecordDot #-}
5+
{-# LANGUAGE OverloadedStrings #-}
6+
{-# LANGUAGE ScopedTypeVariables #-}
7+
{-# LANGUAGE TemplateHaskell #-}
8+
{-# LANGUAGE TypeApplications #-}
9+
{-# LANGUAGE TypeOperators #-}
610

711
module Main where
812

13+
import Control.Concurrent.Class.MonadSTM.Strict
914
import Control.Monad (void, when)
1015
import Control.Tracer (Tracer (..), nullTracer, traceWith)
1116

1217
import Data.Act
1318
import Data.Aeson (ToJSON)
19+
import Data.ByteString.Lazy qualified as BSL
1420
import Data.Functor.Contravariant ((>$<))
21+
import Data.List.NonEmpty (NonEmpty)
1522
import Data.Maybe (maybeToList)
1623
import Data.Text qualified as Text
1724
import Data.Text.IO qualified as Text
@@ -23,13 +30,15 @@ import System.Random (newStdGen, split)
2330

2431
import Cardano.Git.Rev (gitRev)
2532
import Cardano.KESAgent.Protocols.StandardCrypto (StandardCrypto)
33+
import Cardano.Ledger.Keys (VKey (..))
34+
import Cardano.Ledger.Hashes (hashKey)
2635

2736
import DMQ.Configuration
2837
import DMQ.Configuration.CLIOptions (parseCLIOptions)
2938
import DMQ.Configuration.Topology (readTopologyFileOrError)
3039
import DMQ.Diffusion.Applications (diffusionApplications)
3140
import DMQ.Diffusion.Arguments
32-
import DMQ.Diffusion.NodeKernel (mempool, withNodeKernel)
41+
import DMQ.Diffusion.NodeKernel
3342
import DMQ.Handlers.TopLevel (toplevelExceptionHandler)
3443
import DMQ.NodeToClient qualified as NtC
3544
import DMQ.NodeToNode (NodeToNodeVersion, dmqCodecs, dmqLimitsAndTimeouts,
@@ -39,9 +48,14 @@ import DMQ.Protocol.SigSubmission.Type (Sig (..))
3948
import DMQ.Tracer
4049

4150
import DMQ.Diffusion.PeerSelection (policy)
51+
import DMQ.NodeToClient.LocalStateQueryClient
52+
import DMQ.Protocol.SigSubmission.Validate
4253
import Ouroboros.Network.Diffusion qualified as Diffusion
54+
import Ouroboros.Network.PeerSelection.LedgerPeers.Type
4355
import Ouroboros.Network.PeerSelection.PeerSharing.Codec (decodeRemoteAddress,
4456
encodeRemoteAddress)
57+
import Ouroboros.Network.SizeInBytes
58+
import Ouroboros.Network.Snocket
4559
import Ouroboros.Network.TxSubmission.Mempool.Simple qualified as Mempool
4660

4761
import Paths_dmq_node qualified as Meta
@@ -70,6 +84,7 @@ runDMQ commandLineConfig = do
7084
dmqcTopologyFile = I topologyFile,
7185
dmqcHandshakeTracer = I handshakeTracer,
7286
dmqcLocalHandshakeTracer = I localHandshakeTracer,
87+
dmqcCardanoNodeSocket = I snocketPath,
7388
dmqcVersion = I version
7489
} = config' <> commandLineConfig
7590
`act`
@@ -101,49 +116,75 @@ runDMQ commandLineConfig = do
101116
stdGen <- newStdGen
102117
let (psRng, policyRng) = split stdGen
103118

104-
withNodeKernel @StandardCrypto
105-
tracer
106-
dmqConfig
107-
psRng $ \nodeKernel -> do
108-
dmqDiffusionConfiguration <- mkDiffusionConfiguration dmqConfig nt
109-
110-
let dmqNtNApps =
111-
ntnApps tracer
112-
dmqConfig
113-
nodeKernel
114-
(dmqCodecs
115-
(encodeRemoteAddress (maxBound @NodeToNodeVersion))
116-
(decodeRemoteAddress (maxBound @NodeToNodeVersion)))
117-
dmqLimitsAndTimeouts
118-
defaultSigDecisionPolicy
119-
dmqNtCApps =
120-
let sigSize _ = 0 -- TODO
121-
maxMsgs = 1000 -- TODO: make this dynamic?
122-
mempoolReader = Mempool.getReader sigId sigSize (mempool nodeKernel)
123-
mempoolWriter = Mempool.getWriter sigId (pure ())
124-
(\_ _ -> Right () :: Either Void ())
125-
(\_ -> True)
126-
(mempool nodeKernel)
127-
in NtC.ntcApps tracer dmqConfig
128-
mempoolReader mempoolWriter maxMsgs
129-
(NtC.dmqCodecs encodeReject decodeReject)
130-
dmqDiffusionArguments =
131-
diffusionArguments (if handshakeTracer
132-
then WithEventType "Handshake" >$< tracer
133-
else nullTracer)
134-
(if localHandshakeTracer
135-
then WithEventType "Handshake" >$< tracer
136-
else nullTracer)
137-
dmqDiffusionApplications =
138-
diffusionApplications nodeKernel
139-
dmqConfig
140-
dmqDiffusionConfiguration
141-
dmqLimitsAndTimeouts
142-
dmqNtNApps
143-
dmqNtCApps
144-
(policy policyRng)
145-
146-
Diffusion.run dmqDiffusionArguments
147-
(dmqDiffusionTracers dmqConfig tracer)
148-
dmqDiffusionConfiguration
149-
dmqDiffusionApplications
119+
-- TODO: this might not work, since `ouroboros-network` creates its own IO Completion Port.
120+
Diffusion.withIOManager \iocp -> do
121+
let localSnocket' = localSnocket iocp
122+
mkStakePoolMonitor = connectToCardanoNode tracer localSnocket' snocketPath
123+
124+
withNodeKernel @StandardCrypto
125+
tracer
126+
dmqConfig
127+
psRng
128+
mkStakePoolMonitor $ \nodeKernel -> do
129+
dmqDiffusionConfiguration <-
130+
mkDiffusionConfiguration dmqConfig nt nodeKernel.stakePools.ledgerBigPeersVar
131+
132+
let sigSize :: Sig StandardCrypto -> SizeInBytes
133+
sigSize = fromIntegral . BSL.length . sigRawBytes
134+
mempoolReader = Mempool.getReader sigId sigSize (mempool nodeKernel)
135+
dmqNtNApps =
136+
let ntnMempoolWriter = Mempool.writerAdapter $
137+
Mempool.getWriter sigId
138+
(poolValidationCtx $ stakePools nodeKernel)
139+
(validateSig (hashKey . VKey))
140+
SigDuplicate
141+
(mempool nodeKernel)
142+
in ntnApps tracer
143+
dmqConfig
144+
mempoolReader
145+
ntnMempoolWriter
146+
sigSize
147+
nodeKernel
148+
(dmqCodecs
149+
-- TODO: `maxBound :: Cardano.Network.NodeToNode.NodeToNodeVersion`
150+
-- is unsafe here!
151+
(encodeRemoteAddress (maxBound @NodeToNodeVersion))
152+
(decodeRemoteAddress (maxBound @NodeToNodeVersion)))
153+
dmqLimitsAndTimeouts
154+
defaultSigDecisionPolicy
155+
dmqNtCApps =
156+
let ntcMempoolWriter =
157+
Mempool.getWriter sigId
158+
(poolValidationCtx $ stakePools nodeKernel)
159+
(validateSig (hashKey . VKey))
160+
SigDuplicate
161+
(mempool nodeKernel)
162+
in NtC.ntcApps tracer dmqConfig
163+
mempoolReader ntcMempoolWriter
164+
(NtC.dmqCodecs encodeReject decodeReject)
165+
dmqDiffusionArguments =
166+
diffusionArguments (if handshakeTracer
167+
then WithEventType "Handshake" >$< tracer
168+
else nullTracer)
169+
(if localHandshakeTracer
170+
then WithEventType "Handshake" >$< tracer
171+
else nullTracer)
172+
$ maybe [] out <$> tryReadTMVar nodeKernel.stakePools.ledgerPeersVar
173+
where
174+
out :: LedgerPeerSnapshot AllLedgerPeers
175+
-> [(PoolStake, NonEmpty LedgerRelayAccessPoint)]
176+
out (LedgerAllPeerSnapshotV23 _pt _magic relays) = relays
177+
178+
dmqDiffusionApplications =
179+
diffusionApplications nodeKernel
180+
dmqConfig
181+
dmqDiffusionConfiguration
182+
dmqLimitsAndTimeouts
183+
dmqNtNApps
184+
dmqNtCApps
185+
(policy policyRng)
186+
187+
Diffusion.run dmqDiffusionArguments
188+
(dmqDiffusionTracers dmqConfig tracer)
189+
dmqDiffusionConfiguration
190+
dmqDiffusionApplications

dmq-node/dmq-node.cabal

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ library
6868
DMQ.NodeToClient
6969
DMQ.NodeToClient.LocalMsgNotification
7070
DMQ.NodeToClient.LocalMsgSubmission
71+
DMQ.NodeToClient.LocalStateQueryClient
7172
DMQ.NodeToClient.Version
7273
DMQ.NodeToNode
7374
DMQ.NodeToNode.Version
@@ -81,6 +82,7 @@ library
8182
DMQ.Protocol.LocalMsgSubmission.Type
8283
DMQ.Protocol.SigSubmission.Codec
8384
DMQ.Protocol.SigSubmission.Type
85+
DMQ.Protocol.SigSubmission.Validate
8486
DMQ.Tracer
8587

8688
build-depends:
@@ -93,13 +95,17 @@ library
9395
bytestring >=0.10 && <0.13,
9496
cardano-binary,
9597
cardano-crypto-class,
98+
cardano-crypto-wrapper,
99+
cardano-diffusion,
100+
cardano-ledger-byron,
101+
cardano-ledger-core,
102+
cardano-ledger-shelley,
103+
cardano-slotting,
96104
cborg >=0.2.1 && <0.3,
97-
containers >=0.5 && <0.9,
105+
containers >=0.5 && <0.8,
98106
contra-tracer >=0.1 && <0.3,
99107
deepseq >=1.0 && <1.6,
100-
directory,
101108
dns >=1.0 && <4.3,
102-
filepath,
103109
generic-data,
104110
hashable >=1.0 && <1.6,
105111
io-classes:{io-classes, si-timers, strict-mvar, strict-stm} ^>=1.8.0.1,
@@ -108,11 +114,16 @@ library
108114
network ^>=3.2.7,
109115
network-mux ^>=0.9.1,
110116
optparse-applicative >=0.18 && <0.20,
117+
ouroboros-consensus,
118+
ouroboros-consensus-cardano,
119+
ouroboros-consensus-diffusion,
111120
ouroboros-network:{ouroboros-network, api, framework, orphan-instances, protocols} ^>=0.23,
112121
random ^>=1.2,
113122
singletons,
114123
text >=1.2.4 && <2.2,
115-
time >=1.12 && <1.16,
124+
time ^>=1.12,
125+
transformers,
126+
transformers-except,
116127
typed-protocols:{typed-protocols, cborg} ^>=1.1,
117128

118129
hs-source-dirs: src
@@ -134,12 +145,15 @@ executable dmq-node
134145
acts,
135146
aeson,
136147
base,
148+
bytestring,
137149
cardano-git-rev,
150+
cardano-ledger-core,
138151
contra-tracer >=0.1 && <0.3,
139152
dmq-node,
153+
io-classes:strict-stm,
140154
kes-agent-crypto,
141155
optparse-applicative,
142-
ouroboros-network:{ouroboros-network, api},
156+
ouroboros-network:{ouroboros-network, api, framework},
143157
random,
144158
text,
145159

@@ -166,20 +180,25 @@ test-suite dmq-tests
166180
build-depends:
167181
QuickCheck,
168182
base >=4.14 && <4.23,
183+
binary,
169184
bytestring,
170185
cardano-crypto-class,
171186
cardano-crypto-tests,
187+
cardano-ledger-core,
172188
cborg,
189+
containers,
173190
contra-tracer,
174191
dmq-node,
175-
io-classes,
192+
io-classes:{io-classes, strict-stm},
176193
io-sim,
177194
kes-agent-crypto,
178195
ouroboros-network:{api, framework, protocols, protocols-tests-lib, tests-lib},
179196
quickcheck-instances,
180197
serialise,
181198
tasty,
182199
tasty-quickcheck,
200+
time,
201+
transformers,
183202
typed-protocols:{typed-protocols, codec-properties},
184203
with-utf8,
185204

0 commit comments

Comments
 (0)