11{-# LANGUAGE BangPatterns #-}
22{-# LANGUAGE FlexibleContexts #-}
3+ {-# LANGUAGE LambdaCase #-}
34{-# LANGUAGE NamedFieldPuns #-}
45{-# LANGUAGE OverloadedStrings #-}
56{-# LANGUAGE TypeApplications #-}
@@ -11,6 +12,10 @@ import Cardano.Ledger.Api.Era
1112import Cardano.Ledger.Api.State.Query (queryStakePoolDelegsAndRewards )
1213import Cardano.Ledger.BaseTypes
1314import Cardano.Ledger.Binary
15+ import Cardano.Ledger.Conway.Rules (
16+ ConwayLedgerPredFailure (ConwayUtxowFailure ),
17+ ConwayUtxowPredFailure (InvalidWitnessesUTXOW ),
18+ )
1419import Cardano.Ledger.Core
1520import Cardano.Ledger.Shelley.API.Mempool
1621import Cardano.Ledger.Shelley.API.Wallet (getFilteredUTxO , getUTxO )
@@ -21,54 +26,77 @@ import Cardano.Ledger.Shelley.Genesis (
2126 )
2227import Cardano.Ledger.Shelley.LedgerState
2328import Cardano.Ledger.State
24- import Cardano.Ledger.State.UTxO (CurrentEra , readNewEpochState )
29+ import Cardano.Ledger.State.UTxO (CurrentEra , readHexUTxO , readNewEpochState )
2530import Cardano.Ledger.UMap
2631import Cardano.Ledger.Val
2732import Cardano.Slotting.EpochInfo (fixedEpochInfo )
2833import Cardano.Slotting.Time (mkSlotLength )
2934import Control.DeepSeq
35+ import Control.Monad (when )
3036import Criterion.Main
3137import Data.Aeson
32- import Data.Bifunctor (first )
38+ import Data.Bifunctor (bimap , first )
3339import Data.ByteString.Base16.Lazy as BSL16
3440import Data.ByteString.Lazy (ByteString )
3541import Data.Foldable as F
42+ import Data.List.NonEmpty (NonEmpty ((:|) ))
3643import Data.Map.Strict (Map )
3744import qualified Data.Map.Strict as Map
3845import Data.MapExtras (extractKeys , extractKeysSmallSet )
3946import Data.Set (Set )
4047import qualified Data.Set as Set
41- import Lens.Micro ((^.) )
48+ import GHC.Stack (HasCallStack )
49+ import Lens.Micro ((&) , (.~) , (^.) )
4250import System.Environment (getEnv )
51+ import System.Exit (die )
4352import System.Random.Stateful
4453import Test.Cardano.Ledger.Api.State.Query (getFilteredDelegationsAndRewardAccounts )
4554import Test.Cardano.Ledger.Core.Arbitrary (uniformSubSet )
4655
4756main :: IO ()
4857main = do
49- let ledgerVarName = " BENCH_LEDGER_STATE_PATH "
50- genesisVarName = " BENCH_GENESIS_PATH "
51- ledgerStateFilePath <- getEnv ledgerVarName
58+ let genesisVarName = " BENCH_GENESIS_PATH "
59+ utxoVarName = " BENCH_UTXO_PATH "
60+ ledgerStateVarName = " BENCH_LEDGER_STATE_PATH "
5261 genesisFilePath <- getEnv genesisVarName
62+ utxoFilePath <- getEnv utxoVarName
63+ ledgerStateFilePath <- getEnv ledgerStateVarName
64+
5365 genesis <- either error id <$> eitherDecodeFileStrict' genesisFilePath
66+ putStrLn $ " Importing UTxO from: " ++ show utxoFilePath
67+ utxo <- readHexUTxO utxoFilePath
68+ putStrLn " Done importing UTxO"
69+ putStrLn $ " Importing NewEpochState from: " ++ show ledgerStateFilePath
70+ es' <- readNewEpochState ledgerStateFilePath
71+ putStrLn " Done importing NewEpochState"
72+
73+ let nesUTxOL = nesEsL . esLStateL . lsUTxOStateL . utxoL
74+ es = es' & nesUTxOL .~ utxo
75+ utxoMap = unUTxO utxo
76+ utxoSize = Map. size utxoMap
77+ largeKeysNum = 100000
78+ stdGen = mkStdGen 2022
5479
5580 let toMempoolState :: NewEpochState CurrentEra -> MempoolState CurrentEra
5681 toMempoolState NewEpochState {nesEs = EpochState {esLState}} = esLState
5782 ! globals = mkGlobals genesis
5883 ! slotNo = SlotNo 55733343
84+ restrictError = \ case
85+ ApplyTxError (ConwayUtxowFailure (InvalidWitnessesUTXOW [_]) :| [] ) -> ()
86+ otherErr -> error . show $ otherErr
5987 applyTx' mempoolEnv mempoolState =
60- either (error . show ) seqTuple
88+ -- TODO: revert this to `either (error . show) seqTuple` after tx's are fixed
89+ bimap restrictError seqTuple
6190 . applyTx globals mempoolEnv mempoolState
62- reapplyTx' mempoolEnv mempoolState tx =
63- case reapplyTx globals mempoolEnv mempoolState tx of
64- Left err -> error (show err)
65- Right st -> st
66- putStrLn $ " Importing NewEpochState from: " ++ show ledgerStateFilePath
67- es <- readNewEpochState ledgerStateFilePath
68- putStrLn " Done importing NewEpochState"
69- let largeKeysNum = 100000
70- stdGen = mkStdGen 2022
71- largeKeys <- selectRandomMapKeys 100000 stdGen (unUTxO (getUTxO es))
91+ reapplyTx' mempoolEnv mempoolState =
92+ either (error . show ) id
93+ . reapplyTx globals mempoolEnv mempoolState
94+
95+ when (utxoSize < largeKeysNum) $
96+ die $
97+ " UTxO size is too small (" <> show utxoSize <> " < " <> show largeKeysNum <> " )"
98+ largeKeys <- selectRandomMapKeys 100000 stdGen utxoMap
99+
72100 defaultMain
73101 [ env (pure (mkMempoolEnv es slotNo, toMempoolState es)) $ \ ~ (mempoolEnv, mempoolState) ->
74102 bgroup
@@ -92,22 +120,26 @@ main = do
92120 bench " Tx2" . whnf (applyTx' mempoolEnv mempoolState)
93121 , env (pure (extractTx validatedTx3)) $
94122 bench " Tx3" . whnf (applyTx' mempoolEnv mempoolState)
123+ , env
124+ (pure [validatedTx1, validatedTx2, validatedTx3])
125+ $ bench " Tx1+Tx2+Tx3"
126+ -- TODO: revert this to `foldl'` without `fmap` after tx's are fixed
127+ . whnf (F. foldlM (\ ms -> fmap fst . applyTx' mempoolEnv ms . extractTx) mempoolState)
95128 ]
96- , env (pure (getUTxO es)) $ \ utxo ->
129+ , env (pure utxo) $ \ utxo' ->
97130 bgroup
98131 " UTxO"
99- [ bench " balance" $ nf balance utxo
100- , bench " coinBalance" $ nf coinBalance utxo
132+ [ bench " balance" $ nf balance utxo'
133+ , bench " coinBalance" $ nf coinBalance utxo'
101134 , -- We need to filter out all multi-assets to prevent `areAllAdaOnly`
102135 -- from short circuiting and producing results that are way better
103136 -- than the worst case
104- env (pure $ Map. filter (\ txOut -> isAdaOnly (txOut ^. valueTxOutL)) $ unUTxO utxo) $
137+ env (pure $ Map. filter (\ txOut -> isAdaOnly (txOut ^. valueTxOutL)) $ unUTxO utxo' ) $
105138 bench " areAllAdaOnly" . nf areAllAdaOnly
106139 ]
107140 , env (pure es) $ \ newEpochState ->
108- let utxo = getUTxO es
109- (_, minTxOut) = Map. findMin $ unUTxO utxo
110- (_, maxTxOut) = Map. findMax $ unUTxO utxo
141+ let (_, minTxOut) = Map. findMin utxoMap
142+ (_, maxTxOut) = Map. findMax utxoMap
111143 setAddr =
112144 Set. fromList [minTxOut ^. addrTxOutL, maxTxOut ^. addrTxOutL]
113145 in bgroup
@@ -137,10 +169,10 @@ main = do
137169 ]
138170 , bgroup
139171 " DeleteTxOuts"
140- [ extractKeysBench (unUTxO (getUTxO es)) largeKeysNum largeKeys
141- , extractKeysBench (unUTxO (getUTxO es)) 9 (Set. take 9 largeKeys)
142- , extractKeysBench (unUTxO (getUTxO es)) 5 (Set. take 5 largeKeys)
143- , extractKeysBench (unUTxO (getUTxO es)) 2 (Set. take 2 largeKeys)
172+ [ extractKeysBench utxoMap largeKeysNum largeKeys
173+ , extractKeysBench utxoMap 9 (Set. take 9 largeKeys)
174+ , extractKeysBench utxoMap 5 (Set. take 5 largeKeys)
175+ , extractKeysBench utxoMap 2 (Set. take 2 largeKeys)
144176 ]
145177 ]
146178
@@ -176,10 +208,12 @@ selectRandomMapKeys n gen m = runStateGenT_ gen $ \g ->
176208extractKeysNaive :: Ord k => Map k a -> Set. Set k -> (Map k a , Map k a )
177209extractKeysNaive sm s = (Map. withoutKeys sm s, Map. restrictKeys sm s)
178210
179- decodeTx :: ByteString -> Tx CurrentEra
211+ decodeTx :: HasCallStack => ByteString -> Tx CurrentEra
180212decodeTx hex = either error id $ do
181213 bsl <- BSL16. decode hex
182- first show $ decodeFull (eraProtVerHigh @ CurrentEra ) bsl
214+ tx <- first show $ decodeFull (eraProtVerHigh @ BabbageEra ) bsl
215+ -- TODO: remove this after the transactions below are updated
216+ first show $ upgradeTx tx
183217
184218-- | Most basic ada-only transaction:
185219--
@@ -235,8 +269,8 @@ validatedTx3 =
235269 \424643546f6b656e1a006cc9f2021a0002afe90e81581c780648b89ea2f11fa9bbdd67\
236270 \552db5dd020eda1c9a54142dd9f1b136a10081825820cf2477066091b565f87f044581\
237271 \7c4df726900b29af3f05d229309afdbf94296d584088444a5845b198a2d255175770be\
238- \7120c2d3482751b14f06dd41d7ff023eeae6e63933b097c023c1ed19df6a061173c45aa \
239- \54cceb568ff1886e2716e84e6260df5f6 "
272+ \7120c2d3482751b14f06dd41d7ff023eeae6e63933b097c023c1ed19df6a061173c45a \
273+ \a54cceb568ff1886e2716e84e6260df5f6 "
240274
241275mkGlobals :: ShelleyGenesis -> Globals
242276mkGlobals genesis =
0 commit comments