Skip to content

Commit 58932dd

Browse files
mempool: adapt for generalized validation
1 parent 5c28ce6 commit 58932dd

File tree

1 file changed

+19
-37
lines changed
  • ouroboros-network/src/Ouroboros/Network/TxSubmission/Mempool

1 file changed

+19
-37
lines changed

ouroboros-network/src/Ouroboros/Network/TxSubmission/Mempool/Simple.hs

Lines changed: 19 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{-# LANGUAGE NamedFieldPuns #-}
22
{-# LANGUAGE ScopedTypeVariables #-}
3+
{-# LANGUAGE TupleSections #-}
34

45
-- | The module should be imported qualified.
56
--
@@ -16,13 +17,11 @@ module Ouroboros.Network.TxSubmission.Mempool.Simple
1617
import Prelude hiding (read, seq)
1718

1819
import Control.Concurrent.Class.MonadSTM.Strict
19-
import Control.Monad (filterM)
20-
import Control.Monad.Class.MonadTime.SI
21-
20+
import Data.Bifunctor (bimap)
21+
import Data.Either
2222
import Data.Foldable (toList)
2323
import Data.Foldable qualified as Foldable
24-
import Data.Function (on)
25-
import Data.List (find, nubBy)
24+
import Data.List (find)
2625
import Data.Maybe (isJust)
2726
import Data.Sequence (Seq)
2827
import Data.Sequence qualified as Seq
@@ -102,9 +101,8 @@ getReader getTxId getTxSize (Mempool mempool) =
102101

103102
-- | A simple mempool writer.
104103
--
105-
getWriter :: forall tx txid ctx metadata m.
104+
getWriter :: forall tx txid ctx failure m.
106105
( MonadSTM m
107-
, MonadTime m
108106
, Ord txid
109107
)
110108
=> (tx -> txid)
@@ -121,38 +119,22 @@ getWriter getTxId acquireCtx validateTx failureFilterFn (Mempool mempool) =
121119
TxSubmissionMempoolWriter {
122120
txId = getTxId,
123121

124-
-- let metaTxs = getMetaData <$> txs
125-
-- now <- getCurrentTime
126-
-- atomically $ do
127-
-- mempoolTxs <- readTVar mempool
128-
-- let currentIds = Set.fromList (map getTxId (toList mempoolTxs))
129-
-- validTxs <- fmap (fmap fst <$> nubBy ((==) `on` getTxId . fst))
130-
-- . filterM
131-
-- (\(tx, meta) -> do
132-
-- valid <- validateTx now meta
133-
-- return $ valid && getTxId tx `Set.notMember` currentIds)
134-
-- $ zip txs metaTxs
135-
-- let mempoolTxs' = Foldable.foldl' (Seq.|>) mempoolTxs validTxs
136-
-- writeTVar mempool mempoolTxs'
137122
mempoolAddTxs = \txs -> do
138123
ctx <- acquireCtx
139-
(invalidTxIds, validTxs) <- atomically $ do
124+
atomically $ do
140125
MempoolSeq { mempoolSet, mempoolSeq } <- readTVar mempool
141-
let (invalidTxIds, validTxs) =
142-
first (filter (failureFilterFn . snd))
143-
. partitionEithers
144-
. map (\tx -> case validateTx ctx tx of
145-
Left e -> Left (getTxId tx, e)
146-
Right _ -> Right tx
147-
)
148-
. filter (\tx -> getTxId tx `Set.notMember` mempoolSet)
149-
$ txs
150-
mempoolTxs' = MempoolSeq {
151-
mempoolSet = Foldable.foldl' (\s tx -> getTxId tx `Set.insert` s)
152-
mempoolSet
153-
validTxs,
154-
mempoolSeq = Foldable.foldl' (Seq.|>) mempoolSeq validTxs
155-
}
126+
(invalidTxIds, (validIds, validTxs)) <-
127+
bimap (filter (failureFilterFn . snd)) unzip
128+
. partitionEithers <$>
129+
sequence [bimap (txid,) (const (txid, tx)) <$> validateTx ctx tx
130+
| tx <- txs
131+
, let txid = getTxId tx
132+
, txid `Set.notMember` mempoolSet
133+
]
134+
let mempoolTxs' = MempoolSeq {
135+
mempoolSet = Set.union mempoolSet (Set.fromList validIds),
136+
mempoolSeq = Foldable.foldl' (Seq.|>) mempoolSeq validTxs
137+
}
156138
writeTVar mempool mempoolTxs'
157-
return (map getTxId validTxs)
139+
return validIds
158140
}

0 commit comments

Comments
 (0)