diff --git a/cardano-testnet/src/Testnet/Defaults.hs b/cardano-testnet/src/Testnet/Defaults.hs index 32029b6333c..2c1a062301e 100644 --- a/cardano-testnet/src/Testnet/Defaults.hs +++ b/cardano-testnet/src/Testnet/Defaults.hs @@ -58,8 +58,9 @@ import Prelude import Control.Monad.Identity (Identity) import Data.Aeson (ToJSON (..), Value, (.=)) import qualified Data.Aeson as Aeson -import qualified Data.Aeson.Key as Key -import qualified Data.Aeson.KeyMap as KeyMapAeson +import qualified Data.Aeson.Key as Aeson +import qualified Data.Aeson.KeyMap as Aeson +import Data.Bifunctor (bimap) import qualified Data.Default.Class as DefaultClass import Data.Proxy import Data.Ratio @@ -152,195 +153,115 @@ defaultConwayGenesis = -- | Configuration value that allows you to hardfork to any Cardano era -- at epoch 0. -defaultYamlHardforkViaConfig :: ShelleyBasedEra era -> KeyMapAeson.KeyMap Aeson.Value +defaultYamlHardforkViaConfig :: ShelleyBasedEra era -> Aeson.KeyMap Aeson.Value defaultYamlHardforkViaConfig sbe = - mconcat $ concat - [ defaultYamlConfig - , tracers - , protocolVersions sbe - , hardforkViaConfig sbe - ] - + defaultYamlConfig + <> tracers + <> protocolVersions sbe + <> hardforkViaConfig sbe where -- The protocol version number gets used by block producing nodes as part -- of the system for agreeing on and synchronising protocol updates. -- NB: We follow the mainnet protocol versions and assume the latest -- protocol version for a given era that has had an intraera hardfork. - protocolVersions :: ShelleyBasedEra era -> [KeyMapAeson.KeyMap Aeson.Value] + protocolVersions :: ShelleyBasedEra era -> Aeson.KeyMap Aeson.Value protocolVersions sbe' = - case sbe' of - ShelleyBasedEraShelley -> - map (uncurry KeyMapAeson.singleton) - [ ("LastKnownBlockVersion-Major", Aeson.Number 2) - , ("LastKnownBlockVersion-Minor", Aeson.Number 0) - , ("LastKnownBlockVersion-Alt", Aeson.Number 0) - ] - ShelleyBasedEraAllegra -> - map (uncurry KeyMapAeson.singleton) - [ ("LastKnownBlockVersion-Major", Aeson.Number 3) - , ("LastKnownBlockVersion-Minor", Aeson.Number 0) - , ("LastKnownBlockVersion-Alt", Aeson.Number 0) - ] - ShelleyBasedEraMary -> - map (uncurry KeyMapAeson.singleton) - [ ("LastKnownBlockVersion-Major", Aeson.Number 4) - , ("LastKnownBlockVersion-Minor", Aeson.Number 0) - , ("LastKnownBlockVersion-Alt", Aeson.Number 0) - ] - ShelleyBasedEraAlonzo -> - map (uncurry KeyMapAeson.singleton) - [ ("LastKnownBlockVersion-Major", Aeson.Number 5) - , ("LastKnownBlockVersion-Minor", Aeson.Number 0) - , ("LastKnownBlockVersion-Alt", Aeson.Number 0) - ] - ShelleyBasedEraBabbage -> - map (uncurry KeyMapAeson.singleton) - [ ("LastKnownBlockVersion-Major", Aeson.Number 8) - , ("LastKnownBlockVersion-Minor", Aeson.Number 0) - , ("LastKnownBlockVersion-Alt", Aeson.Number 0) - ] - ShelleyBasedEraConway -> - map (uncurry KeyMapAeson.singleton) - [ ("LastKnownBlockVersion-Major", Aeson.Number 9) - , ("LastKnownBlockVersion-Minor", Aeson.Number 0) - , ("LastKnownBlockVersion-Alt", Aeson.Number 0) - ] + Aeson.fromList + [case sbe' of + ShelleyBasedEraShelley -> ("LastKnownBlockVersion-Major", Aeson.Number 2) + ShelleyBasedEraAllegra -> ("LastKnownBlockVersion-Major", Aeson.Number 3) + ShelleyBasedEraMary -> ("LastKnownBlockVersion-Major", Aeson.Number 4) + ShelleyBasedEraAlonzo -> ("LastKnownBlockVersion-Major", Aeson.Number 5) + ShelleyBasedEraBabbage -> ("LastKnownBlockVersion-Major", Aeson.Number 8) + ShelleyBasedEraConway -> ("LastKnownBlockVersion-Major", Aeson.Number 9) + , ("LastKnownBlockVersion-Minor", Aeson.Number 0) + , ("LastKnownBlockVersion-Alt", Aeson.Number 0) + ] -- Allows a direct hardfork to an era of your choice via the configuration. -- This removes the usual requirement for submitting an update proposal, -- waiting for the protocol to change and then restarting the nodes. - hardforkViaConfig :: ShelleyBasedEra era -> [KeyMapAeson.KeyMap Aeson.Value] + hardforkViaConfig :: ShelleyBasedEra era -> Aeson.KeyMap Aeson.Value hardforkViaConfig sbe' = - case sbe' of - ShelleyBasedEraShelley -> - map (uncurry KeyMapAeson.singleton) - [ ("ExperimentalHardForksEnabled", Aeson.Bool True) - , ("ExperimentalProtocolsEnabled", Aeson.Bool True) - , ("TestShelleyHardForkAtEpoch", Aeson.Number 0) - ] - ShelleyBasedEraAllegra -> - map (uncurry KeyMapAeson.singleton) - [ ("ExperimentalHardForksEnabled", Aeson.Bool True) - , ("ExperimentalProtocolsEnabled", Aeson.Bool True) - , ("TestShelleyHardForkAtEpoch", Aeson.Number 0) - , ("TestAllegraHardForkAtEpoch", Aeson.Number 0) - ] - ShelleyBasedEraMary -> - map (uncurry KeyMapAeson.singleton) - [ ("ExperimentalHardForksEnabled", Aeson.Bool True) - , ("ExperimentalProtocolsEnabled", Aeson.Bool True) - , ("TestShelleyHardForkAtEpoch", Aeson.Number 0) - , ("TestAllegraHardForkAtEpoch", Aeson.Number 0) - , ("TestMaryHardForkAtEpoch", Aeson.Number 0) - ] - ShelleyBasedEraAlonzo -> - map (uncurry KeyMapAeson.singleton) - [ ("ExperimentalHardForksEnabled", Aeson.Bool True) - , ("ExperimentalProtocolsEnabled", Aeson.Bool True) - , ("TestShelleyHardForkAtEpoch", Aeson.Number 0) - , ("TestAllegraHardForkAtEpoch", Aeson.Number 0) - , ("TestMaryHardForkAtEpoch", Aeson.Number 0) - , ("TestAlonzoHardForkAtEpoch", Aeson.Number 0) - ] - ShelleyBasedEraBabbage -> - map (uncurry KeyMapAeson.singleton) - [ ("ExperimentalHardForksEnabled", Aeson.Bool True) - , ("ExperimentalProtocolsEnabled", Aeson.Bool True) - , ("TestShelleyHardForkAtEpoch", Aeson.Number 0) - , ("TestAllegraHardForkAtEpoch", Aeson.Number 0) - , ("TestMaryHardForkAtEpoch", Aeson.Number 0) - , ("TestAlonzoHardForkAtEpoch", Aeson.Number 0) - , ("TestBabbageHardForkAtEpoch", Aeson.Number 0) - ] - ShelleyBasedEraConway -> - map (uncurry KeyMapAeson.singleton) - [ ("ExperimentalHardForksEnabled", Aeson.Bool True) - , ("ExperimentalProtocolsEnabled", Aeson.Bool True) - , ("TestShelleyHardForkAtEpoch", Aeson.Number 0) - , ("TestAllegraHardForkAtEpoch", Aeson.Number 0) - , ("TestMaryHardForkAtEpoch", Aeson.Number 0) - , ("TestAlonzoHardForkAtEpoch", Aeson.Number 0) - , ("TestBabbageHardForkAtEpoch", Aeson.Number 0) - , ("TestConwayHardForkAtEpoch", Aeson.Number 0) - ] - - - -- | Various tracers we can turn on or off - tracers :: [KeyMapAeson.KeyMap Aeson.Value] - tracers = map (\(k,v) -> KeyMapAeson.singleton (Key.fromText k) v) - [ (proxyName (Proxy @TraceBlockFetchClient), Aeson.Bool False) - , (proxyName (Proxy @TraceBlockFetchDecisions), Aeson.Bool False) - , (proxyName (Proxy @TraceBlockFetchProtocol), Aeson.Bool False) - , (proxyName (Proxy @TraceBlockFetchProtocolSerialised), Aeson.Bool False) - , (proxyName (Proxy @TraceBlockFetchServer), Aeson.Bool False) - , (proxyName (Proxy @TraceBlockchainTime), Aeson.Bool True) - , (proxyName (Proxy @TraceChainDB), Aeson.Bool True) - , (proxyName (Proxy @TraceChainSyncClient), Aeson.Bool False) - , (proxyName (Proxy @TraceChainSyncBlockServer), Aeson.Bool False) - , (proxyName (Proxy @TraceChainSyncHeaderServer), Aeson.Bool False) - , (proxyName (Proxy @TraceChainSyncProtocol), Aeson.Bool False) - , (proxyName (Proxy @TraceDnsResolver), Aeson.Bool True) - , (proxyName (Proxy @TraceDnsSubscription), Aeson.Bool True) - , (proxyName (Proxy @TraceErrorPolicy), Aeson.Bool True) - , (proxyName (Proxy @TraceLocalErrorPolicy), Aeson.Bool True) - , (proxyName (Proxy @TraceForge), Aeson.Bool True) - , (proxyName (Proxy @TraceHandshake), Aeson.Bool False) - , (proxyName (Proxy @TraceIpSubscription), Aeson.Bool True) - , (proxyName (Proxy @TraceLocalRootPeers), Aeson.Bool True) - , (proxyName (Proxy @TracePublicRootPeers), Aeson.Bool True) - , (proxyName (Proxy @TracePeerSelection), Aeson.Bool True) - , (proxyName (Proxy @TracePeerSelection), Aeson.Bool False) - , (proxyName (Proxy @TracePeerSelectionActions), Aeson.Bool True) - , (proxyName (Proxy @TraceConnectionManager), Aeson.Bool True) - , (proxyName (Proxy @TraceServer), Aeson.Bool True) - , (proxyName (Proxy @TraceLocalConnectionManager), Aeson.Bool False) - , (proxyName (Proxy @TraceLocalServer), Aeson.Bool False) - , (proxyName (Proxy @TraceLocalChainSyncProtocol), Aeson.Bool False) - , (proxyName (Proxy @TraceLocalHandshake), Aeson.Bool False) - , (proxyName (Proxy @TraceLocalTxSubmissionProtocol), Aeson.Bool False) - , (proxyName (Proxy @TraceLocalTxSubmissionServer), Aeson.Bool False) - , (proxyName (Proxy @TraceMempool), Aeson.Bool True) - , (proxyName (Proxy @TraceMux), Aeson.Bool False) - , (proxyName (Proxy @TraceTxInbound), Aeson.Bool False) - , (proxyName (Proxy @TraceTxOutbound), Aeson.Bool False) - , (proxyName (Proxy @TraceTxSubmissionProtocol), Aeson.Bool False) - ] - -defaultScribes :: Aeson.Value -defaultScribes = - Aeson.Array $ Vector.fromList - [ Aeson.Array $ Vector.fromList ["FileSK","logs/mainnet.log"] - , Aeson.Array $ Vector.fromList ["StdoutSK","stdout"] + Aeson.fromList $ + [ ("ExperimentalHardForksEnabled", Aeson.Bool True) + , ("ExperimentalProtocolsEnabled", Aeson.Bool True) ] + ++ (case sbe' of + ShelleyBasedEraShelley -> + [ ("TestShelleyHardForkAtEpoch", Aeson.Number 0) ] + ShelleyBasedEraAllegra -> + [ ("TestShelleyHardForkAtEpoch", Aeson.Number 0) + , ("TestAllegraHardForkAtEpoch", Aeson.Number 0) + ] + ShelleyBasedEraMary -> + [ ("TestShelleyHardForkAtEpoch", Aeson.Number 0) + , ("TestAllegraHardForkAtEpoch", Aeson.Number 0) + , ("TestMaryHardForkAtEpoch", Aeson.Number 0) + ] + ShelleyBasedEraAlonzo -> + [ ("TestShelleyHardForkAtEpoch", Aeson.Number 0) + , ("TestAllegraHardForkAtEpoch", Aeson.Number 0) + , ("TestMaryHardForkAtEpoch", Aeson.Number 0) + , ("TestAlonzoHardForkAtEpoch", Aeson.Number 0) + ] + ShelleyBasedEraBabbage -> + [ ("TestShelleyHardForkAtEpoch", Aeson.Number 0) + , ("TestAllegraHardForkAtEpoch", Aeson.Number 0) + , ("TestMaryHardForkAtEpoch", Aeson.Number 0) + , ("TestAlonzoHardForkAtEpoch", Aeson.Number 0) + , ("TestBabbageHardForkAtEpoch", Aeson.Number 0) + ] + ShelleyBasedEraConway -> + [ ("TestShelleyHardForkAtEpoch", Aeson.Number 0) + , ("TestAllegraHardForkAtEpoch", Aeson.Number 0) + , ("TestMaryHardForkAtEpoch", Aeson.Number 0) + , ("TestAlonzoHardForkAtEpoch", Aeson.Number 0) + , ("TestBabbageHardForkAtEpoch", Aeson.Number 0) + , ("TestConwayHardForkAtEpoch", Aeson.Number 0) + ]) + -- | Various tracers we can turn on or off + tracers :: Aeson.KeyMap Aeson.Value + tracers = Aeson.fromList $ map (bimap Aeson.fromText Aeson.Bool) + [ (proxyName (Proxy @TraceBlockFetchClient), False) + , (proxyName (Proxy @TraceBlockFetchDecisions), False) + , (proxyName (Proxy @TraceBlockFetchProtocol), False) + , (proxyName (Proxy @TraceBlockFetchProtocolSerialised), False) + , (proxyName (Proxy @TraceBlockFetchServer), False) + , (proxyName (Proxy @TraceBlockchainTime), True) + , (proxyName (Proxy @TraceChainDB), True) + , (proxyName (Proxy @TraceChainSyncClient), False) + , (proxyName (Proxy @TraceChainSyncBlockServer), False) + , (proxyName (Proxy @TraceChainSyncHeaderServer), False) + , (proxyName (Proxy @TraceChainSyncProtocol), False) + , (proxyName (Proxy @TraceDnsResolver), True) + , (proxyName (Proxy @TraceDnsSubscription), True) + , (proxyName (Proxy @TraceErrorPolicy), True) + , (proxyName (Proxy @TraceLocalErrorPolicy), True) + , (proxyName (Proxy @TraceForge), True) + , (proxyName (Proxy @TraceHandshake), False) + , (proxyName (Proxy @TraceIpSubscription), True) + , (proxyName (Proxy @TraceLocalRootPeers), True) + , (proxyName (Proxy @TracePublicRootPeers), True) + , (proxyName (Proxy @TracePeerSelection), True) + , (proxyName (Proxy @TracePeerSelectionActions), True) + , (proxyName (Proxy @TraceConnectionManager), True) + , (proxyName (Proxy @TraceServer), True) + , (proxyName (Proxy @TraceLocalConnectionManager), False) + , (proxyName (Proxy @TraceLocalServer), False) + , (proxyName (Proxy @TraceLocalChainSyncProtocol), False) + , (proxyName (Proxy @TraceLocalHandshake), False) + , (proxyName (Proxy @TraceLocalTxSubmissionProtocol), False) + , (proxyName (Proxy @TraceLocalTxSubmissionServer), False) + , (proxyName (Proxy @TraceMempool), True) + , (proxyName (Proxy @TraceMux), False) + , (proxyName (Proxy @TraceTxInbound), False) + , (proxyName (Proxy @TraceTxOutbound), False) + , (proxyName (Proxy @TraceTxSubmissionProtocol), False) ] - - -rotationObject :: Aeson.Value -rotationObject = - Aeson.Object $ - mconcat $ map (uncurry KeyMapAeson.singleton) - [ ("rpLogLimitBytes", Aeson.Number 5000000) - , ("rpKeepFilesNum", Aeson.Number 3) - , ("rpMaxAgeHours", Aeson.Number 24) - ] - -setupScribes :: Aeson.Value -setupScribes = - Aeson.Array $ Vector.fromList - [ Aeson.Object $ mconcat $ map (uncurry KeyMapAeson.singleton) - [ ("scKind", "FileSK") - , ("scName", "logs/node.log") - , ("scFormat", "ScJson") - ] - , Aeson.Object $ mconcat $ map (uncurry KeyMapAeson.singleton) - [ ("scKind", "StdoutSK") - , ("scName", "stdout") - , ("scFormat", "ScJson") - ] - ] - -defaultYamlConfig :: [KeyMapAeson.KeyMap Aeson.Value] + +defaultYamlConfig :: Aeson.KeyMap Aeson.Value defaultYamlConfig = - map (uncurry KeyMapAeson.singleton) + Aeson.fromList [ -- The consensus protocol to use ("Protocol", "Cardano") @@ -386,6 +307,34 @@ defaultYamlConfig = ] where genesisPath era = Aeson.String $ Text.pack $ defaultGenesisFilepath era + defaultScribes :: Aeson.Value + defaultScribes = + Aeson.Array $ Vector.fromList + [ Aeson.Array $ Vector.fromList ["FileSK","logs/mainnet.log"] + , Aeson.Array $ Vector.fromList ["StdoutSK","stdout"] + ] + rotationObject :: Aeson.Value + rotationObject = + Aeson.Object $ + mconcat $ map (uncurry Aeson.singleton) + [ ("rpLogLimitBytes", Aeson.Number 5000000) + , ("rpKeepFilesNum", Aeson.Number 3) + , ("rpMaxAgeHours", Aeson.Number 24) + ] + setupScribes :: Aeson.Value + setupScribes = + Aeson.Array $ Vector.fromList + [ Aeson.Object $ mconcat $ map (uncurry Aeson.singleton) + [ ("scKind", "FileSK") + , ("scName", "logs/node.log") + , ("scFormat", "ScJson") + ] + , Aeson.Object $ mconcat $ map (uncurry Aeson.singleton) + [ ("scKind", "StdoutSK") + , ("scName", "stdout") + , ("scFormat", "ScJson") + ] + ] -- | We need a Byron genesis in order to be able to hardfork to the later Shelley based eras. -- The values here don't matter as the testnet conditions are ultimately determined