Skip to content
Draft
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
77 changes: 56 additions & 21 deletions eras/alonzo/impl/src/Cardano/Ledger/Alonzo/Genesis.hs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PatternSynonyms #-}
Expand All @@ -25,13 +26,18 @@ module Cardano.Ledger.Alonzo.Genesis (
agMaxBlockExUnits,
agMaxValSize,
agCollateralPercentage,
agMaxCollateralInputs
agMaxCollateralInputs,
agExtraConfig
),
toAlonzoGenesisPairs,
AlonzoExtraConfig (..),
) where

import Cardano.Ledger.Alonzo.Era (AlonzoEra)
import Cardano.Ledger.Alonzo.PParams (CoinPerWord, UpgradeAlonzoPParams (..))
import Cardano.Ledger.Alonzo.PParams (
CoinPerWord,
UpgradeAlonzoPParams (..),
)
import Cardano.Ledger.Alonzo.Scripts (CostModels, ExUnits (..), Prices (..))
import Cardano.Ledger.BaseTypes (KeyValuePairs (..), ToKeyValuePairs (..))
import Cardano.Ledger.Binary (
Expand All @@ -51,22 +57,42 @@ import Cardano.Ledger.Binary.Coders (
import Cardano.Ledger.Core
import Cardano.Ledger.Genesis (EraGenesis (..))
import Cardano.Ledger.Plutus.CostModels (parseCostModels)
import Cardano.Ledger.Plutus.Language (Language (..))
import Control.DeepSeq (NFData)
import Data.Aeson (FromJSON (..), ToJSON (..), (.:), (.=))
import Data.Aeson (FromJSON (..), ToJSON (..), (.:), (.:?), (.=))
import qualified Data.Aeson as Aeson
import Data.Functor.Identity (Identity)
import GHC.Generics (Generic)
import NoThunks.Class (NoThunks)
import Numeric.Natural (Natural)

-- | All configuration that is necessary to bootstrap AlonzoEra from ShelleyGenesis
newtype AlonzoGenesis = AlonzoGenesisWrapper
data AlonzoGenesis = AlonzoGenesisWrapper
{ unAlonzoGenesisWrapper :: UpgradeAlonzoPParams Identity
, extraConfig :: AlonzoExtraConfig
}
deriving stock (Eq, Generic)
deriving newtype (Show, NoThunks, NFData)
deriving stock (Eq, Show, Generic)
deriving (ToJSON) via KeyValuePairs AlonzoGenesis

instance NoThunks AlonzoGenesis

instance NFData AlonzoGenesis

newtype AlonzoExtraConfig = AlonzoExtraConfig
{ aecCostModels :: Maybe CostModels
}
deriving (Eq)
deriving newtype (EncCBOR, DecCBOR, NFData, NoThunks, Show)

instance FromJSON AlonzoExtraConfig where
parseJSON = Aeson.withObject "Extra Config" $ \o ->
o .:? "costModels" >>= \case
Nothing -> pure $ AlonzoExtraConfig Nothing
Just val -> AlonzoExtraConfig . Just <$> parseCostModels True [] val

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

pattern AlonzoGenesis ::
CoinPerWord ->
CostModels ->
Expand All @@ -76,6 +102,7 @@ pattern AlonzoGenesis ::
Natural ->
Natural ->
Natural ->
AlonzoExtraConfig ->
AlonzoGenesis
pattern AlonzoGenesis
{ agCoinsPerUTxOWord
Expand All @@ -86,8 +113,10 @@ pattern AlonzoGenesis
, agMaxValSize
, agCollateralPercentage
, agMaxCollateralInputs
, agExtraConfig
} <-
( unAlonzoGenesisWrapper ->
AlonzoGenesisWrapper
{ unAlonzoGenesisWrapper =
UpgradeAlonzoPParams
{ uappCoinsPerUTxOWord = agCoinsPerUTxOWord
, uappCostModels = agCostModels
Expand All @@ -98,7 +127,8 @@ pattern AlonzoGenesis
, uappCollateralPercentage = agCollateralPercentage
, uappMaxCollateralInputs = agMaxCollateralInputs
}
)
, extraConfig = agExtraConfig
}
where
AlonzoGenesis
coinsPerUTxOWord_
Expand All @@ -108,18 +138,21 @@ pattern AlonzoGenesis
maxBlockExUnits_
maxValSize_
collateralPercentage_
maxCollateralInputs_ =
AlonzoGenesisWrapper $
UpgradeAlonzoPParams
{ uappCoinsPerUTxOWord = coinsPerUTxOWord_
, uappCostModels = costModels_
, uappPrices = prices_
, uappMaxTxExUnits = maxTxExUnits_
, uappMaxBlockExUnits = maxBlockExUnits_
, uappMaxValSize = maxValSize_
, uappCollateralPercentage = collateralPercentage_
, uappMaxCollateralInputs = maxCollateralInputs_
}
maxCollateralInputs_
extraConfig_ =
AlonzoGenesisWrapper
( UpgradeAlonzoPParams
{ uappCoinsPerUTxOWord = coinsPerUTxOWord_
, uappCostModels = costModels_
, uappPrices = prices_
, uappMaxTxExUnits = maxTxExUnits_
, uappMaxBlockExUnits = maxBlockExUnits_
, uappMaxValSize = maxValSize_
, uappCollateralPercentage = collateralPercentage_
, uappMaxCollateralInputs = maxCollateralInputs_
}
)
extraConfig_

{-# COMPLETE AlonzoGenesis #-}

Expand All @@ -144,6 +177,7 @@ instance FromCBOR AlonzoGenesis where
<! From
<! From
<! From
<! From

instance ToCBOR AlonzoGenesis where
toCBOR
Expand Down Expand Up @@ -172,13 +206,14 @@ instance ToCBOR AlonzoGenesis where
instance FromJSON AlonzoGenesis where
parseJSON = Aeson.withObject "Alonzo Genesis" $ \o -> do
agCoinsPerUTxOWord <- o .: "lovelacePerUTxOWord"
agCostModels <- parseCostModels False =<< o .: "costModels"
agCostModels <- parseCostModels False [PlutusV1] =<< o .: "costModels"
agPrices <- o .: "executionPrices"
agMaxTxExUnits <- o .: "maxTxExUnits"
agMaxBlockExUnits <- o .: "maxBlockExUnits"
agMaxValSize <- o .: "maxValueSize"
agCollateralPercentage <- o .: "collateralPercentage"
agMaxCollateralInputs <- o .: "maxCollateralInputs"
agExtraConfig <- o .: "extraConfig"
return AlonzoGenesis {..}

instance ToKeyValuePairs AlonzoGenesis where
Expand Down
16 changes: 11 additions & 5 deletions eras/alonzo/impl/src/Cardano/Ledger/Alonzo/PParams.hs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
{-# LANGUAGE GADTs #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
Expand Down Expand Up @@ -106,10 +107,7 @@ import Cardano.Ledger.Plutus.Language (Language (..))
import Cardano.Ledger.Plutus.ToPlutusData (ToPlutusData (..))
import Cardano.Ledger.Shelley.PParams
import Control.DeepSeq (NFData)
import Data.Aeson as Aeson (
FromJSON,
ToJSON (..),
)
import Data.Aeson (FromJSON (..), ToJSON (..))
import Data.ByteString (ByteString)
import qualified Data.ByteString as BS
import Data.Coerce (coerce)
Expand Down Expand Up @@ -422,7 +420,15 @@ data UpgradeAlonzoPParams f = UpgradeAlonzoPParams

emptyAlonzoUpgradePParamsUpdate :: UpgradeAlonzoPParams StrictMaybe
emptyAlonzoUpgradePParamsUpdate =
UpgradeAlonzoPParams SNothing SNothing SNothing SNothing SNothing SNothing SNothing SNothing
UpgradeAlonzoPParams
SNothing
SNothing
SNothing
SNothing
SNothing
SNothing
SNothing
SNothing

deriving instance Eq (UpgradeAlonzoPParams Identity)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ instance TranslateEra AlonzoEra NewEpochState where
}

instance TranslateEra AlonzoEra PParams where
translateEra (AlonzoGenesisWrapper upgradeArgs) = pure . upgradePParams upgradeArgs
translateEra (AlonzoGenesisWrapper upgradeArgs _) = pure . upgradePParams upgradeArgs

instance TranslateEra AlonzoEra FuturePParams where
translateEra ctxt = \case
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ module Test.Cardano.Ledger.Alonzo.Arbitrary (
import Cardano.Ledger.Alonzo (AlonzoEra, Tx (..))
import Cardano.Ledger.Alonzo.BlockBody (AlonzoBlockBody (AlonzoBlockBody))
import Cardano.Ledger.Alonzo.Core
import Cardano.Ledger.Alonzo.Genesis (AlonzoGenesis (..))
import Cardano.Ledger.Alonzo.Genesis (AlonzoExtraConfig (..), AlonzoGenesis (..))
import Cardano.Ledger.Alonzo.PParams (
AlonzoPParams (AlonzoPParams),
LangDepView (..),
Expand Down Expand Up @@ -436,6 +436,7 @@ instance Arbitrary AlonzoGenesis where
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary

alwaysSucceeds ::
forall l era.
Expand Down Expand Up @@ -493,3 +494,5 @@ instance

instance Arbitrary LangDepView where
arbitrary = LangDepView <$> arbitrary <*> arbitrary

deriving instance Arbitrary AlonzoExtraConfig
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ module Test.Cardano.Ledger.Alonzo.Examples (

import Cardano.Ledger.Alonzo (AlonzoEra)
import Cardano.Ledger.Alonzo.Core
import Cardano.Ledger.Alonzo.Genesis (AlonzoGenesis (..))
import Cardano.Ledger.Alonzo.Genesis (AlonzoExtraConfig (..), AlonzoGenesis (..))
import Cardano.Ledger.Alonzo.Plutus.Context (EraPlutusTxInfo)
import Cardano.Ledger.Alonzo.Scripts (
AlonzoPlutusPurpose (..),
Expand Down Expand Up @@ -218,4 +218,5 @@ exampleAlonzoGenesis =
, agMaxValSize = 1234
, agCollateralPercentage = 20
, agMaxCollateralInputs = 30
, agExtraConfig = AlonzoExtraConfig Nothing
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ module Test.Cardano.Ledger.Alonzo.ImpTest (
import Cardano.Ledger.Address (Addr (..))
import Cardano.Ledger.Alonzo (AlonzoEra)
import Cardano.Ledger.Alonzo.Core
import Cardano.Ledger.Alonzo.Genesis (AlonzoGenesis (..))
import Cardano.Ledger.Alonzo.Genesis (AlonzoExtraConfig (..), AlonzoGenesis (..))
import Cardano.Ledger.Alonzo.Plutus.Context (ContextError)
import Cardano.Ledger.Alonzo.Plutus.Evaluate (
collectPlutusScriptsWithContext,
Expand Down Expand Up @@ -431,6 +431,7 @@ instance ShelleyEraImp AlonzoEra where
, agMaxValSize = 5000
, agCollateralPercentage = 150
, agMaxCollateralInputs = 3
, agExtraConfig = AlonzoExtraConfig Nothing
}

impSatisfyNativeScript = impAllegraSatisfyNativeScript
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ module Test.Cardano.Ledger.Alonzo.Golden (

import Cardano.Ledger.Alonzo (AlonzoEra)
import Cardano.Ledger.Alonzo.Core
import Cardano.Ledger.Alonzo.Genesis (AlonzoGenesis (..))
import Cardano.Ledger.Alonzo.Genesis (AlonzoExtraConfig (..), AlonzoGenesis (..))
import Cardano.Ledger.Alonzo.PParams (
LangDepView (..),
getLanguageView,
Expand Down Expand Up @@ -388,6 +388,7 @@ expectedGenesis =
, agMaxValSize = 5000
, agCollateralPercentage = 150
, agMaxCollateralInputs = 3
, agExtraConfig = AlonzoExtraConfig Nothing
}

expectedCostModels :: CostModels
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,17 +135,21 @@ instance NFData CostModel where
rnf (CostModel lang cm ectx) = lang `deepseq` cm `deepseq` rnf ectx

instance FromJSON CostModels where
parseJSON = parseCostModels True
parseJSON = parseCostModels True []

parseCostModels ::
-- | Do not restrict number of parameters to the initial count and allow parsing of cost models
-- for unknown plutus versions.
Bool ->
[Language] ->
Value ->
Parser CostModels
parseCostModels isLenient =
parseCostModels isLenient languages =
withObject "CostModels" $ \o -> do
cms <- mapM (parseCostModel isLenient o) nonNativeLanguages
cms <-
if null languages
then mapM (parseCostModel isLenient o) nonNativeLanguages
else mapM (parseCostModel isLenient o) languages
let cmsMap = Map.fromList [(cmLanguage cm, cm) | Just cm <- cms]
unknownCostModels <-
if isLenient
Expand Down
Loading