Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extendend whitelist options #1644

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions cardano-chain-gen/cardano-chain-gen.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ library
build-depends: base >= 4.14 && < 5
, async
, aeson
, base16-bytestring
, bytestring
, cardano-binary
, cardano-crypto-class
Expand Down Expand Up @@ -166,6 +167,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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ module Cardano.Mock.Forging.Tx.Alonzo.ScriptsExamples (
alwaysMintScriptHash,
alwaysMintScriptAddr,
alwaysMintScriptStake,
alwaysMintScriptHashRandomPolicyVal,
scriptHash,
assetNames,
plutusData2,
Expand All @@ -47,6 +48,7 @@ import Codec.Serialise
import Codec.Serialise.Encoding
import Data.ByteString.Short
import Data.Maybe
import Numeric.Natural (Natural)
import Ouroboros.Consensus.Cardano.Block (StandardAlonzo)
import qualified PlutusCore.Data as Plutus
import qualified PlutusLedgerApi.Test.Examples as Plutus
Expand Down Expand Up @@ -103,6 +105,15 @@ alwaysMintScriptStake = ScriptHashObj alwaysMintScriptHash
mkPlutusScriptEra :: AlonzoEraScript era => PlutusBinary -> AlonzoScript era
mkPlutusScriptEra sh = PlutusScript $ fromJust $ mkBinaryPlutusScript PlutusV1 sh

alwaysMintScriptHashRandomPolicyVal :: Natural -> ScriptHash StandardCrypto
alwaysMintScriptHashRandomPolicyVal n = scriptHash @StandardAlonzo $ alwaysMintRandomScript n

alwaysMintRandomScript :: AlonzoEraScript era => Natural -> AlonzoScript era
alwaysMintRandomScript n = mkPlutusScriptEra $ alwaysMintRandomPlutusBinary n

alwaysMintRandomPlutusBinary :: Natural -> PlutusBinary
alwaysMintRandomPlutusBinary n = PlutusBinary $ Plutus.alwaysFailingNAryFunction n

scriptHash ::
forall era.
( EraCrypto era ~ StandardCrypto
Expand Down
17 changes: 17 additions & 0 deletions cardano-chain-gen/src/Cardano/Mock/Forging/Tx/Conway.hs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ module Cardano.Mock.Forging.Tx.Conway (
mkNewConstitutionTx,
mkDummyRegisterTx,
mkDummyTxBody,
mkDummyTxBodyWithFee,
mkTxDelegCert,
mkRegTxCert,
mkUnRegTxCert,
Expand Down Expand Up @@ -609,6 +610,22 @@ mkDummyTxBody =
(Withdrawals mempty)
mempty

mkDummyTxBodyWithFee ::
Coin ->
ConwayTxBody StandardConway
mkDummyTxBodyWithFee coin' =
consTxBody
mempty
mempty
mempty
mempty
SNothing
coin'
mempty
mempty
(Withdrawals mempty)
mempty

mkFullTx ::
Int ->
Integer ->
Expand Down
69 changes: 68 additions & 1 deletion cardano-chain-gen/src/Cardano/Mock/Query.hs
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,21 @@ module Cardano.Mock.Query (
queryGovActionCounts,
queryConstitutionAnchor,
queryRewardRests,
queryCollateralTxOutCount,
queryMultiAssetMetadataPolicy,
queryPoolUpdateCount,
queryStakeAddressCount,
queryStakeAddressHashRaw,
queryStakeDeRegCount,
queryStakeRegCount,
queryTreasuryDonations,
countTxOutNonNullStakeAddrIds,
) where

import qualified Cardano.Db as Db
import Cardano.Prelude hiding (from, on)
import Cardano.Prelude hiding (from, isNothing, on)
import qualified Data.ByteString.Base16 as Base16
import Data.ByteString.Short (ShortByteString, toShort)
import Database.Esqueleto.Experimental
import Prelude ()

Expand Down Expand Up @@ -162,3 +172,60 @@ queryTreasuryDonations = do

let total = join (unValue <$> res)
pure $ maybe 0 Db.unDbLovelace total

queryMultiAssetMetadataPolicy :: MonadIO io => ReaderT SqlBackend io (Maybe ShortByteString)
queryMultiAssetMetadataPolicy = do
res <- selectOne $ 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

queryStakeAddressCount :: MonadIO io => ReaderT SqlBackend io Word
queryStakeAddressCount = do
res <- selectOne $ do
_ <- from (table @Db.StakeAddress)
pure countRows
pure $ maybe 0 unValue res

queryCollateralTxOutCount :: MonadIO io => ReaderT SqlBackend io Word
queryCollateralTxOutCount = do
res <- selectOne $ do
_ <- from (table @Db.CollateralTxOut)
pure countRows
pure $ maybe 0 unValue res

queryPoolUpdateCount :: MonadIO io => ReaderT SqlBackend io Word
queryPoolUpdateCount = do
res <- selectOne $ do
_ <- from (table @Db.PoolUpdate)
pure countRows
pure $ maybe 0 unValue res

queryStakeDeRegCount :: MonadIO io => ReaderT SqlBackend io Word
queryStakeDeRegCount = do
res <- selectOne $ do
_ <- from (table @Db.StakeDeregistration)
pure countRows
pure $ maybe 0 unValue res

queryStakeRegCount :: MonadIO io => ReaderT SqlBackend io Word
queryStakeRegCount = do
res <- selectOne $ do
_ <- from (table @Db.StakeRegistration)
pure countRows
pure $ maybe 0 unValue res

countTxOutNonNullStakeAddrIds :: (MonadIO m) => SqlPersistT m Word
countTxOutNonNullStakeAddrIds = do
result <- selectOne $ do
txOut <- from $ table @Db.TxOut
where_ $ not_ (isNothing $ txOut ^. Db.TxOutStakeAddressId)
pure countRows
pure $ maybe 0 unValue result
16 changes: 15 additions & 1 deletion cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway.hs
Original file line number Diff line number Diff line change
Expand Up @@ -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.Cardano.Db.Mock.Validate (expectFailSilent)
import Test.Tasty (TestTree (), testGroup)
import Test.Tasty.HUnit (Assertion (), testCase)
Expand All @@ -42,6 +43,12 @@ unitTests iom knownMigrations =
"remove jsonb from schema and add back"
Config.configJsonbInSchemaShouldRemoveThenAdd
]
, testGroup
"invalid whitelist hashes"
[ testCase "Fail if Shelley stake address hash is invalid" Config.invalidShelleyStkAddrHash
, testCase "Fail if multi-asset policies hash is invalid" Config.invalidMultiAssetPoliciesHash
, testCase "Fail if Plutus script hash invalid" Config.invalidPlutusScriptHash
]
, testGroup
"tx-out"
[ test "consumed_by_tx_id column check" MigrateConsumedPruneTxOut.txConsumedColumnCheck
Expand Down Expand Up @@ -113,7 +120,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
]
, testGroup
"stake addresses"
Expand Down Expand Up @@ -175,6 +181,14 @@ unitTests iom knownMigrations =
, test "swap many multi assets" Plutus.swapMultiAssets
, test "swap with multi assets disabled" Plutus.swapMultiAssetsDisabled
]
, 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
, test "add full tx, with stake address whitelist" Whitelist.fullTxStakeAddressWhitelist
]
, testGroup
"Pools and smash"
[ test "pool registration" Other.poolReg
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,29 @@ module Test.Cardano.Db.Mock.Unit.Conway.Config.Parse (
wrongConwayGenesisHash,
insertConfig,
defaultInsertConfig,
) where
invalidShelleyStkAddrHash,
invalidMultiAssetPoliciesHash,
invalidPlutusScriptHash,
)
where

