Skip to content

Commit

Permalink
Merge pull request #5996 from IntersectMBO/smelc/qol-improvements-def…
Browse files Browse the repository at this point in the history
…aults

cardano-testnet: Code sharing in Defaults.hs
  • Loading branch information
smelc authored Sep 30, 2024
2 parents c56322c + 286f8af commit 0f9b077
Showing 1 changed file with 126 additions and 177 deletions.
303 changes: 126 additions & 177 deletions cardano-testnet/src/Testnet/Defaults.hs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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")
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 0f9b077

Please sign in to comment.