Skip to content

Commit 25bfd99

Browse files
committed
Switch AlonzoTxAuxData to use NativeScript
1 parent ad2b961 commit 25bfd99

File tree

16 files changed

+162
-113
lines changed

16 files changed

+162
-113
lines changed

eras/allegra/impl/src/Cardano/Ledger/Allegra/Scripts.hs

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
{-# LANGUAGE AllowAmbiguousTypes #-}
12
{-# LANGUAGE CPP #-}
23
{-# LANGUAGE DataKinds #-}
4+
{-# LANGUAGE DefaultSignatures #-}
35
{-# LANGUAGE DeriveAnyClass #-}
46
{-# LANGUAGE DeriveGeneric #-}
57
{-# LANGUAGE DerivingVia #-}
@@ -73,7 +75,7 @@ import Cardano.Ledger.Binary.Coders (
7375
(<*!),
7476
)
7577
import Cardano.Ledger.Core
76-
import Cardano.Ledger.Internal.Era (AlonzoEra, BabbageEra, ConwayEra, MaryEra)
78+
import Cardano.Ledger.Internal.Era (AlonzoEra, BabbageEra, ConwayEra, MaryEra, ShelleyEra)
7779
import Cardano.Ledger.MemoBytes (
7880
EqRaw (..),
7981
MemoBytes (Memo),
@@ -99,6 +101,7 @@ import Data.Aeson (ToJSON (..), (.=))
99101
import qualified Data.Aeson as Aeson
100102
import Data.ByteString.Lazy (fromStrict)
101103
import Data.ByteString.Short (fromShort)
104+
import Data.Coerce (Coercible, coerce)
102105
import Data.Foldable as F (foldl')
103106
import Data.MemPack
104107
import Data.Sequence.Strict as Seq (StrictSeq (Empty, (:<|)))
@@ -156,6 +159,12 @@ class ShelleyEraScript era => AllegraEraScript era where
156159
mkTimeExpire :: SlotNo -> NativeScript era
157160
getTimeExpire :: NativeScript era -> Maybe SlotNo
158161

162+
upgradeNativeScript :: NativeScript (PreviousEra era) -> NativeScript era
163+
default upgradeNativeScript ::
164+
Coercible (NativeScript (PreviousEra era)) (NativeScript era) =>
165+
NativeScript (PreviousEra era) -> NativeScript era
166+
upgradeNativeScript = coerce
167+
159168
deriving instance Era era => NoThunks (TimelockRaw era)
160169

161170
deriving instance Show (TimelockRaw era)
@@ -244,19 +253,22 @@ deriving instance Show (Timelock era)
244253
instance EqRaw (Timelock era) where
245254
eqRaw = eqTimelockRaw
246255

256+
upgradeMultiSig :: NativeScript ShelleyEra -> NativeScript AllegraEra
257+
upgradeMultiSig = \case
258+
RequireSignature keyHash -> RequireSignature keyHash
259+
RequireAllOf sigs -> RequireAllOf $ upgradeScript <$> sigs
260+
RequireAnyOf sigs -> RequireAnyOf $ upgradeScript <$> sigs
261+
RequireMOf n sigs -> RequireMOf n $ upgradeScript <$> sigs
262+
_ -> error "Impossible: All NativeScripts should have been accounted for"
263+
247264
-- | Since Timelock scripts are a strictly backwards compatible extension of
248265
-- MultiSig scripts, we can use the same 'scriptPrefixTag' tag here as we did
249266
-- for the ValidateScript instance in MultiSig
250267
instance EraScript AllegraEra where
251268
type Script AllegraEra = Timelock AllegraEra
252269
type NativeScript AllegraEra = Timelock AllegraEra
253270

254-
upgradeScript = \case
255-
RequireSignature keyHash -> RequireSignature keyHash
256-
RequireAllOf sigs -> RequireAllOf $ upgradeScript <$> sigs
257-
RequireAnyOf sigs -> RequireAnyOf $ upgradeScript <$> sigs
258-
RequireMOf n sigs -> RequireMOf n $ upgradeScript <$> sigs
259-
_ -> error "Impossible: All NativeScripts should have been accounted for"
271+
upgradeScript = upgradeMultiSig
260272

261273
scriptPrefixTag _script = nativeMultiSigTag -- "\x00"
262274

@@ -284,6 +296,8 @@ instance AllegraEraScript AllegraEra where
284296
mkTimeExpire = mkTimeExpireTimelock
285297
getTimeExpire = getTimeExpireTimelock
286298

299+
upgradeNativeScript = upgradeMultiSig
300+
287301
pattern RequireTimeExpire :: AllegraEraScript era => SlotNo -> NativeScript era
288302
pattern RequireTimeExpire mslot <- (getTimeExpire -> Just mslot)
289303
where
@@ -448,8 +462,6 @@ showTimelock (RequireMOf m xs) = "(MOf " ++ show m ++ " " ++ F.foldl' accum ")"
448462
showTimelock (RequireSignature hash) = "(Signature " ++ show hash ++ ")"
449463
showTimelock _ = error "Impossible: All NativeScripts should have been accounted for"
450464

451-
-- | Check the equality of two underlying types, while ignoring their binary
452-
-- representation, which `Eq` instance normally does. This is used for testing.
453465
eqTimelockRaw :: Timelock era -> Timelock era -> Bool
454466
eqTimelockRaw t1 t2 = go (getMemoRawType t1) (getMemoRawType t2)
455467
where

eras/allegra/impl/src/Cardano/Ledger/Allegra/TxAuxData.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ import NoThunks.Class (NoThunks)
7474
data AllegraTxAuxDataRaw era = AllegraTxAuxDataRaw
7575
{ atadrMetadata :: !(Map Word64 Metadatum)
7676
-- ^ Structured transaction metadata
77-
, atadrTimelock :: !(StrictSeq (Timelock era))
77+
, atadrNativeScripts :: !(StrictSeq (Timelock era))
7878
-- ^ Pre-images of script hashes found within the TxBody, but which are not
7979
-- required as witnesses. Examples include:
8080
-- - Token policy IDs appearing in transaction outputs
@@ -108,8 +108,8 @@ timelockScriptsAllegraTxAuxDataL ::
108108
Era era =>
109109
Lens' (AllegraTxAuxData era) (StrictSeq (Timelock era))
110110
timelockScriptsAllegraTxAuxDataL =
111-
lensMemoRawType @era atadrTimelock $
112-
\txAuxDataRaw ts -> txAuxDataRaw {atadrTimelock = ts}
111+
lensMemoRawType @era atadrNativeScripts $
112+
\txAuxDataRaw ts -> txAuxDataRaw {atadrNativeScripts = ts}
113113

114114
deriving instance Show (AllegraTxAuxDataRaw era)
115115

eras/alonzo/impl/src/Cardano/Ledger/Alonzo/Scripts.hs

Lines changed: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
module Cardano.Ledger.Alonzo.Scripts (
2626
PlutusBinary (..),
27-
AlonzoScript (TimelockScript, PlutusScript),
27+
AlonzoScript (NativeScript, PlutusScript),
2828
Script,
2929
isPlutusScript,
3030
validScript,
@@ -426,44 +426,52 @@ pattern RewardingPurpose c <- (toRewardingPurpose -> Just c)
426426

427427
-- Alonzo Script ===============================================================
428428

429-
-- | Scripts in the Alonzo Era, Either a Timelock script or a Plutus script.
429+
-- | Scripts in the Alonzo Era, Either a nativve script or a Plutus script.
430430
data AlonzoScript era
431-
= TimelockScript !(Timelock era)
431+
= NativeScript !(NativeScript era)
432432
| PlutusScript !(PlutusScript era)
433433
deriving (Generic)
434434

435-
instance (Era era, MemPack (PlutusScript era)) => MemPack (AlonzoScript era) where
435+
instance
436+
( Era era
437+
, MemPack (PlutusScript era)
438+
, MemPack (NativeScript era)
439+
) =>
440+
MemPack (AlonzoScript era)
441+
where
436442
packedByteCount = \case
437-
TimelockScript script -> packedTagByteCount + packedByteCount script
443+
NativeScript script -> packedTagByteCount + packedByteCount script
438444
PlutusScript script -> packedTagByteCount + packedByteCount script
439445
packM = \case
440-
TimelockScript script -> packTagM 0 >> packM script
446+
NativeScript script -> packTagM 0 >> packM script
441447
PlutusScript script -> packTagM 1 >> packM script
442448
{-# INLINE packM #-}
443449
unpackM =
444450
unpackTagM >>= \case
445-
0 -> TimelockScript <$> unpackM
451+
0 -> NativeScript <$> unpackM
446452
1 -> PlutusScript <$> unpackM
447453
n -> unknownTagM @(AlonzoScript era) n
448454
{-# INLINE unpackM #-}
449455

450-
deriving instance Eq (PlutusScript era) => Eq (AlonzoScript era)
456+
deriving instance (Eq (PlutusScript era), Eq (NativeScript era)) => Eq (AlonzoScript era)
451457

452-
instance (Era era, NoThunks (PlutusScript era)) => NoThunks (AlonzoScript era)
458+
instance
459+
(Era era, NoThunks (PlutusScript era), NoThunks (NativeScript era)) =>
460+
NoThunks (AlonzoScript era)
453461

454-
instance NFData (PlutusScript era) => NFData (AlonzoScript era) where
462+
instance (NFData (PlutusScript era), NFData (NativeScript era)) => NFData (AlonzoScript era) where
455463
rnf = \case
456-
TimelockScript ts -> rnf ts
464+
NativeScript ts -> rnf ts
457465
PlutusScript ps -> rnf ps
458466

459467
instance (AlonzoEraScript era, Script era ~ AlonzoScript era) => Show (AlonzoScript era) where
460-
show (TimelockScript x) = "TimelockScript " ++ show x
468+
show (NativeScript x) = "NativeScript " ++ show x
461469
show s@(PlutusScript plutus) =
462470
"PlutusScript " ++ show (plutusScriptLanguage plutus) ++ " " ++ show (hashScript @era s)
463471

464472
-- | Both constructors know their original bytes
465-
instance SafeToHash (PlutusScript era) => SafeToHash (AlonzoScript era) where
466-
originalBytes (TimelockScript t) = originalBytes t
473+
instance (SafeToHash (PlutusScript era), SafeToHash (NativeScript era)) => SafeToHash (AlonzoScript era) where
474+
originalBytes (NativeScript t) = originalBytes t
467475
originalBytes (PlutusScript plutus) = originalBytes plutus
468476

469477
isPlutusScript :: AlonzoEraScript era => Script era -> Bool
@@ -473,22 +481,22 @@ instance EraScript AlonzoEra where
473481
type Script AlonzoEra = AlonzoScript AlonzoEra
474482
type NativeScript AlonzoEra = Timelock AlonzoEra
475483

476-
upgradeScript = TimelockScript . translateTimelock
484+
upgradeScript = NativeScript . translateTimelock
477485

478486
scriptPrefixTag = alonzoScriptPrefixTag
479487

480488
getNativeScript = \case
481-
TimelockScript ts -> Just ts
489+
NativeScript ts -> Just ts
482490
_ -> Nothing
483491

484-
fromNativeScript = TimelockScript
492+
fromNativeScript = NativeScript
485493

486494
alonzoScriptPrefixTag ::
487495
(AlonzoEraScript era, AlonzoScript era ~ Script era) =>
488496
Script era ->
489497
BS.ByteString
490498
alonzoScriptPrefixTag = \case
491-
TimelockScript _ -> nativeMultiSigTag -- "\x00"
499+
NativeScript _ -> nativeMultiSigTag -- "\x00"
492500
PlutusScript plutusScript -> BS.singleton (withPlutusScript plutusScript plutusLanguageTag)
493501

494502
instance ShelleyEraScript AlonzoEra where
@@ -555,7 +563,12 @@ instance AlonzoEraScript AlonzoEra where
555563
upgradePlutusPurposeAsIx =
556564
error "Impossible: No `PlutusScript` and `AlonzoEraScript` instances in the previous era"
557565

558-
instance Eq (PlutusScript era) => EqRaw (AlonzoScript era) where
566+
instance
567+
( Eq (PlutusScript era)
568+
, EqRaw (NativeScript era)
569+
) =>
570+
EqRaw (AlonzoScript era)
571+
where
559572
eqRaw = eqAlonzoScriptRaw
560573

561574
instance AlonzoEraScript era => ToJSON (AlonzoScript era) where
@@ -598,7 +611,7 @@ instance AlonzoEraScript era => ToCBOR (AlonzoScript era) where
598611

599612
encodeScript :: AlonzoEraScript era => AlonzoScript era -> Encode 'Open (AlonzoScript era)
600613
encodeScript = \case
601-
TimelockScript i -> Sum TimelockScript 0 !> To i
614+
NativeScript i -> Sum NativeScript 0 !> To i
602615
PlutusScript plutusScript -> withPlutusScript plutusScript $ \plutus@(Plutus pb) ->
603616
case plutusSLanguage plutus of
604617
SPlutusV1 -> Sum (PlutusScript . fromJust . mkPlutusScript . Plutus @'PlutusV1) 1 !> To pb
@@ -614,7 +627,7 @@ instance AlonzoEraScript era => DecCBOR (Annotator (AlonzoScript era)) where
614627
{-# INLINE decodeAnnPlutus #-}
615628
decodeScript :: Word -> Decode 'Open (Annotator (AlonzoScript era))
616629
decodeScript = \case
617-
0 -> Ann (SumD TimelockScript) <*! From
630+
0 -> Ann (SumD NativeScript) <*! From
618631
1 -> decodeAnnPlutus SPlutusV1
619632
2 -> decodeAnnPlutus SPlutusV2
620633
3 -> decodeAnnPlutus SPlutusV3
@@ -636,8 +649,12 @@ validScript pv script =
636649

637650
-- | Check the equality of two underlying types, while ignoring their binary
638651
-- representation, which `Eq` instance normally does. This is used for testing.
639-
eqAlonzoScriptRaw :: Eq (PlutusScript era) => AlonzoScript era -> AlonzoScript era -> Bool
640-
eqAlonzoScriptRaw (TimelockScript t1) (TimelockScript t2) = eqTimelockRaw t1 t2
652+
eqAlonzoScriptRaw ::
653+
( Eq (PlutusScript era)
654+
, EqRaw (NativeScript era)
655+
) =>
656+
AlonzoScript era -> AlonzoScript era -> Bool
657+
eqAlonzoScriptRaw (NativeScript t1) (NativeScript t2) = eqRaw t1 t2
641658
eqAlonzoScriptRaw (PlutusScript ps1) (PlutusScript ps2) = ps1 == ps2
642659
eqAlonzoScriptRaw _ _ = False
643660

0 commit comments

Comments
 (0)