Skip to content

Commit b03965b

Browse files
committed
Preserve original CBOR bytes of ScriptData which has now been wrapped with
the `HashableScriptData` type. Prior to this commit we were constructing transactions with `toAlonzoData` which created a ledger `Data` value without using the original bytes. Although the content is the same this can result in the re-encoded value differing slightly and therefore resulting in differing script data hashes. See: IntersectMBO/cardano-ledger#2943 for more details.
1 parent 7074c45 commit b03965b

File tree

16 files changed

+259
-139
lines changed

16 files changed

+259
-139
lines changed

Diff for: cardano-api/ChangeLog.md

+3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616

1717
- **Breaking change** - `deserialiseFromRawBytes` method of the `SerialiseAsRawBytes` type class to return `Either` instead of `Maybe`. Deprecate `eitherDeserialiseFromRawBytes`. Use `deserialiseFromRawBytes` instead.
1818

19+
- **Breaking change** - Preserve ScriptData bytes with HashableScriptData ([PR4886](https://github.com/input-output-hk/cardano-node/pull/4886))
20+
21+
1922
### Bugs
2023

2124
- Allow reading text envelopes from pipes ([PR 4384](https://github.com/input-output-hk/cardano-node/pull/4384))

Diff for: cardano-api/cardano-api.cabal

+3-1
Original file line numberDiff line numberDiff line change
@@ -196,9 +196,9 @@ library gen
196196
, cardano-ledger-alonzo-test
197197
, cardano-ledger-byron-test ^>= 1.4
198198
, cardano-ledger-core ^>= 0.1
199+
, cardano-ledger-shelley ^>= 0.1
199200
, containers
200201
, hedgehog
201-
, cardano-ledger-shelley ^>= 0.1
202202
, text
203203

204204
test-suite cardano-api-test
@@ -216,11 +216,13 @@ test-suite cardano-api-test
216216
, cardano-crypto-class ^>= 2.0
217217
, cardano-crypto-test ^>= 1.4
218218
, cardano-crypto-tests ^>= 2.0
219+
, cardano-ledger-alonzo ^>= 0.1
219220
, cardano-ledger-core ^>= 0.1
220221
, cardano-slotting ^>= 0.1
221222
, containers
222223
, hedgehog
223224
, hedgehog-extras
225+
, mtl
224226
, ouroboros-consensus
225227
, ouroboros-consensus-shelley
226228
, QuickCheck

Diff for: cardano-api/gen/Test/Gen/Cardano/Api/Typed.hs

+20-5
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ module Test.Gen.Cardano.Api.Typed
2727
, genUTxO
2828

2929
-- * Scripts
30+
, genHashableScriptData
3031
, genReferenceScript
3132
, genScript
3233
, genSimpleScript
@@ -35,6 +36,7 @@ module Test.Gen.Cardano.Api.Typed
3536
, genScriptInEra
3637
, genScriptHash
3738
, genScriptData
39+
, genScriptDataSchema
3840
, genScriptValidity
3941

4042
, genAssetName
@@ -109,13 +111,14 @@ import Cardano.Api hiding (txIns)
109111
import qualified Cardano.Api as Api
110112
import Cardano.Api.Byron (KeyWitness (ByronKeyWitness),
111113
WitnessNetworkIdOrByronAddress (..))
112-
import Cardano.Api.Shelley (Hash (ScriptDataHash), KESPeriod (KESPeriod),
114+
import Cardano.Api.Shelley (Hash (..), KESPeriod (KESPeriod),
113115
OperationalCertificateIssueCounter (OperationalCertificateIssueCounter),
114116
PlutusScript (PlutusScriptSerialised), ProtocolParameters (ProtocolParameters),
115117
ReferenceScript (..), ReferenceTxInsScriptsInlineDatumsSupportedInEra (..),
116118
StakeCredential (StakeCredentialByKey), StakePoolKey,
117119
refInsScriptsAndInlineDatsSupportedInEra)
118120

121+
119122
import Data.ByteString (ByteString)
120123
import qualified Data.ByteString as BS
121124
import qualified Data.ByteString.Short as SBS
@@ -220,6 +223,18 @@ genPlutusScript _ =
220223
-- We make no attempt to create a valid script
221224
PlutusScriptSerialised . SBS.toShort <$> Gen.bytes (Range.linear 0 32)
222225

226+
genScriptDataSchema :: Gen ScriptDataJsonSchema
227+
genScriptDataSchema = Gen.element [ScriptDataJsonNoSchema, ScriptDataJsonDetailedSchema]
228+
229+
genHashableScriptData :: Gen HashableScriptData
230+
genHashableScriptData = do
231+
sd <- genScriptData
232+
case deserialiseFromCBOR AsHashableScriptData $ serialiseToCBOR sd of
233+
Left e -> error $ "genHashableScriptData: " <> show e
234+
Right r -> return r
235+
236+
237+
{-# DEPRECATED genScriptData "Use genHashableScriptData" #-}
223238
genScriptData :: Gen ScriptData
224239
genScriptData =
225240
Gen.recursive
@@ -891,13 +906,13 @@ genTxOutDatumHashTxContext era = case era of
891906
AlonzoEra -> Gen.choice
892907
[ pure TxOutDatumNone
893908
, TxOutDatumHash ScriptDataInAlonzoEra <$> genHashScriptData
894-
, TxOutDatumInTx ScriptDataInAlonzoEra <$> genScriptData
909+
, TxOutDatumInTx ScriptDataInAlonzoEra <$> genHashableScriptData
895910
]
896911
BabbageEra -> Gen.choice
897912
[ pure TxOutDatumNone
898913
, TxOutDatumHash ScriptDataInBabbageEra <$> genHashScriptData
899-
, TxOutDatumInTx ScriptDataInBabbageEra <$> genScriptData
900-
, TxOutDatumInline ReferenceTxInsScriptsInlineDatumsInBabbageEra <$> genScriptData
914+
, TxOutDatumInTx ScriptDataInBabbageEra <$> genHashableScriptData
915+
, TxOutDatumInline ReferenceTxInsScriptsInlineDatumsInBabbageEra <$> genHashableScriptData
901916
]
902917

903918
genTxOutDatumHashUTxOContext :: CardanoEra era -> Gen (TxOutDatum CtxUTxO era)
@@ -913,7 +928,7 @@ genTxOutDatumHashUTxOContext era = case era of
913928
BabbageEra -> Gen.choice
914929
[ pure TxOutDatumNone
915930
, TxOutDatumHash ScriptDataInBabbageEra <$> genHashScriptData
916-
, TxOutDatumInline ReferenceTxInsScriptsInlineDatumsInBabbageEra <$> genScriptData
931+
, TxOutDatumInline ReferenceTxInsScriptsInlineDatumsInBabbageEra <$> genHashableScriptData
917932
]
918933

919934
mkDummyHash :: forall h a. CRYPTO.HashAlgorithm h => Int -> CRYPTO.Hash h a

Diff for: cardano-api/src/Cardano/Api.hs

+6
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,10 @@ module Cardano.Api (
399399
examplePlutusScriptAlwaysFails,
400400

401401
-- ** Script data
402+
HashableScriptData,
403+
hashScriptDataBytes,
404+
getOriginalScriptDataBytes,
405+
getScriptData,
402406
ScriptData(..),
403407
hashScriptData,
404408

@@ -412,6 +416,8 @@ module Cardano.Api (
412416
scriptDataToJson,
413417
ScriptDataJsonError (..),
414418
ScriptDataJsonSchemaError (..),
419+
ScriptDataJsonBytesError,
420+
scriptDataJsonToHashable,
415421

416422
-- ** Script execution units
417423
ExecutionUnits(..),

Diff for: cardano-api/src/Cardano/Api/Script.hs

+5-5
Original file line numberDiff line numberDiff line change
@@ -792,13 +792,13 @@ instance Eq (ScriptWitness witctx era) where
792792

793793
(==) _ _ = False
794794

795-
type ScriptRedeemer = ScriptData
795+
type ScriptRedeemer = HashableScriptData
796796

797797
data ScriptDatum witctx where
798-
ScriptDatumForTxIn :: ScriptData -> ScriptDatum WitCtxTxIn
799-
InlineScriptDatum :: ScriptDatum WitCtxTxIn
800-
NoScriptDatumForMint :: ScriptDatum WitCtxMint
801-
NoScriptDatumForStake :: ScriptDatum WitCtxStake
798+
ScriptDatumForTxIn :: HashableScriptData -> ScriptDatum WitCtxTxIn
799+
InlineScriptDatum :: ScriptDatum WitCtxTxIn
800+
NoScriptDatumForMint :: ScriptDatum WitCtxMint
801+
NoScriptDatumForStake :: ScriptDatum WitCtxStake
802802

803803
deriving instance Eq (ScriptDatum witctx)
804804
deriving instance Show (ScriptDatum witctx)

0 commit comments

Comments
 (0)