diff --git a/ouroboros-consensus-cardano/changelog.d/20230815_110046_joris_275_consolidate_protocolparams_across_eras.md b/ouroboros-consensus-cardano/changelog.d/20230815_110046_joris_275_consolidate_protocolparams_across_eras.md new file mode 100644 index 0000000000..73afd12ed2 --- /dev/null +++ b/ouroboros-consensus-cardano/changelog.d/20230815_110046_joris_275_consolidate_protocolparams_across_eras.md @@ -0,0 +1,33 @@ + + + + +### Non-Breaking + +- Add a `ProtocolTransitionParams` data family, and provide instances for + transitions from Byron to Shelley and Shelley-based eras to Shelley-based + eras. +- Add a data instance of `ProtocolParams` for the Cardano block. +- Provide a `CardanoProtocolParams` type synonym and associated pattern synonym + (with record syntax). +- Export all `ProtocolParams` and `ProtocolTransitionParams` instances from + `Ouroboros.Consensus.Cardano` and `Ouroboros.Consensus.Cardano.Node`. + +### Breaking + +- Refactor `ProtocolParamsByron` to a data instance of `ProtocolParams`. +- Refactor protocol parameters for Shelley eras (e.g, `ProtocolParamsAlonzo` and `ProtocolParamsBabbage`) to data instances of `ProtocolParams`. +- Export all Shelley `ProtocolParams` data instances from `Ouroboros.Consensus.Shelley.Node`. +- Remove the `ProtocolTransitionParamsShelleyBased` datatype in favour of + `ProtocolTransitionParams`. +- Make `protocolInfoCardano` require a `CardanoProtocolParams` type as its only + argument, instead of a long list of arguments. \ No newline at end of file diff --git a/ouroboros-consensus-cardano/src/byron-testlib/Test/ThreadNet/Infra/Byron/ProtocolInfo.hs b/ouroboros-consensus-cardano/src/byron-testlib/Test/ThreadNet/Infra/Byron/ProtocolInfo.hs index 6739134178..f2805f2250 100644 --- a/ouroboros-consensus-cardano/src/byron-testlib/Test/ThreadNet/Infra/Byron/ProtocolInfo.hs +++ b/ouroboros-consensus-cardano/src/byron-testlib/Test/ThreadNet/Infra/Byron/ProtocolInfo.hs @@ -59,7 +59,7 @@ mkProtocolByron params coreNodeId genesisConfig genesisSecrets = blockForging :: [BlockForging m ByronBlock] blockForging = blockForgingByron protocolParams - protocolParams :: ProtocolParamsByron + protocolParams :: ProtocolParams ByronBlock protocolParams = ProtocolParamsByron { byronGenesis = genesisConfig , byronPbftSignatureThreshold = Just $ pbftSignatureThreshold diff --git a/ouroboros-consensus-cardano/src/byron/Ouroboros/Consensus/Byron/Node.hs b/ouroboros-consensus-cardano/src/byron/Ouroboros/Consensus/Byron/Node.hs index bd9405ebfd..be9b2d6e70 100644 --- a/ouroboros-consensus-cardano/src/byron/Ouroboros/Consensus/Byron/Node.hs +++ b/ouroboros-consensus-cardano/src/byron/Ouroboros/Consensus/Byron/Node.hs @@ -8,18 +8,19 @@ module Ouroboros.Consensus.Byron.Node ( PBftSignatureThreshold (..) - , ProtocolParamsByron (..) , blockForgingByron , byronBlockForging - , defaultPBftSignatureThreshold - , mkByronConfig - , protocolClientInfoByron - , protocolInfoByron -- * Secrets , ByronLeaderCredentials (..) , ByronLeaderCredentialsError , mkByronLeaderCredentials , mkPBftCanBeLeader + -- * ProtocolInfo + , ProtocolParams (..) + , defaultPBftSignatureThreshold + , mkByronConfig + , protocolClientInfoByron + , protocolInfoByron ) where import qualified Cardano.Chain.Delegation as Delegation @@ -151,7 +152,7 @@ mkPBftCanBeLeader (ByronLeaderCredentials sk cert nid _) = PBftCanBeLeader { } blockForgingByron :: Monad m - => ProtocolParamsByron + => ProtocolParams ByronBlock -> [BlockForging m ByronBlock] blockForgingByron ProtocolParamsByron { byronLeaderCredentials = mLeaderCreds , byronMaxTxCapacityOverrides = maxTxCapacityOverrides @@ -169,7 +170,7 @@ defaultPBftSignatureThreshold :: PBftSignatureThreshold defaultPBftSignatureThreshold = PBftSignatureThreshold 0.22 -- | Parameters needed to run Byron -data ProtocolParamsByron = ProtocolParamsByron { +data instance ProtocolParams ByronBlock = ProtocolParamsByron { byronGenesis :: Genesis.Config , byronPbftSignatureThreshold :: Maybe PBftSignatureThreshold , byronProtocolVersion :: Update.ProtocolVersion @@ -178,7 +179,7 @@ data ProtocolParamsByron = ProtocolParamsByron { , byronMaxTxCapacityOverrides :: Mempool.TxOverrides ByronBlock } -protocolInfoByron :: ProtocolParamsByron +protocolInfoByron :: ProtocolParams ByronBlock -> ProtocolInfo ByronBlock protocolInfoByron ProtocolParamsByron { byronGenesis = genesisConfig diff --git a/ouroboros-consensus-cardano/src/cardano-testlib/Test/Consensus/Cardano/ProtocolInfo.hs b/ouroboros-consensus-cardano/src/cardano-testlib/Test/Consensus/Cardano/ProtocolInfo.hs index 70997dba5b..e90cbcc408 100644 --- a/ouroboros-consensus-cardano/src/cardano-testlib/Test/Consensus/Cardano/ProtocolInfo.hs +++ b/ouroboros-consensus-cardano/src/cardano-testlib/Test/Consensus/Cardano/ProtocolInfo.hs @@ -34,15 +34,14 @@ import Data.Word (Word64) import Ouroboros.Consensus.Block.Forging (BlockForging) import Ouroboros.Consensus.BlockchainTime (SlotLength) import Ouroboros.Consensus.Byron.Node (ByronLeaderCredentials, - ProtocolParamsByron (..), byronGenesis, + ProtocolParams (..), byronGenesis, byronMaxTxCapacityOverrides, byronPbftSignatureThreshold, byronSoftwareVersion) import Ouroboros.Consensus.Cardano.Block (CardanoBlock) import Ouroboros.Consensus.Cardano.Node (CardanoHardForkConstraints, - ProtocolTransitionParamsShelleyBased (..), + ProtocolParams (..), ProtocolTransitionParams (..), TriggerHardFork (TriggerHardForkAtEpoch, TriggerHardForkNever), - protocolInfoCardano, transitionTranslationContext, - transitionTrigger) + protocolInfoCardano) import Ouroboros.Consensus.Config.SecurityParam (SecurityParam (..)) import qualified Ouroboros.Consensus.Mempool as Mempool import Ouroboros.Consensus.Node.ProtocolInfo (NumCoreNodes (..), @@ -50,18 +49,9 @@ import Ouroboros.Consensus.Node.ProtocolInfo (NumCoreNodes (..), import Ouroboros.Consensus.NodeId (CoreNodeId (..)) import Ouroboros.Consensus.Protocol.PBFT (PBftParams, PBftSignatureThreshold (..)) -import Ouroboros.Consensus.Shelley.Node (ProtocolParamsAllegra (..), - ProtocolParamsAlonzo (..), ProtocolParamsMary (..), - ProtocolParamsShelley (..), - ProtocolParamsShelleyBased (..), ShelleyGenesis, - ShelleyLeaderCredentials, allegraMaxTxCapacityOverrides, - allegraProtVer, alonzoMaxTxCapacityOverrides, - alonzoProtVer, maryMaxTxCapacityOverrides, maryProtVer, - sgGenDelegs, shelleyBasedGenesis, shelleyBasedInitialNonce, - shelleyBasedLeaderCredentials, - shelleyMaxTxCapacityOverrides, shelleyProtVer) -import Ouroboros.Consensus.Shelley.Node.Praos - (ProtocolParamsBabbage (..), ProtocolParamsConway (..)) +import Ouroboros.Consensus.Shelley.Node + (ProtocolParamsShelleyBased (..), ShelleyGenesis, + ShelleyLeaderCredentials, sgGenDelegs) import Ouroboros.Consensus.Util.IOLike (IOLike) import qualified Test.ThreadNet.Infra.Alonzo as Alonzo import qualified Test.ThreadNet.Infra.Byron as Byron @@ -280,70 +270,72 @@ mkTestProtocolInfo hardForkSpec = protocolInfoCardano - ProtocolParamsByron { - byronGenesis = genesisByron - , byronPbftSignatureThreshold = aByronPbftSignatureThreshold - , byronProtocolVersion = aByronProtocolVersion - , byronSoftwareVersion = softVerByron - , byronLeaderCredentials = Just leaderCredentialsByron - , byronMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure - } - ProtocolParamsShelleyBased { - shelleyBasedGenesis = shelleyGenesis - , shelleyBasedInitialNonce = initialNonce - , shelleyBasedLeaderCredentials = [leaderCredentialsShelley] - } - ProtocolParamsShelley { - shelleyProtVer = hfSpecProtVer Shelley hardForkSpec - , shelleyMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure - } - ProtocolParamsAllegra { - allegraProtVer = hfSpecProtVer Allegra hardForkSpec - , allegraMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure - } - ProtocolParamsMary { - maryProtVer = hfSpecProtVer Mary hardForkSpec - , maryMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure - } - ProtocolParamsAlonzo { - alonzoProtVer = hfSpecProtVer Alonzo hardForkSpec - , alonzoMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure - } - ProtocolParamsBabbage { - babbageProtVer = hfSpecProtVer Babbage hardForkSpec - , babbageMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure - } - ProtocolParamsConway { - conwayProtVer = hfSpecProtVer Conway hardForkSpec - , conwayMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure - } - ProtocolTransitionParamsShelleyBased { - transitionTranslationContext = SL.toFromByronTranslationContext shelleyGenesis - , transitionTrigger = hfSpecTransitionTrigger Shelley hardForkSpec - } - ProtocolTransitionParamsShelleyBased { - transitionTranslationContext = () - , transitionTrigger = hfSpecTransitionTrigger Allegra hardForkSpec - } - ProtocolTransitionParamsShelleyBased { - transitionTranslationContext = () - , transitionTrigger = hfSpecTransitionTrigger Mary hardForkSpec - } - ProtocolTransitionParamsShelleyBased { - transitionTranslationContext = Alonzo.degenerateAlonzoGenesis - , transitionTrigger = hfSpecTransitionTrigger Alonzo hardForkSpec - } - ProtocolTransitionParamsShelleyBased { - transitionTranslationContext = () - , transitionTrigger = hfSpecTransitionTrigger Babbage hardForkSpec - } - ProtocolTransitionParamsShelleyBased { - transitionTranslationContext = - -- Note that this is effectively a no-op, which is fine for - -- testing, at least for now. - SL.ConwayGenesis $ SL.GenDelegs $ sgGenDelegs shelleyGenesis - , transitionTrigger = hfSpecTransitionTrigger Conway hardForkSpec + (CardanoProtocolParams + ProtocolParamsByron { + byronGenesis = genesisByron + , byronPbftSignatureThreshold = aByronPbftSignatureThreshold + , byronProtocolVersion = aByronProtocolVersion + , byronSoftwareVersion = softVerByron + , byronLeaderCredentials = Just leaderCredentialsByron + , byronMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure + } + ProtocolParamsShelleyBased { + shelleyBasedGenesis = shelleyGenesis + , shelleyBasedInitialNonce = initialNonce + , shelleyBasedLeaderCredentials = [leaderCredentialsShelley] + } + ProtocolParamsShelley { + shelleyProtVer = hfSpecProtVer Shelley hardForkSpec + , shelleyMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure + } + ProtocolParamsAllegra { + allegraProtVer = hfSpecProtVer Allegra hardForkSpec + , allegraMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure + } + ProtocolParamsMary { + maryProtVer = hfSpecProtVer Mary hardForkSpec + , maryMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure + } + ProtocolParamsAlonzo { + alonzoProtVer = hfSpecProtVer Alonzo hardForkSpec + , alonzoMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure + } + ProtocolParamsBabbage { + babbageProtVer = hfSpecProtVer Babbage hardForkSpec + , babbageMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure + } + ProtocolParamsConway { + conwayProtVer = hfSpecProtVer Conway hardForkSpec + , conwayMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure + } + ProtocolTransitionParamsByronToShelley { + transitionByronToShelleyTranslationContext = SL.toFromByronTranslationContext shelleyGenesis + , transitionByronToShelleyTrigger = hfSpecTransitionTrigger Shelley hardForkSpec } + ProtocolTransitionParamsIntraShelley { + transitionIntraShelleyTranslationContext = () + , transitionIntraShelleyTrigger = hfSpecTransitionTrigger Allegra hardForkSpec + } + ProtocolTransitionParamsIntraShelley { + transitionIntraShelleyTranslationContext = () + , transitionIntraShelleyTrigger = hfSpecTransitionTrigger Mary hardForkSpec + } + ProtocolTransitionParamsIntraShelley { + transitionIntraShelleyTranslationContext = Alonzo.degenerateAlonzoGenesis + , transitionIntraShelleyTrigger = hfSpecTransitionTrigger Alonzo hardForkSpec + } + ProtocolTransitionParamsIntraShelley { + transitionIntraShelleyTranslationContext = () + , transitionIntraShelleyTrigger = hfSpecTransitionTrigger Babbage hardForkSpec + } + ProtocolTransitionParamsIntraShelley { + transitionIntraShelleyTranslationContext = + -- Note that this is effectively a no-op, which is fine for + -- testing, at least for now. + SL.ConwayGenesis $ SL.GenDelegs $ sgGenDelegs shelleyGenesis + , transitionIntraShelleyTrigger = hfSpecTransitionTrigger Conway hardForkSpec + } + ) where leaderCredentialsByron :: ByronLeaderCredentials diff --git a/ouroboros-consensus-cardano/src/cardano-testlib/Test/ThreadNet/Infra/ShelleyBasedHardFork.hs b/ouroboros-consensus-cardano/src/cardano-testlib/Test/ThreadNet/Infra/ShelleyBasedHardFork.hs index 41ee256e24..d8cfdc24d5 100644 --- a/ouroboros-consensus-cardano/src/cardano-testlib/Test/ThreadNet/Infra/ShelleyBasedHardFork.hs +++ b/ouroboros-consensus-cardano/src/cardano-testlib/Test/ThreadNet/Infra/ShelleyBasedHardFork.hs @@ -38,8 +38,7 @@ import Ouroboros.Consensus.Cardano.CanHardFork (ShelleyPartialLedgerConfig (..), forecastAcrossShelley, translateChainDepStateAcrossShelley) import Ouroboros.Consensus.Cardano.Node - (ProtocolTransitionParamsShelleyBased (..), - TriggerHardFork (..)) + (ProtocolTransitionParams (..), TriggerHardFork (..)) import Ouroboros.Consensus.HardFork.Combinator import Ouroboros.Consensus.HardFork.Combinator.Embed.Binary import Ouroboros.Consensus.HardFork.Combinator.Serialisation @@ -228,7 +227,7 @@ protocolInfoShelleyBasedHardFork :: -> SL.ProtVer -> SL.ProtVer -> SL.TranslationContext era1 - -> ProtocolTransitionParamsShelleyBased era2 + -> ProtocolTransitionParams (ShelleyBlock proto1 era1) (ShelleyBlock proto2 era2) -> ( ProtocolInfo (ShelleyBasedHardForkBlock proto1 era1 proto2 era2) , m [BlockForging m (ShelleyBasedHardForkBlock proto1 era1 proto2 era2)] ) @@ -274,9 +273,9 @@ protocolInfoShelleyBasedHardFork protocolParamsShelleyBased eraParams1 :: History.EraParams eraParams1 = shelleyEraParams genesis - ProtocolTransitionParamsShelleyBased { - transitionTranslationContext = transCtxt2 - , transitionTrigger + ProtocolTransitionParamsIntraShelley { + transitionIntraShelleyTranslationContext = transCtxt2 + , transitionIntraShelleyTrigger } = protocolTransitionParams toPartialLedgerConfig1 :: @@ -284,7 +283,7 @@ protocolInfoShelleyBasedHardFork protocolParamsShelleyBased -> PartialLedgerConfig (ShelleyBlock proto1 era1) toPartialLedgerConfig1 cfg = ShelleyPartialLedgerConfig { shelleyLedgerConfig = cfg - , shelleyTriggerHardFork = transitionTrigger + , shelleyTriggerHardFork = transitionIntraShelleyTrigger } -- Era 2 diff --git a/ouroboros-consensus-cardano/src/ouroboros-consensus-cardano/Ouroboros/Consensus/Cardano.hs b/ouroboros-consensus-cardano/src/ouroboros-consensus-cardano/Ouroboros/Consensus/Cardano.hs index 8e9985ac4f..aa9bd043a1 100644 --- a/ouroboros-consensus-cardano/src/ouroboros-consensus-cardano/Ouroboros/Consensus/Cardano.hs +++ b/ouroboros-consensus-cardano/src/ouroboros-consensus-cardano/Ouroboros/Consensus/Cardano.hs @@ -8,12 +8,8 @@ module Ouroboros.Consensus.Cardano ( , ProtocolCardano , ProtocolShelley -- * Abstract over the various protocols - , ProtocolParamsAllegra (..) - , ProtocolParamsAlonzo (..) - , ProtocolParamsByron (..) - , ProtocolParamsMary (..) - , ProtocolParamsShelley (..) - , ProtocolTransitionParamsShelleyBased (..) + , ProtocolParams (..) + , ProtocolTransitionParams (..) , module X ) where diff --git a/ouroboros-consensus-cardano/src/ouroboros-consensus-cardano/Ouroboros/Consensus/Cardano/Node.hs b/ouroboros-consensus-cardano/src/ouroboros-consensus-cardano/Ouroboros/Consensus/Cardano/Node.hs index 2adc5e4224..fbc9575d5d 100644 --- a/ouroboros-consensus-cardano/src/ouroboros-consensus-cardano/Ouroboros/Consensus/Cardano/Node.hs +++ b/ouroboros-consensus-cardano/src/ouroboros-consensus-cardano/Ouroboros/Consensus/Cardano/Node.hs @@ -1,27 +1,34 @@ -{-# LANGUAGE DataKinds #-} -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MultiParamTypeClasses #-} -{-# LANGUAGE NamedFieldPuns #-} -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE PatternSynonyms #-} -{-# LANGUAGE RankNTypes #-} -{-# LANGUAGE ScopedTypeVariables #-} -{-# LANGUAGE TypeApplications #-} -{-# LANGUAGE TypeFamilies #-} -{-# LANGUAGE TypeOperators #-} +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MultiParamTypeClasses #-} +{-# LANGUAGE NamedFieldPuns #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE PatternSynonyms #-} +{-# LANGUAGE RankNTypes #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE StandaloneKindSignatures #-} +{-# LANGUAGE TypeApplications #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE TypeOperators #-} {-# OPTIONS_GHC -Wno-orphans -Wno-incomplete-patterns -Wno-incomplete-uni-patterns -Wno-incomplete-record-updates -Wno-overlapping-patterns #-} + +-- TODO: this is required for ghc-8.10.7, because using NamedFieldPuns and +-- PatternSynonyms with record syntax results in warnings related to shadowing. +-- This can be removed once we drop ghc-8.10.7. +{-# OPTIONS_GHC -Wno-name-shadowing #-} + module Ouroboros.Consensus.Cardano.Node ( CardanoHardForkConstraints + , CardanoProtocolParams , MaxMajorProtVer (..) - , ProtocolParamsAllegra (..) - , ProtocolParamsMary (..) - , ProtocolTransitionParamsShelleyBased (..) + , ProtocolParams (.., CardanoProtocolParams, paramsByron, paramsShelleyBased, paramsShelley, paramsAllegra, paramsMary, paramsAlonzo, paramsBabbage, paramsConway, transitionParamsByronToShelley, transitionParamsShelleyToAllegra, transitionParamsAllegraToMary, transitionParamsMaryToAlonzo, transitionParamsAlonzoToBabbage, transitionParamsBabbageToConway) + , ProtocolTransitionParams (..) , TriggerHardFork (..) , protocolClientInfoCardano , protocolInfoCardano @@ -62,6 +69,7 @@ import qualified Codec.CBOR.Encoding as CBOR import Control.Exception (assert) import qualified Data.ByteString.Short as Short import Data.Functor.These (These1 (..)) +import Data.Kind (Type) import qualified Data.ListMap as ListMap import qualified Data.Map.Strict as Map import Data.SOP.Counting @@ -81,6 +89,8 @@ import Ouroboros.Consensus.Cardano.CanHardFork import Ouroboros.Consensus.Cardano.ShelleyBased import Ouroboros.Consensus.Config import Ouroboros.Consensus.HardFork.Combinator +import Ouroboros.Consensus.HardFork.Combinator.AcrossEras + (PerEraProtocolParams (..)) import Ouroboros.Consensus.HardFork.Combinator.Embed.Nary import Ouroboros.Consensus.HardFork.Combinator.Serialisation import qualified Ouroboros.Consensus.HardFork.History as History @@ -102,8 +112,6 @@ import Ouroboros.Consensus.Shelley.Ledger.NetworkProtocolVersion import Ouroboros.Consensus.Shelley.Node import Ouroboros.Consensus.Shelley.Node.Common (ShelleyEraWithCrypto, shelleyBlockIssuerVKey) -import Ouroboros.Consensus.Shelley.Node.Praos - (ProtocolParamsBabbage (..), ProtocolParamsConway (..)) import qualified Ouroboros.Consensus.Shelley.Node.Praos as Praos import qualified Ouroboros.Consensus.Shelley.Node.TPraos as TPraos import Ouroboros.Consensus.Storage.Serialisation @@ -554,11 +562,88 @@ instance CardanoHardForkConstraints c ProtocolInfo -------------------------------------------------------------------------------} --- | Parameters needed to transition to a Shelley era. -data ProtocolTransitionParamsShelleyBased era = ProtocolTransitionParamsShelleyBased { - transitionTranslationContext :: Core.TranslationContext era - , transitionTrigger :: TriggerHardFork - } +-- | Parameters needed to transition from one era to the next. +type ProtocolTransitionParams :: Type -> Type -> Type +data family ProtocolTransitionParams x y + +-- | Parameters needed to transition from Byron to Shelley. +data instance ProtocolTransitionParams ByronBlock (ShelleyBlock proto era) = + ProtocolTransitionParamsByronToShelley { + transitionByronToShelleyTranslationContext :: Core.TranslationContext era + , transitionByronToShelleyTrigger :: TriggerHardFork + } + +-- | Parameters needed to transition from a Shelley era to the next. +data instance ProtocolTransitionParams (ShelleyBlock proto era) (ShelleyBlock proto' era') = + ProtocolTransitionParamsIntraShelley { + transitionIntraShelleyTranslationContext :: Core.TranslationContext era' + , transitionIntraShelleyTrigger :: TriggerHardFork + } + +-- | Parameters needed to run Cardano. +data instance ProtocolParams (CardanoBlock c) = ProtocolParamsCardano { + cardanoProtocolParamsPerEra :: PerEraProtocolParams (CardanoEras c) + , shelleyBasedProtocolParams :: ProtocolParamsShelleyBased (ShelleyEra c) + , cardanoProtocolTransitionParams :: InPairs ProtocolTransitionParams (CardanoEras c) + } + +type CardanoProtocolParams c = ProtocolParams (CardanoBlock c) + +pattern CardanoProtocolParams :: + ProtocolParams ByronBlock + -> ProtocolParamsShelleyBased (ShelleyEra c) + -> ProtocolParams (ShelleyBlock (TPraos c) (ShelleyEra c)) + -> ProtocolParams (ShelleyBlock (TPraos c) (AllegraEra c)) + -> ProtocolParams (ShelleyBlock (TPraos c) (MaryEra c)) + -> ProtocolParams (ShelleyBlock (TPraos c) (AlonzoEra c)) + -> ProtocolParams (ShelleyBlock (Praos c) (BabbageEra c)) + -> ProtocolParams (ShelleyBlock (Praos c) (ConwayEra c)) + -> ProtocolTransitionParams ByronBlock (ShelleyBlock (TPraos c) (ShelleyEra c)) + -> ProtocolTransitionParams (ShelleyBlock (TPraos c) (ShelleyEra c)) (ShelleyBlock (TPraos c) (AllegraEra c)) + -> ProtocolTransitionParams (ShelleyBlock (TPraos c) (AllegraEra c)) (ShelleyBlock (TPraos c) (MaryEra c)) + -> ProtocolTransitionParams (ShelleyBlock (TPraos c) (MaryEra c)) (ShelleyBlock (TPraos c) (AlonzoEra c)) + -> ProtocolTransitionParams (ShelleyBlock (TPraos c) (AlonzoEra c)) (ShelleyBlock (Praos c ) (BabbageEra c)) + -> ProtocolTransitionParams (ShelleyBlock (Praos c ) (BabbageEra c)) (ShelleyBlock (Praos c ) (ConwayEra c)) + -> CardanoProtocolParams c +pattern CardanoProtocolParams { + paramsByron + , paramsShelleyBased + , paramsShelley + , paramsAllegra + , paramsMary + , paramsAlonzo + , paramsBabbage + , paramsConway + , transitionParamsByronToShelley + , transitionParamsShelleyToAllegra + , transitionParamsAllegraToMary + , transitionParamsMaryToAlonzo + , transitionParamsAlonzoToBabbage + , transitionParamsBabbageToConway + } = + ProtocolParamsCardano { + cardanoProtocolParamsPerEra = PerEraProtocolParams + ( paramsByron + :* paramsShelley + :* paramsAllegra + :* paramsMary + :* paramsAlonzo + :* paramsBabbage + :* paramsConway + :* Nil + ) + , shelleyBasedProtocolParams = paramsShelleyBased + , cardanoProtocolTransitionParams = + PCons transitionParamsByronToShelley + ( PCons transitionParamsShelleyToAllegra + ( PCons transitionParamsAllegraToMary + ( PCons transitionParamsMaryToAlonzo + ( PCons transitionParamsAlonzoToBabbage + ( PCons transitionParamsBabbageToConway + PNil))))) + } + +{-# COMPLETE CardanoProtocolParams #-} -- | Create a 'ProtocolInfo' for 'CardanoBlock' -- @@ -570,81 +655,11 @@ data ProtocolTransitionParamsShelleyBased era = ProtocolTransitionParamsShelleyB -- for mainnet (check against @'SL.gNetworkId' 'shelleyBasedGenesis'@). protocolInfoCardano :: forall c m. (IOLike m, CardanoHardForkConstraints c) - => ProtocolParamsByron - -> ProtocolParamsShelleyBased (ShelleyEra c) - -> ProtocolParamsShelley c - -> ProtocolParamsAllegra c - -> ProtocolParamsMary c - -> ProtocolParamsAlonzo c - -> ProtocolParamsBabbage c - -> ProtocolParamsConway c - -> ProtocolTransitionParamsShelleyBased (ShelleyEra c) - -> ProtocolTransitionParamsShelleyBased (AllegraEra c) - -> ProtocolTransitionParamsShelleyBased (MaryEra c) - -> ProtocolTransitionParamsShelleyBased (AlonzoEra c) - -> ProtocolTransitionParamsShelleyBased (BabbageEra c) - -> ProtocolTransitionParamsShelleyBased (ConwayEra c) + => CardanoProtocolParams c -> ( ProtocolInfo (CardanoBlock c) , m [BlockForging m (CardanoBlock c)] ) -protocolInfoCardano protocolParamsByron@ProtocolParamsByron { - byronGenesis = genesisByron - , byronLeaderCredentials = mCredsByron - , byronMaxTxCapacityOverrides = maxTxCapacityOverridesByron - } - ProtocolParamsShelleyBased { - shelleyBasedGenesis = genesisShelley - , shelleyBasedInitialNonce = initialNonceShelley - , shelleyBasedLeaderCredentials = credssShelleyBased - } - ProtocolParamsShelley { - shelleyProtVer = protVerShelley - , shelleyMaxTxCapacityOverrides = maxTxCapacityOverridesShelley - } - ProtocolParamsAllegra { - allegraProtVer = protVerAllegra - , allegraMaxTxCapacityOverrides = maxTxCapacityOverridesAllegra - } - ProtocolParamsMary { - maryProtVer = protVerMary - , maryMaxTxCapacityOverrides = maxTxCapacityOverridesMary - } - ProtocolParamsAlonzo { - alonzoProtVer = protVerAlonzo - , alonzoMaxTxCapacityOverrides = maxTxCapacityOverridesAlonzo - } - ProtocolParamsBabbage { - babbageProtVer = protVerBabbage - , babbageMaxTxCapacityOverrides = maxTxCapacityOverridesBabbage - } - ProtocolParamsConway { - conwayProtVer = protVerConway - , conwayMaxTxCapacityOverrides = maxTxCapacityOverridesConway - } - ProtocolTransitionParamsShelleyBased { - transitionTranslationContext = transCtxtShelley - , transitionTrigger = triggerHardForkShelley - } - ProtocolTransitionParamsShelleyBased { - transitionTranslationContext = () - , transitionTrigger = triggerHardForkAllegra - } - ProtocolTransitionParamsShelleyBased { - transitionTranslationContext = () - , transitionTrigger = triggerHardForkMary - } - ProtocolTransitionParamsShelleyBased { - transitionTranslationContext = transCtxtAlonzo - , transitionTrigger = triggerHardForkAlonzo - } - ProtocolTransitionParamsShelleyBased { - transitionTranslationContext = transCtxtBabbage - , transitionTrigger = triggerHardForkBabbage - } - ProtocolTransitionParamsShelleyBased { - transitionTranslationContext = transCtxtConway - , transitionTrigger = triggerHardForkConway - } +protocolInfoCardano paramsCardano | SL.Mainnet <- SL.sgNetworkId genesisShelley , length credssShelleyBased > 1 = error "Multiple Shelley-based credentials not allowed for mainnet" @@ -657,8 +672,87 @@ protocolInfoCardano protocolParamsByron@ProtocolParamsByron { , blockForging ) where + CardanoProtocolParams { + paramsByron + , paramsShelleyBased + , paramsShelley + , paramsAllegra + , paramsMary + , paramsAlonzo + , paramsBabbage + , paramsConway + , transitionParamsByronToShelley + , transitionParamsShelleyToAllegra + , transitionParamsAllegraToMary + , transitionParamsMaryToAlonzo + , transitionParamsAlonzoToBabbage + , transitionParamsBabbageToConway + } = paramsCardano + + ProtocolParamsByron { + byronGenesis = genesisByron + , byronLeaderCredentials = mCredsByron + , byronMaxTxCapacityOverrides = maxTxCapacityOverridesByron + } = paramsByron + ProtocolParamsShelleyBased { + shelleyBasedGenesis = genesisShelley + , shelleyBasedInitialNonce = initialNonceShelley + , shelleyBasedLeaderCredentials = credssShelleyBased + } = paramsShelleyBased + ProtocolParamsShelley { + shelleyProtVer = protVerShelley + , shelleyMaxTxCapacityOverrides = maxTxCapacityOverridesShelley + } = paramsShelley + ProtocolParamsAllegra { + allegraProtVer = protVerAllegra + , allegraMaxTxCapacityOverrides = maxTxCapacityOverridesAllegra + } = paramsAllegra + ProtocolParamsMary { + maryProtVer = protVerMary + , maryMaxTxCapacityOverrides = maxTxCapacityOverridesMary + } = paramsMary + ProtocolParamsAlonzo { + alonzoProtVer = protVerAlonzo + , alonzoMaxTxCapacityOverrides = maxTxCapacityOverridesAlonzo + } = paramsAlonzo + ProtocolParamsBabbage { + babbageProtVer = protVerBabbage + , babbageMaxTxCapacityOverrides = maxTxCapacityOverridesBabbage + } = paramsBabbage + ProtocolParamsConway { + conwayProtVer = protVerConway + , conwayMaxTxCapacityOverrides = maxTxCapacityOverridesConway + } = paramsConway + + ProtocolTransitionParamsByronToShelley { + transitionByronToShelleyTranslationContext = transCtxtShelley + , transitionByronToShelleyTrigger = triggerHardForkShelley + } = transitionParamsByronToShelley + ProtocolTransitionParamsIntraShelley { + transitionIntraShelleyTranslationContext = () + , transitionIntraShelleyTrigger = triggerHardForkAllegra + } = transitionParamsShelleyToAllegra + ProtocolTransitionParamsIntraShelley { + transitionIntraShelleyTranslationContext = () + , transitionIntraShelleyTrigger = triggerHardForkMary + } = transitionParamsAllegraToMary + ProtocolTransitionParamsIntraShelley { + transitionIntraShelleyTranslationContext = transCtxtAlonzo + , transitionIntraShelleyTrigger = triggerHardForkAlonzo + } = transitionParamsMaryToAlonzo + ProtocolTransitionParamsIntraShelley { + transitionIntraShelleyTranslationContext = transCtxtBabbage + , transitionIntraShelleyTrigger = triggerHardForkBabbage + } = transitionParamsAlonzoToBabbage + ProtocolTransitionParamsIntraShelley { + transitionIntraShelleyTranslationContext = transCtxtConway + , transitionIntraShelleyTrigger = triggerHardForkConway + } = transitionParamsBabbageToConway + -- The major protocol version of the last era is the maximum major protocol -- version we support. + -- + -- TODO: use index of CardanoProtocolParams NP maxMajorProtVer :: MaxMajorProtVer maxMajorProtVer = MaxMajorProtVer @@ -687,7 +781,7 @@ protocolInfoCardano protocolParamsByron@ProtocolParamsByron { , topLevelConfigBlock = blockConfigByron } , pInfoInitLedger = initExtLedgerStateByron - } = protocolInfoByron protocolParamsByron + } = protocolInfoByron paramsByron partialConsensusConfigByron :: PartialConsensusConfig (BlockProtocol ByronBlock) partialConsensusConfigByron = consensusConfigByron diff --git a/ouroboros-consensus-cardano/src/shelley/Ouroboros/Consensus/Shelley/Node.hs b/ouroboros-consensus-cardano/src/shelley/Ouroboros/Consensus/Shelley/Node.hs index 76a1142d9d..3c0590a16a 100644 --- a/ouroboros-consensus-cardano/src/shelley/Ouroboros/Consensus/Shelley/Node.hs +++ b/ouroboros-consensus-cardano/src/shelley/Ouroboros/Consensus/Shelley/Node.hs @@ -14,10 +14,7 @@ module Ouroboros.Consensus.Shelley.Node ( MaxMajorProtVer (..) - , ProtocolParamsAllegra (..) - , ProtocolParamsAlonzo (..) - , ProtocolParamsMary (..) - , ProtocolParamsShelley (..) + , ProtocolParams (..) , ProtocolParamsShelleyBased (..) , SL.Nonce (..) , SL.ProtVer (..) @@ -48,15 +45,15 @@ import Ouroboros.Consensus.Shelley.Eras (EraCrypto) import Ouroboros.Consensus.Shelley.Ledger import Ouroboros.Consensus.Shelley.Ledger.Inspect () import Ouroboros.Consensus.Shelley.Ledger.NetworkProtocolVersion () +import Ouroboros.Consensus.Shelley.Node.Praos import Ouroboros.Consensus.Shelley.Node.Serialisation () import Ouroboros.Consensus.Shelley.Node.TPraos import Ouroboros.Consensus.Shelley.Protocol.Abstract (pHeaderIssuer) + {------------------------------------------------------------------------------- ProtocolInfo -------------------------------------------------------------------------------} - - protocolClientInfoShelley :: ProtocolClientInfo (ShelleyBlock proto era) protocolClientInfoShelley = ProtocolClientInfo { diff --git a/ouroboros-consensus-cardano/src/shelley/Ouroboros/Consensus/Shelley/Node/Praos.hs b/ouroboros-consensus-cardano/src/shelley/Ouroboros/Consensus/Shelley/Node/Praos.hs index 4da6ae755b..5b82f0f4d4 100644 --- a/ouroboros-consensus-cardano/src/shelley/Ouroboros/Consensus/Shelley/Node/Praos.hs +++ b/ouroboros-consensus-cardano/src/shelley/Ouroboros/Consensus/Shelley/Node/Praos.hs @@ -1,18 +1,21 @@ {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} +{-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} module Ouroboros.Consensus.Shelley.Node.Praos ( - ProtocolParamsBabbage (..) - , ProtocolParamsConway (..) - , praosBlockForging + -- * BlockForging + praosBlockForging , praosSharedBlockForging + -- * ProtocolInfo + , ProtocolParams (..) ) where import qualified Cardano.Ledger.Shelley.API as SL @@ -21,6 +24,7 @@ import qualified Cardano.Protocol.TPraos.OCert as SL import Ouroboros.Consensus.Block import Ouroboros.Consensus.Config (configConsensus) import qualified Ouroboros.Consensus.Mempool as Mempool +import Ouroboros.Consensus.Node.ProtocolInfo import qualified Ouroboros.Consensus.Protocol.Ledger.HotKey as HotKey import Ouroboros.Consensus.Protocol.Praos (Praos, PraosParams (..), praosCheckCanForge) @@ -30,9 +34,8 @@ import Ouroboros.Consensus.Shelley.Eras (BabbageEra, ConwayEra, EraCrypto, ShelleyBasedEra (shelleyBasedEraName)) import Ouroboros.Consensus.Shelley.Ledger (ShelleyBlock, ShelleyCompatible, forgeShelleyBlock) -import Ouroboros.Consensus.Shelley.Node - (ShelleyLeaderCredentials (..)) -import Ouroboros.Consensus.Shelley.Node.Common (ShelleyEraWithCrypto) +import Ouroboros.Consensus.Shelley.Node.Common (ShelleyEraWithCrypto, + ShelleyLeaderCredentials (..)) import Ouroboros.Consensus.Shelley.Protocol.Praos () import Ouroboros.Consensus.Util.IOLike (IOLike) @@ -114,14 +117,12 @@ praosSharedBlockForging ProtocolInfo -------------------------------------------------------------------------------} --- | Parameters needed to run Babbage -data ProtocolParamsBabbage c = ProtocolParamsBabbage { +data instance ProtocolParams (ShelleyBlock (Praos c) (BabbageEra c)) = ProtocolParamsBabbage { babbageProtVer :: SL.ProtVer , babbageMaxTxCapacityOverrides :: Mempool.TxOverrides (ShelleyBlock (Praos c) (BabbageEra c)) } --- | Parameters needed to run Conway -data ProtocolParamsConway c = ProtocolParamsConway { +data instance ProtocolParams (ShelleyBlock (Praos c) (ConwayEra c)) = ProtocolParamsConway { conwayProtVer :: SL.ProtVer , conwayMaxTxCapacityOverrides :: Mempool.TxOverrides (ShelleyBlock (Praos c) (ConwayEra c)) } diff --git a/ouroboros-consensus-cardano/src/shelley/Ouroboros/Consensus/Shelley/Node/TPraos.hs b/ouroboros-consensus-cardano/src/shelley/Ouroboros/Consensus/Shelley/Node/TPraos.hs index 84f2f1a8be..a144ae5163 100644 --- a/ouroboros-consensus-cardano/src/shelley/Ouroboros/Consensus/Shelley/Node/TPraos.hs +++ b/ouroboros-consensus-cardano/src/shelley/Ouroboros/Consensus/Shelley/Node/TPraos.hs @@ -7,7 +7,6 @@ {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE PolyKinds #-} -{-# LANGUAGE RecordWildCards #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} @@ -19,10 +18,7 @@ module Ouroboros.Consensus.Shelley.Node.TPraos ( MaxMajorProtVer (..) - , ProtocolParamsAllegra (..) - , ProtocolParamsAlonzo (..) - , ProtocolParamsMary (..) - , ProtocolParamsShelley (..) + , ProtocolParams (..) , ProtocolParamsShelleyBased (..) , SL.Nonce (..) , SL.ProtVer (..) @@ -190,25 +186,25 @@ validateGenesis = first errsToString . SL.validateGenesis ("Invalid genesis config:" : map SL.describeValidationErr errs) -- | Parameters needed to run Shelley -data ProtocolParamsShelley c = ProtocolParamsShelley { +data instance ProtocolParams (ShelleyBlock (TPraos c) (ShelleyEra c)) = ProtocolParamsShelley { shelleyProtVer :: SL.ProtVer , shelleyMaxTxCapacityOverrides :: Mempool.TxOverrides (ShelleyBlock(TPraos c) (ShelleyEra c) ) } -- | Parameters needed to run Allegra -data ProtocolParamsAllegra c = ProtocolParamsAllegra { +data instance ProtocolParams (ShelleyBlock (TPraos c) (AllegraEra c)) = ProtocolParamsAllegra { allegraProtVer :: SL.ProtVer , allegraMaxTxCapacityOverrides :: Mempool.TxOverrides (ShelleyBlock (TPraos c) (AllegraEra c) ) } -- | Parameters needed to run Mary -data ProtocolParamsMary c = ProtocolParamsMary { +data instance ProtocolParams (ShelleyBlock (TPraos c) (MaryEra c)) = ProtocolParamsMary { maryProtVer :: SL.ProtVer , maryMaxTxCapacityOverrides :: Mempool.TxOverrides (ShelleyBlock (TPraos c) (MaryEra c) ) } -- | Parameters needed to run Alonzo -data ProtocolParamsAlonzo c = ProtocolParamsAlonzo { +data instance ProtocolParams (ShelleyBlock (TPraos c) (AlonzoEra c)) = ProtocolParamsAlonzo { alonzoProtVer :: SL.ProtVer , alonzoMaxTxCapacityOverrides :: Mempool.TxOverrides (ShelleyBlock (TPraos c) (AlonzoEra c) ) } @@ -221,8 +217,8 @@ protocolInfoShelley :: , TxLimits (ShelleyBlock (TPraos c) (ShelleyEra c)) ) => ProtocolParamsShelleyBased (ShelleyEra c) - -> ProtocolParamsShelley c - -> ( ProtocolInfo (ShelleyBlock (TPraos c)(ShelleyEra c) ) + -> ProtocolParams (ShelleyBlock (TPraos c) (ShelleyEra c)) + -> ( ProtocolInfo (ShelleyBlock (TPraos c) (ShelleyEra c) ) , m [BlockForging m (ShelleyBlock (TPraos c) (ShelleyEra c))] ) protocolInfoShelley protocolParamsShelleyBased diff --git a/ouroboros-consensus-cardano/src/tools/Cardano/Api/Protocol/Types.hs b/ouroboros-consensus-cardano/src/tools/Cardano/Api/Protocol/Types.hs index 2870640d18..87752a9d4a 100644 --- a/ouroboros-consensus-cardano/src/tools/Cardano/Api/Protocol/Types.hs +++ b/ouroboros-consensus-cardano/src/tools/Cardano/Api/Protocol/Types.hs @@ -20,6 +20,7 @@ module Cardano.Api.Protocol.Types ( import Cardano.Chain.Slotting (EpochSlots) import Data.Bifunctor (bimap) import Ouroboros.Consensus.Block.Forging (BlockForging) +import qualified Ouroboros.Consensus.Byron.Ledger.Block as Consensus import Ouroboros.Consensus.Cardano import Ouroboros.Consensus.Cardano.Block import Ouroboros.Consensus.Cardano.ByronHFC (ByronBlockHFC) @@ -36,7 +37,6 @@ import qualified Ouroboros.Consensus.Shelley.Eras as Consensus (ShelleyEra) import qualified Ouroboros.Consensus.Shelley.Ledger.Block as Consensus (ShelleyBlock) import Ouroboros.Consensus.Shelley.Ledger.SupportsProtocol () -import Ouroboros.Consensus.Shelley.Node.Praos import Ouroboros.Consensus.Shelley.ShelleyHFC (ShelleyBlockHFC) import Ouroboros.Consensus.Util.IOLike (IOLike) @@ -59,7 +59,7 @@ class RunNode blk => ProtocolClient blk where -- | Run PBFT against the Byron ledger instance IOLike m => Protocol m ByronBlockHFC where - data ProtocolInfoArgs m ByronBlockHFC = ProtocolInfoArgsByron ProtocolParamsByron + data ProtocolInfoArgs m ByronBlockHFC = ProtocolInfoArgsByron (ProtocolParams Consensus.ByronBlock) protocolInfo (ProtocolInfoArgsByron params) = ( inject $ protocolInfoByron params , pure . map inject $ blockForgingByron params ) @@ -67,51 +67,10 @@ instance IOLike m => Protocol m ByronBlockHFC where instance (CardanoHardForkConstraints StandardCrypto, IOLike m) => Protocol m (CardanoBlock StandardCrypto) where data ProtocolInfoArgs m (CardanoBlock StandardCrypto) = ProtocolInfoArgsCardano - ProtocolParamsByron - (ProtocolParamsShelleyBased StandardShelley) - (ProtocolParamsShelley StandardCrypto) - (ProtocolParamsAllegra StandardCrypto) - (ProtocolParamsMary StandardCrypto) - (ProtocolParamsAlonzo StandardCrypto) - (ProtocolParamsBabbage StandardCrypto) - (ProtocolParamsConway StandardCrypto) - (ProtocolTransitionParamsShelleyBased StandardShelley) - (ProtocolTransitionParamsShelleyBased StandardAllegra) - (ProtocolTransitionParamsShelleyBased StandardMary) - (ProtocolTransitionParamsShelleyBased StandardAlonzo) - (ProtocolTransitionParamsShelleyBased StandardBabbage) - (ProtocolTransitionParamsShelleyBased StandardConway) - - protocolInfo (ProtocolInfoArgsCardano - paramsByron - paramsShelleyBased - paramsShelley - paramsAllegra - paramsMary - paramsAlonzo - paramsBabbage - paramsConway - paramsByronShelley - paramsShelleyAllegra - paramsAllegraMary - paramsMaryAlonzo - paramsAlonzoBabbage - paramsAlonzoConway) = - protocolInfoCardano - paramsByron - paramsShelleyBased - paramsShelley - paramsAllegra - paramsMary - paramsAlonzo - paramsBabbage - paramsConway - paramsByronShelley - paramsShelleyAllegra - paramsAllegraMary - paramsMaryAlonzo - paramsAlonzoBabbage - paramsAlonzoConway + (CardanoProtocolParams StandardCrypto) + + protocolInfo (ProtocolInfoArgsCardano paramsCardano) = + protocolInfoCardano paramsCardano instance ProtocolClient ByronBlockHFC where data ProtocolClientInfoArgs ByronBlockHFC = @@ -133,9 +92,9 @@ instance ( IOLike m => Protocol m (ShelleyBlockHFC (Consensus.TPraos StandardCrypto) StandardShelley) where data ProtocolInfoArgs m (ShelleyBlockHFC (Consensus.TPraos StandardCrypto) StandardShelley) = ProtocolInfoArgsShelley (ProtocolParamsShelleyBased StandardShelley) - (ProtocolParamsShelley StandardCrypto) - protocolInfo (ProtocolInfoArgsShelley paramsShelleyBased paramsShelley) = - bimap inject (fmap $ map inject) $ protocolInfoShelley paramsShelleyBased paramsShelley + (ProtocolParams (Consensus.ShelleyBlock (Consensus.TPraos StandardCrypto) (ShelleyEra StandardCrypto))) + protocolInfo (ProtocolInfoArgsShelley paramsShelleyBased' paramsShelley') = + bimap inject (fmap $ map inject) $ protocolInfoShelley paramsShelleyBased' paramsShelley' instance Consensus.LedgerSupportsProtocol (Consensus.ShelleyBlock diff --git a/ouroboros-consensus-cardano/src/tools/Cardano/Node/Protocol/Cardano.hs b/ouroboros-consensus-cardano/src/tools/Cardano/Node/Protocol/Cardano.hs index d541d72e8a..da33469593 100644 --- a/ouroboros-consensus-cardano/src/tools/Cardano/Node/Protocol/Cardano.hs +++ b/ouroboros-consensus-cardano/src/tools/Cardano/Node/Protocol/Cardano.hs @@ -36,7 +36,6 @@ import qualified Ouroboros.Consensus.Cardano.CanHardFork as Consensus import Ouroboros.Consensus.Cardano.Condense () import Ouroboros.Consensus.HardFork.Combinator.Condense () import qualified Ouroboros.Consensus.Mempool as Mempool -import qualified Ouroboros.Consensus.Shelley.Node.Praos as Praos ------------------------------------------------------------------------------ @@ -140,178 +139,180 @@ mkSomeConsensusProtocolCardano NodeByronProtocolConfiguration { -- It could and should all be automated and these config entries eliminated. return $! SomeConsensusProtocol CardanoBlockType $ ProtocolInfoArgsCardano - Consensus.ProtocolParamsByron { - byronGenesis = byronGenesis, - byronPbftSignatureThreshold = - PBftSignatureThreshold <$> npcByronPbftSignatureThresh, + (CardanoProtocolParams + Consensus.ProtocolParamsByron { + byronGenesis = byronGenesis, + byronPbftSignatureThreshold = + PBftSignatureThreshold <$> npcByronPbftSignatureThresh, - -- This is /not/ the Byron protocol version. It is the protocol - -- version that this node will use in blocks it creates. It is used - -- in the Byron update mechanism to signal that this block-producing - -- node is ready to move to the new protocol. For example, when the - -- protocol version (according to the ledger state) is 0, this setting - -- should be 1 when we are ready to move. Similarly when the current - -- protocol version is 1, this should be 2 to indicate we are ready - -- to move into the Shelley era. - byronProtocolVersion = - Byron.ProtocolVersion - npcByronSupportedProtocolVersionMajor - npcByronSupportedProtocolVersionMinor - npcByronSupportedProtocolVersionAlt, - byronSoftwareVersion = - Byron.SoftwareVersion - npcByronApplicationName - npcByronApplicationVersion, - byronLeaderCredentials = - byronLeaderCredentials, - byronMaxTxCapacityOverrides = - Mempool.mkOverrides Mempool.noOverridesMeasure - } - Consensus.ProtocolParamsShelleyBased { - shelleyBasedGenesis = shelleyGenesis, - shelleyBasedInitialNonce = Shelley.genesisHashToPraosNonce - shelleyGenesisHash, - shelleyBasedLeaderCredentials = shelleyLeaderCredentials - } - Consensus.ProtocolParamsShelley { - -- This is /not/ the Shelley protocol version. It is the protocol - -- version that this node will declare that it understands, when it - -- is in the Shelley era. That is, it is the version of protocol - -- /after/ Shelley, i.e. Allegra. - shelleyProtVer = - ProtVer (natVersion @3) 0, - shelleyMaxTxCapacityOverrides = - Mempool.mkOverrides Mempool.noOverridesMeasure - } - Consensus.ProtocolParamsAllegra { - -- This is /not/ the Allegra protocol version. It is the protocol - -- version that this node will declare that it understands, when it - -- is in the Allegra era. That is, it is the version of protocol - -- /after/ Allegra, i.e. Mary. - allegraProtVer = - ProtVer (natVersion @4) 0, - allegraMaxTxCapacityOverrides = - Mempool.mkOverrides Mempool.noOverridesMeasure - } - Consensus.ProtocolParamsMary { - -- This is /not/ the Mary protocol version. It is the protocol - -- version that this node will declare that it understands, when it - -- is in the Mary era. That is, it is the version of protocol - -- /after/ Mary, i.e. Alonzo. - maryProtVer = ProtVer (natVersion @5) 0, - maryMaxTxCapacityOverrides = - Mempool.mkOverrides Mempool.noOverridesMeasure - } - Consensus.ProtocolParamsAlonzo { - -- This is /not/ the Alonzo protocol version. It is the protocol - -- version that this node will declare that it understands, when it - -- is in the Alonzo era. That is, it is the version of protocol - -- /after/ Alonzo, i.e. Babbage. - alonzoProtVer = ProtVer (natVersion @6) 0, - alonzoMaxTxCapacityOverrides = - Mempool.mkOverrides Mempool.noOverridesMeasure - } - Praos.ProtocolParamsBabbage { - -- This is /not/ the Babbage protocol version. It is the protocol - -- version that this node will declare that it understands, when it - -- is in the Babbage era. - Praos.babbageProtVer = ProtVer (natVersion @7) 0, - Praos.babbageMaxTxCapacityOverrides = - Mempool.mkOverrides Mempool.noOverridesMeasure - } - Praos.ProtocolParamsConway { - -- This is /not/ the Conway protocol version. It is the protocol - -- version that this node will declare that it understands, when it - -- is in the Conway era. - Praos.conwayProtVer = - if npcTestEnableDevelopmentHardForkEras - then ProtVer (natVersion @9) 0 -- Advertise we can support Conway - else ProtVer (natVersion @8) 0, -- Otherwise we only advertise we know about Babbage - Praos.conwayMaxTxCapacityOverrides = - Mempool.mkOverrides Mempool.noOverridesMeasure - } - -- 'ProtocolTransitionParamsShelleyBased' specifies the parameters - -- needed to transition between two eras. The comments below also apply - -- for the Shelley -> Allegra and Allegra -> Mary hard forks. - -- - -- Byron to Shelley hard fork parameters - Consensus.ProtocolTransitionParamsShelleyBased { - transitionTranslationContext = toFromByronTranslationContext shelleyGenesis, - transitionTrigger = - -- What will trigger the Byron -> Shelley hard fork? - case npcTestShelleyHardForkAtEpoch of + -- This is /not/ the Byron protocol version. It is the protocol + -- version that this node will use in blocks it creates. It is used + -- in the Byron update mechanism to signal that this block-producing + -- node is ready to move to the new protocol. For example, when the + -- protocol version (according to the ledger state) is 0, this setting + -- should be 1 when we are ready to move. Similarly when the current + -- protocol version is 1, this should be 2 to indicate we are ready + -- to move into the Shelley era. + byronProtocolVersion = + Byron.ProtocolVersion + npcByronSupportedProtocolVersionMajor + npcByronSupportedProtocolVersionMinor + npcByronSupportedProtocolVersionAlt, + byronSoftwareVersion = + Byron.SoftwareVersion + npcByronApplicationName + npcByronApplicationVersion, + byronLeaderCredentials = + byronLeaderCredentials, + byronMaxTxCapacityOverrides = + Mempool.mkOverrides Mempool.noOverridesMeasure + } + Consensus.ProtocolParamsShelleyBased { + shelleyBasedGenesis = shelleyGenesis, + shelleyBasedInitialNonce = Shelley.genesisHashToPraosNonce + shelleyGenesisHash, + shelleyBasedLeaderCredentials = shelleyLeaderCredentials + } + Consensus.ProtocolParamsShelley { + -- This is /not/ the Shelley protocol version. It is the protocol + -- version that this node will declare that it understands, when it + -- is in the Shelley era. That is, it is the version of protocol + -- /after/ Shelley, i.e. Allegra. + shelleyProtVer = + ProtVer (natVersion @3) 0, + shelleyMaxTxCapacityOverrides = + Mempool.mkOverrides Mempool.noOverridesMeasure + } + Consensus.ProtocolParamsAllegra { + -- This is /not/ the Allegra protocol version. It is the protocol + -- version that this node will declare that it understands, when it + -- is in the Allegra era. That is, it is the version of protocol + -- /after/ Allegra, i.e. Mary. + allegraProtVer = + ProtVer (natVersion @4) 0, + allegraMaxTxCapacityOverrides = + Mempool.mkOverrides Mempool.noOverridesMeasure + } + Consensus.ProtocolParamsMary { + -- This is /not/ the Mary protocol version. It is the protocol + -- version that this node will declare that it understands, when it + -- is in the Mary era. That is, it is the version of protocol + -- /after/ Mary, i.e. Alonzo. + maryProtVer = ProtVer (natVersion @5) 0, + maryMaxTxCapacityOverrides = + Mempool.mkOverrides Mempool.noOverridesMeasure + } + Consensus.ProtocolParamsAlonzo { + -- This is /not/ the Alonzo protocol version. It is the protocol + -- version that this node will declare that it understands, when it + -- is in the Alonzo era. That is, it is the version of protocol + -- /after/ Alonzo, i.e. Babbage. + alonzoProtVer = ProtVer (natVersion @6) 0, + alonzoMaxTxCapacityOverrides = + Mempool.mkOverrides Mempool.noOverridesMeasure + } + Consensus.ProtocolParamsBabbage { + -- This is /not/ the Babbage protocol version. It is the protocol + -- version that this node will declare that it understands, when it + -- is in the Babbage era. + Consensus.babbageProtVer = ProtVer (natVersion @7) 0, + Consensus.babbageMaxTxCapacityOverrides = + Mempool.mkOverrides Mempool.noOverridesMeasure + } + Consensus.ProtocolParamsConway { + -- This is /not/ the Conway protocol version. It is the protocol + -- version that this node will declare that it understands, when it + -- is in the Conway era. + Consensus.conwayProtVer = + if npcTestEnableDevelopmentHardForkEras + then ProtVer (natVersion @9) 0 -- Advertise we can support Conway + else ProtVer (natVersion @8) 0, -- Otherwise we only advertise we know about Babbage + Consensus.conwayMaxTxCapacityOverrides = + Mempool.mkOverrides Mempool.noOverridesMeasure + } + -- 'ProtocolTransitionParams' specifies the parameters needed to + -- transition between two eras. The comments below also apply for the + -- Shelley -> Allegra and Allegra -> Mary hard forks. + -- + -- Byron to Shelley hard fork parameters + Consensus.ProtocolTransitionParamsByronToShelley { + transitionByronToShelleyTranslationContext = toFromByronTranslationContext shelleyGenesis, + transitionByronToShelleyTrigger = + -- What will trigger the Byron -> Shelley hard fork? + case npcTestShelleyHardForkAtEpoch of - -- This specifies the major protocol version number update that will - -- trigger us moving to the Shelley protocol. - -- - -- Version 0 is Byron with Ouroboros classic - -- Version 1 is Byron with Ouroboros Permissive BFT - -- Version 2 is Shelley - -- Version 3 is Allegra - -- Version 4 is Mary - -- Version 5 is Alonzo - -- Version 6 is Alonzo (intra era hardfork) - -- Version 7 is Babbage - -- Version 8 is Babbage (intra era hardfork) - -- Version 9 is Conway - -- - -- But we also provide an override to allow for simpler test setups - -- such as triggering at the 0 -> 1 transition . - -- - Nothing -> Consensus.TriggerHardForkAtVersion - (maybe 2 fromIntegral npcTestShelleyHardForkAtVersion) + -- This specifies the major protocol version number update that will + -- trigger us moving to the Shelley protocol. + -- + -- Version 0 is Byron with Ouroboros classic + -- Version 1 is Byron with Ouroboros Permissive BFT + -- Version 2 is Shelley + -- Version 3 is Allegra + -- Version 4 is Mary + -- Version 5 is Alonzo + -- Version 6 is Alonzo (intra era hardfork) + -- Version 7 is Babbage + -- Version 8 is Babbage (intra era hardfork) + -- Version 9 is Conway + -- + -- But we also provide an override to allow for simpler test setups + -- such as triggering at the 0 -> 1 transition . + -- + Nothing -> Consensus.TriggerHardForkAtVersion + (maybe 2 fromIntegral npcTestShelleyHardForkAtVersion) - -- Alternatively, for testing we can transition at a specific epoch. - -- - Just epochNo -> Consensus.TriggerHardForkAtEpoch epochNo - } - -- Shelley to Allegra hard fork parameters - Consensus.ProtocolTransitionParamsShelleyBased { - transitionTranslationContext = (), - transitionTrigger = - case npcTestAllegraHardForkAtEpoch of - Nothing -> Consensus.TriggerHardForkAtVersion - (maybe 3 fromIntegral npcTestAllegraHardForkAtVersion) - Just epochNo -> Consensus.TriggerHardForkAtEpoch epochNo - } - -- Allegra to Mary hard fork parameters - Consensus.ProtocolTransitionParamsShelleyBased { - transitionTranslationContext = (), - transitionTrigger = - case npcTestMaryHardForkAtEpoch of - Nothing -> Consensus.TriggerHardForkAtVersion - (maybe 4 fromIntegral npcTestMaryHardForkAtVersion) - Just epochNo -> Consensus.TriggerHardForkAtEpoch epochNo - } - -- Mary to Alonzo hard fork parameters - Consensus.ProtocolTransitionParamsShelleyBased { - transitionTranslationContext = alonzoGenesis, - transitionTrigger = - case npcTestAlonzoHardForkAtEpoch of - Nothing -> Consensus.TriggerHardForkAtVersion - (maybe 5 fromIntegral npcTestAlonzoHardForkAtVersion) - Just epochNo -> Consensus.TriggerHardForkAtEpoch epochNo - } - -- Alonzo to Babbage hard fork parameters - Consensus.ProtocolTransitionParamsShelleyBased { - transitionTranslationContext = (), - transitionTrigger = - case npcTestBabbageHardForkAtEpoch of + -- Alternatively, for testing we can transition at a specific epoch. + -- + Just epochNo -> Consensus.TriggerHardForkAtEpoch epochNo + } + -- Shelley to Allegra hard fork parameters + Consensus.ProtocolTransitionParamsIntraShelley { + transitionIntraShelleyTranslationContext = (), + transitionIntraShelleyTrigger = + case npcTestAllegraHardForkAtEpoch of Nothing -> Consensus.TriggerHardForkAtVersion - (maybe 7 fromIntegral npcTestBabbageHardForkAtVersion) + (maybe 3 fromIntegral npcTestAllegraHardForkAtVersion) Just epochNo -> Consensus.TriggerHardForkAtEpoch epochNo - - } - -- Babbage to Conway hard fork parameters - Consensus.ProtocolTransitionParamsShelleyBased { - transitionTranslationContext = conwayGenesis, - transitionTrigger = - case npcTestConwayHardForkAtEpoch of + } + -- Allegra to Mary hard fork parameters + Consensus.ProtocolTransitionParamsIntraShelley { + transitionIntraShelleyTranslationContext = (), + transitionIntraShelleyTrigger = + case npcTestMaryHardForkAtEpoch of Nothing -> Consensus.TriggerHardForkAtVersion - (maybe 9 fromIntegral npcTestConwayHardForkAtVersion) + (maybe 4 fromIntegral npcTestMaryHardForkAtVersion) Just epochNo -> Consensus.TriggerHardForkAtEpoch epochNo + } + -- Mary to Alonzo hard fork parameters + Consensus.ProtocolTransitionParamsIntraShelley { + transitionIntraShelleyTranslationContext = alonzoGenesis, + transitionIntraShelleyTrigger = + case npcTestAlonzoHardForkAtEpoch of + Nothing -> Consensus.TriggerHardForkAtVersion + (maybe 5 fromIntegral npcTestAlonzoHardForkAtVersion) + Just epochNo -> Consensus.TriggerHardForkAtEpoch epochNo + } + -- Alonzo to Babbage hard fork parameters + Consensus.ProtocolTransitionParamsIntraShelley { + transitionIntraShelleyTranslationContext = (), + transitionIntraShelleyTrigger = + case npcTestBabbageHardForkAtEpoch of + Nothing -> Consensus.TriggerHardForkAtVersion + (maybe 7 fromIntegral npcTestBabbageHardForkAtVersion) + Just epochNo -> Consensus.TriggerHardForkAtEpoch epochNo + + } + -- Babbage to Conway hard fork parameters + Consensus.ProtocolTransitionParamsIntraShelley { + transitionIntraShelleyTranslationContext = conwayGenesis, + transitionIntraShelleyTrigger = + case npcTestConwayHardForkAtEpoch of + Nothing -> Consensus.TriggerHardForkAtVersion + (maybe 9 fromIntegral npcTestConwayHardForkAtVersion) + Just epochNo -> Consensus.TriggerHardForkAtEpoch epochNo - } + } + ) ------------------------------------------------------------------------------ -- Errors diff --git a/ouroboros-consensus-cardano/src/tools/Cardano/Node/Protocol/Shelley.hs b/ouroboros-consensus-cardano/src/tools/Cardano/Node/Protocol/Shelley.hs index a62589cb1b..1a8287bf73 100644 --- a/ouroboros-consensus-cardano/src/tools/Cardano/Node/Protocol/Shelley.hs +++ b/ouroboros-consensus-cardano/src/tools/Cardano/Node/Protocol/Shelley.hs @@ -48,9 +48,8 @@ import qualified Ouroboros.Consensus.Mempool as Mempool import Ouroboros.Consensus.Protocol.Praos.Common (PraosCanBeLeader (..)) import Ouroboros.Consensus.Shelley.Node (Nonce (..), - ProtocolParamsShelley (..), - ProtocolParamsShelleyBased (..), ShelleyGenesis (..), - ShelleyLeaderCredentials (..)) + ProtocolParams (..), ProtocolParamsShelleyBased (..), + ShelleyGenesis (..), ShelleyLeaderCredentials (..)) import Prelude (String, id) diff --git a/ouroboros-consensus-cardano/src/tools/Cardano/Tools/DBAnalyser/Block/Byron.hs b/ouroboros-consensus-cardano/src/tools/Cardano/Tools/DBAnalyser/Block/Byron.hs index 449f9c4239..6d44df30cd 100644 --- a/ouroboros-consensus-cardano/src/tools/Cardano/Tools/DBAnalyser/Block/Byron.hs +++ b/ouroboros-consensus-cardano/src/tools/Cardano/Tools/DBAnalyser/Block/Byron.hs @@ -26,7 +26,7 @@ import qualified Data.ByteString.Lazy as BL import Ouroboros.Consensus.Byron.Ledger (ByronBlock) import qualified Ouroboros.Consensus.Byron.Ledger as Byron import Ouroboros.Consensus.Byron.Node (PBftSignatureThreshold (..), - ProtocolParamsByron (..), protocolInfoByron) + ProtocolParams (..), protocolInfoByron) import qualified Ouroboros.Consensus.Mempool as Mempool import Ouroboros.Consensus.Node.ProtocolInfo import Text.Builder (decimal) diff --git a/ouroboros-consensus-cardano/src/tools/Cardano/Tools/DBAnalyser/Block/Cardano.hs b/ouroboros-consensus-cardano/src/tools/Cardano/Tools/DBAnalyser/Block/Cardano.hs index 05f1b209e6..9d025cdaa9 100644 --- a/ouroboros-consensus-cardano/src/tools/Cardano/Tools/DBAnalyser/Block/Cardano.hs +++ b/ouroboros-consensus-cardano/src/tools/Cardano/Tools/DBAnalyser/Block/Cardano.hs @@ -68,7 +68,6 @@ import Ouroboros.Consensus.Protocol.Praos.Translate () import Ouroboros.Consensus.Shelley.HFEras () import Ouroboros.Consensus.Shelley.Ledger.Block (ShelleyBlock) import Ouroboros.Consensus.Shelley.Ledger.SupportsProtocol () -import Ouroboros.Consensus.Shelley.Node.Praos import System.Directory (makeAbsolute) import System.FilePath (takeDirectory, ()) @@ -297,52 +296,54 @@ mkCardanoProtocolInfo :: -> ProtocolInfo (CardanoBlock StandardCrypto) mkCardanoProtocolInfo genesisByron signatureThreshold genesisShelley genesisAlonzo genesisConway initialNonce hardForkTriggers = fst $ protocolInfoCardano @_ @IO - ProtocolParamsByron { - byronGenesis = genesisByron - , byronPbftSignatureThreshold = signatureThreshold - , byronProtocolVersion = Byron.Update.ProtocolVersion 1 2 0 - , byronSoftwareVersion = Byron.Update.SoftwareVersion (Byron.Update.ApplicationName "db-analyser") 2 - , byronLeaderCredentials = Nothing - , byronMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure - } - ProtocolParamsShelleyBased { - shelleyBasedGenesis = genesisShelley - , shelleyBasedInitialNonce = initialNonce - , shelleyBasedLeaderCredentials = [] - } - ProtocolParamsShelley { - -- Note that this is /not/ the Shelley protocol version, see - -- https://github.com/input-output-hk/cardano-node/blob/daeae61a005776ee7b7514ce47de3933074234a8/cardano-node/src/Cardano/Node/Protocol/Cardano.hs#L167-L170 - -- and the succeeding comments. - shelleyProtVer = ProtVer (SL.natVersion @3) 0 - , shelleyMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure - } - ProtocolParamsAllegra { - allegraProtVer = ProtVer (SL.natVersion @4) 0 - , allegraMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure - } - ProtocolParamsMary { - maryProtVer = ProtVer (SL.natVersion @5) 0 - , maryMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure - } - ProtocolParamsAlonzo { - alonzoProtVer = ProtVer (SL.natVersion @7) 0 - , alonzoMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure - } - ProtocolParamsBabbage { - babbageProtVer = ProtVer (SL.natVersion @9) 0 - , babbageMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure - } - ProtocolParamsConway { - conwayProtVer = ProtVer (SL.natVersion @9) 0 - , conwayMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure - } - (unShelleyTransitionArguments shelleyTransition) - (unShelleyTransitionArguments allegraTransition) - (unShelleyTransitionArguments maryTransition) - (unShelleyTransitionArguments alonzoTransition) - (unShelleyTransitionArguments babbageTransition) - (unShelleyTransitionArguments conwayTransition) + (CardanoProtocolParams + ProtocolParamsByron { + byronGenesis = genesisByron + , byronPbftSignatureThreshold = signatureThreshold + , byronProtocolVersion = Byron.Update.ProtocolVersion 1 2 0 + , byronSoftwareVersion = Byron.Update.SoftwareVersion (Byron.Update.ApplicationName "db-analyser") 2 + , byronLeaderCredentials = Nothing + , byronMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure + } + ProtocolParamsShelleyBased { + shelleyBasedGenesis = genesisShelley + , shelleyBasedInitialNonce = initialNonce + , shelleyBasedLeaderCredentials = [] + } + ProtocolParamsShelley { + -- Note that this is /not/ the Shelley protocol version, see + -- https://github.com/input-output-hk/cardano-node/blob/daeae61a005776ee7b7514ce47de3933074234a8/cardano-node/src/Cardano/Node/Protocol/Cardano.hs#L167-L170 + -- and the succeeding comments. + shelleyProtVer = ProtVer (SL.natVersion @3) 0 + , shelleyMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure + } + ProtocolParamsAllegra { + allegraProtVer = ProtVer (SL.natVersion @4) 0 + , allegraMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure + } + ProtocolParamsMary { + maryProtVer = ProtVer (SL.natVersion @5) 0 + , maryMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure + } + ProtocolParamsAlonzo { + alonzoProtVer = ProtVer (SL.natVersion @7) 0 + , alonzoMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure + } + ProtocolParamsBabbage { + babbageProtVer = ProtVer (SL.natVersion @9) 0 + , babbageMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure + } + ProtocolParamsConway { + conwayProtVer = ProtVer (SL.natVersion @9) 0 + , conwayMaxTxCapacityOverrides = Mempool.mkOverrides Mempool.noOverridesMeasure + } + (unByronToShelleyTransitionArguments shelleyTransition) + (unIntraShelleyTransitionArguments allegraTransition) + (unIntraShelleyTransitionArguments maryTransition) + (unIntraShelleyTransitionArguments alonzoTransition) + (unIntraShelleyTransitionArguments babbageTransition) + (unIntraShelleyTransitionArguments conwayTransition) + ) where ( shelleyTransition :* allegraTransition :* @@ -353,11 +354,19 @@ mkCardanoProtocolInfo genesisByron signatureThreshold genesisShelley genesisAlon Nil ) = hardForkTriggers - unShelleyTransitionArguments :: + unByronToShelleyTransitionArguments :: + ShelleyTransitionArguments (ShelleyBlock proto era) + -> ProtocolTransitionParams ByronBlock (ShelleyBlock proto era) + unByronToShelleyTransitionArguments (ShelleyTransitionArguments ctxt trigger) = + ProtocolTransitionParamsByronToShelley + (ctxt (genesisShelley, genesisAlonzo, genesisConway)) + trigger + + unIntraShelleyTransitionArguments :: ShelleyTransitionArguments (ShelleyBlock proto era) - -> ProtocolTransitionParamsShelleyBased era - unShelleyTransitionArguments (ShelleyTransitionArguments ctxt trigger) = - ProtocolTransitionParamsShelleyBased + -> ProtocolTransitionParams (ShelleyBlock proto' era') (ShelleyBlock proto era) + unIntraShelleyTransitionArguments (ShelleyTransitionArguments ctxt trigger) = + ProtocolTransitionParamsIntraShelley (ctxt (genesisShelley, genesisAlonzo, genesisConway)) trigger diff --git a/ouroboros-consensus-cardano/src/tools/Cardano/Tools/DBAnalyser/Block/Shelley.hs b/ouroboros-consensus-cardano/src/tools/Cardano/Tools/DBAnalyser/Block/Shelley.hs index 61eafeb072..7246b89899 100644 --- a/ouroboros-consensus-cardano/src/tools/Cardano/Tools/DBAnalyser/Block/Shelley.hs +++ b/ouroboros-consensus-cardano/src/tools/Cardano/Tools/DBAnalyser/Block/Shelley.hs @@ -48,9 +48,8 @@ import Ouroboros.Consensus.Shelley.Ledger (ShelleyCompatible, import Ouroboros.Consensus.Shelley.Ledger.Block (ShelleyBlock) import qualified Ouroboros.Consensus.Shelley.Ledger.Block as Shelley import Ouroboros.Consensus.Shelley.Node (Nonce (..), - ProtocolParamsShelley (..), - ProtocolParamsShelleyBased (..), ShelleyGenesis, - protocolInfoShelley) + ProtocolParams (..), ProtocolParamsShelleyBased (..), + ShelleyGenesis, protocolInfoShelley) import Text.Builder (decimal) -- | Usable for each Shelley-based era diff --git a/ouroboros-consensus-cardano/test/cardano-test/Test/ThreadNet/AllegraMary.hs b/ouroboros-consensus-cardano/test/cardano-test/Test/ThreadNet/AllegraMary.hs index ba51be49fa..73408ce042 100644 --- a/ouroboros-consensus-cardano/test/cardano-test/Test/ThreadNet/AllegraMary.hs +++ b/ouroboros-consensus-cardano/test/cardano-test/Test/ThreadNet/AllegraMary.hs @@ -34,8 +34,7 @@ import Lens.Micro ((^.)) import Ouroboros.Consensus.BlockchainTime import Ouroboros.Consensus.Cardano.Condense () import Ouroboros.Consensus.Cardano.Node - (ProtocolTransitionParamsShelleyBased (..), - TriggerHardFork (..)) + (ProtocolTransitionParams (..), TriggerHardFork (..)) import Ouroboros.Consensus.Config.SecurityParam import Ouroboros.Consensus.HardFork.Combinator.Serialisation.Common (isHardForkNodeToNodeEnabled) @@ -248,10 +247,10 @@ prop_simple_allegraMary_convergence TestSetup [Shelley.mkLeaderCredentials (coreNodes !! fromIntegral nid)] } - protocolTransitionParamsShelleyBased = - ProtocolTransitionParamsShelleyBased { - transitionTranslationContext = () - , transitionTrigger = + protocolTransitionParamsIntraShelley = + ProtocolTransitionParamsIntraShelley { + transitionIntraShelleyTranslationContext = () + , transitionIntraShelleyTrigger = TriggerHardForkAtVersion $ SL.getVersion majorVersion2 } (protocolInfo, blockForging) = @@ -260,7 +259,7 @@ prop_simple_allegraMary_convergence TestSetup (SL.ProtVer majorVersion1 0) (SL.ProtVer majorVersion2 0) () - protocolTransitionParamsShelleyBased + protocolTransitionParamsIntraShelley in TestNodeInitialization { tniCrucialTxs = if not setupHardFork then [] else diff --git a/ouroboros-consensus-cardano/test/cardano-test/Test/ThreadNet/MaryAlonzo.hs b/ouroboros-consensus-cardano/test/cardano-test/Test/ThreadNet/MaryAlonzo.hs index 4d6d14fada..ae8f540523 100644 --- a/ouroboros-consensus-cardano/test/cardano-test/Test/ThreadNet/MaryAlonzo.hs +++ b/ouroboros-consensus-cardano/test/cardano-test/Test/ThreadNet/MaryAlonzo.hs @@ -35,8 +35,7 @@ import Lens.Micro import Ouroboros.Consensus.BlockchainTime import Ouroboros.Consensus.Cardano.Condense () import Ouroboros.Consensus.Cardano.Node - (ProtocolTransitionParamsShelleyBased (..), - TriggerHardFork (..)) + (ProtocolTransitionParams (..), TriggerHardFork (..)) import Ouroboros.Consensus.Config.SecurityParam import Ouroboros.Consensus.HardFork.Combinator.Serialisation.Common (isHardForkNodeToNodeEnabled) @@ -253,10 +252,10 @@ prop_simple_allegraAlonzo_convergence TestSetup [Shelley.mkLeaderCredentials (coreNodes !! fromIntegral nid)] } - protocolTransitionParamsShelleyBased = - ProtocolTransitionParamsShelleyBased { - transitionTranslationContext = alonzoGenesis - , transitionTrigger = + protocolTransitionParamsIntraShelley = + ProtocolTransitionParamsIntraShelley { + transitionIntraShelleyTranslationContext = alonzoGenesis + , transitionIntraShelleyTrigger = TriggerHardForkAtVersion $ SL.getVersion majorVersion2 } (protocolInfo, blockForging) = @@ -265,7 +264,7 @@ prop_simple_allegraAlonzo_convergence TestSetup (SL.ProtVer majorVersion1 0) (SL.ProtVer majorVersion2 0) () - protocolTransitionParamsShelleyBased + protocolTransitionParamsIntraShelley in TestNodeInitialization { tniCrucialTxs = diff --git a/ouroboros-consensus-cardano/test/cardano-test/Test/ThreadNet/ShelleyAllegra.hs b/ouroboros-consensus-cardano/test/cardano-test/Test/ThreadNet/ShelleyAllegra.hs index 5ef90d6576..aa15d5b23c 100644 --- a/ouroboros-consensus-cardano/test/cardano-test/Test/ThreadNet/ShelleyAllegra.hs +++ b/ouroboros-consensus-cardano/test/cardano-test/Test/ThreadNet/ShelleyAllegra.hs @@ -36,8 +36,7 @@ import Lens.Micro ((^.)) import Ouroboros.Consensus.BlockchainTime import Ouroboros.Consensus.Cardano.Condense () import Ouroboros.Consensus.Cardano.Node - (ProtocolTransitionParamsShelleyBased (..), - TriggerHardFork (..)) + (ProtocolTransitionParams (..), TriggerHardFork (..)) import Ouroboros.Consensus.Config.SecurityParam import Ouroboros.Consensus.HardFork.Combinator.Serialisation.Common (isHardForkNodeToNodeEnabled) @@ -260,10 +259,10 @@ prop_simple_shelleyAllegra_convergence TestSetup [Shelley.mkLeaderCredentials (coreNodes !! fromIntegral nid)] } - protocolTransitionParamsShelleyBased = - ProtocolTransitionParamsShelleyBased { - transitionTranslationContext = () - , transitionTrigger = + protocolTransitionParamsIntraShelley = + ProtocolTransitionParamsIntraShelley { + transitionIntraShelleyTranslationContext = () + , transitionIntraShelleyTrigger = TriggerHardForkAtVersion $ SL.getVersion majorVersion2 } (protocolInfo, blockForging) = @@ -272,7 +271,7 @@ prop_simple_shelleyAllegra_convergence TestSetup (SL.ProtVer majorVersion1 0) (SL.ProtVer majorVersion2 0) (SL.toFromByronTranslationContext genesisShelley) - protocolTransitionParamsShelleyBased + protocolTransitionParamsIntraShelley in TestNodeInitialization { tniCrucialTxs = diff --git a/ouroboros-consensus/changelog.d/20230815_105847_joris_275_consolidate_protocolparams_across_eras.md b/ouroboros-consensus/changelog.d/20230815_105847_joris_275_consolidate_protocolparams_across_eras.md new file mode 100644 index 0000000000..3f0565ec67 --- /dev/null +++ b/ouroboros-consensus/changelog.d/20230815_105847_joris_275_consolidate_protocolparams_across_eras.md @@ -0,0 +1,26 @@ + + + + +### Non-Breaking + +- Add `ProtocolParams` data family to `Ouroboros.Consensus.Node.ProtocolInfo`. +- Add `PerEraProtocolParams` newtype to + `Ouroboros.Consensus.HardFork.Combinator.AcrossEras`. + + + diff --git a/ouroboros-consensus/src/ouroboros-consensus/Ouroboros/Consensus/HardFork/Combinator/AcrossEras.hs b/ouroboros-consensus/src/ouroboros-consensus/Ouroboros/Consensus/HardFork/Combinator/AcrossEras.hs index 1e823a54ef..b38b082650 100644 --- a/ouroboros-consensus/src/ouroboros-consensus/Ouroboros/Consensus/HardFork/Combinator/AcrossEras.hs +++ b/ouroboros-consensus/src/ouroboros-consensus/Ouroboros/Consensus/HardFork/Combinator/AcrossEras.hs @@ -24,6 +24,7 @@ module Ouroboros.Consensus.HardFork.Combinator.AcrossEras ( , PerEraCodecConfig (..) , PerEraConsensusConfig (..) , PerEraLedgerConfig (..) + , PerEraProtocolParams (..) , PerEraStorageConfig (..) -- * Values for /some/ eras , SomeErasCanBeLeader (..) @@ -80,6 +81,7 @@ import Ouroboros.Consensus.HardFork.Combinator.Info import Ouroboros.Consensus.HardFork.Combinator.Lifting import Ouroboros.Consensus.HardFork.Combinator.PartialConfig import Ouroboros.Consensus.Ledger.SupportsMempool +import Ouroboros.Consensus.Node.ProtocolInfo import Ouroboros.Consensus.TypeFamilyWrappers import Ouroboros.Consensus.Util (allEqual) import Ouroboros.Consensus.Util.Assert @@ -95,6 +97,8 @@ newtype PerEraConsensusConfig xs = PerEraConsensusConfig { getPerEraConsensusCon newtype PerEraLedgerConfig xs = PerEraLedgerConfig { getPerEraLedgerConfig :: NP WrapPartialLedgerConfig xs } newtype PerEraStorageConfig xs = PerEraStorageConfig { getPerEraStorageConfig :: NP StorageConfig xs } +newtype PerEraProtocolParams xs = PerEraProtocolParams { getPerEraProtocolParams :: NP ProtocolParams xs } + {------------------------------------------------------------------------------- Values for /some/ eras diff --git a/ouroboros-consensus/src/ouroboros-consensus/Ouroboros/Consensus/Node/ProtocolInfo.hs b/ouroboros-consensus/src/ouroboros-consensus/Ouroboros/Consensus/Node/ProtocolInfo.hs index e6162fd998..72e44c78d1 100644 --- a/ouroboros-consensus/src/ouroboros-consensus/Ouroboros/Consensus/Node/ProtocolInfo.hs +++ b/ouroboros-consensus/src/ouroboros-consensus/Ouroboros/Consensus/Node/ProtocolInfo.hs @@ -1,6 +1,5 @@ {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} -{-# LANGUAGE RecordWildCards #-} {-# LANGUAGE TypeFamilies #-} module Ouroboros.Consensus.Node.ProtocolInfo ( @@ -8,8 +7,11 @@ module Ouroboros.Consensus.Node.ProtocolInfo ( , ProtocolClientInfo (..) , ProtocolInfo (..) , enumCoreNodes + -- * Protocol parameters + , ProtocolParams ) where +import Data.Kind (Type) import Data.Word import NoThunks.Class (NoThunks) import Ouroboros.Consensus.Block @@ -43,3 +45,9 @@ data ProtocolInfo b = ProtocolInfo { data ProtocolClientInfo b = ProtocolClientInfo { pClientInfoCodecConfig :: CodecConfig b } + +{------------------------------------------------------------------------------- + Protocol parameters +-------------------------------------------------------------------------------} + +data family ProtocolParams blk :: Type