Skip to content

Commit 412397f

Browse files
committed
Restrict languages in Alonzo cost model parsing
Only allow `PlutusV1` when parsing cost models in `AlonzoGenesis` and `UpgradeAlonzoPParams`.
1 parent fd1a1e4 commit 412397f

File tree

9 files changed

+445
-250
lines changed

9 files changed

+445
-250
lines changed

eras/alonzo/impl/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## 1.15.0.0
44

5+
* Renamed `uappCostModels` to `uappPlutusV1CostModel`
6+
and changed its type from `CostModels` to `CostModel`
7+
* Renamed `agCostModels` to `agPlutusV1CostModel`
8+
and changed its type from `CostModels` to `CostModel`
59
* Updated `AlonzoGenesis` with `extraConfig` field
610
* Added `AlonzoExtraConfig` and its instances
711
* Remove deprecated functions `nullRedeemers`, `lookupRedeemers`, `nullDats`

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

Lines changed: 57 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ module Cardano.Ledger.Alonzo.Genesis (
2121
extraConfig,
2222
AlonzoGenesis,
2323
agCoinsPerUTxOWord,
24-
agCostModels,
24+
agPlutusV1CostModel,
2525
agPrices,
2626
agMaxTxExUnits,
2727
agMaxBlockExUnits,
@@ -38,25 +38,29 @@ import Cardano.Ledger.Alonzo.PParams (
3838
CoinPerWord,
3939
UpgradeAlonzoPParams (..),
4040
)
41-
import Cardano.Ledger.Alonzo.Scripts (CostModels, ExUnits (..), Prices (..))
41+
import Cardano.Ledger.Alonzo.Scripts (
42+
CostModel,
43+
CostModels,
44+
ExUnits (..),
45+
Prices (..),
46+
decodeCostModel,
47+
decodeCostModelsLenient,
48+
encodeCostModel,
49+
)
4250
import Cardano.Ledger.BaseTypes (KeyValuePairs (..), ToKeyValuePairs (..))
4351
import Cardano.Ledger.Binary (
44-
DecCBOR,
45-
EncCBOR,
52+
DecCBOR (..),
53+
EncCBOR (..),
4654
FromCBOR (..),
4755
ToCBOR (..),
56+
decodeNullMaybe,
57+
encodeNullMaybe,
4858
)
49-
import Cardano.Ledger.Binary.Coders (
50-
Decode (From, RecD),
51-
Encode (Rec, To),
52-
decode,
53-
encode,
54-
(!>),
55-
(<!),
56-
)
59+
import Cardano.Ledger.Binary.Coders
5760
import Cardano.Ledger.Core
5861
import Cardano.Ledger.Genesis (EraGenesis (..))
59-
import Cardano.Ledger.Plutus.CostModels (parseCostModels)
62+
import Cardano.Ledger.Plutus.CostModels (parseCostModelAsArray, parseCostModels)
63+
import Cardano.Ledger.Plutus.Language (Language (..))
6064
import Control.DeepSeq (NFData)
6165
import Data.Aeson (FromJSON (..), ToJSON (..), (.:), (.:?), (.=))
6266
import qualified Data.Aeson as Aeson
@@ -81,20 +85,38 @@ newtype AlonzoExtraConfig = AlonzoExtraConfig
8185
{ aecCostModels :: Maybe CostModels
8286
}
8387
deriving (Eq)
84-
deriving newtype (EncCBOR, DecCBOR, NFData, NoThunks, Show)
88+
deriving newtype (NFData, NoThunks, Show)
89+
90+
instance DecCBOR AlonzoExtraConfig
91+
92+
instance EncCBOR AlonzoExtraConfig
93+
94+
instance FromCBOR AlonzoExtraConfig where
95+
fromCBOR =
96+
eraDecoder @AlonzoEra $
97+
decode $
98+
RecD AlonzoExtraConfig
99+
<! D (decodeNullMaybe decodeCostModelsLenient)
100+
101+
instance ToCBOR AlonzoExtraConfig where
102+
toCBOR x@(AlonzoExtraConfig _) =
103+
let AlonzoExtraConfig {..} = x
104+
in toEraCBOR @AlonzoEra . encode $
105+
Rec AlonzoExtraConfig
106+
!> E (encodeNullMaybe encCBOR) aecCostModels
85107

86108
instance FromJSON AlonzoExtraConfig where
87109
parseJSON = Aeson.withObject "Extra Config" $ \o ->
88110
o .:? "costModels" >>= \case
89111
Nothing -> pure $ AlonzoExtraConfig Nothing
90-
Just val -> AlonzoExtraConfig . Just <$> parseCostModels True [] val
112+
Just val -> AlonzoExtraConfig . Just <$> parseCostModels True val
91113

92114
instance ToJSON AlonzoExtraConfig where
93115
toJSON (AlonzoExtraConfig cms) = Aeson.object ["costModels" .= cms]
94116

95117
pattern AlonzoGenesis ::
96118
CoinPerWord ->
97-
CostModels ->
119+
CostModel ->
98120
Prices ->
99121
ExUnits ->
100122
ExUnits ->
@@ -105,7 +127,7 @@ pattern AlonzoGenesis ::
105127
AlonzoGenesis
106128
pattern AlonzoGenesis
107129
{ agCoinsPerUTxOWord
108-
, agCostModels
130+
, agPlutusV1CostModel
109131
, agPrices
110132
, agMaxTxExUnits
111133
, agMaxBlockExUnits
@@ -118,7 +140,7 @@ pattern AlonzoGenesis
118140
{ unAlonzoGenesisWrapper =
119141
UpgradeAlonzoPParams
120142
{ uappCoinsPerUTxOWord = agCoinsPerUTxOWord
121-
, uappCostModels = agCostModels
143+
, uappPlutusV1CostModel = agPlutusV1CostModel
122144
, uappPrices = agPrices
123145
, uappMaxTxExUnits = agMaxTxExUnits
124146
, uappMaxBlockExUnits = agMaxBlockExUnits
@@ -142,7 +164,7 @@ pattern AlonzoGenesis
142164
AlonzoGenesisWrapper
143165
( UpgradeAlonzoPParams
144166
{ uappCoinsPerUTxOWord = coinsPerUTxOWord_
145-
, uappCostModels = costModels_
167+
, uappPlutusV1CostModel = costModels_
146168
, uappPrices = prices_
147169
, uappMaxTxExUnits = maxTxExUnits_
148170
, uappMaxBlockExUnits = maxBlockExUnits_
@@ -169,7 +191,7 @@ instance FromCBOR AlonzoGenesis where
169191
decode $
170192
RecD AlonzoGenesis
171193
<! From
172-
<! From
194+
<! D (decodeCostModel PlutusV1)
173195
<! From
174196
<! From
175197
<! From
@@ -179,33 +201,24 @@ instance FromCBOR AlonzoGenesis where
179201
<! From
180202

181203
instance ToCBOR AlonzoGenesis where
182-
toCBOR
183-
AlonzoGenesis
184-
{ agCoinsPerUTxOWord
185-
, agCostModels
186-
, agPrices
187-
, agMaxTxExUnits
188-
, agMaxBlockExUnits
189-
, agMaxValSize
190-
, agCollateralPercentage
191-
, agMaxCollateralInputs
192-
} =
193-
toEraCBOR @AlonzoEra
194-
. encode
195-
$ Rec AlonzoGenesis
196-
!> To agCoinsPerUTxOWord
197-
!> To agCostModels
198-
!> To agPrices
199-
!> To agMaxTxExUnits
200-
!> To agMaxBlockExUnits
201-
!> To agMaxValSize
202-
!> To agCollateralPercentage
203-
!> To agMaxCollateralInputs
204+
toCBOR x@(AlonzoGenesis _ _ _ _ _ _ _ _ _) =
205+
let AlonzoGenesis {..} = x
206+
in toEraCBOR @AlonzoEra . encode $
207+
Rec AlonzoGenesis
208+
!> To agCoinsPerUTxOWord
209+
!> E encodeCostModel agPlutusV1CostModel
210+
!> To agPrices
211+
!> To agMaxTxExUnits
212+
!> To agMaxBlockExUnits
213+
!> To agMaxValSize
214+
!> To agCollateralPercentage
215+
!> To agMaxCollateralInputs
216+
!> To agExtraConfig
204217

205218
instance FromJSON AlonzoGenesis where
206219
parseJSON = Aeson.withObject "Alonzo Genesis" $ \o -> do
207220
agCoinsPerUTxOWord <- o .: "lovelacePerUTxOWord"
208-
agCostModels <- parseCostModels False =<< o .: "costModels"
221+
agPlutusV1CostModel <- parseCostModelAsArray False PlutusV1 =<< o .: "plutusV1CostModel"
209222
agPrices <- o .: "executionPrices"
210223
agMaxTxExUnits <- o .: "maxTxExUnits"
211224
agMaxBlockExUnits <- o .: "maxBlockExUnits"
@@ -218,7 +231,7 @@ instance FromJSON AlonzoGenesis where
218231
instance ToKeyValuePairs AlonzoGenesis where
219232
toKeyValuePairs ag =
220233
[ "lovelacePerUTxOWord" .= agCoinsPerUTxOWord ag
221-
, "costModels" .= agCostModels ag
234+
, "plutusV1CostModel" .= agPlutusV1CostModel ag
222235
, "executionPrices" .= agPrices ag
223236
, "maxTxExUnits" .= agMaxTxExUnits ag
224237
, "maxBlockExUnits" .= agMaxBlockExUnits ag

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ import Cardano.Ledger.Plutus.CostModels (
9797
emptyCostModels,
9898
getCostModelLanguage,
9999
getCostModelParams,
100+
mkCostModels,
100101
)
101102
import Cardano.Ledger.Plutus.ExUnits (
102103
ExUnits (..),
@@ -408,7 +409,7 @@ instance Ord OrdExUnits where
408409
-- | Parameters that were added in Alonzo
409410
data UpgradeAlonzoPParams f = UpgradeAlonzoPParams
410411
{ uappCoinsPerUTxOWord :: !(HKD f CoinPerWord)
411-
, uappCostModels :: !(HKD f CostModels)
412+
, uappPlutusV1CostModel :: !(HKD f CostModel)
412413
, uappPrices :: !(HKD f Prices)
413414
, uappMaxTxExUnits :: !(HKD f ExUnits)
414415
, uappMaxBlockExUnits :: !(HKD f ExUnits)
@@ -442,7 +443,7 @@ instance Default (UpgradeAlonzoPParams StrictMaybe) where
442443
def =
443444
UpgradeAlonzoPParams
444445
{ uappCoinsPerUTxOWord = SNothing
445-
, uappCostModels = SNothing
446+
, uappPlutusV1CostModel = SNothing
446447
, uappPrices = SNothing
447448
, uappMaxTxExUnits = SNothing
448449
, uappMaxBlockExUnits = SNothing
@@ -611,7 +612,7 @@ upgradeAlonzoPParams UpgradeAlonzoPParams {..} ShelleyPParams {..} =
611612
, appMinPoolCost = sppMinPoolCost
612613
, -- new in alonzo
613614
appCoinsPerUTxOWord = uappCoinsPerUTxOWord
614-
, appCostModels = uappCostModels
615+
, appCostModels = hkdMap (Proxy @f) (mkCostModels . Map.singleton PlutusV1) uappPlutusV1CostModel
615616
, appPrices = uappPrices
616617
, appMaxTxExUnits = hkdMap (Proxy @f) OrdExUnits uappMaxTxExUnits
617618
, appMaxBlockExUnits = hkdMap (Proxy @f) OrdExUnits uappMaxBlockExUnits

eras/alonzo/impl/testlib/Test/Cardano/Ledger/Alonzo/Arbitrary.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ instance Arbitrary AlonzoGenesis where
425425
arbitrary =
426426
AlonzoGenesis
427427
<$> arbitrary
428-
<*> genValidCostModels [PlutusV1, PlutusV2]
428+
<*> genValidCostModel PlutusV1
429429
<*> arbitrary
430430
<*> arbitrary
431431
<*> arbitrary

eras/alonzo/impl/testlib/Test/Cardano/Ledger/Alonzo/Examples.hs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import Cardano.Ledger.BaseTypes (StrictMaybe (..))
3030
import Cardano.Ledger.Coin (Coin (..))
3131
import Cardano.Ledger.Keys (asWitness)
3232
import Cardano.Ledger.Mary.Value (MaryValue (..))
33-
import Cardano.Ledger.Plutus.CostModels (mkCostModels)
3433
import Cardano.Ledger.Plutus.Data (Data (..), hashData)
3534
import Cardano.Ledger.Plutus.Language (Language (..))
3635
import Cardano.Ledger.Shelley.API (
@@ -211,7 +210,7 @@ exampleAlonzoGenesis :: AlonzoGenesis
211210
exampleAlonzoGenesis =
212211
AlonzoGenesis
213212
{ agCoinsPerUTxOWord = CoinPerWord $ Coin 1
214-
, agCostModels = mkCostModels (Map.fromList [(PlutusV1, zeroTestingCostModelV1)])
213+
, agPlutusV1CostModel = zeroTestingCostModelV1
215214
, agPrices = Prices (unsafeBoundRational 90) (unsafeBoundRational 91)
216215
, agMaxTxExUnits = ExUnits 123 123
217216
, agMaxBlockExUnits = ExUnits 223 223

eras/alonzo/impl/testlib/Test/Cardano/Ledger/Alonzo/ImpTest.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ import Test.Cardano.Ledger.Mary.ImpTest
112112
import Test.Cardano.Ledger.Plutus (
113113
PlutusArgs (..),
114114
ScriptTestContext (..),
115-
testingCostModels,
115+
testingCostModel,
116116
)
117117
import Test.Cardano.Ledger.Plutus.Examples
118118
import Test.Cardano.Ledger.Plutus.Guardrail (guardrailScript)
@@ -413,7 +413,7 @@ instance ShelleyEraImp AlonzoEra where
413413
pure
414414
AlonzoGenesis
415415
{ agCoinsPerUTxOWord = CoinPerWord (Coin 34_482)
416-
, agCostModels = testingCostModels [PlutusV1]
416+
, agPlutusV1CostModel = testingCostModel PlutusV1
417417
, agPrices =
418418
Prices
419419
{ prMem = 577 %! 10_000

0 commit comments

Comments
 (0)