From 78418bffeb4b64d85e1cd5c8da57f2d2e2fe1192 Mon Sep 17 00:00:00 2001 From: Cmdv Date: Thu, 4 Apr 2024 09:29:08 +0100 Subject: [PATCH] add some tests for whitelist --- cardano-chain-gen/cardano-chain-gen.cabal | 1 + cardano-chain-gen/src/Cardano/Mock/Query.hs | 8 + .../test/Test/Cardano/Db/Mock/Unit/Conway.hs | 11 +- .../Cardano/Db/Mock/Unit/Conway/Plutus.hs | 89 +----- .../Test/Cardano/Db/Mock/Unit/Conway/Tx.hs | 86 ------ .../Cardano/Db/Mock/Unit/Conway/Whitelist.hs | 266 ++++++++++++++++++ .../fingerprint/conwayConfigMetadataWhitelist | 1 + cardano-db-sync/src/Cardano/DbSync/Cache.hs | 31 +- .../src/Cardano/DbSync/Util/Whitelist.hs | 3 +- 9 files changed, 307 insertions(+), 189 deletions(-) create mode 100644 cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway/Whitelist.hs create mode 100644 cardano-chain-gen/test/testfiles/fingerprint/conwayConfigMetadataWhitelist diff --git a/cardano-chain-gen/cardano-chain-gen.cabal b/cardano-chain-gen/cardano-chain-gen.cabal index 0d8f4744a..fa925ef2f 100644 --- a/cardano-chain-gen/cardano-chain-gen.cabal +++ b/cardano-chain-gen/cardano-chain-gen.cabal @@ -166,6 +166,7 @@ test-suite cardano-chain-gen Test.Cardano.Db.Mock.Unit.Conway.Simple Test.Cardano.Db.Mock.Unit.Conway.Stake Test.Cardano.Db.Mock.Unit.Conway.Tx + Test.Cardano.Db.Mock.Unit.Conway.Whitelist Test.Cardano.Db.Mock.UnifiedApi Test.Cardano.Db.Mock.Validate diff --git a/cardano-chain-gen/src/Cardano/Mock/Query.hs b/cardano-chain-gen/src/Cardano/Mock/Query.hs index 6d7f8ccef..60dfd2300 100644 --- a/cardano-chain-gen/src/Cardano/Mock/Query.hs +++ b/cardano-chain-gen/src/Cardano/Mock/Query.hs @@ -7,6 +7,7 @@ module Cardano.Mock.Query ( queryMultiAssetCount, queryTxMetadataCount, queryMultiAssetMetadataPolicy, + queryStakeAddressHashRaw, ) where import qualified Cardano.Db as Db @@ -78,3 +79,10 @@ queryMultiAssetMetadataPolicy = do metadataPolicy <- from $ table @Db.MultiAsset pure $ metadataPolicy ^. Db.MultiAssetPolicy pure $ toShort . Base16.encode . unValue <$> res + +queryStakeAddressHashRaw :: MonadIO io => ReaderT SqlBackend io (Maybe ShortByteString) +queryStakeAddressHashRaw = do + res <- selectOne $ do + stakeAddress <- from $ table @Db.StakeAddress + pure $ stakeAddress ^. Db.StakeAddressHashRaw + pure $ toShort . Base16.encode . unValue <$> res diff --git a/cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway.hs b/cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway.hs index 008351ba0..b8afc39e7 100644 --- a/cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway.hs +++ b/cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway.hs @@ -16,6 +16,7 @@ import qualified Test.Cardano.Db.Mock.Unit.Conway.Rollback as Rollback import qualified Test.Cardano.Db.Mock.Unit.Conway.Simple as Simple import qualified Test.Cardano.Db.Mock.Unit.Conway.Stake as Stake import qualified Test.Cardano.Db.Mock.Unit.Conway.Tx as Tx +import qualified Test.Cardano.Db.Mock.Unit.Conway.Whitelist as Whitelist import Test.Tasty (TestTree (), testGroup) import Test.Tasty.HUnit (Assertion (), testCase) import Prelude (String ()) @@ -100,8 +101,6 @@ unitTests iom knownMigrations = , test "consume utxo same block" Tx.consumeSameBlock , test "tx with metadata" Tx.addTxMetadata , test "tx with metadata disabled" Tx.addTxMetadataDisabled - , test "tx with metadata whitelist" Tx.addTxMetadataWhitelist - , test "tx with metadata whitelist multiple" Tx.addTxMetadataWhitelistMultiple ] , testGroup "stake addresses" @@ -162,7 +161,13 @@ unitTests iom knownMigrations = , test "mint many multi assets" Plutus.mintMultiAssets , test "swap many multi assets" Plutus.swapMultiAssets , test "swap with multi assets disabled" Plutus.swapMultiAssetsDisabled - , test "add multi assets with whitelist" Plutus.addTxMultiAssetsWhitelist + ] + , testGroup + "Whitelist" + [ test "add tx with whitelist" Whitelist.addTxMultiAssetsWhitelist + , test "tx with metadata whitelist" Whitelist.addTxMetadataWhitelist + , test "tx with metadata whitelist multiple" Whitelist.addTxMetadataWhitelistMultiple + , test "add simple tx, whitelist tx address" Whitelist.addSimpleTxStakeAddrsWhitelist ] , testGroup "Pools and smash" diff --git a/cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway/Plutus.hs b/cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway/Plutus.hs index 89d776f18..c78258b02 100644 --- a/cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway/Plutus.hs +++ b/cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway/Plutus.hs @@ -29,7 +29,6 @@ module Test.Cardano.Db.Mock.Unit.Conway.Plutus ( mintMultiAssets, swapMultiAssets, swapMultiAssetsDisabled, - addTxMultiAssetsWhitelist, ) where import Cardano.Crypto.Hash.Class (hashToBytes) @@ -46,10 +45,8 @@ import Cardano.Mock.Forging.Interpreter (withConwayLedgerState) import qualified Cardano.Mock.Forging.Tx.Alonzo.ScriptsExamples as Examples import qualified Cardano.Mock.Forging.Tx.Conway as Conway import Cardano.Mock.Forging.Types -import Cardano.Mock.Query (queryMultiAssetCount, queryMultiAssetMetadataPolicy) +import Cardano.Mock.Query (queryMultiAssetCount) import Cardano.Prelude hiding (head) -import Data.ByteString.Short (toShort) -import Data.List.NonEmpty (fromList) import qualified Data.Map as Map import Data.Maybe.Strict (StrictMaybe (..)) import Ouroboros.Consensus.Shelley.Eras (StandardConway ()) @@ -815,87 +812,3 @@ swapMultiAssetsDisabled ioManager metadata = do testLabel = "conwayConfigMultiAssetsDisabled" cfgDir = conwayConfigDir - -addTxMultiAssetsWhitelist :: IOManager -> [(Text, Text)] -> Assertion -addTxMultiAssetsWhitelist ioManager metadata = do - syncNodeConfig <- mksNodeConfig - withCustomConfig args (Just syncNodeConfig) cfgDir testLabel action ioManager metadata - where - action = \interpreter mockServer dbSync -> do - startDBSync dbSync - -- Forge a block with multiple multi-asset scripts - void $ Api.withConwayFindLeaderAndSubmit interpreter mockServer $ \state' -> do - let assetsMinted = - Map.fromList [(head Examples.assetNames, 10), (Examples.assetNames !! 1, 4)] - policy0 = PolicyID $ Examples.alwaysMintScriptHashRandomPolicyVal 1 - policy1 = PolicyID $ Examples.alwaysMintScriptHashRandomPolicyVal 2 - mintValue = - MultiAsset $ - Map.fromList [(policy0, assetsMinted), (policy1, assetsMinted)] - assets = - Map.fromList [(head Examples.assetNames, 5), (Examples.assetNames !! 1, 2)] - outValue = - MaryValue (Coin 20) $ - MultiAsset $ - Map.fromList [(policy0, assets), (policy1, assets)] - - -- Forge a multi-asset script - tx0 <- - Conway.mkMultiAssetsScriptTx - [UTxOIndex 0] - (UTxOIndex 1) - [ (UTxOAddress Examples.alwaysSucceedsScriptAddr, outValue) - , (UTxOAddress Examples.alwaysMintScriptAddr, outValue) - ] - [] - mintValue - True - 100 - state' - - -- Consume the outputs from tx0 - let utxos = Conway.mkUTxOConway tx0 - tx1 <- - Conway.mkMultiAssetsScriptTx - [UTxOPair (head utxos), UTxOPair (utxos !! 1), UTxOIndex 2] - (UTxOIndex 3) - [ (UTxOAddress Examples.alwaysSucceedsScriptAddr, outValue) - , (UTxOAddress Examples.alwaysMintScriptAddr, outValue) - , (UTxOAddressNew 0, outValue) - , (UTxOAddressNew 0, outValue) - ] - [] - mintValue - True - 200 - state' - pure [tx0, tx1] - - -- Verify script counts - assertBlockNoBackoff dbSync 1 - assertAlonzoCounts dbSync (2, 4, 1, 2, 4, 2, 0, 0) - -- create 4 multi-assets but only 2 should be added due to the whitelist - assertEqBackoff dbSync queryMultiAssetCount 2 [] "Expected 2 multi-assets" - -- do the policy match the whitelist - assertEqBackoff dbSync queryMultiAssetMetadataPolicy (Just policyShortBs) [] "Expected correct policy in db" - - args = initCommandLineArgs {claFullMode = False} - testLabel = "conwayConfigMultiAssetsWhitelist" - - cfgDir = conwayConfigDir - - policyShortBs = toShort "4509cdddad21412c22c9164e10bc6071340ba235562f1575a35ded4d" - - mksNodeConfig :: IO SyncNodeConfig - mksNodeConfig = do - initConfigFile <- mkSyncNodeConfig cfgDir args - let dncInsertOptions' = dncInsertOptions initConfigFile - pure $ - initConfigFile - { dncInsertOptions = - dncInsertOptions' - { sioMultiAsset = - MultiAssetPolicies $ - fromList [policyShortBs] - } - } diff --git a/cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway/Tx.hs b/cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway/Tx.hs index ba4e763f3..5b5f27118 100644 --- a/cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway/Tx.hs +++ b/cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway/Tx.hs @@ -7,11 +7,8 @@ module Test.Cardano.Db.Mock.Unit.Conway.Tx ( consumeSameBlock, addTxMetadata, addTxMetadataDisabled, - addTxMetadataWhitelist, - addTxMetadataWhitelistMultiple, ) where -import Cardano.Api.Ledger (Coin (..)) import Cardano.DbSync.Config (SyncNodeConfig (..)) import Cardano.DbSync.Config.Types (MetadataConfig (..), SyncInsertOptions (..)) import Cardano.Ledger.Shelley.TxAuxData (Metadatum (..)) @@ -21,7 +18,6 @@ import qualified Cardano.Mock.Forging.Tx.Shelley as Shelley import Cardano.Mock.Forging.Types (UTxOIndex (..)) import Cardano.Mock.Query (queryNullTxDepositExists, queryTxMetadataCount) import Cardano.Prelude hiding (head) -import Data.List.NonEmpty (fromList) import qualified Data.Map as Map import Test.Cardano.Db.Mock.Config import qualified Test.Cardano.Db.Mock.UnifiedApi as UnifiedApi @@ -167,85 +163,3 @@ addTxMetadataDisabled ioManager metadata = do initConfigFile { dncInsertOptions = dncInsertOptions' {sioMetadata = MetadataDisable} } - --- 2 blocks each with 4 metadata entries. --- The whitelist has one tx metadata key which is in the first block --- so only the TX in the first block should have tx metadata kept. -addTxMetadataWhitelist :: IOManager -> [(Text, Text)] -> Assertion -addTxMetadataWhitelist ioManager metadata = do - syncNodeConfig <- mksNodeConfig - withCustomConfigAndDropDB args (Just syncNodeConfig) cfgDir testLabel action ioManager metadata - where - action = \interpreter mockServer dbSync -> do - startDBSync dbSync - -- Add transactions with metadata - void $ do - UnifiedApi.withConwayFindLeaderAndSubmitTx interpreter mockServer $ \_ -> - let txBody = Conway.mkDummyTxBodyWithFee $ Coin 1_000 - auxData = Map.fromList [(1, I 1), (2, I 2), (3, I 3), (4, I 4)] - in Right (Conway.mkAuxDataTx True txBody auxData) - void $ do - UnifiedApi.withConwayFindLeaderAndSubmitTx interpreter mockServer $ \_ -> - let txBody = Conway.mkDummyTxBodyWithFee $ Coin 2_000 - auxData = Map.fromList [(5, I 5), (6, I 6), (7, I 7), (8, I 8)] - in Right (Conway.mkAuxDataTx True txBody auxData) - - assertBlockNoBackoff dbSync 2 - -- Should have first block's tx metadata - assertEqBackoff dbSync queryTxMetadataCount 4 [] "Expected tx metadata" - - args = initCommandLineArgs {claFullMode = False} - testLabel = "conwayConfigMetadataWhitelist" - - cfgDir = conwayConfigDir - - -- match all metadata keys of value 1 - mksNodeConfig :: IO SyncNodeConfig - mksNodeConfig = do - initConfigFile <- mkSyncNodeConfig cfgDir args - let dncInsertOptions' = dncInsertOptions initConfigFile - pure $ - initConfigFile - { dncInsertOptions = dncInsertOptions' {sioMetadata = MetadataKeys $ fromList [1]} - } - --- 2 blocks each with 4 metadata entries --- The whitelist is set to keys [1,6] each key in in different TX --- so all TxMetadata should be kept from both blocks. -addTxMetadataWhitelistMultiple :: IOManager -> [(Text, Text)] -> Assertion -addTxMetadataWhitelistMultiple ioManager metadata = do - syncNodeConfig <- mksNodeConfig - withCustomConfigAndDropDB args (Just syncNodeConfig) cfgDir testLabel action ioManager metadata - where - action = \interpreter mockServer dbSync -> do - startDBSync dbSync - -- Add transactions with metadata - void $ do - UnifiedApi.withConwayFindLeaderAndSubmitTx interpreter mockServer $ \_ -> - let txBody = Conway.mkDummyTxBodyWithFee $ Coin 1_000 - auxData = Map.fromList [(1, I 1), (2, I 2), (3, I 3), (4, I 4)] - in Right (Conway.mkAuxDataTx True txBody auxData) - void $ do - UnifiedApi.withConwayFindLeaderAndSubmitTx interpreter mockServer $ \_ -> - let txBody = Conway.mkDummyTxBodyWithFee $ Coin 2_000 - auxData = Map.fromList [(5, I 5), (6, I 6), (7, I 7), (8, I 8)] - in Right (Conway.mkAuxDataTx True txBody auxData) - - assertBlockNoBackoff dbSync 2 - -- Should have both block's tx metadata - assertEqBackoff dbSync queryTxMetadataCount 8 [] "Expected tx metadata" - - args = initCommandLineArgs {claFullMode = False} - testLabel = "conwayConfigMetadataWhitelist" - - cfgDir = conwayConfigDir - - -- match all metadata keys of value 1 - mksNodeConfig :: IO SyncNodeConfig - mksNodeConfig = do - initConfigFile <- mkSyncNodeConfig cfgDir args - let dncInsertOptions' = dncInsertOptions initConfigFile - pure $ - initConfigFile - { dncInsertOptions = dncInsertOptions' {sioMetadata = MetadataKeys $ fromList [1, 6]} - } diff --git a/cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway/Whitelist.hs b/cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway/Whitelist.hs new file mode 100644 index 000000000..3aee37905 --- /dev/null +++ b/cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway/Whitelist.hs @@ -0,0 +1,266 @@ +{-# LANGUAGE NumericUnderscores #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE TypeApplications #-} + +module Test.Cardano.Db.Mock.Unit.Conway.Whitelist ( + addTxMultiAssetsWhitelist, + addTxMetadataWhitelist, + addTxMetadataWhitelistMultiple, + addSimpleTxStakeAddrsWhitelist, +) +where + +import Cardano.DbSync.Config (SyncNodeConfig (..)) +import Cardano.DbSync.Config.Types (MetadataConfig (..), MultiAssetConfig (..), ShelleyInsertConfig (..), SyncInsertOptions (..)) +import Cardano.Ledger.Coin (Coin (..)) +import Cardano.Ledger.Mary.Value (MaryValue (..), MultiAsset (..), PolicyID (..)) +import Cardano.Ledger.Shelley.TxAuxData (Metadatum (..)) +import Cardano.Mock.ChainSync.Server (IOManager ()) +import qualified Cardano.Mock.Forging.Tx.Alonzo.ScriptsExamples as Examples +import qualified Cardano.Mock.Forging.Tx.Conway as Conway +import Cardano.Mock.Forging.Types +import Cardano.Mock.Query (queryMultiAssetCount, queryMultiAssetMetadataPolicy, queryStakeAddressHashRaw, queryTxMetadataCount) +import Cardano.Prelude hiding (head) +import Data.ByteString.Short (toShort) +import Data.List.NonEmpty (fromList) +import qualified Data.Map as Map +import Test.Cardano.Db.Mock.Config +import qualified Test.Cardano.Db.Mock.UnifiedApi as Api +import qualified Test.Cardano.Db.Mock.UnifiedApi as UnifiedApi +import Test.Cardano.Db.Mock.Validate +import Test.Tasty.HUnit (Assertion ()) +import Prelude (head, (!!)) + +addTxMultiAssetsWhitelist :: IOManager -> [(Text, Text)] -> Assertion +addTxMultiAssetsWhitelist ioManager metadata = do + syncNodeConfig <- mksNodeConfig + withCustomConfig args (Just syncNodeConfig) cfgDir testLabel action ioManager metadata + where + action = \interpreter mockServer dbSync -> do + startDBSync dbSync + -- Forge a block with multiple multi-asset scripts + void $ Api.withConwayFindLeaderAndSubmit interpreter mockServer $ \state' -> do + let assetsMinted = + Map.fromList [(head Examples.assetNames, 10), (Examples.assetNames !! 1, 4)] + policy0 = PolicyID $ Examples.alwaysMintScriptHashRandomPolicyVal 1 + policy1 = PolicyID $ Examples.alwaysMintScriptHashRandomPolicyVal 2 + mintValue = + MultiAsset $ + Map.fromList [(policy0, assetsMinted), (policy1, assetsMinted)] + assets = + Map.fromList [(head Examples.assetNames, 5), (Examples.assetNames !! 1, 2)] + outValue = + MaryValue (Coin 20) $ + MultiAsset $ + Map.fromList [(policy0, assets), (policy1, assets)] + + -- Forge a multi-asset script + tx0 <- + Conway.mkMultiAssetsScriptTx + [UTxOIndex 0] + (UTxOIndex 1) + [ (UTxOAddress Examples.alwaysSucceedsScriptAddr, outValue) + , (UTxOAddress Examples.alwaysMintScriptAddr, outValue) + ] + [] + mintValue + True + 100 + state' + + -- Consume the outputs from tx0 + let utxos = Conway.mkUTxOConway tx0 + tx1 <- + Conway.mkMultiAssetsScriptTx + [UTxOPair (head utxos), UTxOPair (utxos !! 1), UTxOIndex 2] + (UTxOIndex 3) + [ (UTxOAddress Examples.alwaysSucceedsScriptAddr, outValue) + , (UTxOAddress Examples.alwaysMintScriptAddr, outValue) + , (UTxOAddressNew 0, outValue) + , (UTxOAddressNew 0, outValue) + ] + [] + mintValue + True + 200 + state' + pure [tx0, tx1] + + -- Verify script counts + assertBlockNoBackoff dbSync 1 + assertAlonzoCounts dbSync (2, 4, 1, 2, 4, 2, 0, 0) + -- create 4 multi-assets but only 2 should be added due to the whitelist + assertEqBackoff dbSync queryMultiAssetCount 2 [] "Expected 2 multi-assets" + -- do the policy match the whitelist + assertEqBackoff dbSync queryMultiAssetMetadataPolicy (Just policyShortBs) [] "Expected correct policy in db" + + args = initCommandLineArgs {claFullMode = False} + testLabel = "conwayConfigMultiAssetsWhitelist" + + cfgDir = conwayConfigDir + + policyShortBs = toShort "4509cdddad21412c22c9164e10bc6071340ba235562f1575a35ded4d" + + mksNodeConfig :: IO SyncNodeConfig + mksNodeConfig = do + initConfigFile <- mkSyncNodeConfig cfgDir args + let dncInsertOptions' = dncInsertOptions initConfigFile + pure $ + initConfigFile + { dncInsertOptions = + dncInsertOptions' + { sioMultiAsset = + MultiAssetPolicies $ + fromList [policyShortBs] + } + } + +-- 2 blocks each with 4 metadata entries. +-- The whitelist has one tx metadata key which is in the first block +-- so only the TX in the first block should have tx metadata kept. +addTxMetadataWhitelist :: IOManager -> [(Text, Text)] -> Assertion +addTxMetadataWhitelist ioManager metadata = do + syncNodeConfig <- mksNodeConfig + withCustomConfigAndDropDB args (Just syncNodeConfig) cfgDir testLabel action ioManager metadata + where + action = \interpreter mockServer dbSync -> do + startDBSync dbSync + -- Add transactions with metadata + void $ do + UnifiedApi.withConwayFindLeaderAndSubmitTx interpreter mockServer $ \_ -> + let txBody = Conway.mkDummyTxBodyWithFee $ Coin 1_000 + auxData = Map.fromList [(1, I 1), (2, I 2), (3, I 3), (4, I 4)] + in Right (Conway.mkAuxDataTx True txBody auxData) + void $ do + UnifiedApi.withConwayFindLeaderAndSubmitTx interpreter mockServer $ \_ -> + let txBody = Conway.mkDummyTxBodyWithFee $ Coin 2_000 + auxData = Map.fromList [(5, I 5), (6, I 6), (7, I 7), (8, I 8)] + in Right (Conway.mkAuxDataTx True txBody auxData) + + assertBlockNoBackoff dbSync 2 + -- Should have first block's tx metadata + assertEqBackoff dbSync queryTxMetadataCount 4 [] "Expected tx metadata" + + args = initCommandLineArgs {claFullMode = False} + testLabel = "conwayConfigMetadataWhitelist" + + cfgDir = conwayConfigDir + + -- match all metadata keys of value 1 + mksNodeConfig :: IO SyncNodeConfig + mksNodeConfig = do + initConfigFile <- mkSyncNodeConfig cfgDir args + let dncInsertOptions' = dncInsertOptions initConfigFile + pure $ + initConfigFile + { dncInsertOptions = dncInsertOptions' {sioMetadata = MetadataKeys $ fromList [1]} + } + +-- 2 blocks each with 4 metadata entries +-- The whitelist is set to keys [1,6] each key in in different TX +-- so all TxMetadata should be kept from both blocks. +addTxMetadataWhitelistMultiple :: IOManager -> [(Text, Text)] -> Assertion +addTxMetadataWhitelistMultiple ioManager metadata = do + syncNodeConfig <- mksNodeConfig + withCustomConfigAndDropDB args (Just syncNodeConfig) cfgDir testLabel action ioManager metadata + where + action = \interpreter mockServer dbSync -> do + startDBSync dbSync + -- Add transactions with metadata + void $ do + UnifiedApi.withConwayFindLeaderAndSubmitTx interpreter mockServer $ \_ -> + let txBody = Conway.mkDummyTxBodyWithFee $ Coin 1_000 + auxData = Map.fromList [(1, I 1), (2, I 2), (3, I 3), (4, I 4)] + in Right (Conway.mkAuxDataTx True txBody auxData) + void $ do + UnifiedApi.withConwayFindLeaderAndSubmitTx interpreter mockServer $ \_ -> + let txBody = Conway.mkDummyTxBodyWithFee $ Coin 2_000 + auxData = Map.fromList [(5, I 5), (6, I 6), (7, I 7), (8, I 8)] + in Right (Conway.mkAuxDataTx True txBody auxData) + + assertBlockNoBackoff dbSync 2 + -- Should have both block's tx metadata + assertEqBackoff dbSync queryTxMetadataCount 8 [] "Expected tx metadata" + + args = initCommandLineArgs {claFullMode = False} + testLabel = "conwayConfigMetadataWhitelist" + + cfgDir = conwayConfigDir + + -- match all metadata keys of value 1 + mksNodeConfig :: IO SyncNodeConfig + mksNodeConfig = do + initConfigFile <- mkSyncNodeConfig cfgDir args + let dncInsertOptions' = dncInsertOptions initConfigFile + pure $ + initConfigFile + { dncInsertOptions = dncInsertOptions' {sioMetadata = MetadataKeys $ fromList [1, 6]} + } + +addSimpleTxStakeAddrsWhitelist :: IOManager -> [(Text, Text)] -> Assertion +addSimpleTxStakeAddrsWhitelist ioManager metadata = do + syncNodeConfig <- mksNodeConfig + withCustomConfigAndLogs args (Just syncNodeConfig) cfgDir testLabel action ioManager metadata + where + action = \interpreter mockServer dbSync -> do + -- Forge a block + void $ + UnifiedApi.withConwayFindLeaderAndSubmitTx interpreter mockServer $ + Conway.mkPaymentTx (UTxOIndex 0) (UTxOIndex 1) 10_000 500 + + startDBSync dbSync + -- Verify it syncs + assertBlockNoBackoff dbSync 1 + assertTxCount dbSync 12 + + assertEqBackoff dbSync queryStakeAddressHashRaw (Just shelleyStakeAddrShortBs) [] "Expected matching stake address" + + testLabel = "conwayAddSimpleTx" + args = initCommandLineArgs {claFullMode = False} + cfgDir = conwayConfigDir + + shelleyStakeAddrShortBs = toShort "e0921c25093b263793a1baf36166b819543f5822c62f72571111111111" + -- match all metadata keys of value 1 + mksNodeConfig :: IO SyncNodeConfig + mksNodeConfig = do + initConfigFile <- mkSyncNodeConfig cfgDir args + let dncInsertOptions' = dncInsertOptions initConfigFile + pure $ + initConfigFile + { dncInsertOptions = + dncInsertOptions' + { sioShelley = + ShelleyStakeAddrs $ + fromList [shelleyStakeAddrShortBs] + } + } + +-- spendCollateralOutput :: IOManager -> [(Text, Text)] -> Assertion +-- spendCollateralOutput = +-- withFullConfig babbageConfigDir testLabel $ \interpreter mockServer dbSync -> do +-- startDBSync dbSync +-- void $ registerAllStakeCreds interpreter mockServer + +-- tx0 <- +-- withBabbageLedgerState interpreter $ +-- Babbage.mkLockByScriptTx (UTxOIndex 0) [Babbage.TxOutNoInline False] 20000 20000 +-- void $ forgeNextFindLeaderAndSubmit interpreter mockServer [TxBabbage tx0] + +-- -- tx fails so its collateral output become actual output. +-- let utxo0 = head (Babbage.mkUTxOBabbage tx0) +-- tx1 <- +-- withBabbageLedgerState interpreter $ +-- Babbage.mkUnlockScriptTxBabbage [UTxOInput (fst utxo0)] (UTxOIndex 1) (UTxOIndex 2) [UTxOPair utxo0] True False 10000 500 +-- void $ forgeNextFindLeaderAndSubmit interpreter mockServer [TxBabbage tx1] +-- assertBlockNoBackoff dbSync 3 + +-- let utxo1 = head (Babbage.mkUTxOCollBabbage tx1) +-- tx2 <- +-- withBabbageLedgerState interpreter $ +-- Babbage.mkUnlockScriptTxBabbage [UTxOPair utxo1] (UTxOIndex 3) (UTxOIndex 1) [UTxOPair utxo1] False True 10000 500 +-- void $ forgeNextFindLeaderAndSubmit interpreter mockServer [TxBabbage tx2] + +-- assertBlockNoBackoff dbSync 4 +-- assertBabbageCounts dbSync (1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1) +-- where +-- testLabel = "spendCollateralOutput" diff --git a/cardano-chain-gen/test/testfiles/fingerprint/conwayConfigMetadataWhitelist b/cardano-chain-gen/test/testfiles/fingerprint/conwayConfigMetadataWhitelist new file mode 100644 index 000000000..e51937fbf --- /dev/null +++ b/cardano-chain-gen/test/testfiles/fingerprint/conwayConfigMetadataWhitelist @@ -0,0 +1 @@ +[5,11] \ No newline at end of file diff --git a/cardano-db-sync/src/Cardano/DbSync/Cache.hs b/cardano-db-sync/src/Cardano/DbSync/Cache.hs index 3f4d7b8c0..98e739eb4 100644 --- a/cardano-db-sync/src/Cardano/DbSync/Cache.hs +++ b/cardano-db-sync/src/Cardano/DbSync/Cache.hs @@ -51,6 +51,8 @@ import Control.Concurrent.Class.MonadSTM.Strict ( writeTVar, ) import Control.Monad.Trans.Control (MonadBaseControl) +import qualified Data.ByteString.Base16 as Base16 +import Data.ByteString.Short (toShort) import Data.Either.Combinators import qualified Data.Map.Strict as Map import Database.Persist.Postgresql (SqlBackend) @@ -71,7 +73,7 @@ import Ouroboros.Consensus.Cardano.Block (StandardCrypto) -- NOTE: BlockId is cleaned up on rollbacks, since it may get reinserted on -- a different id. -- NOTE: Other tables are not cleaned up since they are not rollbacked. -rollbackCache :: (MonadIO m) => Cache -> DB.BlockId -> ReaderT SqlBackend m () +rollbackCache :: MonadIO m => Cache -> DB.BlockId -> ReaderT SqlBackend m () rollbackCache UninitiatedCache _ = pure () rollbackCache (Cache cache) blockId = do liftIO $ do @@ -93,6 +95,12 @@ queryOrInsertRewardAccount :: Ledger.RewardAcnt StandardCrypto -> ReaderT SqlBackend m (Maybe DB.StakeAddressId) queryOrInsertRewardAccount syncEnv cache cacheNew rewardAddr = do + liftIO $ + logInfo (getTrace syncEnv) $ + mconcat + [ "queryOrInsertRewardAccount: " + , show $ toShort . Base16.encode $ laBs + ] -- check if the stake address is in the whitelist if shelleyInsertWhitelistCheck (ioShelley iopts) laBs then do @@ -102,9 +110,10 @@ queryOrInsertRewardAccount syncEnv cache cacheNew rewardAddr = do Right addrId -> pure $ Just addrId else pure Nothing where + -- this is the stake address of the reward account used when whitelisting + !laBs = Ledger.serialiseRewardAcnt (Ledger.RewardAcnt nw cred) nw = Ledger.getRwdNetwork rewardAddr cred = Ledger.getRwdCred rewardAddr - !laBs = Ledger.serialiseRewardAcnt (Ledger.RewardAcnt nw cred) iopts = soptInsertOptions $ envOptions syncEnv queryOrInsertStakeAddress :: @@ -145,7 +154,7 @@ insertStakeAddress syncEnv rewardAddr stakeCredBs = queryRewardAccountWithCacheRetBs :: forall m. - (MonadIO m) => + MonadIO m => Cache -> CacheNew -> Ledger.RewardAcnt StandardCrypto -> @@ -155,7 +164,7 @@ queryRewardAccountWithCacheRetBs cache cacheNew rwdAcc = queryStakeAddrWithCache :: forall m. - (MonadIO m) => + MonadIO m => Cache -> CacheNew -> Network -> @@ -166,7 +175,7 @@ queryStakeAddrWithCache cache cacheNew nw cred = queryStakeAddrWithCacheRetBs :: forall m. - (MonadIO m) => + MonadIO m => Cache -> CacheNew -> Network -> @@ -184,7 +193,7 @@ queryStakeAddrWithCacheRetBs cache cacheNew nw cred = do pure mAddrId queryStakeAddrAux :: - (MonadIO m) => + MonadIO m => CacheNew -> StakeAddrCache -> StrictTVar IO CacheStatistics -> @@ -208,7 +217,7 @@ queryStakeAddrAux cacheNew mp sts nw cred = (err, _) -> pure (err, mp) queryPoolKeyWithCache :: - (MonadIO m) => + MonadIO m => SyncEnv -> CacheNew -> PoolKeyHash -> @@ -317,7 +326,7 @@ queryPoolKeyOrInsert txt syncEnv cache cacheNew logsWarning hsh = do trce = getTrace syncEnv queryMAWithCache :: - (MonadIO m) => + MonadIO m => Cache -> PolicyID StandardCrypto -> AssetName -> @@ -349,7 +358,7 @@ queryMAWithCache cache policyId asset = pure maId queryPrevBlockWithCache :: - (MonadIO m) => + MonadIO m => Text -> Cache -> ByteString -> @@ -370,7 +379,7 @@ queryPrevBlockWithCache msg cache hsh = Nothing -> queryFromDb ci where queryFromDb :: - (MonadIO m) => + MonadIO m => CacheInternal -> ExceptT SyncNodeError (ReaderT SqlBackend m) DB.BlockId queryFromDb ci = do @@ -393,7 +402,7 @@ insertBlockAndCache cache block = pure bid queryDatum :: - (MonadIO m) => + MonadIO m => Cache -> DataHash -> ReaderT SqlBackend m (Maybe DB.DatumId) diff --git a/cardano-db-sync/src/Cardano/DbSync/Util/Whitelist.hs b/cardano-db-sync/src/Cardano/DbSync/Util/Whitelist.hs index 074dce166..de1f1fc17 100644 --- a/cardano-db-sync/src/Cardano/DbSync/Util/Whitelist.hs +++ b/cardano-db-sync/src/Cardano/DbSync/Util/Whitelist.hs @@ -3,6 +3,7 @@ module Cardano.DbSync.Util.Whitelist where import Cardano.DbSync.Api.Types (InsertOptions (..), SyncEnv (..), SyncOptions (..)) import Cardano.DbSync.Config.Types (MultiAssetConfig (..), PlutusConfig (..), ShelleyInsertConfig (..)) import qualified Cardano.DbSync.Era.Shelley.Generic as Generic +import Cardano.DbSync.Error (shortBsBase16Encode) import Cardano.Ledger.Crypto (StandardCrypto) import Cardano.Ledger.Mary.Value (PolicyID (..)) import Cardano.Prelude (ByteString, NonEmpty) @@ -61,4 +62,4 @@ shelleyInsertWhitelistCheck shelleyInsertOpts stakeAddress = do case shelleyInsertOpts of ShelleyEnable -> True ShelleyDisable -> True - ShelleyStakeAddrs shelleyWhitelist -> toShort stakeAddress `elem` shelleyWhitelist + ShelleyStakeAddrs shelleyWhitelist -> shortBsBase16Encode stakeAddress `elem` shelleyWhitelist