Skip to content

Commit

Permalink
Refactor tests for auxiliary data hash
Browse files Browse the repository at this point in the history
  • Loading branch information
ch1bo committed May 3, 2024
1 parent 270d30f commit c350a50
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 28 deletions.
3 changes: 0 additions & 3 deletions hydra-node/src/Hydra/Chain/Direct/Tx.hs
Original file line number Diff line number Diff line change
Expand Up @@ -343,9 +343,6 @@ commitTx networkId scriptRegistry headId party commitBlueprintTx (initialInput,
commitMetadata :: TxMetadata
commitMetadata = mkHydraHeadV1TxName "CommitTx"

getAuxMetadata :: AlonzoTxAuxData LedgerEra -> Map Word64 Metadatum
getAuxMetadata (AlonzoTxAuxData metadata _ _) = metadata

mkCommitDatum :: Party -> UTxO -> CurrencySymbol -> Plutus.Datum
mkCommitDatum party utxo headId =
Commit.datum (partyToChain party, commits, headId)
Expand Down
78 changes: 53 additions & 25 deletions hydra-node/test/Hydra/Chain/Direct/TxSpec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ import Hydra.Cardano.Api
import Hydra.Prelude hiding (label)

import Cardano.Api.UTxO qualified as UTxO
import Cardano.Ledger.Alonzo.TxAuxData (hashAlonzoTxAuxData, mkAlonzoTxAuxData)
import Cardano.Ledger.Alonzo.Core (EraTxAuxData (hashTxAuxData))
import Cardano.Ledger.Alonzo.TxAuxData (AlonzoTxAuxData (..))
import Cardano.Ledger.Api (
AlonzoPlutusPurpose (AlonzoSpending),
Metadatum,
Expand All @@ -32,7 +33,7 @@ import Cardano.Ledger.Core (EraTx (getMinFeeTx))
import Cardano.Ledger.Credential (Credential (..))
import Control.Lens ((^.))
import Data.Map qualified as Map
import Data.Maybe.Strict (StrictMaybe (..), fromSMaybe)
import Data.Maybe.Strict (StrictMaybe (..))
import Data.Set qualified as Set
import Data.Text qualified as T
import Hydra.Cardano.Api.Pretty (renderTx, renderTxWithUTxO)
Expand All @@ -50,7 +51,24 @@ import Hydra.Chain.Direct.Fixture qualified as Fixture
import Hydra.Chain.Direct.ScriptRegistry (genScriptRegistry, registryUTxO)
import Hydra.Chain.Direct.State (ChainContext (..), HasKnownUTxO (getKnownUTxO), genChainStateWithTx)
import Hydra.Chain.Direct.State qualified as Transition
import Hydra.Chain.Direct.Tx
import Hydra.Chain.Direct.Tx (
HeadObservation (..),
InitObservation (..),
abortTx,
commitTx,
currencySymbolToHeadId,
headIdToCurrencySymbol,
headIdToPolicyId,
headSeedToTxIn,
initTx,
mkCommitDatum,
mkHeadId,
observeHeadTx,
observeInitTx,
onChainIdToAssetName,
txInToHeadSeed,
verificationKeyToOnChainId,
)
import Hydra.Chain.Direct.Wallet (ErrCoverFee (..), coverFee_)
import Hydra.Contract.Commit qualified as Commit
import Hydra.Contract.HeadTokens (headPolicyId, mkHeadTokenScript)
Expand Down Expand Up @@ -215,23 +233,15 @@ spec =
& counterexample ("Blueprint transaction failed to evaluate: " <> renderTxWithUTxO lookupUTxO blueprintTx')
, propTransactionEvaluates (commitTx', spendableUTxO)
& counterexample ("Commit transaction failed to evaluate: " <> renderTxWithUTxO spendableUTxO commitTx')
, let blueprintMetadataVal = fromSMaybe mempty $ getAuxMetadata <$> blueprintTx ^. auxDataTxL
commitMetadataVal = fromSMaybe mempty $ getAuxMetadata <$> tx ^. auxDataTxL
TxMetadata commitMetadata' = commitMetadata
commitMetadataHash = tx ^. bodyTxL . auxDataHashTxBodyL
expectedMetadataHash =
SJust $
hashAlonzoTxAuxData $
mkAlonzoTxAuxData @[] @LedgerEra (Map.union (toShelleyMetadata commitMetadata') blueprintMetadataVal) []
in ( blueprintMetadataVal `Map.isSubmapOf` commitMetadataVal
.&&. prop_validateTxMetadata blueprintMetadataVal
.&&. prop_validateTxMetadata (toShelleyMetadata commitMetadata')
.&&. commitMetadataHash === expectedMetadataHash
)
& counterexample ("blueprint metadata: " <> show blueprintMetadataVal)
& counterexample ("commit metadata: " <> show commitMetadataVal)
& counterexample ("expected metadata hash: " <> show expectedMetadataHash)
& counterexample ("commit metadata hash: " <> show commitMetadataHash)
, conjoin
[ getAuxMetadata blueprintTx' `Map.isSubmapOf` getAuxMetadata commitTx'
& counterexample ("blueprint metadata: " <> show (getAuxMetadata blueprintTx'))
& counterexample ("commit metadata: " <> show (getAuxMetadata commitTx'))
, propHasValidAuxData blueprintTx'
& counterexample "Blueprint tx has invalid aux data"
, propHasValidAuxData commitTx'
& counterexample "Commit tx has invalid aux data"
]
, let blueprintValidity = blueprintBody ^. vldtTxBodyL
commitValidity = commitTxBody ^. vldtTxBodyL
in blueprintValidity === commitValidity
Expand Down Expand Up @@ -263,10 +273,22 @@ spec =
& counterexample ("commit reference inputs: " <> show commitRefInputs)
]

prop_validateTxMetadata :: Map Word64 Metadatum -> Bool
prop_validateTxMetadata metadataMap = do
let txAuxMetadata = mkAlonzoTxAuxData @[] @LedgerEra (toShelleyMetadata $ fromShelleyMetadata metadataMap) []
validateTxAuxData (pparams ^. ppProtocolVersionL) txAuxMetadata
-- | Check auxiliary data of a transaction against 'pparams' and whether the aux
-- data hash is consistent.
propHasValidAuxData :: Tx -> Property
propHasValidAuxData tx =
case toLedgerTx tx ^. auxDataTxL of
SNothing -> property True
SJust auxData ->
isValid auxData .&&. hashConsistent auxData
where
isValid auxData =
validateTxAuxData (pparams ^. ppProtocolVersionL) auxData
& counterexample "Auxiliary data validation failed"

hashConsistent auxData =
toLedgerTx tx ^. bodyTxL . auxDataHashTxBodyL === SJust (hashTxAuxData auxData)
& counterexample "Auxiliary data hash inconsistent"

genBlueprintTxWithUTxO :: Gen (UTxO, Tx)
genBlueprintTxWithUTxO =
Expand Down Expand Up @@ -338,10 +360,16 @@ genBlueprintTxWithUTxO =
)

genMetadata :: Gen TxMetadataInEra
genMetadata =
genMetadata = do
genMetadata' @LedgerEra >>= \(ShelleyTxAuxData m) ->
pure . TxMetadataInEra . TxMetadata $ fromShelleyMetadata m

getAuxMetadata :: Tx -> Map Word64 Metadatum
getAuxMetadata tx =
case toLedgerTx tx ^. auxDataTxL of
SNothing -> mempty
SJust (AlonzoTxAuxData m _ _) -> m

prop_interestingBlueprintTx :: Property
prop_interestingBlueprintTx = do
forAll genBlueprintTxWithUTxO $ \(utxo, tx) ->
Expand Down

0 comments on commit c350a50

Please sign in to comment.