import Cardano.DbSync.Config
import Cardano.DbSync.Config.Types
import Cardano.DbSync.Error
import Cardano.Prelude hiding (from, isNothing)
import qualified Data.Aeson as Aeson
import Data.Default.Class (Default (..))
import Data.String (String)
import Data.Text (pack)
import Test.Cardano.Db.Mock.Config
import Test.Tasty.HUnit (Assertion (), assertBool, (@?=))
import Prelude ()

conwayGenesis :: Assertion
conwayGenesis =
mkSyncNodeConfig configDir initCommandLineArgs
>>= void . mkConfig configDir mutableDir cmdLineArgs
>>= void
. mkConfig configDir mutableDir cmdLineArgs
where
configDir = "config-conway"
mutableDir = mkMutableDir "conwayConfigSimple"
Expand Down Expand Up @@ -109,3 +116,27 @@ insertConfig = do
dncInsertOptions cfg @?= expected
where
configDir = "config-conway-insert-options"

invalidShelleyStkAddrHash :: Assertion
invalidShelleyStkAddrHash =
let invalidJson = "{ \"enable\": true, \"stake_addresses\": " <> invalidHash <> " }"
decodedResult :: Either String ShelleyInsertConfig
decodedResult = Aeson.eitherDecodeStrict $ encodeUtf8 $ pack invalidJson
in assertBool "Decoding should fail for invalid Shelley stake address hash" (isLeft decodedResult)

invalidMultiAssetPoliciesHash :: Assertion
invalidMultiAssetPoliciesHash =
let invalidJson = "{ \"enable\": true, \"policies\": " <> invalidHash <> " }"
decodedResult :: Either String MultiAssetConfig
decodedResult = Aeson.eitherDecodeStrict $ encodeUtf8 $ pack invalidJson
in assertBool "Decoding should fail for invalid MultiAsset policies hash" (isLeft decodedResult)

invalidPlutusScriptHash :: Assertion
invalidPlutusScriptHash =
let invalidJson = "{ \"enable\": true, \"script_hashes\": " <> invalidHash <> " }"
decodedResult :: Either String PlutusConfig
decodedResult = Aeson.eitherDecodeStrict $ encodeUtf8 $ pack invalidJson
in assertBool "Decoding should fail for invalid Plutus script hash" (isLeft decodedResult)

invalidHash :: String
invalidHash = "[\"\\xe0758b08dea05dabd1cd3510689ebd9efb6a49316acb30eead750e2e9e\"]"
73 changes: 42 additions & 31 deletions cardano-chain-gen/test/Test/Cardano/Db/Mock/Unit/Conway/Plutus.hs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{-# LANGUAGE NumericUnderscores #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}

module Test.Cardano.Db.Mock.Unit.Conway.Plutus (
Expand Down Expand Up @@ -32,6 +33,8 @@ module Test.Cardano.Db.Mock.Unit.Conway.Plutus (

import Cardano.Crypto.Hash.Class (hashToBytes)
import qualified Cardano.Db as DB
import Cardano.DbSync.Config (SyncNodeConfig (..))
import Cardano.DbSync.Config.Types (MultiAssetConfig (..), SyncInsertOptions (..))
import Cardano.DbSync.Era.Shelley.Generic.Util (renderAddress)
import Cardano.Ledger.Coin (Coin (..))
import Cardano.Ledger.Mary.Value (MaryValue (..), MultiAsset (..), PolicyID (..))
Expand Down Expand Up @@ -763,41 +766,49 @@ swapMultiAssets =
testLabel = "conwaySwapMultiAssets"

swapMultiAssetsDisabled :: IOManager -> [(Text, Text)] -> Assertion
swapMultiAssetsDisabled =
withCustomConfig args Nothing cfgDir testLabel $ \interpreter mockServer dbSync -> do
startDBSync dbSync
swapMultiAssetsDisabled ioManager metadata = do
syncNodeConfig <- mksNodeConfig
withCustomConfig cmdlArgs (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 policy = PolicyID Examples.alwaysMintScriptHash
assets = Map.singleton (Prelude.head Examples.assetNames) 1
mintedValue = MultiAsset $ Map.singleton policy assets
outValue = MaryValue (Coin 20) (MultiAsset $ Map.singleton policy assets)

-- Forge a multi-asset script
tx0 <-
Conway.mkMultiAssetsScriptTx
[UTxOIndex 0]
(UTxOIndex 1)
[(UTxOAddress Examples.alwaysSucceedsScriptAddr, outValue)]
[]
mintedValue
True
100
state'

-- Forge a block with multiple multi-asset scripts
void $ Api.withConwayFindLeaderAndSubmit interpreter mockServer $ \state' -> do
let policy = PolicyID Examples.alwaysMintScriptHash
assets = Map.singleton (Prelude.head Examples.assetNames) 1
mintedValue = MultiAsset $ Map.singleton policy assets
outValue = MaryValue (Coin 20) (MultiAsset $ Map.singleton policy assets)
pure [tx0]

-- Forge a multi-asset script
tx0 <-
Conway.mkMultiAssetsScriptTx
[UTxOIndex 0]
(UTxOIndex 1)
[(UTxOAddress Examples.alwaysSucceedsScriptAddr, outValue)]
[]
mintedValue
True
100
state'
-- Wait for it to sync
assertBlockNoBackoff dbSync 1
-- Verify multi-assets
assertEqBackoff dbSync queryMultiAssetCount 0 [] "Unexpected multi-assets"

pure [tx0]
cmdlArgs = initCommandLineArgs {claFullMode = False}

-- Wait for it to sync
assertBlockNoBackoff dbSync 1
-- Verify multi-assets
assertEqBackoff dbSync queryMultiAssetCount 0 [] "Unexpected multi-assets"
where
args =
initCommandLineArgs
{ claConfigFilename = "test-db-sync-config-no-multi-assets.json"
, claFullMode = False
}
mksNodeConfig :: IO SyncNodeConfig
mksNodeConfig = do
initConfigFile <- mkSyncNodeConfig cfgDir cmdlArgs
let dncInsertOptions' = dncInsertOptions initConfigFile
pure $
initConfigFile
{ dncInsertOptions = dncInsertOptions' {sioMultiAsset = MultiAssetDisable}
}

testLabel = "conwayConfigMultiAssetsDisabled"
cfgDir = conwayConfigDir
Original file line number Diff line number Diff line change
Expand Up @@ -416,7 +416,7 @@ registerStakeCreds = do

registerStakeCredsNoShelley :: IOManager -> [(Text, Text)] -> Assertion
registerStakeCredsNoShelley = do
withCustomConfig args Nothing cfgDir testLabel $ \interpreter mockServer dbSync -> do
withCustomConfigAndDropDB args Nothing cfgDir testLabel $ \interpreter mockServer dbSync -> do
startDBSync dbSync

-- These should not be saved when shelley is disabled
Expand Down
Loading
Loading