From fc510668f76fe08f1581b264a4ccbd3725ea3789 Mon Sep 17 00:00:00 2001 From: Michael Karg Date: Thu, 22 Oct 2026 15:21:35 +0200 Subject: [PATCH 01/25] Bump cardano-api to 11.11.0.0 and cardano-cli to 11.6.0.0 --- .../.changes/20261015_033428_palas_bump_cardano_api_11_9.yml | 4 ++++ .../.changes/20261015_033428_palas_bump_cardano_api_11_9.yml | 4 ++++ cardano-testnet/cardano-testnet.cabal | 1 + .../test/cardano-testnet-golden/files/golden/version_cmd.cli | 4 ++-- 4 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 cardano-submit-api/.changes/20261015_033428_palas_bump_cardano_api_11_9.yml create mode 100644 cardano-testnet/.changes/20261015_033428_palas_bump_cardano_api_11_9.yml diff --git a/cardano-submit-api/.changes/20261015_033428_palas_bump_cardano_api_11_9.yml b/cardano-submit-api/.changes/20261015_033428_palas_bump_cardano_api_11_9.yml new file mode 100644 index 00000000000..89b21b78eb6 --- /dev/null +++ b/cardano-submit-api/.changes/20261015_033428_palas_bump_cardano_api_11_9.yml @@ -0,0 +1,4 @@ +pr: 6732 +kind: + - maintenance +description: Bumped cardano-api to 11.11 and cardano-cli to 11.6. diff --git a/cardano-testnet/.changes/20261015_033428_palas_bump_cardano_api_11_9.yml b/cardano-testnet/.changes/20261015_033428_palas_bump_cardano_api_11_9.yml new file mode 100644 index 00000000000..89b21b78eb6 --- /dev/null +++ b/cardano-testnet/.changes/20261015_033428_palas_bump_cardano_api_11_9.yml @@ -0,0 +1,4 @@ +pr: 6732 +kind: + - maintenance +description: Bumped cardano-api to 11.11 and cardano-cli to 11.6. diff --git a/cardano-testnet/cardano-testnet.cabal b/cardano-testnet/cardano-testnet.cabal index e7440706d20..f0c59109ed3 100644 --- a/cardano-testnet/cardano-testnet.cabal +++ b/cardano-testnet/cardano-testnet.cabal @@ -42,6 +42,7 @@ library , ansi-terminal , bytestring , cardano-api ^>= 11.11 + , cardano-config ^>= 2.2.3 , cardano-cli:{cardano-cli, cardano-cli-test-lib} ^>= 11.6 , cardano-crypto-class ^>=2.6 , cardano-crypto-wrapper diff --git a/cardano-testnet/test/cardano-testnet-golden/files/golden/version_cmd.cli b/cardano-testnet/test/cardano-testnet-golden/files/golden/version_cmd.cli index 3a4f336100c..3a030e4a83c 100644 --- a/cardano-testnet/test/cardano-testnet-golden/files/golden/version_cmd.cli +++ b/cardano-testnet/test/cardano-testnet-golden/files/golden/version_cmd.cli @@ -1,3 +1,3 @@ -built against cardano-api 11.8.0.0 +built against cardano-api 11.11.0.0 built against cardano-rpc 11.5.0.0 -built against cardano-cli 11.3.0.0 +built against cardano-cli 11.6.0.0 From 7cd5888fbb15746abfdc09effe072104e35163d9 Mon Sep 17 00:00:00 2001 From: Pablo Lamela Date: Thu, 15 Oct 2026 01:40:04 +0000 Subject: [PATCH 02/25] Write and refresh testnet node configurations through cardano-config --- ...46_palas_config_through_cardano_config.yml | 4 + cardano-testnet/cardano-testnet.cabal | 2 - cardano-testnet/src/Parsers/Run.hs | 6 +- .../src/Testnet/Components/Configuration.hs | 91 +++++-------------- cardano-testnet/src/Testnet/Defaults.hs | 31 +++++-- cardano-testnet/src/Testnet/Start/Cardano.hs | 77 +++++++++++----- cardano-testnet/src/Testnet/Start/Types.hs | 17 +--- cardano-testnet/src/Testnet/SubmitApi.hs | 14 ++- cardano-testnet/src/Testnet/Types.hs | 30 ++---- .../files/golden/node_default_config.json | 75 ++++++++++++++- .../Testnet/Test/Api/TxReferenceInputDatum.hs | 5 +- .../Cardano/Testnet/Test/Cli/KesPeriodInfo.hs | 5 +- .../Testnet/Test/Cli/LeadershipSchedule.hs | 6 +- .../Testnet/Test/Cli/QuerySlotNumber.hs | 2 +- .../Cardano/Testnet/Test/DumpConfig.hs | 8 +- .../Test/Gov/ProposeNewConstitution.hs | 5 - .../Cardano/Testnet/Test/Node/Shutdown.hs | 17 +--- .../Testnet/Test/SubmitApi/Transaction.hs | 1 - .../Cardano/Testnet/Test/UpdateTimeStamps.hs | 9 +- 19 files changed, 211 insertions(+), 194 deletions(-) create mode 100644 cardano-testnet/.changes/20261015_033946_palas_config_through_cardano_config.yml diff --git a/cardano-testnet/.changes/20261015_033946_palas_config_through_cardano_config.yml b/cardano-testnet/.changes/20261015_033946_palas_config_through_cardano_config.yml new file mode 100644 index 00000000000..03b8c36ff96 --- /dev/null +++ b/cardano-testnet/.changes/20261015_033946_palas_config_through_cardano_config.yml @@ -0,0 +1,4 @@ +pr: 6732 +kind: + - breaking +description: Testnet node configurations are written in the cardano-config format and through cardano-config, with their genesis hashes refreshed whenever the testnet starts and the node's default tracing options written out; removed createConfigJson, createConfigJsonNoHash, getByronGenesisHash, getShelleyGenesisHash, GenesisHashesPolicy and the configPath field of SubmitApiConf, and getStartTime no longer takes a path. diff --git a/cardano-testnet/cardano-testnet.cabal b/cardano-testnet/cardano-testnet.cabal index f0c59109ed3..77d2ef62218 100644 --- a/cardano-testnet/cardano-testnet.cabal +++ b/cardano-testnet/cardano-testnet.cabal @@ -44,8 +44,6 @@ library , cardano-api ^>= 11.11 , cardano-config ^>= 2.2.3 , cardano-cli:{cardano-cli, cardano-cli-test-lib} ^>= 11.6 - , cardano-crypto-class ^>=2.6 - , cardano-crypto-wrapper , cardano-git-rev ^>= 0.2.2 , cardano-ledger-alonzo , cardano-ledger-binary diff --git a/cardano-testnet/src/Parsers/Run.hs b/cardano-testnet/src/Parsers/Run.hs index a65e50c5f44..d3d2a9ed27d 100644 --- a/cardano-testnet/src/Parsers/Run.hs +++ b/cardano-testnet/src/Parsers/Run.hs @@ -88,11 +88,7 @@ createEnvOptions CardanoTestnetCreateEnvOptions , createEnvOutputDir=outputDir } = do conf <- mkConfigAbs outputDir - void $ createTestnetEnv - creationOptions - -- Do not add hashes to the main config file, so that genesis files - -- can be modified without having to recompute hashes every time. - conf{genesisHashesPolicy = WithoutHashes} + void $ createTestnetEnv creationOptions conf runCardanoOptions :: CardanoTestnetCliOptions -> IO () runCardanoOptions = \case diff --git a/cardano-testnet/src/Testnet/Components/Configuration.hs b/cardano-testnet/src/Testnet/Components/Configuration.hs index 5b713ba1633..66aaf034cce 100644 --- a/cardano-testnet/src/Testnet/Components/Configuration.hs +++ b/cardano-testnet/src/Testnet/Components/Configuration.hs @@ -6,13 +6,11 @@ {-# LANGUAGE TypeApplications #-} module Testnet.Components.Configuration - ( createConfigJson - , createConfigJsonNoHash + ( writeConfiguration + , refreshConfigurationHashes , createSPOGenesisAndFiles , numSeededUTxOKeys - , getByronGenesisHash - , getShelleyGenesisHash , getDefaultAlonzoGenesis , getDefaultShelleyGenesis , startTimeOffsetSeconds @@ -24,24 +22,17 @@ module Testnet.Components.Configuration import Cardano.Api hiding (Value, cardanoEra) import Cardano.Api.Ledger (AlonzoGenesis, ConwayGenesis) -import Cardano.Chain.Genesis (GenesisHash (unGenesisHash), readGenesisData) -import qualified Cardano.Crypto.Hash.Blake2b as Crypto -import qualified Cardano.Crypto.Hash.Class as Crypto +import Cardano.Configuration.Edit (configurationDocumentFromValue, + readConfigurationDocument, refreshGenesisHashes, writeConfigurationDocument) import Cardano.Ledger.BaseTypes (unsafeNonZero) import Cardano.Ledger.Dijkstra.Genesis (DijkstraGenesis) -import Cardano.Node.Protocol.Byron import Control.Exception import Control.Monad import Control.Monad.Extra import Data.Aeson -import qualified Data.Aeson as Aeson import qualified Data.Aeson.Encode.Pretty as A -import Data.Aeson.Key hiding (fromString) -import Data.Aeson.KeyMap hiding (map) -import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy as LBS -import qualified Data.Text as Text import qualified Data.Time.Clock as DTC import Data.Word (Word64) import GHC.Stack (HasCallStack) @@ -61,62 +52,30 @@ import qualified Hedgehog.Extras.Stock.Time as DTC import RIO (MonadThrow, throwM) --- | Returns JSON encoded hashes of the era, as well as the hard fork configuration toggle. -createConfigJson :: () +-- | Write the node configuration of a testnet: the default configuration for the +-- given era, with the hashes of the genesis files in the same directory as the +-- configuration file. The file is written in the @cardano-config@ format. +writeConfiguration :: () => HasCallStack => MonadIO m - => MonadThrow m - => TmpAbsolutePath + => FilePath -- ^ The configuration file to write -> ShelleyBasedEra era -- ^ The era used for generating the hard fork configuration toggle - -> m (KeyMap Aeson.Value) -createConfigJson (TmpAbsolutePath tempAbsPath) sbe = GHC.withFrozenCallStack $ do - byronGenesisHash <- getByronGenesisHash $ tempAbsPath "byron-genesis.json" - shelleyGenesisHash <- getHash ShelleyEra "ShelleyGenesisHash" - alonzoGenesisHash <- getHash AlonzoEra "AlonzoGenesisHash" - conwayGenesisHash <- getHash ConwayEra "ConwayGenesisHash" - dijkstraGenesisHash <- getHash DijkstraEra "DijkstraGenesisHash" - - pure $ mconcat - [ byronGenesisHash - , shelleyGenesisHash - , alonzoGenesisHash - , conwayGenesisHash - , dijkstraGenesisHash - , Defaults.defaultYamlHardforkViaConfig sbe - ] - where - getHash :: MonadIO m => CardanoEra a -> Text.Text -> m (KeyMap Value) - getHash e = getShelleyGenesisHash (tempAbsPath Defaults.defaultGenesisFilepath e) - -createConfigJsonNoHash :: () - => ShelleyBasedEra era -- ^ The era used for generating the hard fork configuration toggle - -> KeyMap Aeson.Value -createConfigJsonNoHash = Defaults.defaultYamlHardforkViaConfig - --- Generate hashes for genesis.json files - -getByronGenesisHash - :: MonadIO m - => MonadThrow m - => FilePath - -> m (KeyMap Aeson.Value) -getByronGenesisHash path = do - e <- runExceptT $ readGenesisData path - case e of - Left err -> throwM $ GenesisReadError path err - Right (_, genesisHash) -> do - let genesisHash' = unGenesisHash genesisHash - pure . singleton "ByronGenesisHash" $ toJSON genesisHash' - -getShelleyGenesisHash - :: MonadIO m - => FilePath - -> Text - -> m (KeyMap Aeson.Value) -getShelleyGenesisHash path key = do - content <- liftIOAnnotated $ BS.readFile path - let genesisHash = Crypto.hashWith id content :: Crypto.Hash Crypto.Blake2b_256 BS.ByteString - pure . singleton (fromText key) $ toJSON genesisHash + -> m () +writeConfiguration configFile sbe = GHC.withFrozenCallStack . liftIOAnnotated $ do + (document, _warnings) <- configurationDocumentFromValue . Object $ Defaults.defaultYamlHardforkViaConfig sbe + refreshGenesisHashes (takeDirectory configFile) document >>= writeConfigurationDocument configFile + +-- | Set the genesis hashes in a node configuration file to the hashes of the +-- genesis files it names, adding the missing ones and replacing the ones that +-- are out of date. +refreshConfigurationHashes :: () + => HasCallStack + => MonadIO m + => FilePath -- ^ The configuration file + -> m () +refreshConfigurationHashes configFile = GHC.withFrozenCallStack . liftIOAnnotated $ do + (document, _warnings) <- readConfigurationDocument configFile + refreshGenesisHashes (takeDirectory configFile) document >>= writeConfigurationDocument configFile -- | For an unknown reason, CLI commands are a lot slower on Windows than on Linux and -- MacOS. We need to allow a lot more time to set up a testnet. diff --git a/cardano-testnet/src/Testnet/Defaults.hs b/cardano-testnet/src/Testnet/Defaults.hs index df07b687965..4008a327e8c 100644 --- a/cardano-testnet/src/Testnet/Defaults.hs +++ b/cardano-testnet/src/Testnet/Defaults.hs @@ -93,6 +93,7 @@ import Cardano.Network.NodeToNode (DiffusionMode (..)) import Cardano.Network.PeerSelection.Bootstrap (UseBootstrapPeers (..)) import Cardano.Network.PeerSelection.PeerTrustable (PeerTrustable (..)) import Cardano.Node.Testnet.Paths +import Cardano.Node.Tracing.DefaultTraceConfig (defaultCardanoConfig) import Ouroboros.Network.ConnectionManager.Types (Provenance (..)) import Ouroboros.Network.Diffusion.Topology (LocalRootPeersGroup (..), LocalRootPeersGroups (..), LocalRoots (..), NetworkTopology (..), @@ -245,7 +246,6 @@ traceOptionsForwarding = defaultYamlHardforkViaConfig :: ShelleyBasedEra era -> Aeson.KeyMap Aeson.Value defaultYamlHardforkViaConfig sbe = defaultYamlConfig - <> [("TraceOptions", traceOptions)] <> protocolVersions sbe <> hardforkViaConfig sbe where @@ -319,8 +319,6 @@ defaultYamlHardforkViaConfig sbe = ] ) - traceOptions = Aeson.Object mempty - defaultYamlConfig :: Aeson.KeyMap Aeson.Value defaultYamlConfig = Aeson.fromList @@ -349,14 +347,33 @@ defaultYamlConfig = , ("RequiresNetworkMagic", "RequiresMagic") , ("PeerSharing", Aeson.Bool False) - - -- New tracing system: empty map = use all defaults. - -- Mandatory: trace-dispatcher's FromJSON parses "TraceOptions" at the root. - , ("TraceOptions", Aeson.object mempty) ] + <> defaultTraceConfig where genesisPath era = Aeson.String $ Text.pack $ defaultGenesisFilepath era +-- | The tracing configuration the node uses by default ('defaultCardanoConfig'), +-- as the tracing keys of a configuration file: @TraceOptions@ and +-- @TraceOptionMetricsPrefix@. +-- +-- They are written out because the node fills them in only for a configuration +-- in the flat format. Given an empty @TraceOptions@ in the @cardano-config@ +-- format, it uses @trace-dispatcher@'s fallback instead: every namespace at +-- @Notice@, and no metrics prefix. +-- +-- @trace-dispatcher@ renders a configuration with the keys of its newer format +-- (@Options@, @MetricsPrefix@); they are renamed to the keys a configuration +-- file uses. +defaultTraceConfig :: Aeson.KeyMap Aeson.Value +defaultTraceConfig = + Aeson.fromList + [ (fileKey, value) + | Aeson.Object rendered <- [toJSON defaultCardanoConfig] + , (renderedKey, fileKey) <- [("Options", "TraceOptions"), ("MetricsPrefix", "TraceOptionMetricsPrefix")] + , Just value <- [Aeson.lookup renderedKey rendered] + , value /= Aeson.Null + ] + -- | 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 -- by the Shelley genesis. diff --git a/cardano-testnet/src/Testnet/Start/Cardano.hs b/cardano-testnet/src/Testnet/Start/Cardano.hs index 091ae886b64..a61b75e0ca7 100644 --- a/cardano-testnet/src/Testnet/Start/Cardano.hs +++ b/cardano-testnet/src/Testnet/Start/Cardano.hs @@ -40,6 +40,9 @@ import Cardano.Api import Cardano.Api.Byron (GenesisData (..)) import qualified Cardano.Api.Byron as Byron +import Cardano.Configuration.Edit (configurationDocumentFromValue, + configurationDocumentValue, readConfigurationDocument, + writeConfigurationDocument) import Cardano.Network.Diffusion.Topology (CardanoNetworkTopology) import Cardano.Node.Configuration.NodeAddress (PortNumber) import Cardano.Node.Configuration.TopologyP2P () @@ -47,7 +50,7 @@ import Cardano.Node.Testnet.Paths (defaultConfigFile, defaultNodeEnvFi defaultNodeTopologyFile, defaultNodesDataDir, defaultPortFile, defaultUtxoAddrPath) import Cardano.Prelude (NonEmpty ((:|)), canonicalEncodePretty, readMaybe) -import Cardano.Tracer.Configuration (LogFormat(..)) +import Cardano.Tracer.Configuration (LogFormat (..)) import Ouroboros.Network.PeerSelection.RelayAccessPoint (RelayAccessPoint (..)) import Prelude hiding (lines) @@ -59,8 +62,8 @@ import Control.Monad.Catch import Control.Monad.Trans.Maybe (runMaybeT) import Control.Monad.Trans.Resource (MonadResource, getInternalState) import Data.Aeson as Aeson -import qualified Data.Aeson.KeyMap as KeyMap import qualified Data.Aeson.Encode.Pretty as A +import qualified Data.Aeson.KeyMap as KeyMap import qualified Data.ByteString.Lazy as LBS import Data.Default.Class () import Data.Either @@ -80,10 +83,11 @@ import qualified Data.Yaml as Yaml import GHC.Exts (fromList) import GHC.Stack import qualified System.Directory as IO -import System.FilePath ((), dropExtension) +import System.FilePath (dropExtension, ()) import qualified System.Process as Process -import Testnet.CardanoTracer (CardanoTracerConf(..), CardanoTracerRuntime(..), startCardanoTracer) +import Testnet.CardanoTracer (CardanoTracerConf (..), CardanoTracerRuntime (..), + startCardanoTracer) import Testnet.ChainWatchdog (chainForecastHorizon, chainStallWatchdog, stderrTracer) import Testnet.Components.Configuration import qualified Testnet.Defaults as Defaults @@ -100,8 +104,8 @@ import Testnet.Types as TR hiding (shelleyGenesis) import qualified Hedgehog.Extras as H import Hedgehog.Extras.Stock (sprocketSystemName) -import Hedgehog.Extras.Stock.IO.Network.Sprocket (sprocketArgumentName) import qualified Hedgehog.Extras.Stock.IO.Network.Port as H +import Hedgehog.Extras.Stock.IO.Network.Sprocket (sprocketArgumentName) import Hedgehog.Internal.Property (failException) import RIO (MonadUnliftIO, RIO (..), runRIO, throwString, timeout) @@ -130,8 +134,7 @@ createTestnetEnv , creationNodes=TestnetNodesWithOptions{optSpoNodes, optRelayNodes} } Conf - { genesisHashesPolicy - , tempAbsPath=TmpAbsolutePath tmpAbsPath + { tempAbsPath=TmpAbsolutePath tmpAbsPath } = do -- Fresh-run rule: delete any manifest a previous run left in this directory, @@ -147,13 +150,8 @@ createTestnetEnv creationOptions (TmpAbsolutePath tmpAbsPath) - let configurationFile = tmpAbsPath defaultConfigFile - -- Add Byron, Shelley and Alonzo genesis hashes to node configuration - config <- case genesisHashesPolicy of - WithHashes -> createConfigJson (TmpAbsolutePath tmpAbsPath) sbe - WithoutHashes -> pure $ createConfigJsonNoHash sbe - - liftIOAnnotated . LBS.writeFile configurationFile $ A.encodePretty $ Object config + -- The node configuration, with the hashes of the genesis files just created + writeConfiguration (tmpAbsPath defaultConfigFile) sbe let allNodes = NEL.toList optSpoNodes ++ optRelayNodes numberedNodes = zip [1..] allNodes @@ -294,10 +292,9 @@ cardanoTestnet -- should connect to. The tracer's lifetime is tied to the surrounding -- 'MonadResource' scope, and it is additionally interrupted on SIGINT -- alongside the nodes (see 'interruptNodesOnSigINT' below). - (nodeConfigFile', mTracer) <- case cardanoEnableTracer of - TraceDisabled -> pure (nodeConfigFile, Nothing) + mTracer <- case cardanoEnableTracer of + TraceDisabled -> pure Nothing TraceEnabled ip mport -> do - cfgFile' <- liftIOAnnotated $ enableTraceForwarding nodeConfigFile tracerRuntime <- startCardanoTracer $ CardanoTracerConf { tempAbsPath = tmpAbsPath , prometheusIP = ip @@ -308,7 +305,7 @@ cardanoTestnet Ping.waitForSprocket 120 0.2 (tracerSprocket tracerRuntime) >>= \case Left err -> throwString $ "Sprocket of cardano-tracer did not come up after 120s: " <> show err Right _ -> pure () - pure (cfgFile', Just tracerRuntime) + pure $ Just tracerRuntime @@ -374,6 +371,17 @@ cardanoTestnet pure shelleyGenesis' else pure initialShelleyGenesis + -- Bring the genesis hashes in the node configuration in line with the genesis + -- files: the start times may just have been updated, and the files may have + -- been changed since the environment was created. + refreshConfigurationHashes nodeConfigFile + + -- With a cardano-tracer, the nodes run on a copy of the configuration that + -- forwards their traces to it. + nodeConfigFile' <- case mTracer of + Nothing -> pure nodeConfigFile + Just _ -> liftIOAnnotated $ enableTraceForwarding nodeConfigFile + let portNumbersMap = Map.fromList portNumbers rpcPortsMap <- case cardanoEnableRpc of @@ -599,14 +607,33 @@ cardanoTestnet -- modified config file. enableTraceForwarding :: FilePath -> IO FilePath enableTraceForwarding configFile = do - Yaml.decodeFileEither configFile >>= \case - Left err -> throwString $ "enableTraceForwarding: could not decode node configuration file " <> configFile <> ": " <> show err - Right (config :: KeyMap.KeyMap Yaml.Value) -> do - let config' = KeyMap.insertWith mergeTraceOptions "TraceOptions" Defaults.traceOptionsForwarding config - let configFile' = dropExtension configFile <> "-tracer.yaml" - Yaml.encodeFile configFile' config' - pure configFile' + (document, _warnings) <- readConfigurationDocument configFile + (document', _warnings') <- + configurationDocumentFromValue + . onObject (onKey "Configuration" . onKey "HermodTracing" $ + KeyMap.insertWith mergeTraceOptions "TraceOptions" Defaults.traceOptionsForwarding) + $ configurationDocumentValue document + let configFile' = dropExtension configFile <> "-tracer.yaml" + writeConfigurationDocument configFile' document' + pure configFile' where + -- The tracing settings are the @HermodTracing@ object of the @Configuration@ + -- section. A missing object (or one given as a file) is replaced. + onObject :: (KeyMap.KeyMap Aeson.Value -> KeyMap.KeyMap Aeson.Value) -> Aeson.Value -> Aeson.Value + onObject f = \case + Object o -> Object $ f o + other -> other + + onKey + :: KeyMap.Key + -> (KeyMap.KeyMap Aeson.Value -> KeyMap.KeyMap Aeson.Value) + -> KeyMap.KeyMap Aeson.Value + -> KeyMap.KeyMap Aeson.Value + onKey key f o = + KeyMap.insert key (Object . f $ case KeyMap.lookup key o of + Just (Object inner) -> inner + _ -> mempty) o + mergeTraceOptions :: Yaml.Value -> Yaml.Value -> Yaml.Value mergeTraceOptions (Object forwarding) (Object existing) = Object $ KeyMap.unionWith mergeNamespace forwarding existing diff --git a/cardano-testnet/src/Testnet/Start/Types.hs b/cardano-testnet/src/Testnet/Start/Types.hs index bdeefb66a1f..adfa075aa33 100644 --- a/cardano-testnet/src/Testnet/Start/Types.hs +++ b/cardano-testnet/src/Testnet/Start/Types.hs @@ -43,7 +43,6 @@ module Testnet.Start.Types , NodeLoggingFormat(..) , Conf(..) - , GenesisHashesPolicy (..) , NodeConfiguration , NodeConfigurationYaml , mkConf @@ -341,12 +340,8 @@ data NodeConfiguration type NodeConfigurationYaml = File NodeConfiguration InOut -data GenesisHashesPolicy = WithHashes | WithoutHashes - deriving (Eq, Show) - data Conf = Conf - { genesisHashesPolicy :: GenesisHashesPolicy - , tempAbsPath :: TmpAbsolutePath + { tempAbsPath :: TmpAbsolutePath , updateTimestamps :: UpdateTimestamps } deriving (Eq, Show) @@ -357,18 +352,16 @@ mkConf tempAbsPath' = withFrozenCallStack $ do H.note_ tempAbsPath' pure $ mkConfig tempAbsPath' --- | Create a 'Conf' from a temporary absolute path, with Genesis Hashes enabled --- and updating time stamps disabled. +-- | Create a 'Conf' from a temporary absolute path, with updating time stamps +-- disabled. mkConfig :: FilePath -> Conf mkConfig tempAbsPath' = Conf - { genesisHashesPolicy = WithHashes - , tempAbsPath = TmpAbsolutePath (addTrailingPathSeparator tempAbsPath') + { tempAbsPath = TmpAbsolutePath (addTrailingPathSeparator tempAbsPath') , updateTimestamps = DontUpdateTimestamps } --- | Create a 'Conf' from an absolute path, with Genesis Hashes enabled --- and updating time stamps disabled. +-- | Create a 'Conf' from an absolute path, with updating time stamps disabled. mkConfigAbs :: FilePath -> IO Conf mkConfigAbs userOutputDir = do absUserOutputDir <- makeAbsolute userOutputDir diff --git a/cardano-testnet/src/Testnet/SubmitApi.hs b/cardano-testnet/src/Testnet/SubmitApi.hs index f511fb4efbf..36e9fd98793 100644 --- a/cardano-testnet/src/Testnet/SubmitApi.hs +++ b/cardano-testnet/src/Testnet/SubmitApi.hs @@ -9,12 +9,12 @@ module Testnet.SubmitApi , withSubmitApi ) where -import Cardano.Api - import Cardano.Testnet import Prelude +import Data.Aeson ((.=)) +import qualified Data.Aeson as Aeson import qualified System.IO as IO import qualified System.Process as IO @@ -26,11 +26,11 @@ import Hedgehog.Extras.Stock (Sprocket (..)) import qualified Hedgehog.Extras.Stock.IO.Network.Socket as IO import qualified Hedgehog.Extras.Stock.IO.Network.Sprocket as IO import qualified Hedgehog.Extras.Test.Base as H +import qualified Hedgehog.Extras.Test.File as H import qualified Hedgehog.Extras.Test.Process as H data SubmitApiConf = SubmitApiConf { tempAbsPath :: FilePath - , configPath :: File NodeConfig In , epochSlots :: Int , sprocket :: Sprocket , testnetMagic :: Int @@ -41,7 +41,6 @@ withSubmitApi :: SubmitApiConf -> [String] -> (String -> Integration ()) -> Inte withSubmitApi SubmitApiConf { tempAbsPath - , configPath , epochSlots , sprocket , testnetMagic @@ -58,8 +57,13 @@ withSubmitApi [submitApiPort] <- H.evalIO $ maybe (IO.allocateRandomPorts 1) (pure . (:[])) maybePort + -- The submit API's configuration is a tracing configuration, not a node + -- configuration. An empty @TraceOptions@ leaves the submit API's defaults. + configFile <- H.noteTempFile tempAbsPath "submit-api-config.json" + H.lbsWriteFile configFile . Aeson.encode $ Aeson.object ["TraceOptions" .= Aeson.object []] + cp <- procSubmitApi $ - [ "--config", unFile configPath + [ "--config", configFile , "--cardano-mode" , "--epoch-slots", show epochSlots , "--socket-path", IO.sprocketArgumentName sprocket diff --git a/cardano-testnet/src/Testnet/Types.hs b/cardano-testnet/src/Testnet/Types.hs index c463ae1453c..5cb0cd703b6 100644 --- a/cardano-testnet/src/Testnet/Types.hs +++ b/cardano-testnet/src/Testnet/Types.hs @@ -53,10 +53,6 @@ import Cardano.Api import Cardano.Api.Experimental (Some (..)) import qualified Cardano.Chain.Genesis as G -import Cardano.Crypto.ProtocolMagic (RequiresNetworkMagic (..)) -import Cardano.Node.Configuration.POM -import qualified Cardano.Node.Protocol.Byron as Byron -import Cardano.Node.Types import qualified Cardano.Rpc.Client as Rpc import Cardano.Rpc.Server.Config (nodeSocketPathToRpcSocketPath) @@ -71,14 +67,12 @@ import Data.List.NonEmpty (NonEmpty) import qualified Data.List.NonEmpty as NEL import Data.Maybe import Data.MonoTraversable (Element, MonoFunctor (..)) -import qualified Data.Yaml as Yaml import GHC.Exts (IsString (..)) import GHC.Generics (Generic) import qualified GHC.IO.Handle as IO import GHC.Stack import Lens.Micro (ix, (^?)) import Network.Socket (HostAddress, PortNumber, hostAddressToTuple, tupleToHostAddress) -import System.FilePath import qualified System.Process as IO import Testnet.Start.Types @@ -268,24 +262,14 @@ getStartTime :: H.MonadTest m => MonadIO m => HasCallStack - => FilePath - -> TestnetRuntime + => TestnetRuntime -> m SystemStart -getStartTime tempRootPath TestnetRuntime{configurationFile} = withFrozenCallStack $ H.evalEither <=< H.evalIO . runExceptT $ do - byronGenesisFile <- - decodeNodeConfiguration configurationFile >>= \case - NodeProtocolConfigurationCardano NodeByronProtocolConfiguration{npcByronGenesisFile} _ _ _ _ _ _ -> - pure $ unGenesisFile npcByronGenesisFile - let byronGenesisFilePath = tempRootPath byronGenesisFile - SystemStart . G.gdStartTime . G.configGenesisData <$> decodeGenesisFile byronGenesisFilePath - where - decodeNodeConfiguration :: File NodeConfig In -> ExceptT String IO NodeProtocolConfiguration - decodeNodeConfiguration (File file) = do - partialNodeCfg <- modifyError show $ ExceptT $ Yaml.decodeFileEither file - fmap ncProtocolConfig . liftEither . makeNodeConfiguration $ defaultPartialNodeConfiguration <> partialNodeCfg - decodeGenesisFile :: FilePath -> ExceptT String IO G.Config - decodeGenesisFile fp = withExceptT (docToString . prettyError) $ - Byron.readGenesis (GenesisFile fp) Nothing RequiresNoMagic +getStartTime TestnetRuntime{configurationFile} = withFrozenCallStack $ H.evalEither <=< H.evalIO . runExceptT $ do + (nodeConfig, _warnings) <- modifyError show $ readNodeConfig configurationFile + -- readNodeConfig has already read and hash-checked the genesis files, so + -- readByronGenesisConfig is a plain projection of what it returned. + let byronGenesis = readByronGenesisConfig nodeConfig + pure . SystemStart . G.gdStartTime $ G.configGenesisData byronGenesis readNodeLoggingFormat :: String -> Either String NodeLoggingFormat readNodeLoggingFormat = \case diff --git a/cardano-testnet/test/cardano-testnet-golden/files/golden/node_default_config.json b/cardano-testnet/test/cardano-testnet-golden/files/golden/node_default_config.json index 9528440b7bc..fca77ce4923 100644 --- a/cardano-testnet/test/cardano-testnet-golden/files/golden/node_default_config.json +++ b/cardano-testnet/test/cardano-testnet-golden/files/golden/node_default_config.json @@ -21,5 +21,78 @@ "TestConwayHardForkAtEpoch": 0, "TestMaryHardForkAtEpoch": 0, "TestShelleyHardForkAtEpoch": 0, - "TraceOptions": {} + "TraceOptionMetricsPrefix": "cardano.node.metrics.", + "TraceOptions": { + "": { + "backends": [ + "Stdout MachineFormat", + "EKGBackend" + ], + "detail": "DNormal", + "severity": "Notice" + }, + "BlockFetch.Client.CompletedBlockFetch": { + "maxFrequency": 2 + }, + "BlockFetch.Decision": { + "severity": "Silence" + }, + "ChainDB": { + "severity": "Info" + }, + "ChainDB.AddBlockEvent.AddBlockValidation": { + "severity": "Silence" + }, + "ChainDB.AddBlockEvent.AddBlockValidation.ValidCandidate": { + "maxFrequency": 2 + }, + "ChainDB.AddBlockEvent.AddedBlockToQueue": { + "maxFrequency": 2 + }, + "ChainDB.AddBlockEvent.AddedBlockToVolatileDB": { + "maxFrequency": 2 + }, + "ChainDB.CopyToImmutableDBEvent.CopiedBlockToImmutableDB": { + "maxFrequency": 2 + }, + "ChainSync.Client": { + "severity": "Warning" + }, + "Forge.Loop": { + "severity": "Info" + }, + "Forge.StateInfo": { + "severity": "Info" + }, + "LedgerMetrics": { + "severity": "Silence" + }, + "Mempool": { + "severity": "Info" + }, + "Net.ConnectionManager.Remote": { + "severity": "Info" + }, + "Net.ErrorPolicy": { + "severity": "Info" + }, + "Net.InboundGovernor": { + "severity": "Warning" + }, + "Net.InboundGovernor.Remote": { + "severity": "Info" + }, + "Net.Mux.Remote": { + "severity": "Info" + }, + "Net.PeerSelection": { + "severity": "Silence" + }, + "Resources": { + "severity": "Silence" + }, + "Startup.DiffusionInit": { + "severity": "Info" + } + } } \ No newline at end of file diff --git a/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Api/TxReferenceInputDatum.hs b/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Api/TxReferenceInputDatum.hs index 46e023a88b1..ccc29aab6ed 100644 --- a/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Api/TxReferenceInputDatum.hs +++ b/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Api/TxReferenceInputDatum.hs @@ -56,8 +56,7 @@ import qualified Hedgehog.Extras.Test.TestWatchdog as H -- This test tests that such datums are made available to the script. hprop_tx_refin_datum :: Property hprop_tx_refin_datum = integrationRetryWorkspace 2 "api-tx-refin-dat" $ \tempAbsBasePath' -> H.runWithDefaultWatchdog_ $ do - conf@Conf{tempAbsPath} <- mkConf tempAbsBasePath' - let tempAbsPath' = unTmpAbsPath tempAbsPath + conf <- mkConf tempAbsBasePath' let era = Exp.ConwayEra sbe = convert era @@ -73,7 +72,7 @@ hprop_tx_refin_datum = integrationRetryWorkspace 2 "api-tx-refin-dat" $ \tempAbs } <- createAndRunTestnet creationOptions def conf - systemStart <- H.noteShowM $ getStartTime tempAbsPath' tr + systemStart <- H.noteShowM $ getStartTime tr epochStateView <- getEpochStateView configurationFile (nodeSocketPath node0) connectionInfo <- nodeConnectionInfo tr 0 pparams <- getProtocolParams epochStateView ceo diff --git a/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Cli/KesPeriodInfo.hs b/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Cli/KesPeriodInfo.hs index f099ec51312..a745942ce66 100644 --- a/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Cli/KesPeriodInfo.hs +++ b/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Cli/KesPeriodInfo.hs @@ -23,7 +23,6 @@ import Prelude import Control.Monad import qualified Data.Aeson as Aeson import qualified Data.Aeson as J -import qualified Data.Aeson.Encode.Pretty as Aeson import Data.Default.Class import Data.Function import qualified Data.IP as IP @@ -42,7 +41,6 @@ import Testnet.Process.Cli.SPO import Testnet.Process.Run (execCli, execCli', mkExecConfig) import Testnet.Property.Util (decodeEraUTxO, integrationRetryWorkspace) import Testnet.Runtime -import Testnet.Start.Cardano (liftToIntegration) import Testnet.Types import Hedgehog (Property) @@ -259,8 +257,7 @@ hprop_kes_period_info = integrationRetryWorkspace 2 "kes-period-info" $ \tempAbs , "--out-file", testSpoOperationalCertFp ] - jsonBS <- liftToIntegration $ Aeson.encodePretty . Aeson.Object <$> createConfigJson tempAbsPath sbe - H.lbsWriteFile (unFile configurationFile) jsonBS + writeConfiguration (unFile configurationFile) sbe newNodePortNumber <- H.randomPort testnetDefaultIpv4Address eRuntime <- runExceptT . retryOnAddressInUseError $ startNode tempAbsPath "test-spo" testnetDefaultIpv4Address newNodePortNumber testnetMagic Nothing diff --git a/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Cli/LeadershipSchedule.hs b/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Cli/LeadershipSchedule.hs index 00be5b1a35e..06d9a49d0ee 100644 --- a/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Cli/LeadershipSchedule.hs +++ b/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Cli/LeadershipSchedule.hs @@ -24,7 +24,6 @@ import Prelude import Control.Monad (void) import qualified Data.Aeson as Aeson import qualified Data.Aeson as J -import qualified Data.Aeson.Encode.Pretty as Aeson import qualified Data.Aeson.Types as J import Data.Default.Class import qualified Data.IP as IP @@ -48,7 +47,6 @@ import Testnet.Process.Run (execCli, execCli', mkExecConfig) import Testnet.Property.Assert import Testnet.Property.Util (decodeEraUTxO, integrationRetryWorkspace) import Testnet.Runtime -import Testnet.Start.Cardano import Testnet.Types import Hedgehog (Property, (===)) @@ -263,9 +261,7 @@ hprop_leadershipSchedule = integrationRetryWorkspace 2 "leadership-schedule" $ \ , "--operational-certificate-issue-counter-file", testSpoOperationalCertFp , "--out-file", testSpoOperationalCertFp ] - jsonBS <- liftToIntegration $ - Aeson.encodePretty . Aeson.Object <$> createConfigJson tempAbsPath sbe - H.lbsWriteFile (unFile configurationFile) jsonBS + writeConfiguration (unFile configurationFile) sbe newNodePort <- H.randomPort testnetDefaultIpv4Address eRuntime <- runExceptT . retryOnAddressInUseError $ startNode (TmpAbsolutePath work) "test-spo" testnetDefaultIpv4Address newNodePort testnetMagic Nothing diff --git a/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Cli/QuerySlotNumber.hs b/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Cli/QuerySlotNumber.hs index f369b74139d..e6e230ee8ef 100644 --- a/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Cli/QuerySlotNumber.hs +++ b/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Cli/QuerySlotNumber.hs @@ -49,7 +49,7 @@ hprop_querySlotNumber = integrationRetryWorkspace 2 "query-slot-number" $ \tempA , testnetNodes } <- createAndRunTestnet def def conf ShelleyGenesis{sgSlotLength, sgEpochLength} <- H.noteShowM $ shelleyGenesis tr - SystemStart startTime <- H.noteShowM $ getStartTime tempAbsBasePath' tr + SystemStart startTime <- H.noteShowM $ getStartTime tr let slotLength = fromNominalDiffTimeMicro sgSlotLength -- how many slots can the checked value differ from diff --git a/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/DumpConfig.hs b/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/DumpConfig.hs index 3aa8aa190fd..e5dd1498003 100644 --- a/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/DumpConfig.hs +++ b/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/DumpConfig.hs @@ -26,7 +26,7 @@ import System.FilePath (()) import Testnet.Components.Configuration (startTimeOffsetSeconds) import Testnet.Property.Util (integrationRetryWorkspace) import Testnet.Start.Cardano (liftToIntegration) -import Testnet.Start.Types (GenesisHashesPolicy (..), GenesisOptions (..)) +import Testnet.Start.Types (GenesisOptions (..)) import qualified Hedgehog as H import qualified Hedgehog.Extras as H @@ -43,11 +43,7 @@ hprop_dump_config = integrationRetryWorkspace 2 "dump-config-files" $ \tmpDir -> -- Generate the sandbox conf <- mkConf tmpDir - liftToIntegration $ createTestnetEnv - creationOptions - -- Do not add hashes to the main config file, so that genesis files - -- can be modified without having to recompute hashes every time. - conf{genesisHashesPolicy = WithoutHashes} + liftToIntegration $ createTestnetEnv creationOptions conf -- Wait for 20% more than `startTimeOffsetSeconds`, to ensure that -- the time bounds in the sandbox' config files are no longer valid diff --git a/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Gov/ProposeNewConstitution.hs b/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Gov/ProposeNewConstitution.hs index 3aec166bb4a..d2fa6bc60d5 100644 --- a/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Gov/ProposeNewConstitution.hs +++ b/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Gov/ProposeNewConstitution.hs @@ -118,11 +118,6 @@ hprop_ledger_events_propose_new_constitution = integrationRetryWorkspace 2 "prop } } - -- Rehash: the node validates genesis file hashes against configuration.yaml - conwayGenesisHash <- getShelleyGenesisHash conwayGenesisFile "ConwayGenesisHash" - H.rewriteJsonFile (tempAbsBasePath' "configuration.yaml") $ - \(config :: Aeson.Value) -> config & Aeson._Object %~ (conwayGenesisHash <>) - TestnetRuntime { testnetMagic , testnetNodes diff --git a/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Node/Shutdown.hs b/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Node/Shutdown.hs index aa661b7b085..410143fbae5 100644 --- a/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Node/Shutdown.hs +++ b/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/Node/Shutdown.hs @@ -124,8 +124,6 @@ hprop_shutdown = integrationRetryWorkspace 2 "shutdown" $ \tempAbsBasePath' -> H , "--start-time", formatIso8601 startTime ] - byronGenesisHash <- liftToIntegration $ Testnet.getByronGenesisHash $ byronGenesisOutputDir "genesis.json" - -- Move the files to the paths expected by 'defaultYamlHardforkViaConfig' below H.renameFile (byronGenesisOutputDir "genesis.json") (tempAbsPath' defaultGenesisFilepath ByronEra) H.renameFile (tempAbsPath' "shelley/genesis.json") (tempAbsPath' defaultGenesisFilepath ShelleyEra) @@ -134,20 +132,7 @@ hprop_shutdown = integrationRetryWorkspace 2 "shutdown" $ \tempAbsBasePath' -> H -- TODO: once 'cardano-cli latest genesis create' supports dijkstra, make this a copy instead of writing a default H.writeFile (tempAbsPath' defaultGenesisFilepath DijkstraEra) . LBS.unpack $ encode defaultDijkstraGenesis - (shelleyGenesisHash,alonzoGenesisHash) <- - liftToIntegration $ do - shelleyGenesisHash <- Testnet.getShelleyGenesisHash (tempAbsPath' defaultGenesisFilepath ShelleyEra) "ShelleyGenesisHash" - alonzoGenesisHash <- Testnet.getShelleyGenesisHash (tempAbsPath' defaultGenesisFilepath AlonzoEra) "AlonzoGenesisHash" - return (shelleyGenesisHash, alonzoGenesisHash) - - let finalYamlConfig :: LBS.ByteString - finalYamlConfig = encode . Object - $ mconcat [ byronGenesisHash - , shelleyGenesisHash - , alonzoGenesisHash - , defaultYamlHardforkViaConfig sbe] - - H.evalIO $ LBS.writeFile (tempAbsPath' "configuration.yaml") finalYamlConfig + Testnet.writeConfiguration (tempAbsPath' "configuration.yaml") sbe H.evalIO $ LBS.writeFile (tempAbsPath' "mainnet-topology.json") $ encode defaultMainnetTopology diff --git a/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/SubmitApi/Transaction.hs b/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/SubmitApi/Transaction.hs index 2e84dcba5dc..7881b4d68b0 100644 --- a/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/SubmitApi/Transaction.hs +++ b/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/SubmitApi/Transaction.hs @@ -120,7 +120,6 @@ hprop_transaction = integrationRetryWorkspace 2 "submit-api-transaction" $ \temp let submitApiConf = SubmitApiConf { tempAbsPath = unTmpAbsPath tempAbsPath - , configPath = configurationFile , epochSlots = 2 , sprocket = poolSprocket1 , maybePort = Nothing diff --git a/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/UpdateTimeStamps.hs b/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/UpdateTimeStamps.hs index a406125f9e7..db80fca803d 100644 --- a/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/UpdateTimeStamps.hs +++ b/cardano-testnet/test/cardano-testnet-test/Cardano/Testnet/Test/UpdateTimeStamps.hs @@ -18,8 +18,7 @@ import GHC.Float (double2Int) import Testnet.Components.Configuration (startTimeOffsetSeconds) import Testnet.Property.Util (integrationRetryWorkspace) import Testnet.Start.Cardano (liftToIntegration) -import Testnet.Start.Types (GenesisHashesPolicy (..), GenesisOptions (..), - UpdateTimestamps (..)) +import Testnet.Start.Types (GenesisOptions (..), UpdateTimestamps (..)) import qualified Hedgehog as H import qualified Hedgehog.Extras as H @@ -33,11 +32,7 @@ hprop_update_time_stamps = integrationRetryWorkspace 2 "update-time-stamps" $ \t -- Generate the sandbox conf <- mkConf tmpDir - liftToIntegration $ createTestnetEnv - creationOptions - -- Do not add hashes to the main config file, so that genesis files - -- can be modified without having to recompute hashes every time. - conf{genesisHashesPolicy = WithoutHashes} + liftToIntegration $ createTestnetEnv creationOptions conf -- Wait for 20% more than `startTimeOffsetSeconds`, to ensure that -- the time bounds in the sandbox' config files are no longer valid From 95e80e58baf7bdb46b1567084e2a53ad3f5755e5 Mon Sep 17 00:00:00 2001 From: Pablo Lamela Date: Thu, 15 Oct 2026 15:25:50 +0000 Subject: [PATCH 03/25] Let the chairman read node configurations in the cardano-config format --- ...29_palas_chairman_reads_cardano_config.yml | 4 +++ .../app/Cardano/Chairman/Commands/Run.hs | 34 +++++++++++++++---- .../cardano-node-chairman.cabal | 1 + .../Configuration/CardanoConfigResolve.hs | 24 ++++++++----- 4 files changed, 47 insertions(+), 16 deletions(-) create mode 100644 cardano-node-chairman/.changes/20261015_171029_palas_chairman_reads_cardano_config.yml diff --git a/cardano-node-chairman/.changes/20261015_171029_palas_chairman_reads_cardano_config.yml b/cardano-node-chairman/.changes/20261015_171029_palas_chairman_reads_cardano_config.yml new file mode 100644 index 00000000000..791f9145386 --- /dev/null +++ b/cardano-node-chairman/.changes/20261015_171029_palas_chairman_reads_cardano_config.yml @@ -0,0 +1,4 @@ +pr: 6732 +kind: + - feature +description: The chairman reads node configurations in the cardano-config format too, the way the node does. diff --git a/cardano-node-chairman/app/Cardano/Chairman/Commands/Run.hs b/cardano-node-chairman/app/Cardano/Chairman/Commands/Run.hs index da903f0c73c..a5433930584 100644 --- a/cardano-node-chairman/app/Cardano/Chairman/Commands/Run.hs +++ b/cardano-node-chairman/app/Cardano/Chairman/Commands/Run.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE LambdaCase #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RankNTypes #-} @@ -12,9 +13,14 @@ import Cardano.Api import qualified Cardano.Api as Api import Cardano.Chairman (chairmanTest) +import Cardano.Configuration (defaultCliArgs) import Cardano.Ledger.BaseTypes (unNonZero) +import Cardano.Node.Configuration.CardanoConfigResolve (ConfigurationDialect (..), + ResolvedNodeConfiguration (..), buildFromCardanoConfigWith, + classifyConfigurationFile) import Cardano.Node.Configuration.POM (PartialNodeConfiguration (..), parseNodeConfigurationFP) +import qualified Cardano.Node.Configuration.POM as POM import Cardano.Node.Protocol import Cardano.Node.Types import Cardano.Prelude (ConvertText (..)) @@ -97,13 +103,7 @@ run RunOpts , caConfigYaml } = do - configYamlPc <- liftIO . parseNodeConfigurationFP $ Just caConfigYaml - - ptclConfig <- case getProtocolConfiguration configYamlPc of - Nothing -> - error $ "Node protocol configuration was not specified "<> - "in Config yaml filepath: " <> unConfigPath caConfigYaml - Just ptclConfig -> return ptclConfig + ptclConfig <- readProtocolConfiguration caConfigYaml eitherSomeProtocol <- runExceptT $ mkConsensusProtocol ptclConfig Nothing @@ -140,6 +140,26 @@ run RunOpts NodeProtocolConfigurationCardano{} -> CardanoModeParams $ EpochSlots $ unNonZero k +-- | The protocol configuration in a node configuration file, read the way the +-- node reads it: by @cardano-config@ for a file in its format, by the node's own +-- parser otherwise. The chairman's command line is not the node's, so the +-- settings all come from the file. +readProtocolConfiguration :: ConfigYamlFilePath -> IO NodeProtocolConfiguration +readProtocolConfiguration caConfigYaml = + classifyConfigurationFile configFile >>= \case + LegacyDialect -> do + configYamlPc <- parseNodeConfigurationFP $ Just caConfigYaml + case getProtocolConfiguration configYamlPc of + Nothing -> + error $ "Node protocol configuration was not specified "<> + "in Config yaml filepath: " <> configFile + Just ptclConfig -> return ptclConfig + CardanoConfigDialect -> + POM.ncProtocolConfig . rncConfiguration + <$> buildFromCardanoConfigWith configFile (defaultCliArgs configFile) + where + configFile = unConfigPath caConfigYaml + getProtocolConfiguration :: PartialNodeConfiguration -> Maybe NodeProtocolConfiguration diff --git a/cardano-node-chairman/cardano-node-chairman.cabal b/cardano-node-chairman/cardano-node-chairman.cabal index ac993ae33ae..de40fb3ca25 100644 --- a/cardano-node-chairman/cardano-node-chairman.cabal +++ b/cardano-node-chairman/cardano-node-chairman.cabal @@ -42,6 +42,7 @@ executable cardano-node-chairman -rtsopts "-with-rtsopts=-T" build-depends: cardano-api + , cardano-config ^>= 2.2 , cardano-crypto-class , cardano-git-rev ^>= 0.2.2 , cardano-ledger-core diff --git a/cardano-node/src/Cardano/Node/Configuration/CardanoConfigResolve.hs b/cardano-node/src/Cardano/Node/Configuration/CardanoConfigResolve.hs index 4662bb84844..d6493935501 100644 --- a/cardano-node/src/Cardano/Node/Configuration/CardanoConfigResolve.hs +++ b/cardano-node/src/Cardano/Node/Configuration/CardanoConfigResolve.hs @@ -31,6 +31,7 @@ module Cardano.Node.Configuration.CardanoConfigResolve ResolvedNodeConfiguration (..) , CrossCheck (..) , buildNodeConfiguration + , buildFromCardanoConfigWith , NodeConfigurationError (..) -- * Dialects @@ -43,13 +44,12 @@ module Cardano.Node.Configuration.CardanoConfigResolve , cardanoConfigCliLayer ) where -import Cardano.Logging.Types (TraceConfig) import qualified Cardano.Configuration as Cfg import qualified Cardano.Configuration.CliArgs as CliArgs -import Cardano.Node.Configuration.CardanoConfigAdapter - (cardanoConfigToNodeConfiguration) -import Cardano.Node.Configuration.CardanoConfigCompare - (compareConfigurations, deprecatedFlagWarnings) +import Cardano.Logging.Types (TraceConfig) +import Cardano.Node.Configuration.CardanoConfigAdapter (cardanoConfigToNodeConfiguration) +import Cardano.Node.Configuration.CardanoConfigCompare (compareConfigurations, + deprecatedFlagWarnings) import Cardano.Node.Configuration.POM (NodeConfiguration (..), PartialNodeConfiguration (..), defaultPartialNodeConfiguration, makeNodeConfiguration, parseNodeConfigurationFP) @@ -167,10 +167,16 @@ buildFromLegacy crossCheck partialConf configFp = do -- the node's 'NodeConfiguration'. Unlike the cross-check on the legacy path, -- every failure here is fatal: there is no second parser to fall back to. buildFromCardanoConfig :: FilePath -> IO ResolvedNodeConfiguration -buildFromCardanoConfig configFp = do - cliArgs <- - cardanoConfigCliArgs configFp - >>= either (Exception.throwIO . NodeConfigurationError) pure +buildFromCardanoConfig configFp = + cardanoConfigCliArgs configFp + >>= either (Exception.throwIO . NodeConfigurationError) (buildFromCardanoConfigWith configFp) + +-- | 'buildFromCardanoConfig' with a given command-line layer instead of this +-- process's own command line: for a caller that is not the node, whose command +-- line is not the node's. With @'Cfg.defaultCliArgs' configFp@ every setting +-- comes from the file. +buildFromCardanoConfigWith :: FilePath -> Cfg.CliArgs -> IO ResolvedNodeConfiguration +buildFromCardanoConfigWith configFp cliArgs = do (fileCfg, fileWarnings) <- Cfg.parseConfigurationFiles configFp (cfgNc, checkWarnings) <- either (Exception.throwIO . NodeConfigurationError . displayException) pure $ From 3f24f133d02d84de22a56411d83ea0368beab9a4 Mon Sep 17 00:00:00 2001 From: John Lotoski Date: Sun, 11 Oct 2026 06:11:41 -0500 Subject: [PATCH 04/25] bump: mithril for v2630.1-hotfix --- flake.lock | 8 ++++---- flake.nix | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/flake.lock b/flake.lock index 76012b32858..fdcdad43c4c 100644 --- a/flake.lock +++ b/flake.lock @@ -1198,16 +1198,16 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1785407305, - "narHash": "sha256-8Ay4GLKQGeJwGQPLliUNvgfkKCHFVUeASWFu/e0SxqM=", + "lastModified": 1789639081, + "narHash": "sha256-l6ACwepW8R5zsx1iNw9VOzdRfOWhfSE3+GcP6VkX8Zc=", "owner": "IntersectMBO", "repo": "mithril", - "rev": "23e124d99320adea6eb3eca361132c6c43d59cfa", + "rev": "3f6cb73f491eb3195d02318643e40836fb093acc", "type": "github" }, "original": { "owner": "IntersectMBO", - "ref": "refs/tags/2630.0", + "ref": "refs/tags/2630.1-hotfix", "repo": "mithril", "type": "github" } diff --git a/flake.nix b/flake.nix index 21c30d906ea..15dfabae336 100644 --- a/flake.nix +++ b/flake.nix @@ -66,7 +66,7 @@ # Bump the tag and then run: nix flake lock --update-input mithril. # Changing the tag alone only relocks mithril itself, leaving its # transitive pins on an old release. - mithril.url = "github:IntersectMBO/mithril?ref=refs/tags/2630.0"; + mithril.url = "github:IntersectMBO/mithril?ref=refs/tags/2630.1-hotfix"; }; outputs = { From aa13d5e2bd29731fcd2cec165cabfeb7f8566929 Mon Sep 17 00:00:00 2001 From: John Lotoski Date: Sun, 13 Sep 2026 22:16:37 -0500 Subject: [PATCH 05/25] flake: bump iohkNix for the node 11.2 config series Brings in the enveloped environment configs, along with the cardanoLib attributes the release archive and docker changes need: mkEnvelope and the per-environment configFormat. cardano-config 1.1.0.0 appears in the lock transitively as iohk-nix's source-only schema input. --- flake.lock | 25 ++++++++++++++++++++++--- flake.nix | 2 +- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/flake.lock b/flake.lock index fdcdad43c4c..ff2e6ae2792 100644 --- a/flake.lock +++ b/flake.lock @@ -176,6 +176,23 @@ "type": "github" } }, + "cardano-config": { + "flake": false, + "locked": { + "lastModified": 1792141866, + "narHash": "sha256-zF5LFdthGAChJGjGQ3NGkz6LRtB8N/3Hie6A70vY5gI=", + "owner": "IntersectMBO", + "repo": "cardano-config", + "rev": "f22b91530d4a1de56882b71a79ebbfbea7de83d8", + "type": "github" + }, + "original": { + "owner": "IntersectMBO", + "ref": "cardano-config-2.2.2.0", + "repo": "cardano-config", + "type": "github" + } + }, "cardano-dev": { "inputs": { "haskellNix": "haskellNix", @@ -1135,6 +1152,7 @@ "iohkNix_2": { "inputs": { "blst": "blst_2", + "cardano-config": "cardano-config", "nixpkgs": [ "nixpkgs" ], @@ -1142,15 +1160,16 @@ "sodium": "sodium_2" }, "locked": { - "lastModified": 1787718550, - "narHash": "sha256-Wkevfb7P201JHWpP4sbSg3HEO4YDPuCrwvARatfF2RI=", + "lastModified": 1792756495, + "narHash": "sha256-KUXDHN2p9e83PPtespiYf/MMW41/ngYDq5Bgi+PmGoU=", "owner": "input-output-hk", "repo": "iohk-nix", - "rev": "af463a46dbe9c6e2db6b2639c0f35f5689e0c3a8", + "rev": "d0031fb59ddfedc713129718b62f931581039f5d", "type": "github" }, "original": { "owner": "input-output-hk", + "ref": "jl/node-11.2", "repo": "iohk-nix", "type": "github" } diff --git a/flake.nix b/flake.nix index 15dfabae336..2e6aa724e25 100644 --- a/flake.nix +++ b/flake.nix @@ -50,7 +50,7 @@ incl.url = "github:divnix/incl"; iohkNix = { - url = "github:input-output-hk/iohk-nix"; + url = "github:input-output-hk/iohk-nix/jl/node-11.2"; inputs.nixpkgs.follows = "nixpkgs"; }; From eca2cbdaf66f5074b20e194182433c14f2b558ee Mon Sep 17 00:00:00 2001 From: John Lotoski Date: Sun, 13 Sep 2026 22:18:30 -0500 Subject: [PATCH 06/25] configuration: refresh network configs for the 11.2 series Regenerated with update-config-files.sh against the bumped iohkNix. mainnet-config.json is now in the cardano-config envelope, following what iohk-nix publishes. mainnet-config.yaml is hand-maintained and stays flat; it drops the same keys the json series drops, Protocol and MaxKnownMajorProtocolVersion, and its MinNodeVersion moves to 11.2.0 to match. The two remain equivalent through migrate, which reproduces the json from the yaml byte for byte, though they are no longer directly comparable. testnet-template-config.json drops ApplicationName, ApplicationVersion, PBftSignatureThreshold, Protocol and MaxKnownMajorProtocolVersion. The template is copied from the iohk-nix source tree rather than from the published deployment, so it stays flat. testnet-template-dijkstra.json picks up the Leios genesis protocol parameters added in the w36 respin. --- configuration/cardano/mainnet-config.json | 227 +++++++++--------- configuration/cardano/mainnet-config.yaml | 9 +- .../cardano/testnet-template-config.json | 5 - .../cardano/testnet-template-dijkstra.json | 47 +++- 4 files changed, 165 insertions(+), 123 deletions(-) diff --git a/configuration/cardano/mainnet-config.json b/configuration/cardano/mainnet-config.json index 91e40c4beb1..3b6d971b6c8 100644 --- a/configuration/cardano/mainnet-config.json +++ b/configuration/cardano/mainnet-config.json @@ -1,114 +1,121 @@ { - "AlonzoGenesisFile": "mainnet-alonzo-genesis.json", - "AlonzoGenesisHash": "7e94a15f55d1e82d10f09203fa1d40f8eede58fd8066542cf6566008068ed874", - "ByronGenesisFile": "mainnet-byron-genesis.json", - "ByronGenesisHash": "5f20df933584822601f9e3f8c024eb5eb252fe8cefb24d1317dc3d432e940ebb", - "CheckpointsFile": "mainnet-checkpoints.json", - "CheckpointsFileHash": "3e6dee5bae7acc6d870187e72674b37c929be8c66e62a552cf6a876b1af31ade", - "ConsensusMode": "PraosMode", - "ConwayGenesisFile": "mainnet-conway-genesis.json", - "ConwayGenesisHash": "15a199f895e461ec0ffc6dd4e4028af28a492ab4e806d39cb674c88f7643ef62", - "LastKnownBlockVersion-Alt": 0, - "LastKnownBlockVersion-Major": 3, - "LastKnownBlockVersion-Minor": 0, - "LedgerDB": { - "Backend": "V2InMemory", - "QueryBatchSize": 100000, - "Snapshots": { - "NumOfDiskSnapshots": 2, - "SlotOffset": 0, - "SnapshotInterval": 86400 + "$schema": "https://raw.githubusercontent.com/IntersectMBO/cardano-config/v1/schemas/config.schema.json", + "Configuration": { + "ConsensusConfig": { + "ConsensusMode": "PraosMode" + }, + "HermodTracing": { + "TraceOptionForwarder": { + "connQueueSize": 64, + "disconnQueueSize": 128, + "maxReconnectDelay": 30 + }, + "TraceOptionMetricsPrefix": "cardano.node.metrics.", + "TraceOptionResourceFrequency": 1000, + "TraceOptions": { + "": { + "backends": [ + "EKGBackend", + "Forwarder", + "PrometheusSimple suffix 127.0.0.1 12798", + "Stdout HumanFormatColoured" + ], + "detail": "DNormal", + "severity": "Notice" + }, + "BlockFetch.Client.CompletedBlockFetch": { + "maxFrequency": 2.0 + }, + "BlockFetch.Decision": { + "severity": "Info" + }, + "ChainDB": { + "severity": "Info" + }, + "ChainDB.AddBlockEvent.AddBlockValidation": { + "severity": "Silence" + }, + "ChainDB.AddBlockEvent.AddBlockValidation.ValidCandidate": { + "maxFrequency": 2.0 + }, + "ChainDB.AddBlockEvent.AddedBlockToQueue": { + "maxFrequency": 2.0 + }, + "ChainDB.AddBlockEvent.AddedBlockToVolatileDB": { + "maxFrequency": 2.0 + }, + "ChainDB.CopyToImmutableDBEvent.CopiedBlockToImmutableDB": { + "maxFrequency": 2.0 + }, + "ChainDB.LedgerEvent.Forker": { + "severity": "Silence" + }, + "ChainSync.Client": { + "severity": "Warning" + }, + "Forge.Loop": { + "severity": "Info" + }, + "Forge.StateInfo": { + "severity": "Info" + }, + "Mempool": { + "severity": "Silence" + }, + "Mempool.AttemptAdd": { + "severity": "Silence" + }, + "Mempool.SyncNotNeeded": { + "severity": "Silence" + }, + "Net.ConnectionManager.Remote": { + "severity": "Info" + }, + "Net.InboundGovernor": { + "severity": "Warning" + }, + "Net.InboundGovernor.Remote": { + "severity": "Info" + }, + "Net.Mux.Remote": { + "severity": "Info" + }, + "Net.PeerSelection": { + "severity": "Info" + }, + "Resources": { + "severity": "Silence" + }, + "Startup.DiffusionInit": { + "severity": "Info" + } + } + }, + "ProtocolConfig": { + "AlonzoGenesisFile": "mainnet-alonzo-genesis.json", + "AlonzoGenesisHash": "7e94a15f55d1e82d10f09203fa1d40f8eede58fd8066542cf6566008068ed874", + "ByronGenesisFile": "mainnet-byron-genesis.json", + "ByronGenesisHash": "5f20df933584822601f9e3f8c024eb5eb252fe8cefb24d1317dc3d432e940ebb", + "CheckpointsFile": "mainnet-checkpoints.json", + "CheckpointsFileHash": "3e6dee5bae7acc6d870187e72674b37c929be8c66e62a552cf6a876b1af31ade", + "ConwayGenesisFile": "mainnet-conway-genesis.json", + "ConwayGenesisHash": "15a199f895e461ec0ffc6dd4e4028af28a492ab4e806d39cb674c88f7643ef62", + "RequiresNetworkMagic": "RequiresNoMagic", + "ShelleyGenesisFile": "mainnet-shelley-genesis.json", + "ShelleyGenesisHash": "1a3be38bcbb7911969283716ad7aa550250226b76a61fc51cc9a9a35d9276d81" + }, + "StorageConfig": { + "LedgerDB": { + "Backend": "V2InMemory", + "QueryBatchSize": 100000, + "Snapshots": { + "NumOfDiskSnapshots": 2, + "SlotOffset": 0, + "SnapshotInterval": 86400 + } + } } }, - "MaxKnownMajorProtocolVersion": 2, - "MinNodeVersion": "11.1.0", - "Protocol": "Cardano", - "RequiresNetworkMagic": "RequiresNoMagic", - "ShelleyGenesisFile": "mainnet-shelley-genesis.json", - "ShelleyGenesisHash": "1a3be38bcbb7911969283716ad7aa550250226b76a61fc51cc9a9a35d9276d81", - "TraceOptionForwarder": { - "connQueueSize": 64, - "disconnQueueSize": 128, - "maxReconnectDelay": 30 - }, - "TraceOptionMetricsPrefix": "cardano.node.metrics.", - "TraceOptionResourceFrequency": 1000, - "TraceOptions": { - "": { - "backends": [ - "EKGBackend", - "Forwarder", - "PrometheusSimple suffix 127.0.0.1 12798", - "Stdout HumanFormatColoured" - ], - "detail": "DNormal", - "severity": "Notice" - }, - "BlockFetch.Client.CompletedBlockFetch": { - "maxFrequency": 2.0 - }, - "BlockFetch.Decision": { - "severity": "Info" - }, - "ChainDB": { - "severity": "Info" - }, - "ChainDB.AddBlockEvent.AddBlockValidation": { - "severity": "Silence" - }, - "ChainDB.AddBlockEvent.AddBlockValidation.ValidCandidate": { - "maxFrequency": 2.0 - }, - "ChainDB.AddBlockEvent.AddedBlockToQueue": { - "maxFrequency": 2.0 - }, - "ChainDB.AddBlockEvent.AddedBlockToVolatileDB": { - "maxFrequency": 2.0 - }, - "ChainDB.CopyToImmutableDBEvent.CopiedBlockToImmutableDB": { - "maxFrequency": 2.0 - }, - "ChainDB.LedgerEvent.Forker": { - "severity": "Silence" - }, - "ChainSync.Client": { - "severity": "Warning" - }, - "Forge.Loop": { - "severity": "Info" - }, - "Forge.StateInfo": { - "severity": "Info" - }, - "Mempool": { - "severity": "Silence" - }, - "Mempool.AttemptAdd": { - "severity": "Silence" - }, - "Mempool.SyncNotNeeded": { - "severity": "Silence" - }, - "Net.ConnectionManager.Remote": { - "severity": "Info" - }, - "Net.InboundGovernor": { - "severity": "Warning" - }, - "Net.InboundGovernor.Remote": { - "severity": "Info" - }, - "Net.Mux.Remote": { - "severity": "Info" - }, - "Net.PeerSelection": { - "severity": "Info" - }, - "Resources": { - "severity": "Silence" - }, - "Startup.DiffusionInit": { - "severity": "Info" - } - } + "MinNodeVersion": "11.2.0", + "Version": 1 } diff --git a/configuration/cardano/mainnet-config.yaml b/configuration/cardano/mainnet-config.yaml index 1ae3bd13d11..56e7160a8eb 100644 --- a/configuration/cardano/mainnet-config.yaml +++ b/configuration/cardano/mainnet-config.yaml @@ -16,8 +16,6 @@ CheckpointsFileHash: 3e6dee5bae7acc6d870187e72674b37c929be8c66e62a552cf6a876b1af ##### Core protocol parameters ##### -Protocol: Cardano - # The mainnet does not include the network magic into addresses. Testnets do. RequiresNetworkMagic: RequiresNoMagic @@ -30,7 +28,6 @@ RequiresNetworkMagic: RequiresNoMagic LastKnownBlockVersion-Major: 3 LastKnownBlockVersion-Minor: 0 LastKnownBlockVersion-Alt: 0 -MaxKnownMajorProtocolVersion: 2 ##### Network Configuration ##### @@ -114,9 +111,9 @@ LedgerDB: ##### Version Information ##### -# Min is currently 11.1.0 due to removal of legacy tracing system and -# introduction of deterministic snapshots. -MinNodeVersion: "11.1.0" +# Min is currently 11.2.0 for the node 11.2 config series, which drops the keys +# cardano-config treats as removed. +MinNodeVersion: "11.2.0" ##### Logging configuration ##### diff --git a/configuration/cardano/testnet-template-config.json b/configuration/cardano/testnet-template-config.json index 69c75429b39..960e8af3718 100644 --- a/configuration/cardano/testnet-template-config.json +++ b/configuration/cardano/testnet-template-config.json @@ -1,7 +1,5 @@ { "AlonzoGenesisFile": "alonzo-genesis.json", - "ApplicationName": "cardano-sl", - "ApplicationVersion": 0, "ByronGenesisFile": "byron-genesis.json", "ConsensusMode": "PraosMode", "ConwayGenesisFile": "conway-genesis.json", @@ -21,9 +19,6 @@ } }, "MaxConcurrencyDeadline": 4, - "MaxKnownMajorProtocolVersion": 2, - "PBftSignatureThreshold": 1.1, - "Protocol": "Cardano", "RequiresNetworkMagic": "RequiresMagic", "ShelleyGenesisFile": "shelley-genesis.json", "TestAllegraHardForkAtEpoch": 0, diff --git a/configuration/cardano/testnet-template-dijkstra.json b/configuration/cardano/testnet-template-dijkstra.json index c33c6755721..1af3503bf1e 100644 --- a/configuration/cardano/testnet-template-dijkstra.json +++ b/configuration/cardano/testnet-template-dijkstra.json @@ -1,6 +1,49 @@ { + "leiosAnnouncementPeriodLength": 1000, + "leiosCommitteeSize": 900, + "leiosDiffusionPeriodLength": 7000, + "leiosQuorumStakeThreshold": 0.75, + "leiosVotePeriodLength": 4000, + "maxEndorserBlockExecutionUnits": { + "memory": 720000000, + "steps": 200000000000 + }, + "maxEndorserBlockReferencesSize": 40000, + "maxEndorserBlockTxsSize": 260000, + "maxPledgeLeverage": null, "maxRefScriptSizePerBlock": 1048576, + "maxRefScriptSizePerEndorserBlock": 1048576, "maxRefScriptSizePerTx": 204800, - "refScriptCostStride": 25600, - "refScriptCostMultiplier": 1.2 + "minPoolMargin": 0.015, + "perasBootstrapRound": 0, + "perasCertBoost": 15, + "perasHealingFactor": 0.5, + "perasMinCandidateBlockAge": 90, + "perasQuorumThresholdSafetyMargin": 0.05, + "perasTargetCommitteeSize": 800, + "plutusV4CostModel": [ + 100788, 420, 1, 1, 1000, 173, 0, 1, 1000, 59957, 4, 1, 11183, 32, 201305, + 8356, 4, 16000, 100, 16000, 100, 16000, 100, 16000, 100, 16000, 100, 16000, + 100, 100, 100, 16000, 100, 94375, 32, 132994, 32, 61462, 4, 72010, 178, 0, + 1, 22151, 32, 91189, 769, 4, 2, 85848, 123203, 7305, -900, 1716, 960, 57, + 85848, 0, 1, 1, 1000, 42921, 4, 2, 30623, 28755, 75, 1, 898148, 27279, 1, + 51775, 558, 1, 39184, 1000, 60594, 1, 141895, 32, 83150, 32, 15299, 32, + 76049, 1, 13169, 4, 22100, 10, 28999, 74, 1, 28999, 74, 1, 43285, 552, 1, + 44749, 541, 1, 33852, 32, 68246, 32, 72362, 32, 7243, 32, 7391, 32, 11546, + 32, 85848, 123203, 7305, -900, 1716, 960, 57, 85848, 0, 1, 90434, 519, 0, 1, + 74433, 32, 85848, 123203, 7305, -900, 1716, 960, 57, 85848, 0, 1, 1, 85848, + 123203, 7305, -900, 1716, 960, 57, 85848, 0, 1, 955506, 213312, 0, 2, + 270652, 22588, 4, 1457325, 64566, 4, 20467, 1, 4, 0, 141992, 32, 100788, + 420, 1, 1, 81663, 32, 59498, 32, 20142, 32, 24588, 32, 20744, 32, 25933, 32, + 24623, 32, 43053543, 10, 53384111, 14333, 10, 43574283, 26308, 10, 16000, + 100, 16000, 100, 962335, 18, 2780678, 6, 442008, 1, 52538055, 3756, 18, + 267929, 18, 76433006, 8868, 18, 52948122, 18, 1995836, 36, 3227919, 12, + 901022, 1, 166917843, 4307, 36, 284546, 36, 158221314, 26549, 36, 74698472, + 36, 333849714, 1, 254006273, 72, 2174038, 72, 2261318, 64571, 4, 207616, + 8310, 4, 1293828, 28716, 63, 0, 1, 1006041, 43623, 251, 0, 1 + ], + "refInputsCostPerDatumByte": 0, + "refInputsCostPerMultiAssetPolicy": 0, + "refScriptCostMultiplier": 1.2, + "refScriptCostStride": 25600 } From 7abfe9447031ca528411bfdf20162b49eb6c9167 Mon Sep 17 00:00:00 2001 From: John Lotoski Date: Sun, 13 Sep 2026 22:19:11 -0500 Subject: [PATCH 07/25] nix: publish and consume the enveloped node config iohk-nix now publishes -config.json in the cardano-config envelope. Two places in this repo produced or consumed the legacy dialect regardless. binary-release.nix built config.json straight from env.nodeConfig, bypassing configFormat, so release tarballs stayed on the legacy dialect while the published configs moved. It now emits whichever dialect the environment selects, enveloping the already-relativised config so the tarball's sibling genesis paths survive. cardanoLib always sets configFormat and throws on a value it does not know, so this throws too rather than falling through to legacy and publishing the wrong dialect silently. The docker node entrypoint rewrote relative "*File" values to absolute paths with a top-level with_entries. In the envelope those keys live under Configuration.
, so it silently rewrote nothing and the merged config's genesis paths would have resolved against the runtime dir, the exact failure the code comment says it exists to prevent. Walking the document handles the flat and enveloped shapes alike. Docker otherwise needs no change: it takes its configs from mkConfigHtml, so it picks up the envelope, and the sed that strips the - prefix is a plain text substitution that still matches. CARDANO_CONFIG_JSON_MERGE is a user-facing break that no code change can absorb: the merge is a plain deep merge with no key relocation, so a merge document written for the flat shape now adds an unrecognised top-level key and leaves the intended value untouched, silently. The README gains the new shape, an example updated to Configuration.HermodTracing.TraceOptions, and a way to find any key's path from inside the image. The tracer section says its config is not enveloped, since the two appear side by side. --- nix/binary-release.nix | 17 ++++++++++++++++- nix/docker/README.md | 23 ++++++++++++++++++++++- nix/docker/context/node/bin/entrypoint | 20 +++++++++++++++----- 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/nix/binary-release.nix b/nix/binary-release.nix index 5f4a7bbb79b..dfdaa853f29 100644 --- a/nix/binary-release.nix +++ b/nix/binary-release.nix @@ -36,10 +36,25 @@ let CheckpointsFile = "checkpoints.json"; }; + # Published in the dialect the environment selects, matching what iohk-nix + # publishes for it rather than always emitting the legacy config. The + # genesis paths are rewritten to the siblings copied below first, so the + # envelope carries the relative paths too. + # + # cardanoLib always sets configFormat, so an absent value means the + # iohk-nix pin moved under us. Mirror its throw rather than falling + # through to legacy, which would publish the wrong dialect silently. + relativeNodeConfig = env.nodeConfig // genesisAttrs; + nodeConfig = pkgs.writeText "config.json" (builtins.toJSON - (env.nodeConfig // genesisAttrs)); + (if env.configFormat == "enveloped" + then pkgs.cardanoLib.mkEnvelope relativeNodeConfig + else if env.configFormat == "legacy" + then relativeNodeConfig + else throw ("binary-release: ${name} sets configFormat = \"${env.configFormat}\";" + + " expected \"enveloped\" or \"legacy\""))); submitApiConfig = pkgs.writeText "submit-api-config.json" diff --git a/nix/docker/README.md b/nix/docker/README.md index 1770a57bed9..3fec8615388 100644 --- a/nix/docker/README.md +++ b/nix/docker/README.md @@ -113,17 +113,35 @@ Optional env variables and cardano-node args which can be used in custom mode can also be used in this mode. Merge mode uses the same default state directories as custom mode. +**The merge document must match the shape of the base config.** The image's +network configs are now in the cardano-config envelope, so config keys live +under `Configuration.
` rather than at the top level, and a merge +document written against the older flat configs no longer lands where it used +to. Merging is a plain deep merge with no key relocation, so a flat merge +document is not an error: it adds a top-level key the node does not recognise +and warns about, leaving the value you meant to override untouched. + +To find the right path for a key, look at the base config in the image: +``` +docker run --rm --entrypoint jq ghcr.io/intersectmbo/cardano-node:dev \ + -r '[paths(scalars)][] | join(".")' /opt/cardano/config/mainnet/config.json \ + | grep -i +``` + An example where prometheus binding is set away from localhost while preserving other defaults: ``` docker run \ -v node-ipc:/ipc \ -v mainnet-data:/data \ -e NETWORK=mainnet \ - -e CARDANO_CONFIG_JSON_MERGE='{"TraceOptions":{"":{"backends":["EKGBackend","Forwarder","PrometheusSimple suffix 0.0.0.0 12798","Stdout HumanFormatColoured"]}}}' \ + -e CARDANO_CONFIG_JSON_MERGE='{"Configuration":{"HermodTracing":{"TraceOptions":{"":{"backends":["EKGBackend","Forwarder","PrometheusSimple suffix 0.0.0.0 12798","Stdout HumanFormatColoured"]}}}}}' \ -e CARDANO_TOPOLOGY_JSON_MERGE='{"useLedgerAfterSlot": 147000000}' \ ghcr.io/intersectmbo/cardano-node:dev ``` +The topology merge document is unaffected: topology files are not enveloped, so +`CARDANO_TOPOLOGY_JSON_MERGE` keeps its flat shape as above. + The resulting merged config and topology are written to a private, per-container runtime directory under `/tmp` (see [Read-Only Root Filesystem](#read-only-root-filesystem) for the exact path) @@ -515,6 +533,9 @@ Optional env variables and cardano-tracer args which can be used in custom mode can also be used in this mode. Merge mode uses the same default state directories as custom mode. +Unlike the node image, the tracer config is not in the cardano-config envelope, +so merge documents here keep their flat shape. + An example which changes the prometheus binding address from a default of localhost (`127.0.0.1`) to `0.0.0.0`: ``` diff --git a/nix/docker/context/node/bin/entrypoint b/nix/docker/context/node/bin/entrypoint index 542be85dd55..f6706cc55f3 100755 --- a/nix/docker/context/node/bin/entrypoint +++ b/nix/docker/context/node/bin/entrypoint @@ -97,16 +97,26 @@ elif [[ -n ${NETWORK:-} ]]; then # (ByronGenesisFile, ShelleyGenesisFile, AlonzoGenesisFile, # ConwayGenesisFile, CheckpointsFile, ...); matching the "File" suffix # keeps this working if more are added. + # + # Walked rather than applied at the top level: in the cardano-config + # envelope these keys live under Configuration.
, so a top-level + # with_entries would silently rewrite nothing. Walking handles the flat and + # enveloped shapes alike. if [[ -n ${CARDANO_CONFIG_JSON_MERGE:-} ]]; then jq -S \ --arg cfgDir "$CFG/$NETWORK" \ --argjson deepMerge "$CARDANO_CONFIG_JSON_MERGE" \ '. * $deepMerge - | with_entries( - if ((.key | endswith("File")) - and (.value | type == "string") - and (.value | startswith("/") | not)) - then .value = "\($cfgDir)/\(.value)" + | walk( + if type == "object" + then with_entries( + if ((.key | endswith("File")) + and (.value | type == "string") + and (.value | startswith("/") | not)) + then .value = "\($cfgDir)/\(.value)" + else . + end + ) else . end )' \ From c267dc5d42ea01e3e31c020b1b3a225cca8c4223 Mon Sep 17 00:00:00 2001 From: John Lotoski Date: Mon, 14 Sep 2026 11:31:22 -0500 Subject: [PATCH 08/25] tracing: hand the tracing object to trace-dispatcher, not the file trace-dispatcher reads a file expecting the tracing settings at its root, but a cardano-config envelope nests them under `Configuration.HermodTracing`, so `trace-documentation` failed with `key "Options" not found`. Pass that object as `FromJSONObject` instead. It holds the flat legacy key names, so no particular trace-dispatcher version is needed. --- .../Node/Configuration/CardanoConfigResolve.hs | 18 ++++++++++++++++++ .../src/Cardano/Node/Tracing/Consistency.hs | 4 +++- .../src/Cardano/Node/Tracing/Documentation.hs | 11 ++++++++++- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/cardano-node/src/Cardano/Node/Configuration/CardanoConfigResolve.hs b/cardano-node/src/Cardano/Node/Configuration/CardanoConfigResolve.hs index d6493935501..be8af66024b 100644 --- a/cardano-node/src/Cardano/Node/Configuration/CardanoConfigResolve.hs +++ b/cardano-node/src/Cardano/Node/Configuration/CardanoConfigResolve.hs @@ -37,6 +37,7 @@ module Cardano.Node.Configuration.CardanoConfigResolve -- * Dialects , ConfigurationDialect (..) , classifyConfigurationFile + , tracingConfigSource -- * Command-line layers , nodeCliPartialConfiguration @@ -44,6 +45,7 @@ module Cardano.Node.Configuration.CardanoConfigResolve , cardanoConfigCliLayer ) where +import Cardano.Logging.ConfigurationParser (ConfigSource (..)) import qualified Cardano.Configuration as Cfg import qualified Cardano.Configuration.CliArgs as CliArgs import Cardano.Logging.Types (TraceConfig) @@ -144,6 +146,22 @@ classifyConfigurationFile fp = Right (Object o) | KeyMap.member "Configuration" o -> pure CardanoConfigDialect _ -> pure LegacyDialect +-- | How to hand a node configuration file's tracing settings to +-- trace-dispatcher, for a tool with a file and no node to resolve it. +-- +-- Reading a file, the library expects the tracing settings at its root. An +-- envelope puts them at @Configuration.HermodTracing@, so hand over that object +-- instead, which is what 'FromJSONObject' is for. Anything else goes as the +-- file, as before. +tracingConfigSource :: FilePath -> IO ConfigSource +tracingConfigSource fp = + Yaml.decodeFileEither fp >>= \case + Right (Object top) + | Just (Object cfg) <- KeyMap.lookup "Configuration" top + , Just (Object tracing) <- KeyMap.lookup "HermodTracing" cfg -> + pure (FromJSONObject tracing) + _ -> pure (FromFile fp) + -- | Resolve a legacy configuration with the node's own POM parser — the result -- the node runs on — and cross-check it against @cardano-config@'s. buildFromLegacy :: diff --git a/cardano-node/src/Cardano/Node/Tracing/Consistency.hs b/cardano-node/src/Cardano/Node/Tracing/Consistency.hs index 05da334f321..05953c21432 100644 --- a/cardano-node/src/Cardano/Node/Tracing/Consistency.hs +++ b/cardano-node/src/Cardano/Node/Tracing/Consistency.hs @@ -27,6 +27,7 @@ import qualified Cardano.Network.PeerSelection.Governor.Types as Cardano import Cardano.Network.PeerSelection.PeerTrustable (PeerTrustable) import Cardano.Network.Tracing.PeerSelection () import Cardano.Network.Tracing.PeerSelectionCounters () +import Cardano.Node.Configuration.CardanoConfigResolve (tracingConfigSource) import Cardano.Node.Handlers.Shutdown (ShutdownTrace) import Cardano.Node.Startup import Cardano.Node.Tracing.DefaultTraceConfig (defaultCardanoConfig) @@ -133,8 +134,9 @@ checkNodeTraceConfigurationWith :: -> FilePath -> IO NSWarnings checkNodeTraceConfigurationWith dt configFileName = do + src <- tracingConfigSource configFileName w1 <- checkTraceConfiguration - (FromFile configFileName) + src defaultCardanoConfig getAllNamespaces pure $ w1 <> dtWarnings dt diff --git a/cardano-node/src/Cardano/Node/Tracing/Documentation.hs b/cardano-node/src/Cardano/Node/Tracing/Documentation.hs index f36f74b810d..052558f5e5a 100644 --- a/cardano-node/src/Cardano/Node/Tracing/Documentation.hs +++ b/cardano-node/src/Cardano/Node/Tracing/Documentation.hs @@ -35,6 +35,7 @@ import qualified Cardano.Network.PeerSelection.Governor.Types as Cardano import Cardano.Network.PeerSelection.PeerTrustable (PeerTrustable (..)) import Cardano.Network.Tracing.PeerSelection () import Cardano.Network.Tracing.PeerSelectionCounters () +import Cardano.Node.Configuration.CardanoConfigResolve (tracingConfigSource) import Cardano.Node.Configuration.TopologyP2P () import Cardano.Node.Handlers.Shutdown (ShutdownTrace) import Cardano.Node.Startup @@ -189,6 +190,14 @@ runTraceDocumentationCmd runTraceDocumentationCmd TraceDocumentationCmd{..} = do docTracers tdcConfigFile tdcOutput tdMetricsHelp tdNamespaceList +-- | Read the tracing configuration from a node configuration file. This command +-- has no node, so there is no resolved configuration to use as there is at +-- startup; 'tracingConfigSource' says how to present the file. +resolveTracingConfig :: FilePath -> IO TraceConfig +resolveTracingConfig fp = do + src <- tracingConfigSource fp + readConfigurationWithDefault src defaultCardanoConfig + -- Have to repeat the construction of the tracers here, -- as the tracers are behind old tracer interface after construction in mkDispatchTracers. -- Can be changed, when old tracers have gone @@ -215,7 +224,7 @@ docTracersFirstPhase :: forall blk peer remotePeer. -> IO (DocTracer, TraceConfig) docTracersFirstPhase condConfigFileName = do trConfig <- case condConfigFileName of - Just fn -> readConfigurationWithDefault (FromFile fn) defaultCardanoConfig + Just fn -> resolveTracingConfig fn Nothing -> pure defaultCardanoConfig let trBase :: Logging.Trace IO FormattedMessage = docTracer (Stdout MachineFormat) trForward :: Logging.Trace IO FormattedMessage = docTracer Forwarder From 4e2a169b157930d121581e446d0c6cf89aae2d65 Mon Sep 17 00:00:00 2001 From: John Lotoski Date: Mon, 14 Sep 2026 11:57:40 -0500 Subject: [PATCH 09/25] configuration: envelope mainnet-config.yaml The json moved to the cardano-config envelope, leaving the hand-maintained yaml as the only flat mainnet config and breaking the yaml === json equivalence that Test.Cardano.Config.Mainnet asserts. Restructure the yaml to the same shape. LastKnownBlockVersion-Major/-Minor/-Alt are dropped: migrate treats them as removed and the json does not carry them. An enveloped config never reaches POM, which was the only thing that required them, so this file is no longer readable by a pre-11.2 node. Comments are preserved per section, and the commented-out examples are re-nested under Network and Mempool, the section names cardano-config derives from its schemas, with the DeadlineTargetNumberOf* and CapacityBytesOverride key names. Uncommenting one now sets the value it names instead of adding a key the node does not recognise. Verified: the yaml and json decode to identical values, and trace-documentation generates identical output from the yaml, the json and an older flat config. --- configuration/cardano/mainnet-config.yaml | 544 ++++++++++++---------- 1 file changed, 287 insertions(+), 257 deletions(-) diff --git a/configuration/cardano/mainnet-config.yaml b/configuration/cardano/mainnet-config.yaml index 56e7160a8eb..059d89460a4 100644 --- a/configuration/cardano/mainnet-config.yaml +++ b/configuration/cardano/mainnet-config.yaml @@ -1,113 +1,23 @@ ################################################################################ # Mainnet Cardano Node Configuration - -##### Locations ##### - -AlonzoGenesisFile: mainnet-alonzo-genesis.json -AlonzoGenesisHash: 7e94a15f55d1e82d10f09203fa1d40f8eede58fd8066542cf6566008068ed874 -ByronGenesisFile: mainnet-byron-genesis.json -ByronGenesisHash: 5f20df933584822601f9e3f8c024eb5eb252fe8cefb24d1317dc3d432e940ebb -ConwayGenesisFile: mainnet-conway-genesis.json -ConwayGenesisHash: 15a199f895e461ec0ffc6dd4e4028af28a492ab4e806d39cb674c88f7643ef62 -ShelleyGenesisFile: mainnet-shelley-genesis.json -ShelleyGenesisHash: 1a3be38bcbb7911969283716ad7aa550250226b76a61fc51cc9a9a35d9276d81 -CheckpointsFile: mainnet-checkpoints.json -CheckpointsFileHash: 3e6dee5bae7acc6d870187e72674b37c929be8c66e62a552cf6a876b1af31ade - -##### Core protocol parameters ##### - -# The mainnet does not include the network magic into addresses. Testnets do. -RequiresNetworkMagic: RequiresNoMagic - -##### Update system parameters ##### - -# This protocol version number gets used by block producing nodes as part -# of the system for agreeing on and synchronising protocol updates. # -# See https://github.com/intersectmbo/cardano-node/blob/master/cardano-node/src/Cardano/Node/Protocol/Cardano.hs#L199 -LastKnownBlockVersion-Major: 3 -LastKnownBlockVersion-Minor: 0 -LastKnownBlockVersion-Alt: 0 - -##### Network Configuration ##### - -# The following control the number of outbound connections to strictly our upstream peers -# cf. https://developers.cardano.org/docs/operate-a-stake-pool/node-operations/topology -# -# Defaults are provided by ouroboros-network, but can be overridden by uncommenting below: -# SyncTargetNumberOfActiveBigLedgerPeers: 30 -# SyncTargetNumberOfActivePeers: 5 -# SyncTargetNumberOfEstablishedBigLedgerPeers: 40 -# SyncTargetNumberOfEstablishedPeers: 10 -# SyncTargetNumberOfKnownBigLedgerPeers: 100 -# SyncTargetNumberOfKnownPeers: 150 -# SyncTargetNumberOfRootPeers: 0 -# TargetNumberOfActiveBigLedgerPeers: 5 -# TargetNumberOfActivePeers: 20 -# TargetNumberOfEstablishedBigLedgerPeers: 10 -# TargetNumberOfEstablishedPeers: 30 -# TargetNumberOfKnownBigLedgerPeers: 15 +# This is the cardano-config envelope form: the settings live under +# `Configuration`, grouped by component, beneath the `$schema`, `Version` and +# `MinNodeVersion` annotations. It is the same shape as mainnet-config.json, and +# the two are checked for equivalence by Test.Cardano.Config.Mainnet. # -# Additionally, as of ouroboros-network `0.22.2` with cardano-node `10.6.0`, -# the following three node config parameters which previously required -# explicit configuration depending on whether the node is a forger are now -# handled automatically. +# A node given an envelope resolves it with cardano-config rather than its own +# parser, so the keys cardano-config treats as removed are not present here. +# Notably LastKnownBlockVersion-Major/-Minor/-Alt are gone: the Byron +# supported-protocol-version now comes from consensus defaults. # -# PeerSharing: false for forgers, true for non-forgers -# TargetNumberOfKnownPeers: set according to forging status -# TargetNumberOfRootPeers: set according to forging status - -# When syncing in Genesis mode, this is the minimum number of active connections -# to big ledger peers needed to continue: -# MinBigLedgerPeersForTrustedState: 5 - -##### Consensus Configuration ##### - -ConsensusMode: PraosMode - -# Mempool timeout parameters must be either all set or all unset. -# When unset cardano-node will use default values. -# Default example values are: -# MempoolTimeoutSoft: 1.0 -# MempoolTimeoutHard: 1.5 -# MempoolTimeoutCapacity: 5.0 +# Commented-out examples below show the section each key belongs to, so they are +# correct as written if uncommented. -##### Ledger Configuration ##### +$schema: https://raw.githubusercontent.com/IntersectMBO/cardano-config/v2/schemas/config.schema.json -# Additional configuration options can be found at: -# https://ouroboros-consensus.cardano.intersectmbo.org/docs/for-developers/utxo-hd/migrating - -LedgerDB: - # When querying the store for a big range of UTxOs (such as with - # QueryUTxOByAddress), the store will be read in batches of this size. - QueryBatchSize: 100000 - - # The backend can either be in memory with `V2InMemory` or on disk with - # `V2LSM`. - Backend: V2InMemory - - # Instead of an object with individual options, a predefined snapshot - # policy can be selected by name, e.g. `Snapshots: Mithril`. - Snapshots: - # The snapshot interval in slots. Use `securityParam * 40` to provide - # intra-epoch snapshot redundancy while minimizing potential IOWAIT stall on some - # spec constrained machines during snapshot write. - SnapshotInterval: 86400 - - # Slot offset at which snapshot scheduling begins. - SlotOffset: 0 - - # A minimum duration between snapshots, in seconds (used to avoid excessive snapshots while syncing). - # Default is 10 minutes. - # RateLimit: 600 - - # Randomised snapshot delay range, in seconds. - # Both Min and Max need to be specified, otherwise the default delay of (5min, 10min) will be used. - # MinDelay: 300 - # MaxDelay: 600 - - # The number of disk snapshots to keep. - NumOfDiskSnapshots: 2 +# The configuration format version this document is written in. +Version: 2 ##### Version Information ##### @@ -115,160 +25,280 @@ LedgerDB: # cardano-config treats as removed. MinNodeVersion: "11.2.0" -##### Logging configuration ##### - -# Match the metrics prefix of the legacy tracing system to minimize breaking -# changes. -TraceOptionMetricsPrefix: "cardano.node.metrics." - -# Optional node name. Defaults to hostname if left unset. Ideally this is -# set in downstream code where the node's name is known. -# TraceOptionNodeName: - -# The frequency of resource messages. -TraceOptionResourceFrequency: 1000 - -# Queue size control: -# In case of a missing forwarding service consumer, trace messages will be -# buffered. This mitigates short forwarding interruptions, or delays at -# startup time. -# -# The queue capacity should thus correlate to the expected log lines per -# second given a particular tracing configuration to avoid unnecessarily -# increasing memory footprint. -# -# The maxReconnectDelay config option specifies the maximum delay in seconds -# between (re-)connection attempts of a forwarder. -TraceOptionForwarder: - connQueueSize: 64 - disconnQueueSize: 128 - maxReconnectDelay: 30 - -# Tracing options for node -TraceOptions: - # The default tracer configuration - '': - backends: - # None, any combination, or all of the following backends can be - # enabled, where `EKGBackend` forwards EKG resource status to - # cardano-tracer, `Forwarder` forwards message traces and - # `PrometheusSimple` serves cardano-node metrics directly from - # cardano-node and defaults to use of the same port as in the legacy - # tracing system. - - EKGBackend - - Forwarder - - PrometheusSimple suffix 127.0.0.1 12798 - - # Only one of the following can be enabled, which determines for format - # of node logging to stdout. - - Stdout HumanFormatColoured - # - Stdout HumanFormatUncoloured - # - Stdout MachineFormat - - # Each tracer can specify the level of details for printing messages. - # Options include `DMinimal`, `DNormal`, `DDetailed`, and `DMaximum`. If - # no implementation is given, `DNormal` is chosen. - detail: DNormal - - # The severity levels, ranging from the least severe (`Debug`) to the - # most severe (`Emergency`), provide a framework for ignoring messages - # with severity levels below a globally configured severity cutoff. +Configuration: + + ##### Protocol Configuration ##### + + Protocol: + + ##### Locations ##### + + AlonzoGenesisFile: mainnet-alonzo-genesis.json + AlonzoGenesisHash: 7e94a15f55d1e82d10f09203fa1d40f8eede58fd8066542cf6566008068ed874 + ByronGenesisFile: mainnet-byron-genesis.json + ByronGenesisHash: 5f20df933584822601f9e3f8c024eb5eb252fe8cefb24d1317dc3d432e940ebb + ConwayGenesisFile: mainnet-conway-genesis.json + ConwayGenesisHash: 15a199f895e461ec0ffc6dd4e4028af28a492ab4e806d39cb674c88f7643ef62 + ShelleyGenesisFile: mainnet-shelley-genesis.json + ShelleyGenesisHash: 1a3be38bcbb7911969283716ad7aa550250226b76a61fc51cc9a9a35d9276d81 + CheckpointsFile: mainnet-checkpoints.json + CheckpointsFileHash: 3e6dee5bae7acc6d870187e72674b37c929be8c66e62a552cf6a876b1af31ade + + ##### Core protocol parameters ##### + + # The mainnet does not include the network magic into addresses. Testnets do. + RequiresNetworkMagic: RequiresNoMagic + + ##### Consensus Configuration ##### + + Consensus: + ConsensusMode: GenesisMode + + ##### Network Configuration ##### + # + # The following control the number of outbound connections to strictly our upstream peers + # cf. https://developers.cardano.org/docs/operate-a-stake-pool/node-operations/topology + # + # Defaults are provided by ouroboros-network, but can be overridden by uncommenting below: + # Network: + # SyncTargetNumberOfActiveBigLedgerPeers: 30 + # SyncTargetNumberOfActivePeers: 5 + # SyncTargetNumberOfEstablishedBigLedgerPeers: 40 + # SyncTargetNumberOfEstablishedPeers: 10 + # SyncTargetNumberOfKnownBigLedgerPeers: 100 + # SyncTargetNumberOfKnownPeers: 150 + # SyncTargetNumberOfRootPeers: 0 + # DeadlineTargetNumberOfActiveBigLedgerPeers: 5 + # DeadlineTargetNumberOfActivePeers: 20 + # DeadlineTargetNumberOfEstablishedBigLedgerPeers: 10 + # DeadlineTargetNumberOfEstablishedPeers: 30 + # DeadlineTargetNumberOfKnownBigLedgerPeers: 15 + # + # Note the deadline targets were named TargetNumberOf* before the node 11.2 + # config series; cardano-config only accepts the Deadline-prefixed names. + # + # Additionally, as of ouroboros-network `0.22.2` with cardano-node `10.6.0`, + # the following three node config parameters which previously required + # explicit configuration depending on whether the node is a forger are now + # handled automatically. + # + # PeerSharing: false for forgers, true for non-forgers + # DeadlineTargetNumberOfKnownPeers: set according to forging status + # DeadlineTargetNumberOfRootPeers: set according to forging status + # + # When syncing in Genesis mode, this is the minimum number of active connections + # to big ledger peers needed to continue: + # Network: + # MinBigLedgerPeersForTrustedState: 5 + + ##### Mempool Configuration ##### + # + # Mempool timeout parameters must be either all set or all unset. + # When unset cardano-node will use default values. + # Default example values are: + # Mempool: + # MempoolTimeoutSoft: 1.0 + # MempoolTimeoutHard: 1.5 + # MempoolTimeoutCapacity: 5.0 + # + # Set or unset the mempool capacity override in number of bytes. + # + # This is intended for testing, and for low-resource machines to run with a smaller mempool. + # Please note that running with a large mempool is NOT recommended. The mempool is a + # just a network communication buffer and all the advice on "buffer bloat" applies, see: + # https://en.wikipedia.org/wiki/Bufferbloat + # The default size is two blocks, which is generally enough to ensure full blocks. + # + # Mempool: + # CapacityBytesOverride: Integer | NoOverride + # + # Examples: + # CapacityBytesOverride: 1000000 (1MB) + # CapacityBytesOverride: NoOverride (default) + + ##### Storage Configuration ##### + + Storage: + + # Additional configuration options can be found at: + # https://ouroboros-consensus.cardano.intersectmbo.org/docs/for-developers/utxo-hd/migrating + + LedgerDB: + # When querying the store for a big range of UTxOs (such as with + # QueryUTxOByAddress), the store will be read in batches of this size. + QueryBatchSize: 100000 + + # The backend can either be in memory with `V2InMemory` or on disk with + # `V2LSM`. + Backend: V2InMemory + + # Instead of an object with individual options, a predefined snapshot + # policy can be selected by name, e.g. `Snapshots: Mithril`. + Snapshots: + # The snapshot interval in slots. Use `securityParam * 40` to provide + # intra-epoch snapshot redundancy while minimizing potential IOWAIT stall on some + # spec constrained machines during snapshot write. + Interval: 86400 + + # Slot offset at which snapshot scheduling begins. + Offset: 0 + + # A minimum duration between snapshots, in seconds (used to avoid excessive snapshots while syncing). + # Default is 10 minutes. + # RateLimit: 600 + + # Randomised snapshot delay range, in seconds. + # Both Min and Max need to be specified, otherwise the default delay of (5min, 10min) will be used. + MinDelay: 300 + MaxDelay: 21600 + + # The number of disk snapshots to keep. + NumOfDiskSnapshots: 2 + + ##### Logging configuration ##### + # + # The tracing settings are handed to trace-dispatcher as-is; cardano-config + # only carries them, it does not interpret their shape. + + HermodTracing: + + # Match the metrics prefix of the legacy tracing system to minimize breaking + # changes. + TraceOptionMetricsPrefix: "cardano.node.metrics." + + # Optional node name. Defaults to hostname if left unset. Ideally this is + # set in downstream code where the node's name is known. + # TraceOptionNodeName: + + # The frequency of resource messages. + TraceOptionResourceFrequency: 1000 + + # Queue size control: + # In case of a missing forwarding service consumer, trace messages will be + # buffered. This mitigates short forwarding interruptions, or delays at + # startup time. # - # The full list of severities are: - # `Debug`, `Info`, `Notice`, `Warning`, `Error`, `Critical`, `Alert` and - # `Emergency`. + # The queue capacity should thus correlate to the expected log lines per + # second given a particular tracing configuration to avoid unnecessarily + # increasing memory footprint. # - # To enhance severity filtering, there is also the option of `Silence` - # which allows for the unconditional silencing of a specific trace, - # essentially representing the deactivation of tracers -- a semantic - # continuation of the functionality in the legacy system. - severity: Notice + # The maxReconnectDelay config option specifies the maximum delay in seconds + # between (re-)connection attempts of a forwarder. + TraceOptionForwarder: + maxReconnectDelay: 30 + queueSize: 128 + + # Tracing options for node + TraceOptions: + # The default tracer configuration + '': + backends: + # None, any combination, or all of the following backends can be + # enabled, where `EKGBackend` forwards EKG resource status to + # cardano-tracer, `Forwarder` forwards message traces and + # `PrometheusSimple` serves cardano-node metrics directly from + # cardano-node and defaults to use of the same port as in the legacy + # tracing system. + - EKGBackend + - Forwarder + - PrometheusSimple suffix 127.0.0.1 12798 + + # Only one of the following can be enabled, which determines for format + # of node logging to stdout. + - Stdout HumanFormatColoured + # - Stdout HumanFormatUncoloured + # - Stdout MachineFormat + + # Each tracer can specify the level of details for printing messages. + # Options include `DMinimal`, `DNormal`, `DDetailed`, and `DMaximum`. If + # no implementation is given, `DNormal` is chosen. + detail: DNormal + + # The severity levels, ranging from the least severe (`Debug`) to the + # most severe (`Emergency`), provide a framework for ignoring messages + # with severity levels below a globally configured severity cutoff. + # + # The full list of severities are: + # `Debug`, `Info`, `Notice`, `Warning`, `Error`, `Critical`, `Alert` and + # `Emergency`. + # + # To enhance severity filtering, there is also the option of `Silence` + # which allows for the unconditional silencing of a specific trace, + # essentially representing the deactivation of tracers -- a semantic + # continuation of the functionality in the legacy system. + severity: Notice + + # The following tracer configurations are configured to closely match the + # default logging seen in the legacy cardano-node tracing system. + BlockFetch.Client.CompletedBlockFetch: + # A frequency limit for the number of messages per second may also be + # provided for any tracer. + maxFrequency: 2.0 + + BlockFetch.Decision: + severity: Info + + ChainDB: + severity: Info + + ChainDB.AddBlockEvent.AddBlockValidation: + severity: Silence + + ChainDB.AddBlockEvent.AddBlockValidation.ValidCandidate: + maxFrequency: 2.0 + + ChainDB.AddBlockEvent.AddedBlockToQueue: + maxFrequency: 2.0 + + ChainDB.AddBlockEvent.AddedBlockToVolatileDB: + maxFrequency: 2.0 + + ChainDB.CopyToImmutableDBEvent.CopiedBlockToImmutableDB: + maxFrequency: 2.0 + + ChainSync.Client: + severity: Warning + + Forge.Loop: + severity: Info + + Forge.StateInfo: + severity: Info + + Mempool: + severity: Silence + + Net.ConnectionManager.Remote: + severity: Info + + Net.InboundGovernor: + severity: Warning + + Net.InboundGovernor.Remote: + severity: Info + + Net.Mux.Remote: + severity: Info + + Net.PeerSelection: + severity: Info + + Resources: + severity: Silence + + Startup.DiffusionInit: + severity: Info + + # The following messages are UTxO-HD specific. Silencing these tracers aims + # at having comparable log line rates in messages per second on both the + # UTxO-HD and earlier non-UTxO-HD nodes. The additional high granularity + # mempool silences are not redundant in the case that the top level Mempool + # severity is switched away from silence. + ChainDB.LedgerEvent.Forker: + severity: Silence + + Mempool.AttemptAdd: + severity: Silence - # The following tracer configurations are configured to closely match the - # default logging seen in the legacy cardano-node tracing system. - BlockFetch.Client.CompletedBlockFetch: - # A frequency limit for the number of messages per second may also be - # provided for any tracer. - maxFrequency: 2.0 - - BlockFetch.Decision: - severity: Info - - ChainDB: - severity: Info - - ChainDB.AddBlockEvent.AddBlockValidation: - severity: Silence - - ChainDB.AddBlockEvent.AddBlockValidation.ValidCandidate: - maxFrequency: 2.0 - - ChainDB.AddBlockEvent.AddedBlockToQueue: - maxFrequency: 2.0 - - ChainDB.AddBlockEvent.AddedBlockToVolatileDB: - maxFrequency: 2.0 - - ChainDB.CopyToImmutableDBEvent.CopiedBlockToImmutableDB: - maxFrequency: 2.0 - - ChainSync.Client: - severity: Warning - - Forge.Loop: - severity: Info - - Forge.StateInfo: - severity: Info - - Mempool: - severity: Silence - - Net.ConnectionManager.Remote: - severity: Info - - Net.InboundGovernor: - severity: Warning - - Net.InboundGovernor.Remote: - severity: Info - - Net.Mux.Remote: - severity: Info - - Net.PeerSelection: - severity: Info - - Resources: - severity: Silence - - Startup.DiffusionInit: - severity: Info - - # The following messages are UTxO-HD specific. Silencing these tracers aims - # at having comparable log line rates in messages per second on both the - # UTxO-HD and earlier non-UTxO-HD nodes. The additional high granularity - # mempool silences are not redundant in the case that the top level Mempool - # severity is switched away from silence. - ChainDB.LedgerEvent.Forker: - severity: Silence - - Mempool.AttemptAdd: - severity: Silence - - Mempool.SyncNotNeeded: - severity: Silence - -# Set or unset the mempool capacity override in number of bytes. -# -# This is intended for testing, and for low-resource machines to run with a smaller mempool. -# Please note that running with a large mempool is NOT recommended. The mempool is a -# just a network communication buffer and all the advice on "buffer bloat" applies, see: -# https://en.wikipedia.org/wiki/Bufferbloat -# The default size is two blocks, which is generally enough to ensure full blocks. -# -# MempoolCapacityBytesOverride: Integer | NoOverride -# -# Examples: -# MempoolCapacityBytesOverride: 1000000 (1MB) -# MempoolCapacityBytesOverride: NoOverride (default) + Mempool.SyncNotNeeded: + severity: Silence From db7712b41a02c9937683e8b12f1e38e971a35472 Mon Sep 17 00:00:00 2001 From: John Lotoski Date: Wed, 23 Sep 2026 02:57:52 -0500 Subject: [PATCH 10/25] nixosModule: update node service to include {immutable,volatile}DatabasePath opts --- nix/nixos/cardano-node-service.nix | 52 ++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/nix/nixos/cardano-node-service.nix b/nix/nixos/cardano-node-service.nix index 5a4f6622203..b3ab1fa4279 100644 --- a/nix/nixos/cardano-node-service.nix +++ b/nix/nixos/cardano-node-service.nix @@ -114,13 +114,31 @@ let "--shelley-kes-agent-socket ${cfg.shelleyKesAgentSocket}"}" ]; }; + instanceDbPath = cfg.databasePath i; - cmd = filter (x: x != "") [ + instanceImmutableDbPath = cfg.immutableDatabasePath i; + instanceVolatileDbPath = cfg.volatileDatabasePath i; + + # The node accepts either --database-path or both of the split paths, never + # a mix: parseNodeDatabasePaths is `parseDbPath <|> parseMultipleDbPaths`, + # so emitting --database-path alongside them would win and the split paths + # would be silently ignored. + splitDbPaths = instanceImmutableDbPath != null && instanceVolatileDbPath != null; + + dbPathArgs = + if splitDbPaths + then [ + "--immutable-database-path ${instanceImmutableDbPath}" + "--volatile-database-path ${instanceVolatileDbPath}" + ] + else [ "--database-path ${instanceDbPath}" ]; + + cmd = filter (x: x != "") ([ "${cfg.executable} run" "--config ${nodeConfigFile}" - "--database-path ${instanceDbPath}" + ] ++ dbPathArgs ++ [ "--topology ${topology i}" - ] ++ optionals (!cfg.systemdSocketActivation) ([ + ]) ++ optionals (!cfg.systemdSocketActivation) ([ "--host-addr ${cfg.hostAddr}" "--port ${if (cfg.shareIpv4port || cfg.shareIpv6port) then toString cfg.port else toString (cfg.port + i)}" "--socket-path ${cfg.socketPath i}" @@ -407,6 +425,28 @@ in { description = ''The node database path, for each instance.''; }; + immutableDatabasePath = mkOption { + type = funcToOr nullOrStr; + default = null; + apply = x : if lib.isFunction x then x else _ : x; + description = '' + The node immutable database path, for each instance. + Set this together with `volatileDatabasePath` to place the two partitions on + separate volumes, in which case `databasePath` is not passed to the node. + ''; + }; + + volatileDatabasePath = mkOption { + type = funcToOr nullOrStr; + default = null; + apply = x : if lib.isFunction x then x else _ : x; + description = '' + The node volatile database path, for each instance. + Set this together with `immutableDatabasePath` to place the two partitions on + separate volumes, in which case `databasePath` is not passed to the node. + ''; + }; + lsmDatabasePath = mkOption { type = funcToOr nullOrStr; default = null; @@ -1011,6 +1051,12 @@ in { assertion = (length lsmPaths) == (length (lists.unique lsmPaths)); message = "When configuring multiple LSM enabled nodes on one instance, lsmDatabasePath must be unique."; } + { + # The node takes either --database-path or both split paths, so half a + # pair would silently fall back to databasePath. + assertion = (cfg.immutableDatabasePath i == null) == (cfg.volatileDatabasePath i == null); + message = "immutableDatabasePath and volatileDatabasePath must be set together, or neither set."; + } { assertion = count (o: o != null) (with cfg; [ (tracerSocketPathAccept i) From 926fd8742a75e67dee9f2290e9aa8d1a4836d358 Mon Sep 17 00:00:00 2001 From: John Lotoski Date: Tue, 6 Oct 2026 23:38:46 -0500 Subject: [PATCH 11/25] nixosNodeSvc: take a single bls key, not a list The current prototype parses --shelley-bls-key as optional (strOption ...), so the node takes at most one occurrence. Multiple keys go in the one file instead, as a JSON array of text envelopes, which is how a rotation pair or a bundle of pool keys is supplied. The earlier --shelley-bls-keys design of accepting the flag repeatedly is not supported going forward. --- nix/nixos/cardano-node-service.nix | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/nix/nixos/cardano-node-service.nix b/nix/nixos/cardano-node-service.nix index b3ab1fa4279..38c77e842d1 100644 --- a/nix/nixos/cardano-node-service.nix +++ b/nix/nixos/cardano-node-service.nix @@ -109,7 +109,8 @@ let "--shelley-kes-key ${cfg.kesKey}"}" "${optionalString (cfg.operationalCertificate != null) "--shelley-operational-certificate ${cfg.operationalCertificate}"}" - "${concatMapStringsSep " " (k: "--shelley-bls-key ${k}") cfg.blsKeys}" + "${optionalString (cfg.blsKey != null) + "--shelley-bls-key ${cfg.blsKey}"}" "${optionalString (cfg.shelleyKesAgentSocket != null) "--shelley-kes-agent-socket ${cfg.shelleyKesAgentSocket}"}" ]; @@ -348,14 +349,14 @@ in { ''; }; - blsKeys = mkOption { - type = listOf str; - default = []; + blsKey = mkOption { + type = nullOr str; + default = null; description = '' - Leios BLS signing key files. Optional and repeatable; used alongside - the KES and VRF keys on a producer that participates in Leios. During - a BLS key rotation both the active and the incoming key may be - supplied and node uses whichever is active per the on-chain schedule. + The Leios BLS signing key file, used alongside the KES and VRF keys + on a producer that participates in Leios. The file is either a single + text envelope or a JSON array of them, so a rotation pair or a bundle + of pool keys goes in the one file; the option is not repeatable. ''; }; From 2eb8b2ef400926971181d7351052de1e46cc2dd6 Mon Sep 17 00:00:00 2001 From: John Lotoski Date: Tue, 6 Oct 2026 23:53:18 -0500 Subject: [PATCH 12/25] configuration: refresh the shipped configs for cardano-config 2.2.2.0 Regenerated from iohk-nix, which this bumps. The envelope moves to format version 2 with the shortened section keys, mainnet defaults to GenesisMode, and the snapshot policy gains MinDelay and MaxDelay derived from the security parameter. The peer snapshot and the topology's useLedgerAfterSlot are regenerated together, so the point past which a syncing node trusts ledger peers tracks the snapshot rather than trailing it. --- configuration/cardano/mainnet-config.json | 26 +- configuration/cardano/mainnet-config.yaml | 3 + .../cardano/mainnet-peer-snapshot.json | 5859 ++++++++--------- configuration/cardano/mainnet-topology.json | 2 +- .../cardano/testnet-template-config.json | 8 +- 5 files changed, 2930 insertions(+), 2968 deletions(-) diff --git a/configuration/cardano/mainnet-config.json b/configuration/cardano/mainnet-config.json index 3b6d971b6c8..1a178d11662 100644 --- a/configuration/cardano/mainnet-config.json +++ b/configuration/cardano/mainnet-config.json @@ -1,14 +1,13 @@ { - "$schema": "https://raw.githubusercontent.com/IntersectMBO/cardano-config/v1/schemas/config.schema.json", + "$schema": "https://raw.githubusercontent.com/IntersectMBO/cardano-config/v2/schemas/config.schema.json", "Configuration": { - "ConsensusConfig": { - "ConsensusMode": "PraosMode" + "Consensus": { + "ConsensusMode": "GenesisMode" }, "HermodTracing": { "TraceOptionForwarder": { - "connQueueSize": 64, - "disconnQueueSize": 128, - "maxReconnectDelay": 30 + "maxReconnectDelay": 30, + "queueSize": 128 }, "TraceOptionMetricsPrefix": "cardano.node.metrics.", "TraceOptionResourceFrequency": 1000, @@ -80,6 +79,9 @@ "Net.Mux.Remote": { "severity": "Info" }, + "Net.Mux.Remote.Bearer": { + "severity": "Silence" + }, "Net.PeerSelection": { "severity": "Info" }, @@ -91,7 +93,7 @@ } } }, - "ProtocolConfig": { + "Protocol": { "AlonzoGenesisFile": "mainnet-alonzo-genesis.json", "AlonzoGenesisHash": "7e94a15f55d1e82d10f09203fa1d40f8eede58fd8066542cf6566008068ed874", "ByronGenesisFile": "mainnet-byron-genesis.json", @@ -104,18 +106,20 @@ "ShelleyGenesisFile": "mainnet-shelley-genesis.json", "ShelleyGenesisHash": "1a3be38bcbb7911969283716ad7aa550250226b76a61fc51cc9a9a35d9276d81" }, - "StorageConfig": { + "Storage": { "LedgerDB": { "Backend": "V2InMemory", "QueryBatchSize": 100000, "Snapshots": { + "Interval": 86400, + "MaxDelay": 21600, + "MinDelay": 300, "NumOfDiskSnapshots": 2, - "SlotOffset": 0, - "SnapshotInterval": 86400 + "Offset": 0 } } } }, "MinNodeVersion": "11.2.0", - "Version": 1 + "Version": 2 } diff --git a/configuration/cardano/mainnet-config.yaml b/configuration/cardano/mainnet-config.yaml index 059d89460a4..fd289739300 100644 --- a/configuration/cardano/mainnet-config.yaml +++ b/configuration/cardano/mainnet-config.yaml @@ -280,6 +280,9 @@ Configuration: Net.Mux.Remote: severity: Info + Net.Mux.Remote.Bearer: + severity: Silence + Net.PeerSelection: severity: Info diff --git a/configuration/cardano/mainnet-peer-snapshot.json b/configuration/cardano/mainnet-peer-snapshot.json index afad080fcbb..f39974e0cc4 100644 --- a/configuration/cardano/mainnet-peer-snapshot.json +++ b/configuration/cardano/mainnet-peer-snapshot.json @@ -2,31 +2,13 @@ "NetworkMagic": 764824073, "NodeToClientVersion": 23, "Point": { - "blockPointHash": "8754889f556c056dc0faef5ffa23b1a9ce315cafd02012e1be1081d0d03853c2", - "blockPointSlot": 194344226 + "blockPointHash": "7021b0be095d2f652a3cc45c655059bf1b9ef5d5e6717dbb168d1f42d7dd3f9b", + "blockPointSlot": 200803835 }, "bigLedgerPools": [ { - "accumulatedStake": 0.005395048750398899, - "relativeStake": 0.005395048750398899, - "relays": [ - { - "address": "relay-trustwallet-5-0.cardano.mainnet.kiln.fi", - "port": 3001 - }, - { - "address": "relay-trustwallet-5-1.cardano.mainnet.kiln.fi", - "port": 3001 - }, - { - "address": "relay-trustwallet-5-2.cardano.mainnet.kiln.fi", - "port": 3001 - } - ] - }, - { - "accumulatedStake": 0.010337275510315476, - "relativeStake": 0.004942226759916578, + "accumulatedStake": 0.0059591023377367994, + "relativeStake": 0.0059591023377367994, "relays": [ { "address": "170.23.181.50", @@ -43,17 +25,26 @@ ] }, { - "accumulatedStake": 0.01446888802258894, - "relativeStake": 0.004131612512273464, + "accumulatedStake": 0.011339267222468839, + "relativeStake": 0.00538016488473204, "relays": [ { - "address": "relay-pool-2-mainnet.cardano.aeq5f.com" + "address": "relay-trustwallet-5-0.cardano.mainnet.kiln.fi", + "port": 3001 + }, + { + "address": "relay-trustwallet-5-1.cardano.mainnet.kiln.fi", + "port": 3001 + }, + { + "address": "relay-trustwallet-5-2.cardano.mainnet.kiln.fi", + "port": 3001 } ] }, { - "accumulatedStake": 0.01857466912355889, - "relativeStake": 0.00410578110096995, + "accumulatedStake": 0.015531686871731704, + "relativeStake": 0.004192419649262864, "relays": [ { "address": "relay-pool-3-mainnet.cardano.aeq5f.com" @@ -61,8 +52,8 @@ ] }, { - "accumulatedStake": 0.022583639986000485, - "relativeStake": 0.004008970862441595, + "accumulatedStake": 0.01947247552873279, + "relativeStake": 0.003940788657001085, "relays": [ { "address": "relay-pool-ledger-2-mainnet.cardano.aeq5f.com" @@ -70,8 +61,8 @@ ] }, { - "accumulatedStake": 0.026391353874785063, - "relativeStake": 0.0038077138887845784, + "accumulatedStake": 0.023358018083157288, + "relativeStake": 0.0038855425544244986, "relays": [ { "address": "relay-kiln-4-0.cardano.mainnet.kiln.fi", @@ -88,52 +79,56 @@ ] }, { - "accumulatedStake": 0.030127623172465888, - "relativeStake": 0.0037362692976808227, + "accumulatedStake": 0.02705435511035205, + "relativeStake": 0.003696337027194761, "relays": [ { - "address": "26e894b1.cardano-relay.herd.run", - "port": 1338 + "address": "170.23.181.50", + "port": 6001 + }, + { + "address": "170.23.181.50", + "port": 6002 + }, + { + "address": "170.23.181.50", + "port": 6003 } ] }, { - "accumulatedStake": 0.03379257855131295, - "relativeStake": 0.0036649553788470645, + "accumulatedStake": 0.030743376890059546, + "relativeStake": 0.003689021779707499, "relays": [ { - "address": "204.12.236.13", + "address": "13.236.12.204", "port": 8332 } ] }, { - "accumulatedStake": 0.037454519010006786, - "relativeStake": 0.0036619404586938336, + "accumulatedStake": 0.03443067112241167, + "relativeStake": 0.003687294232352119, "relays": [ { - "address": "179.73.211.13", + "address": "13.211.73.179", "port": 8332 } ] }, { - "accumulatedStake": 0.041115979410513516, - "relativeStake": 0.0036614604005067285, + "accumulatedStake": 0.03811663401167597, + "relativeStake": 0.0036859628892643055, "relays": [ { - "address": "219.79.128.178", - "port": 3001 - }, - { - "address": "73.122.131.104", - "port": 3001 + "address": "162.120.71.180", + "port": 6000 } ] }, { - "accumulatedStake": 0.04477498198794721, - "relativeStake": 0.0036590025774336965, + "accumulatedStake": 0.04178922015750158, + "relativeStake": 0.0036725861458256105, "relays": [ { "address": "relays.wavepool.digital", @@ -142,48 +137,52 @@ ] }, { - "accumulatedStake": 0.04842720110485478, - "relativeStake": 0.00365221911690757, + "accumulatedStake": 0.045455726800821245, + "relativeStake": 0.0036665066433196666, "relays": [ { - "address": "113.cardano.staked.cloud", - "port": 3001 + "address": "relay1.cardanotech.io", + "port": 6000 + }, + { + "address": "relay2.cardanotech.io", + "port": 6000 } ] }, { - "accumulatedStake": 0.052079365940333404, - "relativeStake": 0.003652164835478622, + "accumulatedStake": 0.04911180072557414, + "relativeStake": 0.0036560739247528916, "relays": [ { - "address": "102.cardano.staked.cloud", + "address": "115.cardano.staked.cloud", "port": 3001 } ] }, { - "accumulatedStake": 0.05573151258047909, - "relativeStake": 0.0036521466401456927, + "accumulatedStake": 0.052767699243445536, + "relativeStake": 0.003655898517871393, "relays": [ { - "address": "109.cardano.staked.cloud", + "address": "111.cardano.staked.cloud", "port": 3001 } ] }, { - "accumulatedStake": 0.059383622923739374, - "relativeStake": 0.0036521103432602814, + "accumulatedStake": 0.05642354516738017, + "relativeStake": 0.003655845923934637, "relays": [ { - "address": "112.cardano.staked.cloud", + "address": "114.cardano.staked.cloud", "port": 3001 } ] }, { - "accumulatedStake": 0.06303562452256749, - "relativeStake": 0.0036520015988281054, + "accumulatedStake": 0.060079355975111576, + "relativeStake": 0.0036558108077314033, "relays": [ { "address": "106.cardano.staked.cloud", @@ -192,8 +191,18 @@ ] }, { - "accumulatedStake": 0.06668758982068673, - "relativeStake": 0.003651965298119255, + "accumulatedStake": 0.0637351141717924, + "relativeStake": 0.003655758196680816, + "relays": [ + { + "address": "108.cardano.staked.cloud", + "port": 3001 + } + ] + }, + { + "accumulatedStake": 0.06739085485624118, + "relativeStake": 0.003655740684448784, "relays": [ { "address": "107.cardano.staked.cloud", @@ -202,86 +211,92 @@ ] }, { - "accumulatedStake": 0.07033953701158523, - "relativeStake": 0.003651947190898494, + "accumulatedStake": 0.07104654305401932, + "relativeStake": 0.003655688197778154, "relays": [ { - "address": "111.cardano.staked.cloud", + "address": "102.cardano.staked.cloud", "port": 3001 } ] }, { - "accumulatedStake": 0.07399148419632527, - "relativeStake": 0.0036519471847400457, + "accumulatedStake": 0.07470223110631379, + "relativeStake": 0.003655688052294456, "relays": [ { - "address": "103.cardano.staked.cloud", + "address": "113.cardano.staked.cloud", "port": 3001 } ] }, { - "accumulatedStake": 0.07764337699291962, - "relativeStake": 0.0036518927965943407, + "accumulatedStake": 0.07835788408851123, + "relativeStake": 0.0036556529821974416, "relays": [ { - "address": "104.cardano.staked.cloud", + "address": "109.cardano.staked.cloud", "port": 3001 } ] }, { - "accumulatedStake": 0.08129521542839614, - "relativeStake": 0.0036518384354765213, + "accumulatedStake": 0.08201350201047922, + "relativeStake": 0.003655617921967993, "relays": [ { - "address": "114.cardano.staked.cloud", + "address": "104.cardano.staked.cloud", "port": 3001 } ] }, { - "accumulatedStake": 0.08494701756831743, - "relativeStake": 0.0036518021399212994, + "accumulatedStake": 0.08566910237946196, + "relativeStake": 0.0036556003689827386, "relays": [ { - "address": "108.cardano.staked.cloud", + "address": "112.cardano.staked.cloud", "port": 3001 } ] }, { - "accumulatedStake": 0.08859878345734244, - "relativeStake": 0.0036517658890250103, + "accumulatedStake": 0.08932457994342005, + "relativeStake": 0.0036554775639580967, "relays": [ { - "address": "115.cardano.staked.cloud", + "address": "103.cardano.staked.cloud", "port": 3001 } ] }, { - "accumulatedStake": 0.09224692693728437, - "relativeStake": 0.0036481434799419156, + "accumulatedStake": 0.09297811442534205, + "relativeStake": 0.0036535344819220014, "relays": [ { - "address": "170.23.181.50", - "port": 6001 + "address": "173.15.110.154", + "port": 6000 }, { - "address": "170.23.181.50", - "port": 6002 - }, + "address": "173.15.110.155", + "port": 6000 + } + ] + }, + { + "accumulatedStake": 0.0966286499895629, + "relativeStake": 0.0036505355642208405, + "relays": [ { - "address": "170.23.181.50", - "port": 6003 + "address": "relays.wavepool.digital", + "port": 3001 } ] }, { - "accumulatedStake": 0.09587659519155345, - "relativeStake": 0.003629668254269081, + "accumulatedStake": 0.10026271609627614, + "relativeStake": 0.003634066106713254, "relays": [ { "address": "relay1.mainnet.pool.cardano.services", @@ -294,8 +309,56 @@ ] }, { - "accumulatedStake": 0.09950405256921431, - "relativeStake": 0.003627457377660863, + "accumulatedStake": 0.10389620419452207, + "relativeStake": 0.00363348809824592, + "relays": [ + { + "address": "relay-kiln-2-0.cardano.mainnet.kiln.fi", + "port": 3001 + }, + { + "address": "relay-kiln-2-1.cardano.mainnet.kiln.fi", + "port": 3001 + }, + { + "address": "relay-kiln-2-2.cardano.mainnet.kiln.fi", + "port": 3001 + } + ] + }, + { + "accumulatedStake": 0.10752710053563859, + "relativeStake": 0.003630896341116517, + "relays": [ + { + "address": "180.150.102.25", + "port": 8376 + }, + { + "address": "180.150.96.245", + "port": 8376 + }, + { + "address": "144.6.112.28", + "port": 8376 + }, + { + "address": "154.38.173.238", + "port": 8376 + }, + { + "address": "152.53.55.29", + "port": 8376 + }, + { + "address": "relays.terminada.io", + "port": 8376 + } + ] + }, + { + "accumulatedStake": 0.11115782962443356, + "relativeStake": 0.0036307290887949775, "relays": [ { "address": "cf1r1.mainnet.pool.cardanofoundation.org", @@ -308,50 +371,54 @@ ] }, { - "accumulatedStake": 0.10313096510382867, - "relativeStake": 0.003626912534614365, + "accumulatedStake": 0.11478855178052443, + "relativeStake": 0.003630722156090856, "relays": [ { - "address": "cf3r1.mainnet.pool.cardanofoundation.org", + "address": "cf2r1.mainnet.pool.cardanofoundation.org", "port": 3001 }, { - "address": "cf3r2.mainnet.pool.cardanofoundation.org", + "address": "cf2r2.mainnet.pool.cardanofoundation.org", "port": 3001 } ] }, { - "accumulatedStake": 0.10675787510248218, - "relativeStake": 0.0036269099986535117, + "accumulatedStake": 0.1184192739293348, + "relativeStake": 0.003630722148810378, "relays": [ { - "address": "cf4r1.mainnet.pool.cardanofoundation.org", + "address": "cf3r1.mainnet.pool.cardanofoundation.org", "port": 3001 }, { - "address": "cf4r2.mainnet.pool.cardanofoundation.org", + "address": "cf3r2.mainnet.pool.cardanofoundation.org", "port": 3001 } ] }, { - "accumulatedStake": 0.11038478508025004, - "relativeStake": 0.0036269099777678647, + "accumulatedStake": 0.12204358071220663, + "relativeStake": 0.0036243067828718354, "relays": [ { - "address": "cf2r1.mainnet.pool.cardanofoundation.org", + "address": "relay-kiln-6-0.cardano.mainnet.kiln.fi", "port": 3001 }, { - "address": "cf2r2.mainnet.pool.cardanofoundation.org", + "address": "relay-kiln-6-1.cardano.mainnet.kiln.fi", + "port": 3001 + }, + { + "address": "relay-kiln-6-2.cardano.mainnet.kiln.fi", "port": 3001 } ] }, { - "accumulatedStake": 0.1140104192686956, - "relativeStake": 0.003625634188445552, + "accumulatedStake": 0.1256623126155026, + "relativeStake": 0.0036187319032959598, "relays": [ { "address": "cardanosuisse.com", @@ -368,18 +435,18 @@ ] }, { - "accumulatedStake": 0.11763479956254201, - "relativeStake": 0.003624380293846408, + "accumulatedStake": 0.1292725236077011, + "relativeStake": 0.003610210992198514, "relays": [ { - "address": "180.71.120.162", - "port": 6000 + "address": "relays.wavepool.digital", + "port": 3001 } ] }, { - "accumulatedStake": 0.12123631012768447, - "relativeStake": 0.0036015105651424606, + "accumulatedStake": 0.13288143993365018, + "relativeStake": 0.0036089163259490796, "relays": [ { "address": "relays.wavepool.digital", @@ -388,8 +455,18 @@ ] }, { - "accumulatedStake": 0.12483298583348279, - "relativeStake": 0.0035966757057983227, + "accumulatedStake": 0.13645186433724682, + "relativeStake": 0.0035704244035966227, + "relays": [ + { + "address": "644dd09c.cardano-relay.herd.run", + "port": 1338 + } + ] + }, + { + "accumulatedStake": 0.14001805951313204, + "relativeStake": 0.0035661951758852164, "relays": [ { "address": "relays.wavepool.digital", @@ -398,26 +475,56 @@ ] }, { - "accumulatedStake": 0.12842440528594729, - "relativeStake": 0.0035914194524644806, + "accumulatedStake": 0.14358121339280516, + "relativeStake": 0.003563153879673136, "relays": [ { - "address": "relay-kiln-2-0.cardano.mainnet.kiln.fi", + "address": "bd-cardano-main-relay-12-a.bdnodes.net", + "port": 6000 + }, + { + "address": "bd-cardano-main-relay-12-b.bdnodes.net", + "port": 6000 + } + ] + }, + { + "accumulatedStake": 0.14713407158814018, + "relativeStake": 0.003552858195335023, + "relays": [ + { + "address": "104.167.218.211", "port": 3001 }, { - "address": "relay-kiln-2-1.cardano.mainnet.kiln.fi", + "address": "5.226.35.52", "port": 3001 }, { - "address": "relay-kiln-2-2.cardano.mainnet.kiln.fi", + "address": "yul.mainnet.happystaking.io", + "port": 3001 + }, + { + "address": "arn.mainnet.happystaking.io", "port": 3001 + }, + { + "address": "mainnet.happystaking.io" + } + ] + }, + { + "accumulatedStake": 0.15068551493492258, + "relativeStake": 0.003551443346782405, + "relays": [ + { + "address": "relay-pool-ledger-1-mainnet.cardano.aeq5f.com" } ] }, { - "accumulatedStake": 0.13201368560246637, - "relativeStake": 0.0035892803165190963, + "accumulatedStake": 0.15422692148102032, + "relativeStake": 0.003541406546097748, "relays": [ { "address": "relays.wavepool.digital", @@ -426,199 +533,215 @@ ] }, { - "accumulatedStake": 0.1356020346503598, - "relativeStake": 0.003588349047893422, + "accumulatedStake": 0.15773604315656567, + "relativeStake": 0.0035091216755453298, "relays": [ { - "address": "Relay1.NordicPool.org", - "port": 3005 + "address": "olive-geonosis-edffc.cardano.bdnodes.net", + "port": 6000 }, { - "address": "Relay2.NordicPool.org", - "port": 3005 - }, + "address": "violet-kingston-8d67e.cardano.bdnodes.net", + "port": 6000 + } + ] + }, + { + "accumulatedStake": 0.16123665595643227, + "relativeStake": 0.0035006127998666167, + "relays": [ { - "address": "Relay3.NordicPool.org", - "port": 3005 + "address": "relay-pool-ledger-3-mainnet.cardano.aeq5f.com" } ] }, { - "accumulatedStake": 0.13915085624669235, - "relativeStake": 0.0035488215963325543, + "accumulatedStake": 0.1647269115144712, + "relativeStake": 0.003490255558038904, "relays": [ { - "address": "r1.spirestaking.com", - "port": 3001 + "address": "relay-pool-figment-21-mainnet.cardano.aeq5f.com" } ] }, { - "accumulatedStake": 0.1426953247015414, - "relativeStake": 0.003544468454849035, + "accumulatedStake": 0.16820666248624264, + "relativeStake": 0.0034797509717714404, "relays": [ { - "address": "bd-cardano-main-relay-12-a.bdnodes.net", - "port": 6000 + "address": "r-eu-1.polypool.io", + "port": 4001 }, { - "address": "bd-cardano-main-relay-12-b.bdnodes.net", - "port": 6000 + "address": "r-sg-1.polypool.io", + "port": 4001 } ] }, { - "accumulatedStake": 0.14623342247651902, - "relativeStake": 0.003538097774977632, + "accumulatedStake": 0.17168156374624427, + "relativeStake": 0.0034749012600016516, "relays": [ { - "address": "644dd09c.cardano-relay.herd.run", - "port": 1338 + "address": "relay-pool-figment-27-mainnet.cardano.aeq5f.com" } ] }, { - "accumulatedStake": 0.1497649298147439, - "relativeStake": 0.003531507338224878, + "accumulatedStake": 0.17515060008276398, + "relativeStake": 0.0034690363365197114, "relays": [ { - "address": "gateway.adavault.com", - "port": 4021 - }, - { - "address": "gateway.adavault.com", - "port": 4022 - }, - { - "address": "gateway.adavault.com", - "port": 4026 + "address": "178.128.79.219", + "port": 3001 }, { - "address": "gateway.adavault.com", - "port": 4027 + "address": "104.131.122.73", + "port": 3001 } ] }, { - "accumulatedStake": 0.15328721784078325, - "relativeStake": 0.003522288026039366, + "accumulatedStake": 0.17858712589405026, + "relativeStake": 0.0034365258112862827, "relays": [ { - "address": "relay-kiln-0-0.cardano.mainnet.kiln.fi", + "address": "20.61.229.103", "port": 3001 }, { - "address": "relay-kiln-0-1.cardano.mainnet.kiln.fi", + "address": "20.61.228.218", "port": 3001 }, { - "address": "relay-kiln-0-2.cardano.mainnet.kiln.fi", + "address": "108.142.42.221", + "port": 3001 + }, + { + "address": "108.142.42.161", "port": 3001 } ] }, { - "accumulatedStake": 0.1568085858869114, - "relativeStake": 0.0035213680461281516, + "accumulatedStake": 0.18200980369310832, + "relativeStake": 0.0034226777990580544, "relays": [ { - "address": "154.110.15.173", - "port": 6000 - }, - { - "address": "155.110.15.173", - "port": 6000 + "address": "relay-pool-2-mainnet.cardano.aeq5f.com" } ] }, { - "accumulatedStake": 0.16029957513459672, - "relativeStake": 0.0034909892476853188, + "accumulatedStake": 0.18542452501907186, + "relativeStake": 0.0034147213259635386, "relays": [ { - "address": "olive-geonosis-edffc.cardano.bdnodes.net", - "port": 6000 - }, - { - "address": "violet-kingston-8d67e.cardano.bdnodes.net", - "port": 6000 + "address": "relays.wavepool.digital", + "port": 3001 } ] }, { - "accumulatedStake": 0.16377274461153404, - "relativeStake": 0.0034731694769373237, + "accumulatedStake": 0.18883644958781792, + "relativeStake": 0.0034119245687460557, "relays": [ { - "address": "relay-pool-figment-21-mainnet.cardano.aeq5f.com" + "address": "relay-pool-figment-8-mainnet.cardano.aeq5f.com" } ] }, { - "accumulatedStake": 0.16720566214638358, - "relativeStake": 0.0034329175348495394, + "accumulatedStake": 0.1922375248481912, + "relativeStake": 0.0034010752603732763, "relays": [ { - "address": "103.229.61.20", - "port": 3001 + "address": "sydney.cardanode.com.au", + "port": 6000 }, { - "address": "218.228.61.20", - "port": 3001 + "address": "singapore.cardanode.com.au", + "port": 6000 }, { - "address": "221.42.142.108", - "port": 3001 + "address": "goldcoast.cardanode.com.au", + "port": 6000 }, { - "address": "161.42.142.108", + "address": "europe.cardanode.com.au", + "port": 6000 + } + ] + }, + { + "accumulatedStake": 0.19563367481699628, + "relativeStake": 0.003396149968805096, + "relays": [ + { + "address": "r1.spirestaking.com", "port": 3001 } ] }, { - "accumulatedStake": 0.17063501332829778, - "relativeStake": 0.0034293511819141784, + "accumulatedStake": 0.1990139606703871, + "relativeStake": 0.003380285853390799, "relays": [ { - "address": "relay.de.fikapool.com", - "port": 6000 + "address": "26e894b1.cardano-relay.herd.run", + "port": 1338 + } + ] + }, + { + "accumulatedStake": 0.20238993297485977, + "relativeStake": 0.0033759723044726885, + "relays": [ + { + "address": "31.220.91.105", + "port": 3001 }, { - "address": "relay.sg.fikapool.com", - "port": 6000 + "address": "154.26.158.189", + "port": 3001 }, { - "address": "relay.ca.fikapool.com", - "port": 6000 + "address": "5.104.83.174", + "port": 3001 } ] }, { - "accumulatedStake": 0.1740288295687427, - "relativeStake": 0.0033938162404449274, + "accumulatedStake": 0.20575570175213787, + "relativeStake": 0.003365768777278085, "relays": [ { - "address": "sydney.cardanode.com.au", + "address": "54.37.87.63", "port": 6000 }, { - "address": "singapore.cardanode.com.au", + "address": "54.36.178.85", "port": 6000 - }, + } + ] + }, + { + "accumulatedStake": 0.2091213345401094, + "relativeStake": 0.003365632787971513, + "relays": [ { - "address": "goldcoast.cardanode.com.au", - "port": 6000 + "address": "46.101.9.225", + "port": 3001 }, { - "address": "europe.cardanode.com.au", - "port": 6000 + "address": "64.227.46.95", + "port": 3001 } ] }, { - "accumulatedStake": 0.17742206009488956, - "relativeStake": 0.003393230526146853, + "accumulatedStake": 0.212486964477268, + "relativeStake": 0.0033656299371586304, "relays": [ { "address": "relay1-dl.aichi-stakepool.com", @@ -635,8 +758,8 @@ ] }, { - "accumulatedStake": 0.1808117527811607, - "relativeStake": 0.0033896926862711715, + "accumulatedStake": 0.21584918215925925, + "relativeStake": 0.0033622176819912467, "relays": [ { "address": "ada-relay01.biglazycat.com", @@ -645,116 +768,67 @@ ] }, { - "accumulatedStake": 0.18419958269095146, - "relativeStake": 0.0033878299097907395, - "relays": [ - { - "address": "gateway.adavault.com", - "port": 4021 - }, - { - "address": "gateway.adavault.com", - "port": 4022 - }, - { - "address": "gateway.adavault.com", - "port": 4026 - }, - { - "address": "gateway.adavault.com", - "port": 4027 - } - ] - }, - { - "accumulatedStake": 0.18758684983476245, - "relativeStake": 0.003387267143810997, + "accumulatedStake": 0.21920969714398045, + "relativeStake": 0.0033605149847211954, "relays": [ { - "address": "relay01.ca.lovelace.community", + "address": "cardano-main.everstake.com", "port": 3001 }, { - "address": "relay02.ca.lovelace.community", + "address": "cardano-main2.everstake.com", "port": 3001 }, { - "address": "relay01.fr.lovelace.community", + "address": "cardano-relay.everstake.com", "port": 3001 }, { - "address": "relay01.de.lovelace.community", + "address": "cardano-relay1.everstake.com", "port": 3001 - } - ] - }, - { - "accumulatedStake": 0.19095357224609483, - "relativeStake": 0.0033667224113323765, - "relays": [ + }, { - "address": "225.9.101.46", + "address": "cardano-relay2.everstake.com", "port": 3001 }, { - "address": "95.46.227.64", + "address": "cardano-relay3.everstake.com", "port": 3001 } ] }, { - "accumulatedStake": 0.1943093653978898, - "relativeStake": 0.003355793151794949, + "accumulatedStake": 0.2225661817355047, + "relativeStake": 0.00335648459152423, "relays": [ { - "address": "25.102.150.180", - "port": 8376 - }, - { - "address": "245.96.150.180", - "port": 8376 - }, - { - "address": "28.112.6.144", - "port": 8376 - }, - { - "address": "238.173.38.154", - "port": 8376 - }, - { - "address": "29.55.53.152", - "port": 8376 - }, - { - "address": "relays.terminada.io", - "port": 8376 + "address": "7ddb9c28.cardano-relay.bison.run", + "port": 1338 } ] }, { - "accumulatedStake": 0.19766213202464056, - "relativeStake": 0.003352766626750775, + "accumulatedStake": 0.225915434130273, + "relativeStake": 0.003349252394768329, "relays": [ { - "address": "7ddb9c28.cardano-relay.bison.run", + "address": "8d6f8de4.cardano-relay.herd.run", "port": 1338 } ] }, { - "accumulatedStake": 0.20100569682665403, - "relativeStake": 0.003343564802013482, + "accumulatedStake": 0.22926433512468408, + "relativeStake": 0.003348900994411077, "relays": [ { - "address": "8d6f8de4.cardano-relay.herd.run", - "port": 1338 + "address": "relay-pool-figment-19-mainnet.cardano.aeq5f.com" } ] }, { - "accumulatedStake": 0.20434855212111785, - "relativeStake": 0.003342855294463827, + "accumulatedStake": 0.23261086401500164, + "relativeStake": 0.003346528890317544, "relays": [ { "address": "b3e201f4.cardano-relay.bison.run", @@ -763,8 +837,8 @@ ] }, { - "accumulatedStake": 0.20768525316357095, - "relativeStake": 0.0033367010424530693, + "accumulatedStake": 0.23595105427598617, + "relativeStake": 0.0033401902609845307, "relays": [ { "address": "b3bbbcac.cardano-relay.bison.run", @@ -773,8 +847,8 @@ ] }, { - "accumulatedStake": 0.2110216131478754, - "relativeStake": 0.003336359984304455, + "accumulatedStake": 0.23929089932651007, + "relativeStake": 0.0033398450505238986, "relays": [ { "address": "ddbb5a06.cardano-relay.herd.run", @@ -783,48 +857,47 @@ ] }, { - "accumulatedStake": 0.21435362415317488, - "relativeStake": 0.0033320110052994854, + "accumulatedStake": 0.2426301054865828, + "relativeStake": 0.0033392061600727167, "relays": [ { - "address": "50809bee.cardano-relay.herd.run", - "port": 1338 + "address": "35.75.32.253", + "port": 6000 } ] }, { - "accumulatedStake": 0.21768439218291366, - "relativeStake": 0.003330768029738787, + "accumulatedStake": 0.24596492313007395, + "relativeStake": 0.00333481764349117, "relays": [ { - "address": "e4527900.cardano-relay.herd.run", + "address": "a94da6a8.cardano-relay.bison.run", "port": 1338 } ] }, { - "accumulatedStake": 0.22101451363810834, - "relativeStake": 0.0033301214551946763, + "accumulatedStake": 0.2492996339891381, + "relativeStake": 0.0033347108590641474, "relays": [ { - "address": "253.32.75.35", - "port": 6000 + "address": "relay-pool-figment-10-mainnet.cardano.aeq5f.com" } ] }, { - "accumulatedStake": 0.22434448749640495, - "relativeStake": 0.003329973858296607, + "accumulatedStake": 0.2526340925258125, + "relativeStake": 0.003334458536674399, "relays": [ { - "address": "a94da6a8.cardano-relay.bison.run", + "address": "e4527900.cardano-relay.herd.run", "port": 1338 } ] }, { - "accumulatedStake": 0.22767411865879394, - "relativeStake": 0.0033296311623889976, + "accumulatedStake": 0.2559672767756021, + "relativeStake": 0.003333184249789584, "relays": [ { "address": "9a956262.cardano-relay.bison.run", @@ -833,8 +906,8 @@ ] }, { - "accumulatedStake": 0.23100354312760665, - "relativeStake": 0.0033294244688126936, + "accumulatedStake": 0.2593002002365603, + "relativeStake": 0.003332923460958219, "relays": [ { "address": "9dc533bf.cardano-relay.herd.run", @@ -843,8 +916,8 @@ ] }, { - "accumulatedStake": 0.23433277934603886, - "relativeStake": 0.0033292362184322273, + "accumulatedStake": 0.262633010882834, + "relativeStake": 0.0033328106462736725, "relays": [ { "address": "f84db19f.cardano-relay.bison.run", @@ -853,8 +926,8 @@ ] }, { - "accumulatedStake": 0.23766172987201378, - "relativeStake": 0.003328950525974904, + "accumulatedStake": 0.26596562590703565, + "relativeStake": 0.003332615024201682, "relays": [ { "address": "fdd5329e.cardano-relay.bison.run", @@ -863,48 +936,48 @@ ] }, { - "accumulatedStake": 0.24099034980667422, - "relativeStake": 0.0033286199346604585, + "accumulatedStake": 0.2692978914129037, + "relativeStake": 0.003332265505868066, "relays": [ { - "address": "c2504518.cardano-relay.bison.run", + "address": "50809bee.cardano-relay.herd.run", "port": 1338 } ] }, { - "accumulatedStake": 0.24431876057941174, - "relativeStake": 0.0033284107727375094, + "accumulatedStake": 0.2726300324346796, + "relativeStake": 0.003332141021775879, "relays": [ { - "address": "d489c136.cardano-relay.bison.run", + "address": "c2504518.cardano-relay.bison.run", "port": 1338 } ] }, { - "accumulatedStake": 0.24764717007703838, - "relativeStake": 0.003328409497626637, + "accumulatedStake": 0.2759621520678068, + "relativeStake": 0.0033321196331271715, "relays": [ { - "address": "dbe22510.cardano-relay.bison.run", + "address": "778cb679.cardano-relay.bison.run", "port": 1338 } ] }, { - "accumulatedStake": 0.25097554812057987, - "relativeStake": 0.0033283780435415097, + "accumulatedStake": 0.27929415034971733, + "relativeStake": 0.0033319982819105575, "relays": [ { - "address": "778cb679.cardano-relay.bison.run", + "address": "dbe22510.cardano-relay.bison.run", "port": 1338 } ] }, { - "accumulatedStake": 0.25430390614640436, - "relativeStake": 0.003328358025824483, + "accumulatedStake": 0.2826261169830032, + "relativeStake": 0.003331966633285883, "relays": [ { "address": "94cc7304.cardano-relay.bison.run", @@ -913,57 +986,58 @@ ] }, { - "accumulatedStake": 0.2576321985779972, - "relativeStake": 0.0033282924315928297, + "accumulatedStake": 0.28595799486185697, + "relativeStake": 0.003331877878853766, "relays": [ { - "address": "a5f2af9f.cardano-relay.bison.run", + "address": "72e508af.cardano-relay.herd.run", "port": 1338 } ] }, { - "accumulatedStake": 0.26096043933597945, - "relativeStake": 0.0033282407579822487, + "accumulatedStake": 0.28928984826556026, + "relativeStake": 0.0033318534037032692, "relays": [ { - "address": "relay-pool-figment-19-mainnet.cardano.aeq5f.com" + "address": "a5f2af9f.cardano-relay.bison.run", + "port": 1338 } ] }, { - "accumulatedStake": 0.26428865881947766, - "relativeStake": 0.0033282194834982153, + "accumulatedStake": 0.29262167351966406, + "relativeStake": 0.003331825254103824, "relays": [ { - "address": "bb78d57d.cardano-relay.bison.run", + "address": "d489c136.cardano-relay.bison.run", "port": 1338 } ] }, { - "accumulatedStake": 0.2676168682296856, - "relativeStake": 0.0033282094102079387, + "accumulatedStake": 0.2959534817745367, + "relativeStake": 0.0033318082548726125, "relays": [ { - "address": "72e508af.cardano-relay.herd.run", + "address": "d89eeea0.cardano-relay.herd.run", "port": 1338 } ] }, { - "accumulatedStake": 0.270945058037804, - "relativeStake": 0.0033281898081184017, + "accumulatedStake": 0.2992851596403488, + "relativeStake": 0.0033316778658120925, "relays": [ { - "address": "d89eeea0.cardano-relay.herd.run", + "address": "bb78d57d.cardano-relay.bison.run", "port": 1338 } ] }, { - "accumulatedStake": 0.27427312884325394, - "relativeStake": 0.003328070805449945, + "accumulatedStake": 0.30261678357212374, + "relativeStake": 0.003331623931774961, "relays": [ { "address": "d699483e.cardano-relay.bison.run", @@ -972,155 +1046,160 @@ ] }, { - "accumulatedStake": 0.2776005040929206, - "relativeStake": 0.0033273752496666377, + "accumulatedStake": 0.30594765616467373, + "relativeStake": 0.003330872592549971, "relays": [ { - "address": "253.32.75.35", + "address": "35.75.32.253", "port": 6000 } ] }, { - "accumulatedStake": 0.2809182634218505, - "relativeStake": 0.003317759328929939, - "relays": [ - { - "address": "relay-pool-figment-10-mainnet.cardano.aeq5f.com" - } - ] - }, - { - "accumulatedStake": 0.28423087118968404, - "relativeStake": 0.003312607767833522, + "accumulatedStake": 0.30926593196539365, + "relativeStake": 0.0033182758007199685, "relays": [ { - "address": "gateway.adavault.com", - "port": 4021 - }, - { - "address": "gateway.adavault.com", - "port": 4022 + "address": "relay.de.fikapool.com", + "port": 6000 }, { - "address": "gateway.adavault.com", - "port": 4026 + "address": "relay.sg.fikapool.com", + "port": 6000 }, { - "address": "gateway.adavault.com", - "port": 4027 + "address": "relay.ca.fikapool.com", + "port": 6000 } ] }, { - "accumulatedStake": 0.28753528708249987, - "relativeStake": 0.003304415892815847, + "accumulatedStake": 0.31256131701934486, + "relativeStake": 0.0032953850539512103, "relays": [ { - "address": "relays.wavepool.digital", - "port": 3001 + "address": "53e378bf.cardano-relay.bison.run", + "port": 1338 } ] }, { - "accumulatedStake": 0.29083948690874545, - "relativeStake": 0.0033041998262455653, + "accumulatedStake": 0.31584842327246576, + "relativeStake": 0.003287106253120903, "relays": [ { - "address": "relays.stakepool.at", - "port": 3001 + "address": "95.154.235.142", + "port": 6000 }, { - "address": "relay-1.stakepool.at", - "port": 3001 + "address": "217.155.18.115", + "port": 6003 }, { - "address": "relay-2.stakepool.at", - "port": 3001 + "address": "217.155.18.115", + "port": 6001 } ] }, { - "accumulatedStake": 0.2941350010071504, - "relativeStake": 0.003295514098404966, + "accumulatedStake": 0.31911673912113037, + "relativeStake": 0.0032683158486645574, "relays": [ { - "address": "142.235.154.95", - "port": 6000 + "address": "cardano-main.everstake.com", + "port": 3001 }, { - "address": "115.18.155.217", - "port": 6003 + "address": "cardano-main2.everstake.com", + "port": 3001 }, { - "address": "115.18.155.217", - "port": 6001 - } - ] - }, - { - "accumulatedStake": 0.2974277496632033, - "relativeStake": 0.0032927486560528738, - "relays": [ + "address": "cardano-relay.everstake.com", + "port": 3001 + }, { - "address": "r-eu-1.polypool.io", - "port": 4001 + "address": "cardano-relay1.everstake.com", + "port": 3001 }, { - "address": "r-sg-1.polypool.io", - "port": 4001 + "address": "cardano-relay2.everstake.com", + "port": 3001 + }, + { + "address": "cardano-relay3.everstake.com", + "port": 3001 } ] }, { - "accumulatedStake": 0.3006885099381554, - "relativeStake": 0.0032607602749520626, + "accumulatedStake": 0.3223388811486656, + "relativeStake": 0.003222142027535244, "relays": [ { - "address": "relay-kiln-6-0.cardano.mainnet.kiln.fi", + "address": "157.173.120.233", "port": 3001 }, { - "address": "relay-kiln-6-1.cardano.mainnet.kiln.fi", - "port": 3001 + "address": "157.173.120.233", + "port": 3002 }, { - "address": "relay-kiln-6-2.cardano.mainnet.kiln.fi", + "address": "5.252.53.68", "port": 3001 } ] }, { - "accumulatedStake": 0.30392704680109744, - "relativeStake": 0.003238536862942106, + "accumulatedStake": 0.32555680131264036, + "relativeStake": 0.0032179201639747513, "relays": [ { - "address": "relay1.cardanotech.io", - "port": 6000 + "address": "gateway.adavault.com", + "port": 4021 }, { - "address": "relay2.cardanotech.io", - "port": 6000 + "address": "gateway.adavault.com", + "port": 4022 + }, + { + "address": "gateway.adavault.com", + "port": 4026 + }, + { + "address": "gateway.adavault.com", + "port": 4027 + }, + { + "address": "gateway2.adavault.com", + "port": 4060 + }, + { + "address": "gateway2.adavault.com", + "port": 4061 } ] }, { - "accumulatedStake": 0.30715737985222247, - "relativeStake": 0.003230333051124986, + "accumulatedStake": 0.32875398090594826, + "relativeStake": 0.003197179593307914, "relays": [ { - "address": "eu.relays.cardanians.io", - "port": 1000 + "address": "relays.stakepool.at", + "port": 3001 }, { - "address": "ca.relays.cardanians.io", - "port": 1000 + "address": "relay-1.stakepool.at", + "port": 3001 + }, + { + "address": "relay-2.stakepool.at", + "port": 3001 } ] }, { - "accumulatedStake": 0.3103492603803173, - "relativeStake": 0.0031918805280948636, + "accumulatedStake": 0.33194851319980617, + "relativeStake": 0.0031945322938579167, "relays": [ { "address": "f9395b98.cardano-relay.herd.run", @@ -1129,142 +1208,200 @@ ] }, { - "accumulatedStake": 0.31353699782893685, - "relativeStake": 0.0031877374486195416, + "accumulatedStake": 0.33514162350163146, + "relativeStake": 0.003193110301825292, "relays": [ { - "address": "Relay1.NordicPool.org", - "port": 3005 + "address": "r-eu-0.titanstaking.io", + "port": 4321 }, { - "address": "Relay2.NordicPool.org", - "port": 3005 + "address": "r-eu-1.titanstaking.io", + "port": 4321 }, { - "address": "Relay3.NordicPool.org", - "port": 3005 + "address": "r-eu-2.titanstaking.io", + "port": 4321 } ] }, { - "accumulatedStake": 0.31671240508614645, - "relativeStake": 0.00317540725720958, + "accumulatedStake": 0.3383217031672839, + "relativeStake": 0.0031800796656524235, "relays": [ { - "address": "Relay1.NordicPool.org", - "port": 3005 + "address": "relay-kiln-7-0.cardano.mainnet.kiln.fi", + "port": 3001 }, { - "address": "Relay2.NordicPool.org", - "port": 3005 + "address": "relay-kiln-7-1.cardano.mainnet.kiln.fi", + "port": 3001 }, { - "address": "Relay3.NordicPool.org", - "port": 3005 + "address": "relay-kiln-7-2.cardano.mainnet.kiln.fi", + "port": 3001 } ] }, { - "accumulatedStake": 0.31986578276081135, - "relativeStake": 0.0031533776746648944, + "accumulatedStake": 0.3415009698511818, + "relativeStake": 0.003179266683897904, "relays": [ { - "address": "relay.cardano.securestaking.io", - "port": 3000 + "address": "relay-kiln-0-0.cardano.mainnet.kiln.fi", + "port": 3001 }, { - "address": "secur2.cardano.securestaking.io", - "port": 3000 - } + "address": "relay-kiln-0-1.cardano.mainnet.kiln.fi", + "port": 3001 + }, + { + "address": "relay-kiln-0-2.cardano.mainnet.kiln.fi", + "port": 3001 + } ] }, { - "accumulatedStake": 0.323004437417142, - "relativeStake": 0.0031386546563306954, + "accumulatedStake": 0.3446481667567213, + "relativeStake": 0.0031471969055394703, "relays": [ { - "address": "cof-1.cardanocafe.org", - "port": 3005 + "address": "cardano-main.everstake.com", + "port": 3001 }, { - "address": "cof-2.cardanocafe.org", - "port": 3010 + "address": "cardano-main2.everstake.com", + "port": 3001 }, { - "address": "cap-1.cardanocafe.org", - "port": 4000 + "address": "cardano-relay.everstake.com", + "port": 3001 }, { - "address": "cap-2.cardanocafe.org", - "port": 4005 + "address": "cardano-relay1.everstake.com", + "port": 3001 }, { - "address": "lat-1.cardanocafe.org", - "port": 5001 + "address": "cardano-relay2.everstake.com", + "port": 3001 }, { - "address": "lat-2.cardanocafe.org", - "port": 5002 + "address": "cardano-relay3.everstake.com", + "port": 3001 } ] }, { - "accumulatedStake": 0.32614159867078624, - "relativeStake": 0.003137161253644213, + "accumulatedStake": 0.3477830195923553, + "relativeStake": 0.0031348528356340156, "relays": [ { - "address": "relay-kiln-7-0.cardano.mainnet.kiln.fi", - "port": 3001 + "address": "77cb3f75.cardano-relay.herd.run", + "port": 1338 + } + ] + }, + { + "accumulatedStake": 0.35091109625538885, + "relativeStake": 0.0031280766630335565, + "relays": [ + { + "address": "gateway.adavault.com", + "port": 4021 }, { - "address": "relay-kiln-7-1.cardano.mainnet.kiln.fi", - "port": 3001 + "address": "gateway.adavault.com", + "port": 4022 }, { - "address": "relay-kiln-7-2.cardano.mainnet.kiln.fi", + "address": "gateway.adavault.com", + "port": 4026 + }, + { + "address": "gateway.adavault.com", + "port": 4027 + }, + { + "address": "gateway2.adavault.com", + "port": 4060 + }, + { + "address": "gateway2.adavault.com", + "port": 4061 + } + ] + }, + { + "accumulatedStake": 0.35401885348202194, + "relativeStake": 0.003107757226633093, + "relays": [ + { + "address": "110.cardano.staked.cloud", "port": 3001 } ] }, { - "accumulatedStake": 0.3292722366692076, - "relativeStake": 0.003130637998421326, + "accumulatedStake": 0.35708310189519316, + "relativeStake": 0.0030642484131712415, "relays": [ { - "address": "r-eu-0.titanstaking.io", - "port": 4321 + "address": "cof-1.cardanocafe.org", + "port": 3005 }, { - "address": "r-eu-1.titanstaking.io", - "port": 4321 + "address": "cof-2.cardanocafe.org", + "port": 3010 }, { - "address": "r-eu-2.titanstaking.io", - "port": 4321 + "address": "cap-1.cardanocafe.org", + "port": 4000 + }, + { + "address": "cap-2.cardanocafe.org", + "port": 4005 + }, + { + "address": "lat-1.cardanocafe.org", + "port": 5001 + }, + { + "address": "lat-2.cardanocafe.org", + "port": 5002 } ] }, { - "accumulatedStake": 0.3323683170392178, - "relativeStake": 0.0030960803700102284, + "accumulatedStake": 0.36014143685343836, + "relativeStake": 0.0030583349582452126, "relays": [ { - "address": "105.91.220.31", + "address": "91.242.214.33", "port": 3001 }, { - "address": "189.158.26.154", + "address": "186.233.187.33", "port": 3001 + } + ] + }, + { + "accumulatedStake": 0.3631863119041928, + "relativeStake": 0.003044875050754456, + "relays": [ + { + "address": "rev-cardano-main-relay-01-a.bdnodes.net", + "port": 6000 }, { - "address": "174.83.104.5", - "port": 3001 + "address": "rev-cardano-main-relay-01-b.bdnodes.net", + "port": 6000 } ] }, { - "accumulatedStake": 0.3354356623043562, - "relativeStake": 0.0030673452651383917, + "accumulatedStake": 0.3662262064739854, + "relativeStake": 0.0030398945697925834, "relays": [ { "address": "r1.1percentpool.eu", @@ -1277,203 +1414,218 @@ ] }, { - "accumulatedStake": 0.33850158472450437, - "relativeStake": 0.0030659224201481997, + "accumulatedStake": 0.3692612300378267, + "relativeStake": 0.003035023563841242, "relays": [ { - "address": "relays.wavepool.digital", - "port": 3001 - } - ] - }, - { - "accumulatedStake": 0.3415553876719289, - "relativeStake": 0.003053802947424508, - "relays": [ + "address": "Relay1.NordicPool.org", + "port": 3005 + }, { - "address": "relay-pool-figment-8-mainnet.cardano.aeq5f.com" + "address": "Relay2.NordicPool.org", + "port": 3005 + }, + { + "address": "Relay3.NordicPool.org", + "port": 3005 } ] }, { - "accumulatedStake": 0.34460445024769326, - "relativeStake": 0.0030490625757643836, + "accumulatedStake": 0.37229119256078874, + "relativeStake": 0.0030299625229620705, "relays": [ { - "address": "233.120.173.157", - "port": 3001 + "address": "Relay1.NordicPool.org", + "port": 3005 }, { - "address": "233.120.173.157", - "port": 3002 + "address": "Relay2.NordicPool.org", + "port": 3005 }, { - "address": "68.53.252.5", - "port": 3001 + "address": "Relay3.NordicPool.org", + "port": 3005 } ] }, { - "accumulatedStake": 0.34765338046550237, - "relativeStake": 0.003048930217809118, + "accumulatedStake": 0.3753191985671891, + "relativeStake": 0.003028006006400369, "relays": [ { - "address": "77cb3f75.cardano-relay.herd.run", - "port": 1338 + "address": "relay.cardano.securestaking.io", + "port": 3000 + }, + { + "address": "secur2.cardano.securestaking.io", + "port": 3000 } ] }, { - "accumulatedStake": 0.3506935036030231, - "relativeStake": 0.003040123137520715, + "accumulatedStake": 0.37834083915163474, + "relativeStake": 0.0030216405844456255, "relays": [ { - "address": "cardano-relays.autostake.com", - "port": 3001 + "address": "bd-cardano-main-relay-2-a.bdnodes.net", + "port": 6000 } ] }, { - "accumulatedStake": 0.353729976215865, - "relativeStake": 0.003036472612841861, + "accumulatedStake": 0.3813479018057491, + "relativeStake": 0.0030070626541144063, "relays": [ { - "address": "33.214.242.91", + "address": "relays.stakepool.at", + "port": 3001 + }, + { + "address": "relay-1.stakepool.at", "port": 3001 }, { - "address": "33.187.233.186", + "address": "relay-2.stakepool.at", "port": 3001 } ] }, { - "accumulatedStake": 0.3567493658532314, - "relativeStake": 0.0030193896373664347, + "accumulatedStake": 0.38435337653599955, + "relativeStake": 0.0030054747302503924, "relays": [ { - "address": "63.87.37.54", - "port": 6000 + "address": "eu.relays.cardanians.io", + "port": 1000 }, { - "address": "85.178.36.54", - "port": 6000 + "address": "ca.relays.cardanians.io", + "port": 1000 } ] }, { - "accumulatedStake": 0.35975247463433885, - "relativeStake": 0.00300310878110743, + "accumulatedStake": 0.38735023648656974, + "relativeStake": 0.0029968599505702394, "relays": [ { - "address": "relay-pool-ledger-1-mainnet.cardano.aeq5f.com" + "address": "fr.relays.cardanians.io", + "port": 1000 + }, + { + "address": "ca.relays.cardanians.io", + "port": 1000 } ] }, { - "accumulatedStake": 0.36275494522537727, - "relativeStake": 0.0030024705910384093, + "accumulatedStake": 0.39029802059829166, + "relativeStake": 0.0029477841117218793, "relays": [ { - "address": "relay-pool-ledger-3-mainnet.cardano.aeq5f.com" + "address": "6398a55d.cardano-relay.herd.run", + "port": 1338 } ] }, { - "accumulatedStake": 0.36575208344045335, - "relativeStake": 0.0029971382150760814, + "accumulatedStake": 0.39322611502591936, + "relativeStake": 0.0029280944276277054, "relays": [ { - "address": "rev-cardano-main-relay-01-a.bdnodes.net", - "port": 6000 + "address": "norway.adanorthpool.com", + "port": 9011 }, { - "address": "rev-cardano-main-relay-01-b.bdnodes.net", - "port": 6000 + "address": "norway.adanorthpool.com", + "port": 9012 + }, + { + "address": "norway.adanorthpool.com", + "port": 9014 + }, + { + "address": "norway2.adanorthpool.com", + "port": 9014 + }, + { + "address": "norway2.adanorthpool.com", + "port": 9013 } ] }, { - "accumulatedStake": 0.3687395066584281, - "relativeStake": 0.002987423217974743, + "accumulatedStake": 0.3961431950283147, + "relativeStake": 0.0029170800023953377, "relays": [ { - "address": "fr.relays.cardanians.io", - "port": 1000 + "address": "178.156.128.18", + "port": 6001 }, { - "address": "ca.relays.cardanians.io", - "port": 1000 + "address": "65.21.7.149", + "port": 6001 } ] }, { - "accumulatedStake": 0.37172000145824946, - "relativeStake": 0.002980494799821401, + "accumulatedStake": 0.3990569819666123, + "relativeStake": 0.002913786938297617, "relays": [ { - "address": "Relay1.NordicPool.org", - "port": 3005 - }, - { - "address": "Relay2.NordicPool.org", - "port": 3005 + "address": "d95s1f1ak3bc73bjovog.bdnodes.net", + "port": 6000 }, { - "address": "Relay3.NordicPool.org", - "port": 3005 + "address": "d95s1e4alf0c73agtflg.bdnodes.net", + "port": 6000 } ] }, { - "accumulatedStake": 0.37469240600239845, - "relativeStake": 0.002972404544148982, + "accumulatedStake": 0.40196154518785593, + "relativeStake": 0.002904563221243636, "relays": [ { - "address": "cardano-main.everstake.one", - "port": 3001 - }, - { - "address": "cardano-main2.everstake.one", + "address": "relay01.ca.lovelace.community", "port": 3001 }, { - "address": "cardano-relay.everstake.one", + "address": "relay02.ca.lovelace.community", "port": 3001 }, { - "address": "cardano-relay1.everstake.one", + "address": "relay01.fr.lovelace.community", "port": 3001 }, { - "address": "cardano-relay2.everstake.one", + "address": "relay01.de.lovelace.community", "port": 3001 } ] }, { - "accumulatedStake": 0.37763212255170936, - "relativeStake": 0.0029397165493109012, + "accumulatedStake": 0.4048565993629928, + "relativeStake": 0.002895054175136825, "relays": [ { - "address": "bd-cardano-main-relay-2-a.bdnodes.net", - "port": 6000 - } - ] - }, - { - "accumulatedStake": 0.3805549500855349, - "relativeStake": 0.0029228275338255365, - "relays": [ + "address": "Relay1.NordicPool.org", + "port": 3005 + }, { - "address": "6398a55d.cardano-relay.herd.run", - "port": 1338 + "address": "Relay2.NordicPool.org", + "port": 3005 + }, + { + "address": "Relay3.NordicPool.org", + "port": 3005 } ] }, { - "accumulatedStake": 0.38343647535941855, - "relativeStake": 0.0028815252738836634, + "accumulatedStake": 0.4077408300382135, + "relativeStake": 0.002884230675220699, "relays": [ { "address": "170.23.181.50", @@ -1490,36 +1642,44 @@ ] }, { - "accumulatedStake": 0.3862980690295382, - "relativeStake": 0.002861593670119681, + "accumulatedStake": 0.4106193375288086, + "relativeStake": 0.0028785074905951155, "relays": [ { - "address": "rockyrelay1.ddns.net", + "address": "139.59.200.123", "port": 3001 }, { - "address": "rockyrelay2.ddns.net", - "port": 3002 + "address": "129.212.154.208", + "port": 3001 + }, + { + "address": "129.212.214.149", + "port": 3001 } ] }, { - "accumulatedStake": 0.3891541666933272, - "relativeStake": 0.00285609766378897, + "accumulatedStake": 0.4134870320656869, + "relativeStake": 0.002867694536878287, "relays": [ { - "address": "relay1.clovernodes.io", - "port": 6000 + "address": "Relay1.NordicPool.org", + "port": 3005 }, { - "address": "relay2.clovernodes.io", - "port": 6000 + "address": "Relay2.NordicPool.org", + "port": 3005 + }, + { + "address": "Relay3.NordicPool.org", + "port": 3005 } ] }, { - "accumulatedStake": 0.3920092537719859, - "relativeStake": 0.002855087078658718, + "accumulatedStake": 0.4163540883411624, + "relativeStake": 0.0028670562754755163, "relays": [ { "address": "relays.wavepool.digital", @@ -1528,76 +1688,100 @@ ] }, { - "accumulatedStake": 0.3948634489715873, - "relativeStake": 0.0028541951996013753, + "accumulatedStake": 0.4192145623190529, + "relativeStake": 0.002860473977890499, "relays": [ { - "address": "relays.stakepool.at", + "address": "86.80.128.65", "port": 3001 }, { - "address": "relay-1.stakepool.at", - "port": 3001 + "address": "86.80.128.65", + "port": 3002 }, { - "address": "relay-2.stakepool.at", + "address": "86.80.128.65", + "port": 3003 + } + ] + }, + { + "accumulatedStake": 0.422075014063197, + "relativeStake": 0.0028604517441441065, + "relays": [ + { + "address": "101.cardano.staked.cloud", "port": 3001 } ] }, { - "accumulatedStake": 0.3977167363563328, - "relativeStake": 0.0028532873847455305, + "accumulatedStake": 0.42493303297101404, + "relativeStake": 0.0028580189078170333, "relays": [ { - "address": "185.24.129.57", + "address": "188.165.236.202", "port": 3001 }, { - "address": "178.28.129.57", + "address": "195.201.107.114", "port": 3001 } ] }, { - "accumulatedStake": 0.4005687755644095, - "relativeStake": 0.0028520392080766534, + "accumulatedStake": 0.42778806990500945, + "relativeStake": 0.0028550369339954097, "relays": [ { - "address": "103.229.61.20", + "address": "20.61.229.103", "port": 3001 }, { - "address": "218.228.61.20", + "address": "20.61.228.218", "port": 3001 }, { - "address": "221.42.142.108", + "address": "108.142.42.221", "port": 3001 }, { - "address": "161.42.142.108", + "address": "108.142.42.161", "port": 3001 } ] }, { - "accumulatedStake": 0.403410302552123, - "relativeStake": 0.0028415269877135165, + "accumulatedStake": 0.43063976580257246, + "relativeStake": 0.0028516958975630196, "relays": [ { - "address": "18.128.156.178", - "port": 6001 + "address": "st3ak.1337.cx", + "port": 6000 }, { - "address": "149.7.21.65", - "port": 6001 + "address": "st3ak.mooo.com", + "port": 6000 + }, + { + "address": "st3ak.root.sx", + "port": 6000 + } + ] + }, + { + "accumulatedStake": 0.43347259002368455, + "relativeStake": 0.0028328242211121215, + "relays": [ + { + "address": "relays.wavepool.digital", + "port": 3001 } ] }, { - "accumulatedStake": 0.4062275780948029, - "relativeStake": 0.0028172755426799107, + "accumulatedStake": 0.43630169346112985, + "relativeStake": 0.0028291034374452713, "relays": [ { "address": "76cf1dd1.cardano-relay.bison.run", @@ -1606,254 +1790,202 @@ ] }, { - "accumulatedStake": 0.4090382757161769, - "relativeStake": 0.002810697621373978, + "accumulatedStake": 0.43912262903285587, + "relativeStake": 0.0028209355717260165, "relays": [ { - "address": "cardano-main.everstake.one", - "port": 3001 - }, - { - "address": "cardano-main2.everstake.one", - "port": 3001 - }, - { - "address": "cardano-relay.everstake.one", - "port": 3001 - }, - { - "address": "cardano-relay1.everstake.one", - "port": 3001 - }, - { - "address": "cardano-relay2.everstake.one", - "port": 3001 + "address": "e646e266.cardano-relay.bison.run", + "port": 1338 } ] }, { - "accumulatedStake": 0.4118427674781431, - "relativeStake": 0.002804491761966212, + "accumulatedStake": 0.4419429277855328, + "relativeStake": 0.002820298752676927, "relays": [ { - "address": "a0e18895.cardano-relay.bison.run", + "address": "c61ace08.cardano-relay.herd.run", "port": 1338 } ] }, { - "accumulatedStake": 0.41464655594429967, - "relativeStake": 0.0028037884661565498, + "accumulatedStake": 0.44475830961741913, + "relativeStake": 0.002815381831886331, "relays": [ { - "address": "relays.wavepool.digital", - "port": 3001 + "address": "a0e18895.cardano-relay.bison.run", + "port": 1338 } ] }, { - "accumulatedStake": 0.41743786945782435, - "relativeStake": 0.002791313513524713, + "accumulatedStake": 0.4475538987225074, + "relativeStake": 0.0027955891050882816, "relays": [ { - "address": "cardano-main.everstake.one", - "port": 3001 - }, - { - "address": "cardano-main2.everstake.one", - "port": 3001 - }, - { - "address": "cardano-relay.everstake.one", + "address": "lucerne.datadyne.earth", "port": 3001 }, { - "address": "cardano-relay1.everstake.one", - "port": 3001 + "address": "g5.datadyne.earth", + "port": 3002 }, { - "address": "cardano-relay2.everstake.one", - "port": 3001 + "address": "drcaroll.datadyne.earth", + "port": 3003 } ] }, { - "accumulatedStake": 0.4202250086732971, - "relativeStake": 0.0027871392154727244, + "accumulatedStake": 0.45033787985085916, + "relativeStake": 0.0027839811283517763, "relays": [ { - "address": "Relay1.NordicPool.org", - "port": 3005 - }, - { - "address": "Relay2.NordicPool.org", - "port": 3005 + "address": "relay1.ppcx2.mainnet.cardano.p2p.org", + "port": 6001 }, { - "address": "Relay3.NordicPool.org", - "port": 3005 + "address": "relay2.ppcx2.mainnet.cardano.p2p.org", + "port": 6001 } ] }, { - "accumulatedStake": 0.423004076762356, - "relativeStake": 0.0027790680890589304, + "accumulatedStake": 0.4530991253782823, + "relativeStake": 0.0027612455274230925, "relays": [ { - "address": "23.17.113.148", + "address": "148.113.17.23", "port": 6000 }, { - "address": "103.25.69.158", + "address": "158.69.25.103", "port": 6000 }, { - "address": "238.53.4.46", + "address": "46.4.53.238", "port": 6000 }, { - "address": "164.140.102.149", + "address": "149.102.140.164", "port": 6000 } ] }, { - "accumulatedStake": 0.4257794754716553, - "relativeStake": 0.002775398709299285, + "accumulatedStake": 0.4558114110079053, + "relativeStake": 0.0027122856296229966, "relays": [ { - "address": "octaluso.dyndns.org", - "port": 3002 - } - ] - }, - { - "accumulatedStake": 0.4285307675394967, - "relativeStake": 0.0027512920678414246, - "relays": [ + "address": "20.61.229.103", + "port": 3001 + }, { - "address": "relays.digi.pro", + "address": "20.61.228.218", + "port": 3001 + }, + { + "address": "108.142.42.221", + "port": 3001 + }, + { + "address": "108.142.42.161", "port": 3001 } ] }, { - "accumulatedStake": 0.43127773441681333, - "relativeStake": 0.002746966877316626, + "accumulatedStake": 0.45852259709024595, + "relativeStake": 0.0027111860823407063, "relays": [ { - "address": "relays.cardanowithpaul.com", - "port": 1069 + "address": "rockyrelay1.ddns.net", + "port": 3001 + }, + { + "address": "rockyrelay2.ddns.net", + "port": 3002 } ] }, { - "accumulatedStake": 0.43401401795403494, - "relativeStake": 0.0027362835372215983, + "accumulatedStake": 0.46123273998145836, + "relativeStake": 0.0027101428912123674, "relays": [ { - "address": "d95s1f1ak3bc73bjovog.bdnodes.net", - "port": 6000 + "address": "relay1.str8pool.com", + "port": 7421 }, { - "address": "d95s1e4alf0c73agtflg.bdnodes.net", - "port": 6000 + "address": "relay2.str8pool.com", + "port": 3611 } ] }, { - "accumulatedStake": 0.43674738799706736, - "relativeStake": 0.0027333700430323907, + "accumulatedStake": 0.463924357969422, + "relativeStake": 0.0026916179879636418, "relays": [ { - "address": "53e378bf.cardano-relay.bison.run", - "port": 1338 + "address": "cork.queenada.com", + "port": 7500 } ] }, { - "accumulatedStake": 0.4394568257864981, - "relativeStake": 0.002709437789430746, + "accumulatedStake": 0.46661260423816403, + "relativeStake": 0.0026882462687420543, "relays": [ { - "address": "103.229.61.20", - "port": 3001 - }, - { - "address": "218.228.61.20", - "port": 3001 - }, - { - "address": "221.42.142.108", - "port": 3001 - }, - { - "address": "161.42.142.108", - "port": 3001 + "address": "relays.cardanowithpaul.com", + "port": 1069 } ] }, { - "accumulatedStake": 0.44211477349891903, - "relativeStake": 0.00265794771242095, + "accumulatedStake": 0.46928177862895776, + "relativeStake": 0.0026691743907937254, "relays": [ { - "address": "norway.adanorthpool.com", - "port": 9011 - }, - { - "address": "norway.adanorthpool.com", - "port": 9012 + "address": "cardano-main.everstake.com", + "port": 3001 }, { - "address": "norway.adanorthpool.com", - "port": 9014 + "address": "cardano-main2.everstake.com", + "port": 3001 }, { - "address": "norway2.adanorthpool.com", - "port": 9014 + "address": "cardano-relay.everstake.com", + "port": 3001 }, { - "address": "norway2.adanorthpool.com", - "port": 9013 - } - ] - }, - { - "accumulatedStake": 0.4447710321270004, - "relativeStake": 0.002656258628081374, - "relays": [ - { - "address": "11.relays.happystaking.io", + "address": "cardano-relay1.everstake.com", "port": 3001 }, { - "address": "12.relays.happystaking.io", + "address": "cardano-relay2.everstake.com", "port": 3001 } ] }, { - "accumulatedStake": 0.44740595707611036, - "relativeStake": 0.0026349249491099637, + "accumulatedStake": 0.47194697021849075, + "relativeStake": 0.0026651915895330148, "relays": [ { - "address": "rel01.fairpool.eu", - "port": 55001 - }, - { - "address": "rel02.fairpool.eu", - "port": 55002 + "address": "relay1.clovernodes.io", + "port": 6000 }, { - "address": "rel03.fairpool.eu", - "port": 55003 + "address": "relay2.clovernodes.io", + "port": 6000 } ] }, { - "accumulatedStake": 0.4500345873357131, - "relativeStake": 0.002628630259602752, + "accumulatedStake": 0.4745710568685571, + "relativeStake": 0.0026240866500663353, "relays": [ { "address": "relay.anonaf.com", @@ -1862,280 +1994,220 @@ ] }, { - "accumulatedStake": 0.4526606957091051, - "relativeStake": 0.0026261083733919734, - "relays": [ - { - "address": "relay2.snakepool.link", - "port": 3002 - } - ] - }, - { - "accumulatedStake": 0.4552851773596565, - "relativeStake": 0.002624481650551397, + "accumulatedStake": 0.47718817128126084, + "relativeStake": 0.0026171144127037343, "relays": [ { - "address": "r-eu-0.titanstaking.io", - "port": 4321 - }, - { - "address": "r-eu-1.titanstaking.io", - "port": 4321 - }, - { - "address": "r-eu-2.titanstaking.io", - "port": 4321 + "address": "35.75.32.253", + "port": 6001 } ] }, { - "accumulatedStake": 0.45788192084935087, - "relativeStake": 0.002596743489694367, + "accumulatedStake": 0.47978764416024317, + "relativeStake": 0.0025994728789823455, "relays": [ { - "address": "103.229.61.20", + "address": "20.61.229.103", "port": 3001 }, { - "address": "218.228.61.20", + "address": "20.61.228.218", "port": 3001 }, { - "address": "221.42.142.108", + "address": "108.142.42.221", "port": 3001 }, { - "address": "161.42.142.108", + "address": "108.142.42.161", "port": 3001 } ] }, { - "accumulatedStake": 0.46047299992753665, - "relativeStake": 0.0025910790781857604, + "accumulatedStake": 0.482377209547169, + "relativeStake": 0.0025895653869258315, "relays": [ { - "address": "lucerne.datadyne.earth", - "port": 3001 - }, - { - "address": "g5.datadyne.earth", - "port": 3002 + "address": "Relay1.NordicPool.org", + "port": 3005 }, { - "address": "drcaroll.datadyne.earth", - "port": 3003 - } - ] - }, - { - "accumulatedStake": 0.4630636978686284, - "relativeStake": 0.0025906979410917717, - "relays": [ - { - "address": "relay1.str8pool.com", - "port": 7421 + "address": "Relay2.NordicPool.org", + "port": 3005 }, { - "address": "relay2.str8pool.com", - "port": 3611 + "address": "Relay3.NordicPool.org", + "port": 3005 } ] }, { - "accumulatedStake": 0.4656534964863589, - "relativeStake": 0.002589798617730518, + "accumulatedStake": 0.48495806256336005, + "relativeStake": 0.0025808530161910287, "relays": [ { - "address": "202.236.165.188", - "port": 3001 - }, - { - "address": "114.107.201.195", - "port": 3001 + "address": "octaluso.dyndns.org", + "port": 3002 } ] }, { - "accumulatedStake": 0.4682174780347772, - "relativeStake": 0.0025639815484182825, + "accumulatedStake": 0.4875344969123622, + "relativeStake": 0.0025764343490021703, "relays": [ { - "address": "cork.queenada.com", - "port": 7500 + "address": "1339aecb.cardano-relay.herd.run", + "port": 1338 } ] }, { - "accumulatedStake": 0.47077109057110417, - "relativeStake": 0.0025536125363269657, + "accumulatedStake": 0.4901011429552267, + "relativeStake": 0.0025666460428645063, "relays": [ { - "address": "relay.cardano.securestaking.io", - "port": 3000 + "address": "rel01.fairpool.eu", + "port": 55001 }, { - "address": "secur2.cardano.securestaking.io", - "port": 3000 - } - ] - }, - { - "accumulatedStake": 0.47330602076843636, - "relativeStake": 0.002534930197332188, - "relays": [ - { - "address": "94c3c6d3.cardano-relay.herd.run", - "port": 1338 - } - ] - }, - { - "accumulatedStake": 0.4758318114737277, - "relativeStake": 0.002525790705291376, - "relays": [ + "address": "rel02.fairpool.eu", + "port": 55002 + }, { - "address": "c61ace08.cardano-relay.herd.run", - "port": 1338 + "address": "rel03.fairpool.eu", + "port": 55003 } ] }, { - "accumulatedStake": 0.47833467578918243, - "relativeStake": 0.0025028643154547197, + "accumulatedStake": 0.49266675978441626, + "relativeStake": 0.0025656168291895297, "relays": [ { - "address": "33.184.128.57", - "port": 3001 + "address": "rho.relay.easy1staking.com", + "port": 30020 }, { - "address": "31.184.128.57", - "port": 3001 - } - ] - }, - { - "accumulatedStake": 0.4808313021792356, - "relativeStake": 0.0024966263900531543, - "relays": [ - { - "address": "relays.bladepool.com", - "port": 3001 - } - ] - }, - { - "accumulatedStake": 0.48330945841631007, - "relativeStake": 0.002478156237074452, - "relays": [ + "address": "pi.relay.easy1staking.com", + "port": 30021 + }, { - "address": "relaynode1.bravostakepool.nl", - "port": 3001 + "address": "eu-central-1.relay.easy1staking.com", + "port": 30000 }, { - "address": "relaynode2.bravostakepool.nl", - "port": 3001 + "address": "us-east-1.relay.easy1staking.com", + "port": 30000 }, { - "address": "relaynode3.bravostakepool.nl", - "port": 3001 + "address": "eu-west-1.relay.easy1staking.com", + "port": 30000 } ] }, { - "accumulatedStake": 0.4857873170357562, - "relativeStake": 0.0024778586194461457, + "accumulatedStake": 0.4952238389423434, + "relativeStake": 0.002557079157927141, "relays": [ { - "address": "r1.1percentpool.eu", - "port": 19001 - }, - { - "address": "r2.1percentpool.eu", - "port": 19002 + "address": "relays.digi.pro", + "port": 3001 } ] }, { - "accumulatedStake": 0.4882609656674006, - "relativeStake": 0.0024736486316444405, + "accumulatedStake": 0.49774690701487023, + "relativeStake": 0.002523068072526852, "relays": [ { - "address": "cardano-main.everstake.one", + "address": "cardano-main.everstake.com", "port": 3001 }, { - "address": "cardano-main2.everstake.one", + "address": "cardano-main2.everstake.com", "port": 3001 }, { - "address": "cardano-relay.everstake.one", + "address": "cardano-relay.everstake.com", "port": 3001 }, { - "address": "cardano-relay1.everstake.one", + "address": "cardano-relay1.everstake.com", "port": 3001 }, { - "address": "cardano-relay2.everstake.one", + "address": "cardano-relay2.everstake.com", "port": 3001 } ] }, { - "accumulatedStake": 0.49071977560698077, - "relativeStake": 0.0024588099395801135, + "accumulatedStake": 0.5002522726638451, + "relativeStake": 0.002505365648974889, "relays": [ { - "address": "st3ak.1337.cx", + "address": "169.58.185.200", "port": 6000 }, { - "address": "st3ak.mooo.com", + "address": "169.58.186.9", "port": 6000 }, { - "address": "st3ak.root.sx", + "address": "169.58.186.24", "port": 6000 } ] }, { - "accumulatedStake": 0.49317697072457223, - "relativeStake": 0.002457195117591497, + "accumulatedStake": 0.5027551538887999, + "relativeStake": 0.0025028812249547755, "relays": [ { - "address": "110.cardano.staked.cloud", - "port": 3001 + "address": "r-eu-0.titanstaking.io", + "port": 4321 + }, + { + "address": "r-eu-1.titanstaking.io", + "port": 4321 + }, + { + "address": "r-eu-2.titanstaking.io", + "port": 4321 } ] }, { - "accumulatedStake": 0.495630309300874, - "relativeStake": 0.0024533385763017505, + "accumulatedStake": 0.5052072297927471, + "relativeStake": 0.0024520759039472063, "relays": [ { - "address": "relay1.nedscave.io", + "address": "cardano-main.everstake.com", "port": 3001 }, { - "address": "relay2.nedscave.io", + "address": "cardano-main2.everstake.com", "port": 3001 }, { - "address": "relay3.nedscave.io", + "address": "cardano-relay.everstake.com", "port": 3001 }, { - "address": "relay4.nedscave.io", + "address": "cardano-relay1.everstake.com", + "port": 3001 + }, + { + "address": "cardano-relay2.everstake.com", "port": 3001 } ] }, { - "accumulatedStake": 0.49807756968336253, - "relativeStake": 0.002447260382488523, + "accumulatedStake": 0.5076459140136994, + "relativeStake": 0.002438684220952295, "relays": [ { "address": "relays.onyxstakepool.com", @@ -2144,82 +2216,93 @@ ] }, { - "accumulatedStake": 0.5005195582044285, - "relativeStake": 0.0024419885210659616, + "accumulatedStake": 0.510070233700938, + "relativeStake": 0.0024243196872385238, "relays": [ { - "address": "65.128.80.86", - "port": 3001 - }, + "address": "relay-pool-figment-6-mainnet.cardano.aeq5f.com" + } + ] + }, + { + "accumulatedStake": 0.5124921140822818, + "relativeStake": 0.0024218803813438015, + "relays": [ { - "address": "65.128.80.86", - "port": 3002 + "address": "152.53.21.151", + "port": 6000 }, { - "address": "65.128.80.86", - "port": 3003 + "address": "149.102.152.63", + "port": 6000 } ] }, { - "accumulatedStake": 0.5029589950427319, - "relativeStake": 0.0024394368383034498, + "accumulatedStake": 0.5148986966900798, + "relativeStake": 0.0024065826077981226, "relays": [ { - "address": "cardano-main.everstake.one", + "address": "cardano-main.everstake.com", "port": 3001 }, { - "address": "cardano-main2.everstake.one", + "address": "cardano-main2.everstake.com", "port": 3001 }, { - "address": "cardano-relay.everstake.one", + "address": "cardano-relay.everstake.com", "port": 3001 }, { - "address": "cardano-relay1.everstake.one", + "address": "cardano-relay1.everstake.com", "port": 3001 }, { - "address": "cardano-relay2.everstake.one", + "address": "cardano-relay2.everstake.com", "port": 3001 } ] }, { - "accumulatedStake": 0.5053950693189452, - "relativeStake": 0.0024360742762132275, + "accumulatedStake": 0.5173009089390436, + "relativeStake": 0.0024022122489637094, "relays": [ { - "address": "ACLrelay1.cardanoland.com", - "port": 6000 + "address": "r1.1percentpool.eu", + "port": 19001 }, { - "address": "ACLrelay2.cardanoland.com", - "port": 7000 - }, + "address": "r2.1percentpool.eu", + "port": 19002 + } + ] + }, + { + "accumulatedStake": 0.5196998661306225, + "relativeStake": 0.0023989571915788706, + "relays": [ { - "address": "ACLrelay3.cardanoland.com", - "port": 8000 + "address": "ada10753.allnodes.me", + "port": 3001 }, { - "address": "ACLrelay4.cardanoland.com", - "port": 6000 + "address": "ada12179.allnodes.me", + "port": 3001 }, { - "address": "ACLrelay5.cardanoland.com", - "port": 7000 + "address": "ada20364.allnodes.me", + "port": 3001 }, { - "address": "ACLrelay6.cardanoland.com", - "port": 8000 + "address": "ada21853.allnodes.me", + "port": 3001 } ] }, { - "accumulatedStake": 0.5078200530322211, - "relativeStake": 0.0024249837132759456, + "accumulatedStake": 0.5220982867979349, + "relativeStake": 0.002398420667312513, "relays": [ { "address": "ada-relay02.biglazycat.com", @@ -2228,183 +2311,194 @@ ] }, { - "accumulatedStake": 0.5102329359870145, - "relativeStake": 0.0024128829547933927, + "accumulatedStake": 0.524485952045627, + "relativeStake": 0.0023876652476920147, "relays": [ { - "address": "relay-pool-figment-6-mainnet.cardano.aeq5f.com" + "address": "relay1.able-pool.io", + "port": 4555 + }, + { + "address": "relay2.able-pool.io", + "port": 4419 } ] }, { - "accumulatedStake": 0.5126388853458439, - "relativeStake": 0.002405949358829343, + "accumulatedStake": 0.5268654789000897, + "relativeStake": 0.002379526854462772, "relays": [ { - "address": "ada10753.allnodes.me", + "address": "20.61.229.103", "port": 3001 }, { - "address": "ada12179.allnodes.me", + "address": "20.61.228.218", "port": 3001 }, { - "address": "ada20364.allnodes.me", + "address": "108.142.42.221", "port": 3001 }, { - "address": "ada21853.allnodes.me", + "address": "108.142.42.161", "port": 3001 } ] }, { - "accumulatedStake": 0.5150412586170898, - "relativeStake": 0.0024023732712460063, + "accumulatedStake": 0.5292446926064516, + "relativeStake": 0.0023792137063618837, "relays": [ { - "address": "1339aecb.cardano-relay.herd.run", - "port": 1338 - } - ] - }, - { - "accumulatedStake": 0.5174183436302654, - "relativeStake": 0.0023770850131755437, - "relays": [ - { - "address": "103.229.61.20", + "address": "20.61.229.103", "port": 3001 }, { - "address": "218.228.61.20", + "address": "20.61.228.218", "port": 3001 }, { - "address": "221.42.142.108", + "address": "108.142.42.221", "port": 3001 }, { - "address": "161.42.142.108", + "address": "108.142.42.161", "port": 3001 } ] }, { - "accumulatedStake": 0.5197950592146209, - "relativeStake": 0.0023767155843555108, + "accumulatedStake": 0.5316238986187564, + "relativeStake": 0.002379206012304725, "relays": [ { - "address": "103.229.61.20", + "address": "20.61.229.103", "port": 3001 }, { - "address": "218.228.61.20", + "address": "20.61.228.218", "port": 3001 }, { - "address": "221.42.142.108", + "address": "108.142.42.221", "port": 3001 }, { - "address": "161.42.142.108", + "address": "108.142.42.161", "port": 3001 } ] }, { - "accumulatedStake": 0.5221717671129978, - "relativeStake": 0.0023767078983769428, + "accumulatedStake": 0.5340031028229233, + "relativeStake": 0.002379204204166974, "relays": [ { - "address": "103.229.61.20", + "address": "20.61.229.103", "port": 3001 }, { - "address": "218.228.61.20", + "address": "20.61.228.218", "port": 3001 }, { - "address": "221.42.142.108", + "address": "108.142.42.221", "port": 3001 }, { - "address": "161.42.142.108", + "address": "108.142.42.161", "port": 3001 } ] }, { - "accumulatedStake": 0.5245484736885823, - "relativeStake": 0.00237670657558436, + "accumulatedStake": 0.5363823009085212, + "relativeStake": 0.0023791980855978907, "relays": [ { - "address": "103.229.61.20", + "address": "20.61.229.103", "port": 3001 }, { - "address": "218.228.61.20", + "address": "20.61.228.218", "port": 3001 }, { - "address": "221.42.142.108", + "address": "108.142.42.221", "port": 3001 }, { - "address": "161.42.142.108", + "address": "108.142.42.161", "port": 3001 } ] }, { - "accumulatedStake": 0.5269251736685752, - "relativeStake": 0.002376699979992976, + "accumulatedStake": 0.538753424676811, + "relativeStake": 0.00237112376828981, "relays": [ { - "address": "103.229.61.20", + "address": "relay1.nedscave.io", "port": 3001 }, { - "address": "218.228.61.20", + "address": "relay2.nedscave.io", "port": 3001 }, { - "address": "221.42.142.108", + "address": "relay3.nedscave.io", "port": 3001 }, { - "address": "161.42.142.108", + "address": "relay4.nedscave.io", "port": 3001 } ] }, { - "accumulatedStake": 0.5293018705303323, - "relativeStake": 0.0023766968617571, + "accumulatedStake": 0.5410849210872811, + "relativeStake": 0.002331496410470073, "relays": [ { - "address": "253.32.75.35", - "port": 6001 + "address": "94c3c6d3.cardano-relay.herd.run", + "port": 1338 } ] }, { - "accumulatedStake": 0.5316518059649552, - "relativeStake": 0.0023499354346229358, + "accumulatedStake": 0.5433949868170332, + "relativeStake": 0.002310065729752187, "relays": [ { - "address": "52.90.217.3", - "port": 6000 + "address": "gateway.adavault.com", + "port": 4021 }, { - "address": "127.254.219.3", - "port": 6000 + "address": "gateway.adavault.com", + "port": 4022 + }, + { + "address": "gateway.adavault.com", + "port": 4026 + }, + { + "address": "gateway.adavault.com", + "port": 4027 + }, + { + "address": "gateway2.adavault.com", + "port": 4060 + }, + { + "address": "gateway2.adavault.com", + "port": 4061 } ] }, { - "accumulatedStake": 0.5339530242143362, - "relativeStake": 0.0023012182493809892, + "accumulatedStake": 0.5456967634913253, + "relativeStake": 0.00230177667429201, "relays": [ { "address": "relay-pool-figment-26-mainnet.cardano.aeq5f.com" @@ -2412,178 +2506,156 @@ ] }, { - "accumulatedStake": 0.5362516067470976, - "relativeStake": 0.002298582532761402, + "accumulatedStake": 0.5479784891177965, + "relativeStake": 0.0022817256264711797, "relays": [ { - "address": "cardano-main.everstake.one", + "address": "cardano-main.everstake.com", "port": 3001 }, { - "address": "cardano-main2.everstake.one", + "address": "cardano-main2.everstake.com", "port": 3001 }, { - "address": "cardano-relay.everstake.one", + "address": "cardano-relay.everstake.com", "port": 3001 }, { - "address": "cardano-relay1.everstake.one", + "address": "cardano-relay1.everstake.com", "port": 3001 }, { - "address": "cardano-relay2.everstake.one", + "address": "cardano-relay2.everstake.com", "port": 3001 } ] }, { - "accumulatedStake": 0.5385419415247156, - "relativeStake": 0.0022903347776179295, + "accumulatedStake": 0.5502510490330732, + "relativeStake": 0.002272559915276723, "relays": [ { - "address": "r1.adastat.net", - "port": 3333 - }, - { - "address": "r2.adastat.net", - "port": 3333 - }, - { - "address": "r3.adastat.net", - "port": 3333 + "address": "cardano-relays.autostake.com", + "port": 3001 } ] }, { - "accumulatedStake": 0.540831933504683, - "relativeStake": 0.002289991979967418, + "accumulatedStake": 0.552481480529135, + "relativeStake": 0.0022304314960618237, "relays": [ { - "address": "86.17.211.35", - "port": 3000 + "address": "eu.relays.cardanians.io", + "port": 1000 }, { - "address": "7.88.23.34", - "port": 3000 + "address": "ca.relays.cardanians.io", + "port": 1000 } ] }, { - "accumulatedStake": 0.5431042319184912, - "relativeStake": 0.0022722984138082132, + "accumulatedStake": 0.5547005353543547, + "relativeStake": 0.0022190548252197227, "relays": [ { - "address": "cardano-main.everstake.one", - "port": 3001 - }, - { - "address": "cardano-main2.everstake.one", + "address": "157.245.228.134", "port": 3001 }, { - "address": "cardano-relay.everstake.one", + "address": "159.89.120.164", "port": 3001 }, { - "address": "cardano-relay1.everstake.one", + "address": "209.97.186.44", "port": 3001 }, { - "address": "cardano-relay2.everstake.one", + "address": "eu.bloompool.io", "port": 3001 } ] }, { - "accumulatedStake": 0.5452789722775988, - "relativeStake": 0.002174740359107583, + "accumulatedStake": 0.5569189503111706, + "relativeStake": 0.0022184149568157787, "relays": [ { - "address": "relay-pool-bitvavo-2-mainnet.cardano.aeq5f.com" - } - ] - }, - { - "accumulatedStake": 0.547451753984116, - "relativeStake": 0.0021727817065172765, - "relays": [ - { - "address": "relay.azureada.com", - "port": 3001 + "address": "35.211.17.86", + "port": 3000 }, { - "address": "relay.azureada.com", - "port": 3001 + "address": "34.23.88.7", + "port": 3000 } ] }, { - "accumulatedStake": 0.5496139851237356, - "relativeStake": 0.0021622311396195986, + "accumulatedStake": 0.5591342671671027, + "relativeStake": 0.002215316855932139, "relays": [ { - "address": "relay-pool-bitvavo-3-mainnet.cardano.aeq5f.com" - } - ] - }, - { - "accumulatedStake": 0.5517723514451625, - "relativeStake": 0.002158366321426845, - "relays": [ + "address": "ACLrelay1.cardanoland.com", + "port": 6000 + }, { - "address": "cardano-main.everstake.one", - "port": 3001 + "address": "ACLrelay2.cardanoland.com", + "port": 7000 }, { - "address": "cardano-main2.everstake.one", - "port": 3001 + "address": "ACLrelay3.cardanoland.com", + "port": 8000 }, { - "address": "cardano-relay.everstake.one", - "port": 3001 + "address": "ACLrelay4.cardanoland.com", + "port": 6000 }, { - "address": "cardano-relay1.everstake.one", - "port": 3001 + "address": "ACLrelay5.cardanoland.com", + "port": 7000 }, { - "address": "cardano-relay2.everstake.one", - "port": 3001 + "address": "ACLrelay6.cardanoland.com", + "port": 8000 } ] }, { - "accumulatedStake": 0.5539262567534654, - "relativeStake": 0.0021539053083028913, + "accumulatedStake": 0.5613441009778928, + "relativeStake": 0.0022098338107901625, "relays": [ { - "address": "relay1.able-pool.io", - "port": 4555 + "address": "3.217.90.52", + "port": 6000 }, { - "address": "relay2.able-pool.io", - "port": 4419 + "address": "3.219.254.127", + "port": 6000 } ] }, { - "accumulatedStake": 0.5560633733823807, - "relativeStake": 0.0021371166289152425, + "accumulatedStake": 0.5635316439527023, + "relativeStake": 0.002187542974809437, "relays": [ { - "address": "95.192.156.35", - "port": 6000 - }, + "address": "relay-pool-bitvavo-2-mainnet.cardano.aeq5f.com" + } + ] + }, + { + "accumulatedStake": 0.5657050460039165, + "relativeStake": 0.002173402051214181, + "relays": [ { - "address": "215.51.197.18", - "port": 6000 + "address": "relay-pool-bitvavo-3-mainnet.cardano.aeq5f.com" } ] }, { - "accumulatedStake": 0.5581836767662953, - "relativeStake": 0.002120303383914668, + "accumulatedStake": 0.5678758768503668, + "relativeStake": 0.002170830846450335, "relays": [ { "address": "relay1.blueocean.sg", @@ -2600,194 +2672,179 @@ ] }, { - "accumulatedStake": 0.5602807884331025, - "relativeStake": 0.0020971116668072084, + "accumulatedStake": 0.5700418579240493, + "relativeStake": 0.002165981073682473, "relays": [ { - "address": "relay.cardano.securestaking.io", + "address": "r1.adastat.net", + "port": 3333 + }, + { + "address": "r2.adastat.net", + "port": 3333 + }, + { + "address": "r3.adastat.net", + "port": 3333 + } + ] + }, + { + "accumulatedStake": 0.5721712709815225, + "relativeStake": 0.0021294130574732464, + "relays": [ + { + "address": "relay.cardano.securestaking.io", + "port": 3000 + }, + { + "address": "secur2.cardano.securestaking.io", + "port": 3000 + } + ] + }, + { + "accumulatedStake": 0.5742754321037465, + "relativeStake": 0.0021041611222240688, + "relays": [ + { + "address": "relay0.fimi.vn", + "port": 3000 + }, + { + "address": "relay1.fimi.vn", "port": 3000 }, { - "address": "secur2.cardano.securestaking.io", + "address": "relay2.fimi.vn", "port": 3000 } ] }, { - "accumulatedStake": 0.56237450255604, - "relativeStake": 0.0020937141229375885, + "accumulatedStake": 0.5763736581520984, + "relativeStake": 0.0020982260483518238, "relays": [ { - "address": "42.193.216.88", + "address": "relay1-dl.aichi-stakepool.com", "port": 6000 }, { - "address": "38.193.216.88", + "address": "relay2-jp.aichi-stakepool.com", "port": 6000 }, { - "address": "39.193.216.88", + "address": "relay3-li.aichi-stakepool.com", "port": 6000 } ] }, { - "accumulatedStake": 0.5644601656005398, - "relativeStake": 0.0020856630444997786, + "accumulatedStake": 0.5784679661186758, + "relativeStake": 0.002094307966577436, "relays": [ { - "address": "86.17.211.35", + "address": "35.211.17.86", "port": 3000 }, { - "address": "7.88.23.34", + "address": "34.23.88.7", "port": 3000 } ] }, { - "accumulatedStake": 0.5665380143724658, - "relativeStake": 0.0020778487719259452, - "relays": [ - { - "address": "cardano-main.everstake.one", - "port": 3001 - }, - { - "address": "cardano-main2.everstake.one", - "port": 3001 - }, - { - "address": "cardano-relay.everstake.one", - "port": 3001 - }, - { - "address": "cardano-relay1.everstake.one", - "port": 3001 - }, - { - "address": "cardano-relay2.everstake.one", - "port": 3001 - } - ] - }, - { - "accumulatedStake": 0.568605038333113, - "relativeStake": 0.0020670239606472214, + "accumulatedStake": 0.5805284645968883, + "relativeStake": 0.002060498478212516, "relays": [ { - "address": "eu.relays.cardanians.io", - "port": 1000 - }, - { - "address": "ca.relays.cardanians.io", - "port": 1000 + "address": "relay-pool-figment-3-mainnet.cardano.aeq5f.com" } ] }, { - "accumulatedStake": 0.5706453822519215, - "relativeStake": 0.0020403439188084876, + "accumulatedStake": 0.5825858914791722, + "relativeStake": 0.002057426882283819, "relays": [ { - "address": "relay1-dl.aichi-stakepool.com", - "port": 6000 - }, - { - "address": "relay2-jp.aichi-stakepool.com", + "address": "109.123.231.213", "port": 6000 }, { - "address": "relay3-li.aichi-stakepool.com", + "address": "89.58.45.244", "port": 6000 } ] }, { - "accumulatedStake": 0.5726786327279993, - "relativeStake": 0.002033250476077876, + "accumulatedStake": 0.5846406729382763, + "relativeStake": 0.0020547814591040897, "relays": [ { - "address": "cardano-main.everstake.one", + "address": "cardano-main.everstake.com", "port": 3001 }, { - "address": "cardano-main2.everstake.one", + "address": "cardano-main2.everstake.com", "port": 3001 }, { - "address": "cardano-relay.everstake.one", + "address": "cardano-relay.everstake.com", "port": 3001 }, { - "address": "cardano-relay1.everstake.one", + "address": "cardano-relay1.everstake.com", "port": 3001 }, { - "address": "cardano-relay2.everstake.one", + "address": "cardano-relay2.everstake.com", "port": 3001 } ] }, { - "accumulatedStake": 0.5747089626651583, - "relativeStake": 0.002030329937158899, + "accumulatedStake": 0.5866698580143551, + "relativeStake": 0.0020291850760788574, "relays": [ { - "address": "213.231.123.109", - "port": 6000 + "address": "cardano-main.everstake.com", + "port": 3001 }, { - "address": "244.45.58.89", - "port": 6000 - } - ] - }, - { - "accumulatedStake": 0.5767172544545587, - "relativeStake": 0.0020082917894004423, - "relays": [ - { - "address": "151.21.53.152", - "port": 6000 + "address": "cardano-main2.everstake.com", + "port": 3001 }, { - "address": "63.152.102.149", - "port": 6000 - } - ] - }, - { - "accumulatedStake": 0.5787199604453425, - "relativeStake": 0.0020027059907837203, - "relays": [ + "address": "cardano-relay.everstake.com", + "port": 3001 + }, { - "address": "relay1.0aaaa.org", + "address": "cardano-relay1.everstake.com", "port": 3001 }, { - "address": "relay2.0aaaa.org", + "address": "cardano-relay2.everstake.com", "port": 3001 } ] }, { - "accumulatedStake": 0.5807095505835773, - "relativeStake": 0.001989590138234822, + "accumulatedStake": 0.5886754554594746, + "relativeStake": 0.0020055974451195333, "relays": [ { - "address": "cardano-relay1.nodes.lgns.xyz", - "port": 6000 + "address": "relay.azureada.com", + "port": 3001 }, { - "address": "cardano-relay2.nodes.lgns.xyz", - "port": 6000 + "address": "relay.azureada.com", + "port": 3001 } ] }, { - "accumulatedStake": 0.5826980535966266, - "relativeStake": 0.001988503013049387, + "accumulatedStake": 0.5906771345536959, + "relativeStake": 0.002001679094221229, "relays": [ { "address": "cardano-relays-1.nu.fi", @@ -2800,26 +2857,22 @@ ] }, { - "accumulatedStake": 0.5846840593036701, - "relativeStake": 0.0019860057070434037, + "accumulatedStake": 0.5926754735325814, + "relativeStake": 0.001998338978885562, "relays": [ { - "address": "relay0.fimi.vn", - "port": 3000 - }, - { - "address": "relay1.fimi.vn", - "port": 3000 + "address": "cardano-relay1.nodes.lgns.xyz", + "port": 6000 }, { - "address": "relay2.fimi.vn", - "port": 3000 + "address": "cardano-relay2.nodes.lgns.xyz", + "port": 6000 } ] }, { - "accumulatedStake": 0.5866642872573108, - "relativeStake": 0.001980227953640767, + "accumulatedStake": 0.5946664023189131, + "relativeStake": 0.0019909287863316798, "relays": [ { "address": "relay-pool-bitvavo-1-mainnet.cardano.aeq5f.com" @@ -2827,375 +2880,330 @@ ] }, { - "accumulatedStake": 0.5886406098437236, - "relativeStake": 0.001976322586412771, + "accumulatedStake": 0.5966214232282798, + "relativeStake": 0.001955020909366724, "relays": [ { - "address": "germany.cardanode.io", - "port": 6000 - }, - { - "address": "missouri.cardanode.io", - "port": 6000 - }, - { - "address": "la.cardanode.io", - "port": 6000 + "address": "relay-kiln-8-0.cardano.mainnet.kiln.fi", + "port": 3001 }, { - "address": "perth.cardanode.io", - "port": 6000 - } - ] - }, - { - "accumulatedStake": 0.5905840532701321, - "relativeStake": 0.001943443426408455, - "relays": [ - { - "address": "229.68.27.37", - "port": 6000 + "address": "relay-kiln-8-1.cardano.mainnet.kiln.fi", + "port": 3001 }, { - "address": "51.18.58.89", - "port": 6000 + "address": "relay-kiln-8-2.cardano.mainnet.kiln.fi", + "port": 3001 } ] }, { - "accumulatedStake": 0.5925121967854174, - "relativeStake": 0.0019281435152854283, + "accumulatedStake": 0.5985728133845801, + "relativeStake": 0.0019513901563002701, "relays": [ { - "address": "relay-kiln-9-0.cardano.mainnet.kiln.fi", + "address": "relaynode1.bravostakepool.nl", "port": 3001 }, { - "address": "relay-kiln-9-1.cardano.mainnet.kiln.fi", + "address": "relaynode2.bravostakepool.nl", "port": 3001 }, { - "address": "relay-kiln-9-2.cardano.mainnet.kiln.fi", + "address": "relaynode3.bravostakepool.nl", "port": 3001 } ] }, { - "accumulatedStake": 0.5944360119065782, - "relativeStake": 0.001923815121160807, + "accumulatedStake": 0.6005070296202005, + "relativeStake": 0.0019342162356204102, "relays": [ { - "address": "23.17.113.148", - "port": 6000 - }, - { - "address": "103.25.69.158", - "port": 6000 - }, - { - "address": "238.70.216.95", - "port": 6000 - }, - { - "address": "196.140.102.149", + "address": "217.160.14.223", "port": 6000 } ] }, { - "accumulatedStake": 0.5963561671533798, - "relativeStake": 0.0019201552468015132, + "accumulatedStake": 0.6024314390773762, + "relativeStake": 0.0019244094571756953, "relays": [ { - "address": "eu1.stakecool.io", - "port": 4001 + "address": "relay1.adaocean.com", + "port": 6000 }, { - "address": "eu2.stakecool.io", - "port": 4001 + "address": "relay2.adaocean.com", + "port": 6000 }, { - "address": "eu3.stakecool.io", - "port": 4002 + "address": "relay3.adaocean.com", + "port": 6000 }, { - "address": "eu4.stakecool.io", - "port": 4002 + "address": "relay4.adaocean.com", + "port": 6000 + }, + { + "address": "relay5.adaocean.com", + "port": 6000 } ] }, { - "accumulatedStake": 0.5982596193914641, - "relativeStake": 0.0019034522380842948, + "accumulatedStake": 0.6043548230813641, + "relativeStake": 0.001923384003987907, "relays": [ { - "address": "gateway.adavault.com", - "port": 4021 - }, - { - "address": "gateway.adavault.com", - "port": 4022 - }, - { - "address": "gateway.adavault.com", - "port": 4026 - }, - { - "address": "gateway.adavault.com", - "port": 4027 - }, - { - "address": "gateway2.adavault.com", - "port": 4060 + "address": "35.156.192.95", + "port": 6000 }, { - "address": "gateway2.adavault.com", - "port": 4061 + "address": "18.197.51.215", + "port": 6000 } ] }, { - "accumulatedStake": 0.6001406639981915, - "relativeStake": 0.001881044606727422, + "accumulatedStake": 0.6062759382296868, + "relativeStake": 0.0019211151483227238, "relays": [ { - "address": "relay0.viperstaking.com", - "port": 4444 + "address": "92a8429c.cardano-relay.herd.run", + "port": 1338 } ] }, { - "accumulatedStake": 0.6020202584907764, - "relativeStake": 0.0018795944925849661, + "accumulatedStake": 0.6081947259407998, + "relativeStake": 0.001918787711112987, "relays": [ { - "address": "cardano-main.everstake.one", - "port": 3001 - }, - { - "address": "cardano-main2.everstake.one", - "port": 3001 + "address": "germany.cardanode.io", + "port": 6000 }, { - "address": "cardano-relay.everstake.one", - "port": 3001 + "address": "missouri.cardanode.io", + "port": 6000 }, { - "address": "cardano-relay1.everstake.one", - "port": 3001 + "address": "la.cardanode.io", + "port": 6000 }, { - "address": "cardano-relay2.everstake.one", - "port": 3001 + "address": "perth.cardanode.io", + "port": 6000 } ] }, { - "accumulatedStake": 0.6038987141800749, - "relativeStake": 0.0018784556892984202, + "accumulatedStake": 0.6101120848656427, + "relativeStake": 0.0019173589248428378, "relays": [ { - "address": "relay1.zetetic.tech", - "port": 3001 - }, - { - "address": "relay2.zetetic.tech", - "port": 3001 - }, - { - "address": "relay3.zetetic.tech", - "port": 3001 + "address": "66.160.158.69", + "port": 6000 }, { - "address": "relay4.zetetic.tech", - "port": 3001 + "address": "66.160.158.70", + "port": 6000 } ] }, { - "accumulatedStake": 0.6057743037214485, - "relativeStake": 0.001875589541373524, + "accumulatedStake": 0.6120195500976833, + "relativeStake": 0.0019074652320406362, "relays": [ { - "address": "relay-kiln-8-0.cardano.mainnet.kiln.fi", - "port": 3001 - }, - { - "address": "relay-kiln-8-1.cardano.mainnet.kiln.fi", - "port": 3001 - }, - { - "address": "relay-kiln-8-2.cardano.mainnet.kiln.fi", + "address": "relays.bladepool.com", "port": 3001 } ] }, { - "accumulatedStake": 0.6076453760102749, - "relativeStake": 0.0018710722888264598, + "accumulatedStake": 0.6139233597252975, + "relativeStake": 0.0019038096276142243, "relays": [ { - "address": "116.cardano.staked.cloud", - "port": 3001 + "address": "relay0.viperstaking.com", + "port": 4444 } ] }, { - "accumulatedStake": 0.6095142989496983, - "relativeStake": 0.0018689229394234178, + "accumulatedStake": 0.6158003391293084, + "relativeStake": 0.0018769794040108703, "relays": [ { - "address": "69.158.160.66", - "port": 6000 - }, - { - "address": "70.158.160.66", - "port": 6000 + "address": "116.cardano.staked.cloud", + "port": 3001 } ] }, { - "accumulatedStake": 0.6113547818571127, - "relativeStake": 0.0018404829074144201, + "accumulatedStake": 0.6176747636806711, + "relativeStake": 0.0018744245513626504, "relays": [ { - "address": "bd-cardano-main-relay-5-a.bdnodes.net", - "port": 6000 + "address": "relay.cardano.securestaking.io", + "port": 3000 }, { - "address": "bd-cardano-main-relay-5-b.bdnodes.net", - "port": 6000 + "address": "secur2.cardano.securestaking.io", + "port": 3000 } ] }, { - "accumulatedStake": 0.6131721377547631, - "relativeStake": 0.001817355897650401, + "accumulatedStake": 0.6195488594661811, + "relativeStake": 0.0018740957855100195, "relays": [ { - "address": "117.203.187.170", - "port": 6000 - }, - { - "address": "8.203.255.173", - "port": 6000 + "address": "relay-pool-figment-13-mainnet.cardano.aeq5f.com" } ] }, { - "accumulatedStake": 0.6149810357807676, - "relativeStake": 0.0018088980260044113, + "accumulatedStake": 0.6214110823011194, + "relativeStake": 0.0018622228349383346, "relays": [ { - "address": "clio.one" + "address": "cardano-main.everstake.com", + "port": 3001 }, { - "address": "91.193.161.185", - "port": 6010 + "address": "cardano-main2.everstake.com", + "port": 3001 }, { - "address": "84.123.211.80", - "port": 6010 + "address": "cardano-relay.everstake.com", + "port": 3001 }, { - "address": "2a07:c700:0:700::91", - "port": 6010 + "address": "cardano-relay1.everstake.com", + "port": 3001 + }, + { + "address": "cardano-relay2.everstake.com", + "port": 3001 } ] }, { - "accumulatedStake": 0.6167850884619853, - "relativeStake": 0.0018040526812177597, + "accumulatedStake": 0.6232530763386381, + "relativeStake": 0.001841994037518711, "relays": [ { - "address": "relay1.adaocean.com", - "port": 6000 - }, - { - "address": "relay2.adaocean.com", - "port": 6000 + "address": "clio.one" }, { - "address": "relay3.adaocean.com", - "port": 6000 + "address": "185.161.193.91", + "port": 6010 }, { - "address": "relay4.adaocean.com", - "port": 6000 + "address": "80.211.123.84", + "port": 6010 }, - { - "address": "relay5.adaocean.com", - "port": 6000 + { + "address": "2a07:c700:0:700::91", + "port": 6010 } ] }, { - "accumulatedStake": 0.618572826291369, - "relativeStake": 0.0017877378293837231, + "accumulatedStake": 0.625090709530904, + "relativeStake": 0.00183763319226589, "relays": [ { - "address": "223.14.160.217", - "port": 6000 + "address": "relay.cardano.securestaking.io", + "port": 3000 + }, + { + "address": "secur2.cardano.securestaking.io", + "port": 3000 } ] }, { - "accumulatedStake": 0.6203355453666106, - "relativeStake": 0.0017627190752416513, + "accumulatedStake": 0.6269258529104996, + "relativeStake": 0.001835143379595623, "relays": [ { - "address": "relay1-us.xstakepool.com", + "address": "139.59.200.123", "port": 3001 }, { - "address": "relay2-eu.xstakepool.com", + "address": "129.212.154.208", "port": 3001 }, { - "address": "relay3-sg.xstakepool.com", + "address": "129.212.214.149", "port": 3001 - }, + } + ] + }, + { + "accumulatedStake": 0.6287519232985608, + "relativeStake": 0.0018260703880611487, + "relays": [ { - "address": "relay4-ae.xstakepool.com", - "port": 3001 + "address": "18.157.253.103", + "port": 8381 } ] }, { - "accumulatedStake": 0.6220925477499452, - "relativeStake": 0.001757002383334479, + "accumulatedStake": 0.6305744488517058, + "relativeStake": 0.0018225255531450024, "relays": [ { - "address": "134.228.245.157", - "port": 3001 - }, + "address": "relay2.snakepool.link", + "port": 3002 + } + ] + }, + { + "accumulatedStake": 0.6323818732530899, + "relativeStake": 0.0018074244013841412, + "relays": [ { - "address": "164.120.89.159", - "port": 3001 + "address": "170.187.203.117", + "port": 6000 }, { - "address": "44.186.97.209", - "port": 3001 + "address": "173.255.203.8", + "port": 6000 + } + ] + }, + { + "accumulatedStake": 0.6341757402570924, + "relativeStake": 0.0017938670040025125, + "relays": [ + { + "address": "bd-cardano-main-relay-5-a.bdnodes.net", + "port": 6000 }, { - "address": "na.bloompool.io", - "port": 3001 + "address": "bd-cardano-main-relay-5-b.bdnodes.net", + "port": 6000 } ] }, { - "accumulatedStake": 0.6238380599578405, - "relativeStake": 0.0017455122078952913, + "accumulatedStake": 0.6359349765831955, + "relativeStake": 0.0017592363261031505, "relays": [ { - "address": "103.253.157.18", - "port": 8381 + "address": "67680868.cardano-relay.herd.run", + "port": 1338 } ] }, { - "accumulatedStake": 0.6255809109085879, - "relativeStake": 0.0017428509507474831, + "accumulatedStake": 0.6376861250420863, + "relativeStake": 0.0017511484588907604, "relays": [ { "address": "cardano-relays-1.nu.fi", @@ -3208,72 +3216,66 @@ ] }, { - "accumulatedStake": 0.6273236407494499, - "relativeStake": 0.0017427298408619848, + "accumulatedStake": 0.6394356947391474, + "relativeStake": 0.0017495696970610355, "relays": [ { - "address": "relay.cardano.securestaking.io", - "port": 3000 + "address": "37.27.68.229", + "port": 6000 }, { - "address": "secur2.cardano.securestaking.io", - "port": 3000 + "address": "89.58.18.51", + "port": 6000 } ] }, { - "accumulatedStake": 0.6290617823373637, - "relativeStake": 0.0017381415879137241, + "accumulatedStake": 0.6411761438474243, + "relativeStake": 0.001740449108276899, "relays": [ { - "address": "relay1.adaocean.com", - "port": 6000 - }, - { - "address": "relay2.adaocean.com", - "port": 6000 + "address": "157.245.228.134", + "port": 3001 }, { - "address": "relay3.adaocean.com", - "port": 6000 + "address": "159.89.120.164", + "port": 3001 }, { - "address": "relay4.adaocean.com", - "port": 6000 + "address": "209.97.186.44", + "port": 3001 }, { - "address": "relay5.adaocean.com", - "port": 6000 - } - ] - }, - { - "accumulatedStake": 0.6307838165687589, - "relativeStake": 0.001722034231395349, - "relays": [ - { - "address": "north-america-relay.jpn-sp.net", + "address": "na.bloompool.io", "port": 3001 } ] }, { - "accumulatedStake": 0.6325031211718264, - "relativeStake": 0.0017193046030673852, + "accumulatedStake": 0.6429134835151361, + "relativeStake": 0.001737339667711854, "relays": [ { - "address": "btc-cardano-main-relay-00-a.bdnodes.net", + "address": "148.113.17.23", "port": 6000 }, { - "address": "btc-cardano-main-relay-00-b.bdnodes.net", + "address": "158.69.25.103", + "port": 6000 + }, + { + "address": "95.216.70.238", + "port": 6000 + }, + { + "address": "149.102.140.196", "port": 6000 } ] }, { - "accumulatedStake": 0.634213838608823, - "relativeStake": 0.0017107174369965874, + "accumulatedStake": 0.6446334045515203, + "relativeStake": 0.0017199210363841293, "relays": [ { "address": "cardano-relay-1.upbit.com", @@ -3290,8 +3292,8 @@ ] }, { - "accumulatedStake": 0.6359208248410955, - "relativeStake": 0.0017069862322725408, + "accumulatedStake": 0.6463498374325157, + "relativeStake": 0.001716432880995435, "relays": [ { "address": "cardano-relay-1.upbit.com", @@ -3308,8 +3310,8 @@ ] }, { - "accumulatedStake": 0.6376260187731728, - "relativeStake": 0.001705193932077326, + "accumulatedStake": 0.6480648646421495, + "relativeStake": 0.001715027209633812, "relays": [ { "address": "cardano-relay-1.upbit.com", @@ -3326,54 +3328,32 @@ ] }, { - "accumulatedStake": 0.6393296129455525, - "relativeStake": 0.0017035941723796094, + "accumulatedStake": 0.6497764439049192, + "relativeStake": 0.0017115792627696422, "relays": [ { - "address": "adar1.stakit.io", - "port": 30500 + "address": "north-america-relay.jpn-sp.net", + "port": 3001 } ] }, { - "accumulatedStake": 0.6410291798588725, - "relativeStake": 0.0016995669133201233, + "accumulatedStake": 0.6514737219822213, + "relativeStake": 0.001697278077302112, "relays": [ { - "address": "224.49.176.64", + "address": "btc-cardano-main-relay-00-a.bdnodes.net", "port": 6000 }, { - "address": "63.161.28.149", + "address": "btc-cardano-main-relay-00-b.bdnodes.net", "port": 6000 } ] }, { - "accumulatedStake": 0.6427133214890756, - "relativeStake": 0.001684141630202982, - "relays": [ - { - "address": "rho.relay.easy1staking.com", - "port": 30020 - }, - { - "address": "pi.relay.easy1staking.com", - "port": 30021 - }, - { - "address": "eu-central-1.relay.easy1staking.com", - "port": 30000 - }, - { - "address": "us-east-1.relay.easy1staking.com", - "port": 30000 - } - ] - }, - { - "accumulatedStake": 0.644391965378605, - "relativeStake": 0.0016786438895294686, + "accumulatedStake": 0.6531616743408779, + "relativeStake": 0.0016879523586566844, "relays": [ { "address": "cardano-relay-2.upbit.com", @@ -3390,423 +3370,508 @@ ] }, { - "accumulatedStake": 0.6460705101098909, - "relativeStake": 0.0016785447312859271, + "accumulatedStake": 0.6548326865436552, + "relativeStake": 0.0016710122027772476, "relays": [ { - "address": "cardano-relay-1.upbit.com", - "port": 30800 - }, + "address": "0b2a2fd4.cardano-relay.bison.run", + "port": 1338 + } + ] + }, + { + "accumulatedStake": 0.6564988000161904, + "relativeStake": 0.0016661134725352643, + "relays": [ { - "address": "cardano-relay-2.upbit.com", - "port": 30800 - }, + "address": "07f6ea55.cardano-relay.herd.run", + "port": 1338 + } + ] + }, + { + "accumulatedStake": 0.6581647966078474, + "relativeStake": 0.0016659965916569282, + "relays": [ { - "address": "cardano-relay-3.upbit.com", - "port": 30800 + "address": "a1666f4c.cardano-relay.herd.run", + "port": 1338 } ] }, { - "accumulatedStake": 0.6477439655348424, - "relativeStake": 0.0016734554249514552, + "accumulatedStake": 0.6598306826868352, + "relativeStake": 0.0016658860789878448, "relays": [ { - "address": "28.184.128.57", - "port": 3001 - }, + "address": "84cbba68.cardano-relay.herd.run", + "port": 1338 + } + ] + }, + { + "accumulatedStake": 0.6614965287211069, + "relativeStake": 0.0016658460342716696, + "relays": [ { - "address": "30.184.128.57", + "address": "3ef2283d.cardano-relay.bison.run", + "port": 1338 + } + ] + }, + { + "accumulatedStake": 0.6631595906579604, + "relativeStake": 0.001663061936853446, + "relays": [ + { + "address": "52.6.109.221", "port": 3001 } ] }, { - "accumulatedStake": 0.6494138347236943, - "relativeStake": 0.001669869188851931, + "accumulatedStake": 0.6648181240161833, + "relativeStake": 0.0016585333582230428, "relays": [ { - "address": "relay-pool-figment-9-mainnet.cardano.aeq5f.com" + "address": "169.58.185.200", + "port": 6000 + }, + { + "address": "169.58.186.9", + "port": 6000 + }, + { + "address": "169.58.186.24", + "port": 6000 } ] }, { - "accumulatedStake": 0.6510788602938906, - "relativeStake": 0.0016650255701963106, + "accumulatedStake": 0.6664742098251282, + "relativeStake": 0.0016560858089447999, "relays": [ { - "address": "cardano-main.everstake.one", + "address": "relays.digi.pro", "port": 3001 - }, + } + ] + }, + { + "accumulatedStake": 0.6681300519694447, + "relativeStake": 0.0016558421443165954, + "relays": [ { - "address": "cardano-main2.everstake.one", + "address": "relay1.zetetic.tech", "port": 3001 }, { - "address": "cardano-relay.everstake.one", + "address": "relay2.zetetic.tech", "port": 3001 }, { - "address": "cardano-relay1.everstake.one", + "address": "relay3.zetetic.tech", "port": 3001 }, { - "address": "cardano-relay2.everstake.one", + "address": "relay4.zetetic.tech", "port": 3001 } ] }, { - "accumulatedStake": 0.6527434849307499, - "relativeStake": 0.001664624636859269, + "accumulatedStake": 0.6697841328442863, + "relativeStake": 0.0016540808748415183, "relays": [ { - "address": "0b2a2fd4.cardano-relay.bison.run", - "port": 1338 + "address": "148.113.17.23", + "port": 6000 + }, + { + "address": "158.69.25.103", + "port": 6000 + }, + { + "address": "95.216.4.252", + "port": 6000 + }, + { + "address": "178.18.250.204", + "port": 6000 } ] }, { - "accumulatedStake": 0.6544078618717506, - "relativeStake": 0.0016643769410006472, + "accumulatedStake": 0.6714293768447281, + "relativeStake": 0.0016452440004417995, "relays": [ { - "address": "07f6ea55.cardano-relay.herd.run", - "port": 1338 + "address": "relay-pool-figment-9-mainnet.cardano.aeq5f.com" } ] }, { - "accumulatedStake": 0.6560720763115534, - "relativeStake": 0.0016642144398029029, + "accumulatedStake": 0.6730663731849615, + "relativeStake": 0.0016369963402334624, "relays": [ { - "address": "3ef2283d.cardano-relay.bison.run", - "port": 1338 + "address": "relay-pool-figment-25-mainnet.cardano.aeq5f.com" } ] }, { - "accumulatedStake": 0.6577362886604072, - "relativeStake": 0.0016642123488537779, + "accumulatedStake": 0.6746868931422207, + "relativeStake": 0.0016205199572591686, "relays": [ { - "address": "e646e266.cardano-relay.bison.run", - "port": 1338 + "address": "cardano-main.everstake.com", + "port": 3001 + }, + { + "address": "cardano-main2.everstake.com", + "port": 3001 + }, + { + "address": "cardano-relay.everstake.com", + "port": 3001 + }, + { + "address": "cardano-relay1.everstake.com", + "port": 3001 + }, + { + "address": "cardano-relay2.everstake.com", + "port": 3001 } ] }, { - "accumulatedStake": 0.6594003875418183, - "relativeStake": 0.0016640988814110936, + "accumulatedStake": 0.6762898762597854, + "relativeStake": 0.0016029831175646994, "relays": [ { - "address": "84cbba68.cardano-relay.herd.run", - "port": 1338 + "address": "adaboy-mainnet-2a.gleeze.com", + "port": 6000 + }, + { + "address": "adaboy-mainnet-3a.gleeze.com", + "port": 6000 } ] }, { - "accumulatedStake": 0.6610644650911441, - "relativeStake": 0.0016640775493257797, + "accumulatedStake": 0.6778619399043374, + "relativeStake": 0.001572063644552006, "relays": [ { - "address": "a1666f4c.cardano-relay.herd.run", - "port": 1338 + "address": "3.221.184.134", + "port": 3001 } ] }, { - "accumulatedStake": 0.6627281545339267, - "relativeStake": 0.0016636894427826908, + "accumulatedStake": 0.6794311812343337, + "relativeStake": 0.0015692413299962327, "relays": [ { - "address": "cf5r1.mainnet.pool.cardanofoundation.org", - "port": 3001 + "address": "cardano-relay-1.upbit.com", + "port": 30800 }, { - "address": "cf5r2.mainnet.pool.cardanofoundation.org", - "port": 3001 + "address": "cardano-relay-2.upbit.com", + "port": 30800 + }, + { + "address": "cardano-relay-3.upbit.com", + "port": 30800 } ] }, { - "accumulatedStake": 0.6643827806638513, - "relativeStake": 0.0016546261299245208, + "accumulatedStake": 0.6809981647367833, + "relativeStake": 0.0015669835024496087, "relays": [ { - "address": "221.109.6.52", + "address": "195.201.143.213", + "port": 3001 + }, + { + "address": "194.233.70.237", + "port": 3001 + }, + { + "address": "89.58.59.127", "port": 3001 } ] }, { - "accumulatedStake": 0.6660108621508252, - "relativeStake": 0.0016280814869738805, + "accumulatedStake": 0.682560402939401, + "relativeStake": 0.0015622382026177833, "relays": [ { - "address": "134.228.245.157", - "port": 3001 - }, - { - "address": "164.120.89.159", - "port": 3001 + "address": "cardano-relay-2.upbit.com", + "port": 30800 }, { - "address": "44.186.97.209", - "port": 3001 + "address": "cardano-relay-3.upbit.com", + "port": 30800 }, { - "address": "eu.bloompool.io", - "port": 3001 + "address": "cardano-relay-1.upbit.com", + "port": 30800 } ] }, { - "accumulatedStake": 0.6676385798445247, - "relativeStake": 0.0016277176936994994, + "accumulatedStake": 0.6841210657416846, + "relativeStake": 0.0015606628022835226, "relays": [ { - "address": "relay1.apexfusionhosting.com", - "port": 3001 + "address": "cardano-relay-1.upbit.com", + "port": 30800 }, { - "address": "relay2.apexfusionhosting.com", - "port": 3001 + "address": "cardano-relay-2.upbit.com", + "port": 30800 + }, + { + "address": "cardano-relay-3.upbit.com", + "port": 30800 } ] }, { - "accumulatedStake": 0.6692539391308432, - "relativeStake": 0.0016153592863185225, + "accumulatedStake": 0.6856810482767811, + "relativeStake": 0.0015599825350964861, "relays": [ { - "address": "cardano-main.everstake.one", - "port": 3001 + "address": "cardano-relay-1.upbit.com", + "port": 30800 }, { - "address": "cardano-main2.everstake.one", - "port": 3001 + "address": "cardano-relay-2.upbit.com", + "port": 30800 }, { - "address": "cardano-relay.everstake.one", - "port": 3001 + "address": "cardano-relay-3.upbit.com", + "port": 30800 + } + ] + }, + { + "accumulatedStake": 0.687237851911875, + "relativeStake": 0.0015568036350939037, + "relays": [ + { + "address": "cardano-relay-1.upbit.com", + "port": 30800 }, { - "address": "cardano-relay1.everstake.one", - "port": 3001 + "address": "cardano-relay-2.upbit.com", + "port": 30800 }, { - "address": "cardano-relay2.everstake.one", - "port": 3001 + "address": "cardano-relay-3.upbit.com", + "port": 30800 } ] }, { - "accumulatedStake": 0.6708635531528467, - "relativeStake": 0.0016096140220035187, + "accumulatedStake": 0.6887892348090332, + "relativeStake": 0.0015513828971582097, "relays": [ { - "address": "eu.relays.cardanians.io", - "port": 1000 + "address": "cardano-relay-2.upbit.com", + "port": 30800 }, { - "address": "ca.relays.cardanians.io", - "port": 1000 + "address": "cardano-relay-3.upbit.com", + "port": 30800 + }, + { + "address": "cardano-relay-1.upbit.com", + "port": 30800 } ] }, { - "accumulatedStake": 0.6724644061883924, - "relativeStake": 0.0016008530355457078, + "accumulatedStake": 0.6903402488658155, + "relativeStake": 0.0015510140567822368, "relays": [ { - "address": "213.143.201.195", + "address": "139.59.200.123", "port": 3001 }, { - "address": "237.70.233.194", + "address": "129.212.154.208", "port": 3001 }, { - "address": "127.59.58.89", + "address": "129.212.214.149", "port": 3001 } ] }, { - "accumulatedStake": 0.674065054790454, - "relativeStake": 0.0016006486020615936, + "accumulatedStake": 0.6918889958685525, + "relativeStake": 0.0015487470027370491, "relays": [ { - "address": "relay1.adaocean.com", - "port": 6000 - }, - { - "address": "relay2.adaocean.com", - "port": 6000 - }, - { - "address": "relay3.adaocean.com", - "port": 6000 + "address": "cardano-relay-1.upbit.com", + "port": 30800 }, { - "address": "relay4.adaocean.com", - "port": 6000 + "address": "cardano-relay-2.upbit.com", + "port": 30800 }, { - "address": "relay5.adaocean.com", - "port": 6000 + "address": "cardano-relay-3.upbit.com", + "port": 30800 } ] }, { - "accumulatedStake": 0.6756627873860951, - "relativeStake": 0.0015977325956410876, + "accumulatedStake": 0.6934363031137971, + "relativeStake": 0.0015473072452446353, "relays": [ { - "address": "42.193.216.88", - "port": 6000 + "address": "relay1-us.xstakepool.com", + "port": 3001 }, { - "address": "38.193.216.88", - "port": 6000 + "address": "relay2-eu.xstakepool.com", + "port": 3001 }, { - "address": "39.193.216.88", - "port": 6000 + "address": "relay3-ag.xstakepool.com", + "port": 3001 } ] }, { - "accumulatedStake": 0.6772466566436263, - "relativeStake": 0.0015838692575311669, + "accumulatedStake": 0.6949785802847129, + "relativeStake": 0.0015422771709158113, "relays": [ { - "address": "115.131.235.13", + "address": "relay1.0aaaa.org", + "port": 3001 + }, + { + "address": "relay2.0aaaa.org", "port": 3001 } ] }, { - "accumulatedStake": 0.6788251887712076, - "relativeStake": 0.0015785321275813258, + "accumulatedStake": 0.6965197911555547, + "relativeStake": 0.001541210870841826, "relays": [ { - "address": "23.17.113.148", - "port": 6000 + "address": "eu1.stakecool.io", + "port": 4001 }, { - "address": "103.25.69.158", - "port": 6000 + "address": "eu2.stakecool.io", + "port": 4001 }, { - "address": "252.4.216.95", - "port": 6000 + "address": "eu3.stakecool.io", + "port": 4002 }, { - "address": "204.250.18.178", - "port": 6000 + "address": "eu4.stakecool.io", + "port": 4002 } ] }, { - "accumulatedStake": 0.6803964159425462, - "relativeStake": 0.0015712271713386107, + "accumulatedStake": 0.6980547606611645, + "relativeStake": 0.001534969505609655, "relays": [ { - "address": "truth.kiwipool.org", - "port": 9630 - }, - { - "address": "love.kiwipool.org", - "port": 9630 - }, - { - "address": "liberty.kiwipool.org", - "port": 9630 - }, - { - "address": "freedom.kiwipool.org", - "port": 9630 + "address": "cardano-relay-2.upbit.com", + "port": 30800 }, { - "address": "peace.kiwipool.org", - "port": 9630 + "address": "cardano-relay-3.upbit.com", + "port": 30800 }, { - "address": "aspire.kiwipool.org", - "port": 9630 + "address": "cardano-relay-1.upbit.com", + "port": 30800 } ] }, { - "accumulatedStake": 0.6819671429068548, - "relativeStake": 0.0015707269643085748, + "accumulatedStake": 0.6995893781137137, + "relativeStake": 0.0015346174525492794, "relays": [ { - "address": "27.184.128.57", - "port": 3001 + "address": "cardano-relay-1.upbit.com", + "port": 30800 }, { - "address": "86.184.128.57", - "port": 3001 - } - ] - }, - { - "accumulatedStake": 0.6835360427664302, - "relativeStake": 0.0015688998595754298, - "relays": [ + "address": "cardano-relay-2.upbit.com", + "port": 30800 + }, { - "address": "relays.cardanowithpaul.com", - "port": 1069 + "address": "cardano-relay-3.upbit.com", + "port": 30800 } ] }, { - "accumulatedStake": 0.6851021168658922, - "relativeStake": 0.001566074099461911, + "accumulatedStake": 0.7011233306910739, + "relativeStake": 0.0015339525773602149, "relays": [ { - "address": "relays.digi.pro", + "address": "18.207.62.97", "port": 3001 } ] }, { - "accumulatedStake": 0.6866675543217039, - "relativeStake": 0.0015654374558117829, + "accumulatedStake": 0.7026571320658984, + "relativeStake": 0.001533801374824538, "relays": [ { - "address": "207.213.69.20", - "port": 3000 + "address": "adar1.stakit.io", + "port": 30500 } ] }, { - "accumulatedStake": 0.6882150297173124, - "relativeStake": 0.0015474753956085296, + "accumulatedStake": 0.7041884301822569, + "relativeStake": 0.001531298116358373, "relays": [ { - "address": "101.cardano.staked.cloud", - "port": 3001 + "address": "cardano-relay-1.upbit.com", + "port": 30800 + }, + { + "address": "cardano-relay-2.upbit.com", + "port": 30800 + }, + { + "address": "cardano-relay-3.upbit.com", + "port": 30800 } ] }, { - "accumulatedStake": 0.6897501545278133, - "relativeStake": 0.0015351248105008174, + "accumulatedStake": 0.7057188942593559, + "relativeStake": 0.0015304640770990954, "relays": [ { - "address": "97.62.207.18", + "address": "23.21.195.62", "port": 3001 } ] }, { - "accumulatedStake": 0.6912837545191998, - "relativeStake": 0.001533599991386536, + "accumulatedStake": 0.7072489973807456, + "relativeStake": 0.0015301031213897805, "relays": [ { "address": "relay1.adaocean.com", @@ -3831,297 +3896,260 @@ ] }, { - "accumulatedStake": 0.6928167901258371, - "relativeStake": 0.0015330356066373177, + "accumulatedStake": 0.7087781105767322, + "relativeStake": 0.0015291131959865058, "relays": [ { - "address": "62.195.21.23", + "address": "23.23.190.5", "port": 3001 } ] }, { - "accumulatedStake": 0.6943471624502999, - "relativeStake": 0.0015303723244628595, + "accumulatedStake": 0.7103066795139305, + "relativeStake": 0.0015285689371983158, "relays": [ { - "address": "5.190.23.23", + "address": "23.23.190.5", "port": 3001 } ] }, { - "accumulatedStake": 0.6958774075377737, - "relativeStake": 0.0015302450874737138, + "accumulatedStake": 0.7118347263888309, + "relativeStake": 0.001528046874900474, "relays": [ { - "address": "5.190.23.23", - "port": 3001 + "address": "cardano-relay-1.upbit.com", + "port": 30800 + }, + { + "address": "cardano-relay-2.upbit.com", + "port": 30800 + }, + { + "address": "cardano-relay-3.upbit.com", + "port": 30800 } ] }, { - "accumulatedStake": 0.6974061402059052, - "relativeStake": 0.0015287326681314424, + "accumulatedStake": 0.713361322517404, + "relativeStake": 0.001526596128573095, "relays": [ { - "address": "4.140.231.3", + "address": "3.231.140.4", "port": 3001 } ] }, { - "accumulatedStake": 0.6989343801781279, - "relativeStake": 0.0015282399722227615, + "accumulatedStake": 0.7148875969130823, + "relativeStake": 0.0015262743956783217, "relays": [ { - "address": "137.94.221.3", + "address": "3.221.94.137", "port": 3001 } ] }, { - "accumulatedStake": 0.7004622887062466, - "relativeStake": 0.0015279085281186616, + "accumulatedStake": 0.7164135773001414, + "relativeStake": 0.0015259803870590588, "relays": [ { - "address": "97.62.207.18", + "address": "3.221.94.137", "port": 3001 } ] }, { - "accumulatedStake": 0.7019900038056064, - "relativeStake": 0.0015277150993597902, + "accumulatedStake": 0.7179389492895815, + "relativeStake": 0.0015253719894400457, "relays": [ { - "address": "137.153.222.3", + "address": "3.231.140.4", "port": 3001 } ] }, { - "accumulatedStake": 0.7035174839821215, - "relativeStake": 0.001527480176515235, + "accumulatedStake": 0.7194642445898034, + "relativeStake": 0.001525295300221885, "relays": [ { - "address": "137.94.221.3", + "address": "3.222.153.137", "port": 3001 } ] }, { - "accumulatedStake": 0.7050448991235065, - "relativeStake": 0.0015274151413850068, + "accumulatedStake": 0.7209895203002039, + "relativeStake": 0.0015252757104004748, "relays": [ { - "address": "4.140.231.3", + "address": "3.224.130.99", "port": 3001 } ] }, { - "accumulatedStake": 0.706571763197264, - "relativeStake": 0.0015268640737573689, + "accumulatedStake": 0.7225133898771746, + "relativeStake": 0.00152386957697078, "relays": [ { - "address": "99.130.224.3", + "address": "3.221.184.134", "port": 3001 } ] }, { - "accumulatedStake": 0.7080986149481988, - "relativeStake": 0.0015268517509348493, + "accumulatedStake": 0.7240227560664301, + "relativeStake": 0.001509366189255382, "relays": [ { - "address": "relay-pool-figment-25-mainnet.cardano.aeq5f.com" - } - ] - }, - { - "accumulatedStake": 0.7096252798347118, - "relativeStake": 0.0015266648865129963, - "relays": [ + "address": "cardano-main.everstake.com", + "port": 3001 + }, { - "address": "137.153.222.3", + "address": "cardano-main2.everstake.com", "port": 3001 - } - ] - }, - { - "accumulatedStake": 0.7111510577803846, - "relativeStake": 0.0015257779456727871, - "relays": [ + }, { - "address": "134.184.221.3", + "address": "cardano-relay.everstake.com", "port": 3001 - } - ] - }, - { - "accumulatedStake": 0.7126766491880712, - "relativeStake": 0.0015255914076866175, - "relays": [ + }, + { + "address": "cardano-relay1.everstake.com", + "port": 3001 + }, { - "address": "134.184.221.3", + "address": "cardano-relay2.everstake.com", "port": 3001 } ] }, { - "accumulatedStake": 0.7141998141723219, - "relativeStake": 0.0015231649842507378, + "accumulatedStake": 0.725513523731948, + "relativeStake": 0.0014907676655179876, "relays": [ { - "address": "relay.pasklab.com", - "port": 3001 + "address": "relay1.adaocean.com", + "port": 6000 }, { - "address": "relay.pasklab.com", - "port": 3002 + "address": "relay2.adaocean.com", + "port": 6000 }, { - "address": "relay.pasklab.com", - "port": 3003 - } - ] - }, - { - "accumulatedStake": 0.715720828430104, - "relativeStake": 0.0015210142577820628, - "relays": [ + "address": "relay3.adaocean.com", + "port": 6000 + }, { - "address": "relay-1.minswap.org", - "port": 3001 + "address": "relay4.adaocean.com", + "port": 6000 }, { - "address": "relay-2.minswap.org", - "port": 3001 + "address": "relay5.adaocean.com", + "port": 6000 } ] }, { - "accumulatedStake": 0.7172340056015309, - "relativeStake": 0.0015131771714269316, + "accumulatedStake": 0.7270001165507889, + "relativeStake": 0.001486592818840872, "relays": [ { - "address": "cardano-relay-1.upbit.com", - "port": 30800 - }, - { - "address": "cardano-relay-2.upbit.com", - "port": 30800 + "address": "64.176.49.224", + "port": 6000 }, { - "address": "cardano-relay-3.upbit.com", - "port": 30800 + "address": "149.28.161.63", + "port": 6000 } ] }, { - "accumulatedStake": 0.7187438219045147, - "relativeStake": 0.0015098163029837672, + "accumulatedStake": 0.7284856043934339, + "relativeStake": 0.001485487842645034, "relays": [ { - "address": "cardano-relay-1.upbit.com", - "port": 30800 - }, - { - "address": "cardano-relay-2.upbit.com", - "port": 30800 - }, - { - "address": "cardano-relay-3.upbit.com", - "port": 30800 + "address": "20.69.213.207", + "port": 3000 } ] }, { - "accumulatedStake": 0.7202506023100178, - "relativeStake": 0.001506780405503141, + "accumulatedStake": 0.729969718350196, + "relativeStake": 0.0014841139567620175, "relays": [ { - "address": "cardano-relay-2.upbit.com", - "port": 30800 + "address": "truth.kiwipool.org", + "port": 9630 }, { - "address": "cardano-relay-3.upbit.com", - "port": 30800 + "address": "love.kiwipool.org", + "port": 9630 }, { - "address": "cardano-relay-1.upbit.com", - "port": 30800 - } - ] - }, - { - "accumulatedStake": 0.7217558427149688, - "relativeStake": 0.0015052404049509852, - "relays": [ + "address": "liberty.kiwipool.org", + "port": 9630 + }, { - "address": "cardano-relay-2.upbit.com", - "port": 30800 + "address": "freedom.kiwipool.org", + "port": 9630 }, { - "address": "cardano-relay-3.upbit.com", - "port": 30800 + "address": "peace.kiwipool.org", + "port": 9630 }, { - "address": "cardano-relay-1.upbit.com", - "port": 30800 + "address": "aspire.kiwipool.org", + "port": 9630 } ] }, { - "accumulatedStake": 0.7232607942461172, - "relativeStake": 0.0015049515311484156, + "accumulatedStake": 0.7314478361208645, + "relativeStake": 0.0014781177706685614, "relays": [ { - "address": "cardano-relay-1.upbit.com", - "port": 30800 - }, - { - "address": "cardano-relay-2.upbit.com", - "port": 30800 + "address": "152.53.121.193", + "port": 6000 }, { - "address": "cardano-relay-3.upbit.com", - "port": 30800 + "address": "84.247.163.186", + "port": 6000 } ] }, { - "accumulatedStake": 0.7247651733958439, - "relativeStake": 0.001504379149726614, + "accumulatedStake": 0.7329240383228246, + "relativeStake": 0.0014762022019600759, "relays": [ { - "address": "cardano-relay-1.upbit.com", - "port": 30800 - }, - { - "address": "cardano-relay-2.upbit.com", - "port": 30800 + "address": "eu.relays.cardanians.io", + "port": 1000 }, { - "address": "cardano-relay-3.upbit.com", - "port": 30800 + "address": "ca.relays.cardanians.io", + "port": 1000 } ] }, { - "accumulatedStake": 0.72626827671121, - "relativeStake": 0.0015031033153660954, + "accumulatedStake": 0.7343978007295392, + "relativeStake": 0.0014737624067145828, "relays": [ { - "address": "67680868.cardano-relay.herd.run", - "port": 1338 + "address": "relays.smaug.pool.pm", + "port": 3001 } ] }, { - "accumulatedStake": 0.7277706245128932, - "relativeStake": 0.0015023478016832827, + "accumulatedStake": 0.7358589773858463, + "relativeStake": 0.0014611766563071673, "relays": [ { "address": "cardano-relay-1.upbit.com", @@ -4138,41 +4166,50 @@ ] }, { - "accumulatedStake": 0.7292700354365264, - "relativeStake": 0.0014994109236331067, + "accumulatedStake": 0.7373197301235141, + "relativeStake": 0.0014607527376678685, "relays": [ { - "address": "relay-pool-figment-3-mainnet.cardano.aeq5f.com" + "address": "cardano-relay-3.upbit.com", + "port": 30800 + }, + { + "address": "cardano-relay-1.upbit.com", + "port": 30800 + }, + { + "address": "cardano-relay-2.upbit.com", + "port": 30800 } ] }, { - "accumulatedStake": 0.7307683939998268, - "relativeStake": 0.001498358563300524, + "accumulatedStake": 0.7387774296930378, + "relativeStake": 0.0014576995695235945, "relays": [ { - "address": "r1.1percentpool.eu", - "port": 19001 - }, - { - "address": "r2.1percentpool.eu", - "port": 19002 + "address": "asia-pacific-zzzrelay.zzzpool.net", + "port": 3001 } ] }, { - "accumulatedStake": 0.7322606004436018, - "relativeStake": 0.0014922064437748932, + "accumulatedStake": 0.7402334760879228, + "relativeStake": 0.0014560463948850438, "relays": [ { - "address": "relays.smaug.pool.pm", + "address": "relay1.apexfusionhosting.com", + "port": 3001 + }, + { + "address": "relay2.apexfusionhosting.com", "port": 3001 } ] }, { - "accumulatedStake": 0.7337362453316693, - "relativeStake": 0.001475644888067439, + "accumulatedStake": 0.7416857948368808, + "relativeStake": 0.0014523187489579286, "relays": [ { "address": "cardano-relay-1.upbit.com", @@ -4189,18 +4226,26 @@ ] }, { - "accumulatedStake": 0.7352117924388794, - "relativeStake": 0.0014755471072101945, + "accumulatedStake": 0.7431379174795304, + "relativeStake": 0.0014521226426496264, "relays": [ { - "address": "relays.mainnet.fortepool.io", - "port": 3001 + "address": "cardano-relay-1.upbit.com", + "port": 30800 + }, + { + "address": "cardano-relay-2.upbit.com", + "port": 30800 + }, + { + "address": "cardano-relay-3.upbit.com", + "port": 30800 } ] }, { - "accumulatedStake": 0.7366846393007195, - "relativeStake": 0.0014728468618400233, + "accumulatedStake": 0.7445896954223536, + "relativeStake": 0.0014517779428232305, "relays": [ { "address": "cardano-relay-1.upbit.com", @@ -4217,276 +4262,254 @@ ] }, { - "accumulatedStake": 0.7381571253789843, - "relativeStake": 0.001472486078264782, + "accumulatedStake": 0.7460409301345761, + "relativeStake": 0.001451234712222448, "relays": [ { - "address": "relays.digi.pro", + "address": "relay-1.minswap.org", "port": 3001 - } - ] - }, - { - "accumulatedStake": 0.7396203332115197, - "relativeStake": 0.001463207832535431, - "relays": [ + }, { - "address": "asia-pacific-zzzrelay.zzzpool.net", + "address": "relay-2.minswap.org", "port": 3001 } ] }, { - "accumulatedStake": 0.7410835342947842, - "relativeStake": 0.001463201083264625, + "accumulatedStake": 0.7474839620752501, + "relativeStake": 0.0014430319406740927, "relays": [ { - "address": "eu-relay.hermes-stakepool.com", - "port": 1000 - }, - { - "address": "us-relay.hermes-stakepool.com", - "port": 1000 + "address": "europe-2.katanapool.net", + "port": 3001 } ] }, { - "accumulatedStake": 0.7425211365227932, - "relativeStake": 0.0014376022280088874, + "accumulatedStake": 0.7489262621330861, + "relativeStake": 0.0014423000578359592, "relays": [ { - "address": "relay.sunnyada.com", - "port": 5001 + "address": "105.cardano.staked.cloud", + "port": 3001 } ] }, { - "accumulatedStake": 0.7439583255885924, - "relativeStake": 0.0014371890657992317, + "accumulatedStake": 0.7503658063806005, + "relativeStake": 0.0014395442475143038, "relays": [ { - "address": "relay1.hyperlinkpool.kr", - "port": 3002 - }, - { - "address": "relay2.hyperlinkpool.kr", - "port": 3003 + "address": "157.245.228.134", + "port": 3001 }, { - "address": "relay3.hyperlinkpool.kr", - "port": 3004 - } - ] - }, - { - "accumulatedStake": 0.7453888343303511, - "relativeStake": 0.0014305087417587309, - "relays": [ - { - "address": "3.37.8.52", + "address": "159.89.120.164", "port": 3001 }, { - "address": "182.252.125.3", + "address": "209.97.186.44", "port": 3001 }, { - "address": "190.225.63.52", + "address": "eu.bloompool.io", "port": 3001 } ] }, { - "accumulatedStake": 0.7468102288952191, - "relativeStake": 0.001421394564867967, + "accumulatedStake": 0.751805253005796, + "relativeStake": 0.0014394466251956108, "relays": [ { - "address": "137.118.154.35", - "port": 6000 + "address": "cof-1.cardanocafe.org", + "port": 3005 }, { - "address": "137.81.6.3", - "port": 6000 - } - ] - }, - { - "accumulatedStake": 0.7482164578924971, - "relativeStake": 0.001406228997278021, - "relays": [ + "address": "cof-2.cardanocafe.org", + "port": 3010 + }, { - "address": "cardano-relay-1.upbit.com", - "port": 30800 + "address": "cap-1.cardanocafe.org", + "port": 4000 }, { - "address": "cardano-relay-2.upbit.com", - "port": 30800 + "address": "cap-2.cardanocafe.org", + "port": 4005 }, { - "address": "cardano-relay-3.upbit.com", - "port": 30800 + "address": "lat-1.cardanocafe.org", + "port": 5001 + }, + { + "address": "lat-2.cardanocafe.org", + "port": 5002 } ] }, { - "accumulatedStake": 0.7496226199214806, - "relativeStake": 0.0014061620289835478, + "accumulatedStake": 0.7532233630887903, + "relativeStake": 0.0014181100829942742, "relays": [ { - "address": "cardano-relay-1.upbit.com", - "port": 30800 + "address": "198.71.57.191", + "port": 6000 }, { - "address": "cardano-relay-2.upbit.com", - "port": 30800 + "address": "154.12.240.223", + "port": 6000 }, { - "address": "cardano-relay-3.upbit.com", - "port": 30800 + "address": "94.16.113.130", + "port": 6000 } ] }, { - "accumulatedStake": 0.7510284137875228, - "relativeStake": 0.001405793866042205, + "accumulatedStake": 0.7546238523866678, + "relativeStake": 0.0014004892978775917, "relays": [ { - "address": "cardano-relay-1.upbit.com", - "port": 30800 + "address": "relay.pasklab.com", + "port": 3001 }, { - "address": "cardano-relay-2.upbit.com", - "port": 30800 + "address": "relay.pasklab.com", + "port": 3002 }, { - "address": "cardano-relay-3.upbit.com", - "port": 30800 + "address": "relay.pasklab.com", + "port": 3003 } ] }, { - "accumulatedStake": 0.7524341573185833, - "relativeStake": 0.001405743531060515, + "accumulatedStake": 0.7560171795434117, + "relativeStake": 0.0013933271567438735, "relays": [ { - "address": "cardano-relay-3.upbit.com", - "port": 30800 - }, - { - "address": "cardano-relay-1.upbit.com", - "port": 30800 + "address": "r1.1percentpool.eu", + "port": 19001 }, { - "address": "cardano-relay-2.upbit.com", - "port": 30800 + "address": "r2.1percentpool.eu", + "port": 19002 } ] }, { - "accumulatedStake": 0.7538398973050682, - "relativeStake": 0.0014057399864847607, + "accumulatedStake": 0.7573954049723385, + "relativeStake": 0.0013782254289266855, "relays": [ { - "address": "cardano-relay-1.upbit.com", - "port": 30800 + "address": "a-r1.elitestakepool.com", + "port": 7011 }, { - "address": "cardano-relay-2.upbit.com", - "port": 30800 + "address": "a-r2.elitestakepool.com", + "port": 7012 }, { - "address": "cardano-relay-3.upbit.com", - "port": 30800 + "address": "b-r3.elitestakepool.com", + "port": 7013 + }, + { + "address": "b-r4.elitestakepool.com", + "port": 7014 } ] }, { - "accumulatedStake": 0.7552451194433372, - "relativeStake": 0.0014052221382689974, + "accumulatedStake": 0.7587710805109774, + "relativeStake": 0.0013756755386389217, "relays": [ { - "address": "europe-2.katanapool.net", + "address": "relays.digi.pro", "port": 3001 } ] }, { - "accumulatedStake": 0.756642025970124, - "relativeStake": 0.0013969065267868616, + "accumulatedStake": 0.7601461811323978, + "relativeStake": 0.0013751006214204884, "relays": [ { - "address": "13.198.180.139", + "address": "51.15.230.232", "port": 6000 }, { - "address": "122.77.148.207", + "address": "51.15.47.58", "port": 6000 } ] }, { - "accumulatedStake": 0.7580132632498632, - "relativeStake": 0.0013712372797392222, + "accumulatedStake": 0.7615104743768474, + "relativeStake": 0.001364293244449504, "relays": [ { - "address": "92a8429c.cardano-relay.herd.run", - "port": 1338 + "address": "65.109.12.161", + "port": 6001 + }, + { + "address": "116.203.131.106", + "port": 6002 } ] }, { - "accumulatedStake": 0.7593799753772064, - "relativeStake": 0.0013667121273431906, + "accumulatedStake": 0.7628661444984154, + "relativeStake": 0.001355670121568058, "relays": [ { - "address": "relays.wavepool.digital", - "port": 3001 + "address": "eu-relay.hermes-stakepool.com", + "port": 1000 + }, + { + "address": "us-relay.hermes-stakepool.com", + "port": 1000 } ] }, { - "accumulatedStake": 0.7607433072622544, - "relativeStake": 0.0013633318850479709, + "accumulatedStake": 0.7642158841151103, + "relativeStake": 0.0013497396166948607, "relays": [ { - "address": "191.57.71.198", + "address": "relay1.alfa-pool.gr", + "port": 6001 + }, + { + "address": "relay2.alfa-pool.gr", "port": 6000 }, { - "address": "223.240.12.154", + "address": "relay3.alfa-pool.gr", "port": 6000 }, { - "address": "130.113.16.94", + "address": "relay4.alfa-pool.gr", "port": 6000 } ] }, { - "accumulatedStake": 0.7621004510712855, - "relativeStake": 0.0013571438090311397, + "accumulatedStake": 0.7655623109820798, + "relativeStake": 0.001346426866969565, "relays": [ { - "address": "134.228.245.157", - "port": 3001 - }, - { - "address": "164.120.89.159", - "port": 3001 - }, - { - "address": "44.186.97.209", - "port": 3001 + "address": "102.130.127.242", + "port": 6000 }, { - "address": "eu.bloompool.io", - "port": 3001 + "address": "94.16.106.16", + "port": 6000 } ] }, { - "accumulatedStake": 0.7634483180583703, - "relativeStake": 0.001347866987084812, + "accumulatedStake": 0.7668974941395252, + "relativeStake": 0.0013351831574453948, "relays": [ { "address": "relay1.mazza.vc", @@ -4495,144 +4518,144 @@ ] }, { - "accumulatedStake": 0.7647927584255396, - "relativeStake": 0.0013444403671692825, + "accumulatedStake": 0.7682322395597301, + "relativeStake": 0.0013347454202047924, "relays": [ { - "address": "86.17.211.35", - "port": 3000 - }, - { - "address": "7.88.23.34", - "port": 3000 + "address": "relays.cardanowithpaul.com", + "port": 1069 } ] }, { - "accumulatedStake": 0.7661296156722747, - "relativeStake": 0.0013368572467350884, + "accumulatedStake": 0.7695653997394243, + "relativeStake": 0.0013331601796942, "relays": [ { - "address": "cardano-relay-2.upbit.com", - "port": 30800 + "address": "relay1.adaocean.com", + "port": 6000 }, { - "address": "cardano-relay-3.upbit.com", - "port": 30800 + "address": "relay2.adaocean.com", + "port": 6000 }, { - "address": "cardano-relay-1.upbit.com", - "port": 30800 + "address": "relay3.adaocean.com", + "port": 6000 + }, + { + "address": "relay4.adaocean.com", + "port": 6000 + }, + { + "address": "relay5.adaocean.com", + "port": 6000 } ] }, { - "accumulatedStake": 0.7674418018049507, - "relativeStake": 0.001312186132676042, + "accumulatedStake": 0.7708976045749564, + "relativeStake": 0.0013322048355320889, "relays": [ { - "address": "19.50.139.3", - "port": 6000 - }, - { - "address": "218.129.137.3", - "port": 6000 + "address": "relay.sunnyada.com", + "port": 5001 } ] }, { - "accumulatedStake": 0.7687532316473753, - "relativeStake": 0.0013114298424246077, + "accumulatedStake": 0.7722151080472698, + "relativeStake": 0.001317503472313417, "relays": [ { - "address": "relay1.ppcx2.mainnet.cardano.p2p.org", - "port": 6001 + "address": "relay0.crimsonpool.com", + "port": 5100 }, { - "address": "relay2.ppcx2.mainnet.cardano.p2p.org", - "port": 6001 + "address": "relay1.crimsonpool.com", + "port": 5101 }, { - "address": "relay1.ppcx2.mainnet.cardano.p2p.org", - "port": 6001 + "address": "relay2.crimsonpool.com", + "port": 5102 + } + ] + }, + { + "accumulatedStake": 0.7735323880241787, + "relativeStake": 0.0013172799769089057, + "relays": [ + { + "address": "139.59.200.123", + "port": 3001 + }, + { + "address": "129.212.154.208", + "port": 3001 }, { - "address": "relay2.ppcx2.mainnet.cardano.p2p.org", - "port": 6001 + "address": "129.212.214.149", + "port": 3001 } ] }, { - "accumulatedStake": 0.7700639499098472, - "relativeStake": 0.0013107182624718077, + "accumulatedStake": 0.7748480290130509, + "relativeStake": 0.0013156409888722808, "relays": [ { - "address": "42.193.216.88", - "port": 6000 + "address": "52.8.37.3", + "port": 3001 }, { - "address": "38.193.216.88", - "port": 6000 + "address": "3.125.252.182", + "port": 3001 }, { - "address": "39.193.216.88", - "port": 6000 + "address": "52.63.225.190", + "port": 3001 } ] }, { - "accumulatedStake": 0.7713706105987118, - "relativeStake": 0.0013066606888646971, + "accumulatedStake": 0.7761538530421636, + "relativeStake": 0.0013058240291126217, "relays": [ { - "address": "23.17.113.148", + "address": "148.113.17.23", "port": 6000 }, { - "address": "103.25.69.158", + "address": "158.69.25.103", "port": 6000 }, { - "address": "158.13.119.168", + "address": "168.119.13.158", "port": 6000 }, { - "address": "207.140.102.149", + "address": "149.102.140.207", "port": 6000 } ] }, { - "accumulatedStake": 0.7726637800746666, - "relativeStake": 0.00129316947595473, - "relays": [ - { - "address": "cardano-relays-1.nu.fi", - "port": 3003 - }, - { - "address": "cardano-relays-2.nu.fi", - "port": 3001 - } - ] - }, - { - "accumulatedStake": 0.7739420285496634, - "relativeStake": 0.0012782484749968303, + "accumulatedStake": 0.7774298706927101, + "relativeStake": 0.0012760176505465526, "relays": [ { - "address": "relay1.cardanesia.com", - "port": 3001 + "address": "35.154.118.137", + "port": 6000 }, { - "address": "relay2.cardanesia.com", - "port": 3001 + "address": "3.6.81.137", + "port": 6000 } ] }, { - "accumulatedStake": 0.7752092678150284, - "relativeStake": 0.0012672392653650256, + "accumulatedStake": 0.7787057770756656, + "relativeStake": 0.00127590638295549, "relays": [ { "address": "relay1.nedscave.io", @@ -4653,135 +4676,88 @@ ] }, { - "accumulatedStake": 0.7764695941338963, - "relativeStake": 0.0012603263188678585, - "relays": [ - { - "address": "223.183.159.51", - "port": 6000 - }, - { - "address": "58.47.15.51", - "port": 6000 - } - ] - }, - { - "accumulatedStake": 0.7777170105806365, - "relativeStake": 0.0012474164467401818, + "accumulatedStake": 0.7799688429392226, + "relativeStake": 0.0012630658635570256, "relays": [ { - "address": "relay-pool-figment-13-mainnet.cardano.aeq5f.com" + "address": "relays.mainnet.fortepool.io", + "port": 3001 } ] }, { - "accumulatedStake": 0.7789636036524538, - "relativeStake": 0.001246593071817292, + "accumulatedStake": 0.7812307953046751, + "relativeStake": 0.0012619523654524582, "relays": [ { - "address": "relay1.alfa-pool.gr", - "port": 6001 - }, - { - "address": "relay2.alfa-pool.gr", - "port": 6000 - }, - { - "address": "relay3.alfa-pool.gr", + "address": "51.159.183.223", "port": 6000 }, { - "address": "relay4.alfa-pool.gr", + "address": "51.15.47.58", "port": 6000 } ] }, { - "accumulatedStake": 0.7802071545014146, - "relativeStake": 0.0012435508489608777, + "accumulatedStake": 0.7824863087828099, + "relativeStake": 0.0012555134781348572, "relays": [ { - "address": "ipclub29-1.relay.my-ip.at", - "port": 3001 - }, - { - "address": "ipclub29-1.relay.my-ip.at", - "port": 3002 - }, - { - "address": "ipclub29-2.relay.my-ip.at", - "port": 3001 + "address": "ada-relay03.biglazycat.com", + "port": 6000 } ] }, { - "accumulatedStake": 0.7814409172170284, - "relativeStake": 0.0012337627156137558, + "accumulatedStake": 0.7837400011944141, + "relativeStake": 0.0012536924116042256, "relays": [ { - "address": "relay1-us.xstakepool.com", - "port": 3001 - }, - { - "address": "relay2-eu.xstakepool.com", + "address": "relay01.nekota.work", "port": 3001 }, { - "address": "relay3-sg.xstakepool.com", + "address": "relay02.nekota.work", "port": 3001 }, { - "address": "relay4-ae.xstakepool.com", + "address": "relay03.nekota.work", "port": 3001 } ] }, { - "accumulatedStake": 0.7826701814566002, - "relativeStake": 0.0012292642395717614, - "relays": [ - { - "address": "relay1.angelstakepool.net", - "port": 5001 - }, - { - "address": "relay2.angelstakepool.net", - "port": 5002 - } - ] - }, - { - "accumulatedStake": 0.7838878706112994, - "relativeStake": 0.0012176891546992667, + "accumulatedStake": 0.7849772500848974, + "relativeStake": 0.0012372488904831987, "relays": [ { - "address": "161.12.109.65", - "port": 6001 + "address": "cardano-relays-1.nu.fi", + "port": 3003 }, { - "address": "106.131.203.116", - "port": 6002 + "address": "cardano-relays-2.nu.fi", + "port": 3001 } ] }, { - "accumulatedStake": 0.785095530511875, - "relativeStake": 0.0012076599005755382, + "accumulatedStake": 0.7861854059496092, + "relativeStake": 0.0012081558647117762, "relays": [ { - "address": "161.122.53.152", + "address": "3.139.50.19", "port": 6000 }, { - "address": "40.196.251.160", + "address": "3.137.129.218", "port": 6000 } ] }, { - "accumulatedStake": 0.786299431412355, - "relativeStake": 0.0012039009004801103, + "accumulatedStake": 0.7873928616769793, + "relativeStake": 0.0012074557273702186, "relays": [ { "address": "cardano-relays-1.nu.fi", @@ -4794,8 +4770,8 @@ ] }, { - "accumulatedStake": 0.7874984494987047, - "relativeStake": 0.0011990180863496389, + "accumulatedStake": 0.7885979927737605, + "relativeStake": 0.0012051310967812069, "relays": [ { "address": "49.0.82.230", @@ -4808,182 +4784,132 @@ ] }, { - "accumulatedStake": 0.7886813164424313, - "relativeStake": 0.00118286694372661, + "accumulatedStake": 0.7898028703279778, + "relativeStake": 0.001204877554217284, "relays": [ { - "address": "48.98.145.132", + "address": "152.53.122.161", "port": 6000 }, { - "address": "141.230.165.82", + "address": "160.251.196.40", "port": 6000 } ] }, { - "accumulatedStake": 0.7898562164827972, - "relativeStake": 0.0011749000403658949, - "relays": [ - { - "address": "91.246.61.202", - "port": 3001 - } - ] - }, - { - "accumulatedStake": 0.7910243278630884, - "relativeStake": 0.0011681113802912253, + "accumulatedStake": 0.7909945765319796, + "relativeStake": 0.0011917062040017207, "relays": [ { - "address": "cardano-relays-1.nu.fi", - "port": 3003 - }, - { - "address": "cardano-relays-2.nu.fi", - "port": 3001 - } - ] - }, - { - "accumulatedStake": 0.7921866141734099, - "relativeStake": 0.0011622863103213834, - "relays": [ - { - "address": "eu-de-blue-cdn-relays.cardano.fans", + "address": "relay1-us.xstakepool.com", "port": 3001 }, { - "address": "us-us-blue-cdn-relays.cardano.fans", + "address": "relay2-eu.xstakepool.com", "port": 3001 }, { - "address": "eu-fr-blue-cdn-relays.cardano.fans", + "address": "relay3-ag.xstakepool.com", "port": 3001 } ] }, { - "accumulatedStake": 0.793348160947835, - "relativeStake": 0.0011615467744252176, + "accumulatedStake": 0.7921806515584374, + "relativeStake": 0.0011860750264579023, "relays": [ { - "address": "relay0.crimsonpool.com", - "port": 5100 - }, - { - "address": "relay1.crimsonpool.com", - "port": 5101 - }, - { - "address": "relay2.crimsonpool.com", - "port": 5102 + "address": "relay1.viperstaking.com", + "port": 4444 } ] }, { - "accumulatedStake": 0.7945078341976717, - "relativeStake": 0.00115967324983668, + "accumulatedStake": 0.7933621690257942, + "relativeStake": 0.0011815174673567143, "relays": [ { - "address": "12.38.58.89", + "address": "89.58.38.12", "port": 6001 }, { - "address": "249.195.221.37", + "address": "37.221.195.249", "port": 6001 }, { - "address": "179.239.38.46", + "address": "46.38.239.179", "port": 6001 }, { - "address": "7.189.120.37", + "address": "37.120.189.7", "port": 6001 } ] }, { - "accumulatedStake": 0.7956627477386801, - "relativeStake": 0.0011549135410083328, + "accumulatedStake": 0.7945429892669899, + "relativeStake": 0.0011808202411956268, "relays": [ { - "address": "57.11.58.89", - "port": 6000 - }, - { - "address": "130.104.207.185", - "port": 6000 + "address": "relay1.bluecheesestakehouse.com", + "port": 5001 } ] }, { - "accumulatedStake": 0.79681717639186, - "relativeStake": 0.0011544286531799512, + "accumulatedStake": 0.7957173730083413, + "relativeStake": 0.0011743837413515379, "relays": [ { - "address": "a-r1.elitestakepool.com", - "port": 7011 - }, - { - "address": "a-r2.elitestakepool.com", - "port": 7012 + "address": "eu-de-blue-cdn-relays.cardano.fans", + "port": 3001 }, { - "address": "b-r3.elitestakepool.com", - "port": 7013 + "address": "us-us-blue-cdn-relays.cardano.fans", + "port": 3001 }, { - "address": "b-r4.elitestakepool.com", - "port": 7014 + "address": "eu-fr-blue-cdn-relays.cardano.fans", + "port": 3001 } ] }, { - "accumulatedStake": 0.7979705134891872, - "relativeStake": 0.0011533370973272655, + "accumulatedStake": 0.7968867331304931, + "relativeStake": 0.0011693601221516975, "relays": [ { - "address": "relay1.kaizn.kaizencrypto.com", + "address": "169.58.185.200", "port": 6000 }, { - "address": "relay2.kaizn.kaizencrypto.com", + "address": "169.58.186.9", "port": 6000 - } - ] - }, - { - "accumulatedStake": 0.7991203229810727, - "relativeStake": 0.001149809491885393, - "relays": [ - { - "address": "relaynode1.kaldano.work", - "port": 3001 }, { - "address": "relaynode2.kaldano.work", - "port": 3001 + "address": "169.58.186.24", + "port": 6000 } ] }, { - "accumulatedStake": 0.8002419594580464, - "relativeStake": 0.0011216364769737648, + "accumulatedStake": 0.7980558350743192, + "relativeStake": 0.00116910194382615, "relays": [ { - "address": "relay1.adaverse.com", - "port": 5000 + "address": "139.180.198.13", + "port": 6000 }, { - "address": "relay2.adaverse.com", - "port": 4000 + "address": "207.148.77.122", + "port": 6000 } ] }, { - "accumulatedStake": 0.8013624111626693, - "relativeStake": 0.001120451704622824, + "accumulatedStake": 0.7992242501389303, + "relativeStake": 0.0011684150646111043, "relays": [ { "address": "asia.jazzstakepool.net", @@ -4992,8 +4918,8 @@ ] }, { - "accumulatedStake": 0.8024819021695112, - "relativeStake": 0.0011194910068418934, + "accumulatedStake": 0.8003843180025516, + "relativeStake": 0.0011600678636213139, "relays": [ { "address": "cardano-relays-1.nu.fi", @@ -5006,176 +4932,158 @@ ] }, { - "accumulatedStake": 0.8035876367305095, - "relativeStake": 0.0011057345609983343, + "accumulatedStake": 0.8015429421613534, + "relativeStake": 0.0011586241588017133, "relays": [ { - "address": "europe1-zzz3relay.zzzpool.net", + "address": "ipclub29-1.relay.my-ip.at", "port": 3001 - } - ] - }, - { - "accumulatedStake": 0.8046843200672522, - "relativeStake": 0.001096683336742725, - "relays": [ + }, { - "address": "relays.planetstake.com", - "port": 3001 + "address": "ipclub29-1.relay.my-ip.at", + "port": 3002 }, { - "address": "20.90.97.161", + "address": "ipclub29-2.relay.my-ip.at", "port": 3001 } ] }, { - "accumulatedStake": 0.805776655626269, - "relativeStake": 0.0010923355590167446, + "accumulatedStake": 0.8027013407935079, + "relativeStake": 0.001158398632154485, "relays": [ { - "address": "226.124.6.3", - "port": 3001 - }, - { - "address": "87.92.193.18", - "port": 3001 + "address": "35.211.17.86", + "port": 3000 }, { - "address": "10.241.219.54", - "port": 3001 + "address": "34.23.88.7", + "port": 3000 } ] }, { - "accumulatedStake": 0.8068674850669669, - "relativeStake": 0.0010908294406979172, + "accumulatedStake": 0.8038505194775264, + "relativeStake": 0.001149178684018558, "relays": [ { - "address": "60.14.111.3", - "port": 3001 + "address": "relay1.adaverse.com", + "port": 5000 + }, + { + "address": "relay2.adaverse.com", + "port": 4000 } ] }, { - "accumulatedStake": 0.8079526746808571, - "relativeStake": 0.0010851896138901976, + "accumulatedStake": 0.8049837186333402, + "relativeStake": 0.0011331991558138305, "relays": [ { - "address": "relay1.viperstaking.com", - "port": 4444 + "address": "relaynode1.kaldano.work", + "port": 3001 + }, + { + "address": "relaynode2.kaldano.work", + "port": 3001 } ] }, { - "accumulatedStake": 0.809030274774136, - "relativeStake": 0.001077600093278973, + "accumulatedStake": 0.8061159285572247, + "relativeStake": 0.001132209923884508, "relays": [ { - "address": "91.246.61.202", + "address": "asia.jazzstakepool.net", "port": 3001 } ] }, { - "accumulatedStake": 0.8101070894062479, - "relativeStake": 0.0010768146321118476, + "accumulatedStake": 0.8072460623398336, + "relativeStake": 0.0011301337826089275, "relays": [ { - "address": "relay1.adaocean.com", - "port": 6000 - }, - { - "address": "relay2.adaocean.com", - "port": 6000 - }, - { - "address": "relay3.adaocean.com", - "port": 6000 - }, - { - "address": "relay4.adaocean.com", - "port": 6000 + "address": "r1.isp-r1.wjg.jp", + "port": 3001 }, { - "address": "relay5.adaocean.com", - "port": 6000 + "address": "r2.isp-r1.wjg.jp", + "port": 3002 } ] }, { - "accumulatedStake": 0.8111748918134505, - "relativeStake": 0.0010678024072025385, + "accumulatedStake": 0.8083509054981621, + "relativeStake": 0.0011048431583284832, "relays": [ { - "address": "relay1.bluecheesestakehouse.com", - "port": 5001 + "address": "europe1-zzz3relay.zzzpool.net", + "port": 3001 } ] }, { - "accumulatedStake": 0.8122343452211386, - "relativeStake": 0.0010594534076881937, + "accumulatedStake": 0.8094482624029952, + "relativeStake": 0.0010973569048330404, "relays": [ { - "address": "242.127.130.102", - "port": 6000 + "address": "cardano-relays-1.nu.fi", + "port": 3003 }, { - "address": "16.106.16.94", - "port": 6000 + "address": "cardano-relays-2.nu.fi", + "port": 3001 } ] }, { - "accumulatedStake": 0.8132924994060334, - "relativeStake": 0.0010581541848948457, + "accumulatedStake": 0.8105404299631341, + "relativeStake": 0.0010921675601389277, "relays": [ { - "address": "193.121.53.152", + "address": "89.58.11.57", "port": 6000 }, { - "address": "186.163.247.84", + "address": "185.207.104.130", "port": 6000 } ] }, { - "accumulatedStake": 0.8143482283554258, - "relativeStake": 0.001055728949392282, + "accumulatedStake": 0.8116236486115497, + "relativeStake": 0.0010832186484156336, "relays": [ { - "address": "relay1.nedscave.io", - "port": 3001 - }, - { - "address": "relay2.nedscave.io", - "port": 3001 - }, - { - "address": "relay3.nedscave.io", - "port": 3001 + "address": "135.181.194.233", + "port": 6000 }, { - "address": "relay4.nedscave.io", - "port": 3001 + "address": "168.119.101.200", + "port": 6000 } ] }, { - "accumulatedStake": 0.8153931849468389, - "relativeStake": 0.001044956591413173, + "accumulatedStake": 0.8126968460601274, + "relativeStake": 0.0010731974485776383, "relays": [ { - "address": "relays.digi.pro", - "port": 3001 + "address": "104.236.24.187", + "port": 5281 + }, + { + "address": "23.24.140.149", + "port": 5282 } ] }, { - "accumulatedStake": 0.8164192760173788, - "relativeStake": 0.0010260910705399019, + "accumulatedStake": 0.8137563790573552, + "relativeStake": 0.0010595329972279022, "relays": [ { "address": "relays.staking4ada.org", @@ -5188,226 +5096,232 @@ ] }, { - "accumulatedStake": 0.8174204533057499, - "relativeStake": 0.0010011772883709933, + "accumulatedStake": 0.8148155309641317, + "relativeStake": 0.001059151906776512, "relays": [ { - "address": "207.213.69.20", - "port": 3000 + "address": "relay1.hyperlinkpool.kr", + "port": 3002 + }, + { + "address": "relay2.hyperlinkpool.kr", + "port": 3003 + }, + { + "address": "relay3.hyperlinkpool.kr", + "port": 3004 } ] }, { - "accumulatedStake": 0.8184205943427519, - "relativeStake": 0.001000141037002156, + "accumulatedStake": 0.8158745995989611, + "relativeStake": 0.001059068634829361, "relays": [ { - "address": "185.57.58.89", - "port": 4000 + "address": "relay0.bluecheesestakehouse.com", + "port": 5000 } ] }, { - "accumulatedStake": 0.8194149073123242, - "relativeStake": 0.0009943129695723055, + "accumulatedStake": 0.8169318520952344, + "relativeStake": 0.0010572524962733536, "relays": [ { - "address": "relay0.bluecheesestakehouse.com", - "port": 5000 + "address": "north-america-zzz2relay.zzzpool.net", + "port": 3001 } ] }, { - "accumulatedStake": 0.8204083305225268, - "relativeStake": 0.0009934232102024828, + "accumulatedStake": 0.8179883364688387, + "relativeStake": 0.001056484373604191, "relays": [ { - "address": "213.231.123.109", + "address": "132.145.98.48", "port": 6000 }, { - "address": "244.45.58.89", + "address": "82.165.230.141", "port": 6000 } ] }, { - "accumulatedStake": 0.8214004661440315, - "relativeStake": 0.0009921356215047328, + "accumulatedStake": 0.8190327535308589, + "relativeStake": 0.001044417062020291, "relays": [ { - "address": "adaboy-mainnet-2a.gleeze.com", - "port": 6000 - }, - { - "address": "adaboy-mainnet-3a.gleeze.com", - "port": 6000 + "address": "3.111.14.60", + "port": 3001 } ] }, { - "accumulatedStake": 0.8223923461931333, - "relativeStake": 0.00099188004910184, + "accumulatedStake": 0.8200753496561842, + "relativeStake": 0.0010425961253252526, "relays": [ { - "address": "relay.azureada.com", + "address": "relays.planetstake.com", "port": 3001 }, { - "address": "relay.azureada.com", + "address": "161.97.90.20", "port": 3001 } ] }, { - "accumulatedStake": 0.8233773981855402, - "relativeStake": 0.000985051992406943, + "accumulatedStake": 0.821111565594646, + "relativeStake": 0.0010362159384618237, "relays": [ { - "address": "3.37.8.52", - "port": 3001 - }, - { - "address": "182.252.125.3", - "port": 3001 + "address": "relay1.kaizn.kaizencrypto.com", + "port": 6000 }, { - "address": "190.225.63.52", - "port": 3001 + "address": "relay2.kaizn.kaizencrypto.com", + "port": 6000 } ] }, { - "accumulatedStake": 0.8243601757647733, - "relativeStake": 0.0009827775792330357, + "accumulatedStake": 0.8221407284779572, + "relativeStake": 0.0010291628833111216, "relays": [ { - "address": "eu1.stakecool.io", - "port": 4001 + "address": "gateway.adavault.com", + "port": 4021 }, { - "address": "eu2.stakecool.io", - "port": 4001 + "address": "gateway.adavault.com", + "port": 4022 }, { - "address": "eu3.stakecool.io", - "port": 4002 + "address": "gateway.adavault.com", + "port": 4026 }, { - "address": "eu4.stakecool.io", - "port": 4002 - } - ] - }, - { - "accumulatedStake": 0.8253420288120061, - "relativeStake": 0.0009818530472328597, - "relays": [ + "address": "gateway.adavault.com", + "port": 4027 + }, { - "address": "217.209.35.161", - "port": 6000 + "address": "gateway2.adavault.com", + "port": 4060 + }, + { + "address": "gateway2.adavault.com", + "port": 4061 } ] }, { - "accumulatedStake": 0.8263044758382014, - "relativeStake": 0.0009624470261952067, + "accumulatedStake": 0.8231623930190965, + "relativeStake": 0.0010216645411393434, "relays": [ { - "address": "251.123.154.35", - "port": 3001 - }, - { - "address": "107.230.206.15", + "address": "r1.spirestaking.com", "port": 3001 } ] }, { - "accumulatedStake": 0.8272591316107105, - "relativeStake": 0.0009546557725090971, + "accumulatedStake": 0.824165035347624, + "relativeStake": 0.0010026423285274572, "relays": [ { - "address": "233.194.181.135", + "address": "109.123.231.213", "port": 6000 }, { - "address": "200.101.119.168", + "address": "89.58.45.244", "port": 6000 } ] }, { - "accumulatedStake": 0.8282128112034212, - "relativeStake": 0.000953679592710641, + "accumulatedStake": 0.8251673342651774, + "relativeStake": 0.0010022989175534924, "relays": [ { - "address": "127.20.167.52", - "port": 4000 + "address": "cf4r1.mainnet.pool.cardanofoundation.org", + "port": 3001 + }, + { + "address": "cf4r2.mainnet.pool.cardanofoundation.org", + "port": 3001 } ] }, { - "accumulatedStake": 0.8291603189867409, - "relativeStake": 0.0009475077833197504, + "accumulatedStake": 0.8261692051981957, + "relativeStake": 0.0010018709330182314, "relays": [ { - "address": "ada-relay03.biglazycat.com", - "port": 6000 + "address": "relay1.angelstakepool.net", + "port": 5001 + }, + { + "address": "relay2.angelstakepool.net", + "port": 5002 } ] }, { - "accumulatedStake": 0.8301053589145103, - "relativeStake": 0.0009450399277694044, + "accumulatedStake": 0.8271657391839405, + "relativeStake": 0.0009965339857448588, "relays": [ { - "address": "r1.spirestaking.com", - "port": 3001 + "address": "34.84.0.241", + "port": 3000 + }, + { + "address": "34.146.198.77", + "port": 3000 } ] }, { - "accumulatedStake": 0.8310497912787418, - "relativeStake": 0.0009444323642315236, + "accumulatedStake": 0.8281605365040757, + "relativeStake": 0.0009947973201352232, "relays": [ { - "address": "europe3-zzz5relay.zzzpool.net", + "address": "relays.digi.pro", "port": 3001 } ] }, { - "accumulatedStake": 0.8319868297485825, - "relativeStake": 0.0009370384698407521, + "accumulatedStake": 0.8291527834691741, + "relativeStake": 0.0009922469650982732, "relays": [ { - "address": "71.174.38.154", - "port": 6000 + "address": "3.6.124.226", + "port": 3001 }, { - "address": "133.253.153.118", - "port": 57413 + "address": "18.193.92.87", + "port": 3001 }, { - "address": "133.253.153.118", - "port": 57414 + "address": "54.219.241.10", + "port": 3001 } ] }, { - "accumulatedStake": 0.8329226190543191, - "relativeStake": 0.0009357893057364758, + "accumulatedStake": 0.8301289640535834, + "relativeStake": 0.0009761805844093909, "relays": [ { - "address": "asia.jazzstakepool.net", - "port": 3001 + "address": "89.58.57.185", + "port": 4000 } ] }, { - "accumulatedStake": 0.8338568323999922, - "relativeStake": 0.0009342133456731942, + "accumulatedStake": 0.8310939334030663, + "relativeStake": 0.0009649693494828541, "relays": [ { "address": "cardano-relays.autostake.com", @@ -5416,361 +5330,373 @@ ] }, { - "accumulatedStake": 0.8347787261224033, - "relativeStake": 0.00092189372241112, + "accumulatedStake": 0.8320538810449015, + "relativeStake": 0.0009599476418352132, "relays": [ { - "address": "private-pools.fivebinaries.com", + "address": "europe-de.popsp.net", "port": 3001 } ] }, { - "accumulatedStake": 0.8356858333075803, - "relativeStake": 0.0009071071851769305, + "accumulatedStake": 0.8329962913205696, + "relativeStake": 0.0009424102756681627, "relays": [ { - "address": "236.157.119.75", - "port": 6000 + "address": "125.250.255.197", + "port": 8000 }, { - "address": "126.144.102.149", + "address": "75.119.158.164", "port": 6000 } ] }, { - "accumulatedStake": 0.8365858569466892, - "relativeStake": 0.0009000236391088864, + "accumulatedStake": 0.8339358415870205, + "relativeStake": 0.0009395502664508021, "relays": [ { - "address": "207.213.69.20", - "port": 3000 + "address": "118.153.253.133", + "port": 57413 + }, + { + "address": "118.153.253.133", + "port": 57414 + }, + { + "address": "106.72.126.170", + "port": 49712 } ] }, { - "accumulatedStake": 0.8374765115217238, - "relativeStake": 0.0008906545750346224, + "accumulatedStake": 0.8348750724566589, + "relativeStake": 0.0009392308696385119, "relays": [ { - "address": "cardano-relays.atomicwallet.io", - "port": 6001 + "address": "161.35.209.217", + "port": 6000 } ] }, { - "accumulatedStake": 0.8383667608204103, - "relativeStake": 0.0008902492986865051, + "accumulatedStake": 0.835809733249017, + "relativeStake": 0.000934660792357951, "relays": [ { - "address": "189.145.126.144", + "address": "108.174.196.172", "port": 6000 }, { - "address": "190.145.126.144", - "port": 7001 - } - ] - }, - { - "accumulatedStake": 0.8392526408016955, - "relativeStake": 0.0008858799812852319, - "relays": [ + "address": "142.11.241.195", + "port": 6000 + }, { - "address": "benitoite-rohan-d68b9.cardano.bdnodes.net", + "address": "142.11.241.198", "port": 6000 }, { - "address": "brown-lagos-6a470.cardano.bdnodes.net", + "address": "104.168.174.247", "port": 6000 + }, + { + "address": "104.168.204.201", + "port": 6001 } ] }, { - "accumulatedStake": 0.8401382070858234, - "relativeStake": 0.0008855662841278994, + "accumulatedStake": 0.8367428473225402, + "relativeStake": 0.0009331140735232778, "relays": [ { - "address": "asia.jazzstakepool.net", + "address": "202.61.246.91", "port": 3001 } ] }, { - "accumulatedStake": 0.8410202025566532, - "relativeStake": 0.0008819954708297972, + "accumulatedStake": 0.8376757866121997, + "relativeStake": 0.0009329392896594556, "relays": [ { - "address": "relays.liqwid.finance", - "port": 3001 + "address": "relay-pool-figment-7-mainnet.cardano.aeq5f.com" } ] }, { - "accumulatedStake": 0.841898711986315, - "relativeStake": 0.0008785094296618257, + "accumulatedStake": 0.8386007264426456, + "relativeStake": 0.0009249398304459107, "relays": [ { - "address": "relays.liqwid.finance", - "port": 3001 + "address": "eu1.stakecool.io", + "port": 4001 + }, + { + "address": "eu2.stakecool.io", + "port": 4001 + }, + { + "address": "eu3.stakecool.io", + "port": 4002 + }, + { + "address": "eu4.stakecool.io", + "port": 4002 } ] }, { - "accumulatedStake": 0.8427695712346451, - "relativeStake": 0.0008708592483301273, + "accumulatedStake": 0.8395189467566484, + "relativeStake": 0.0009182203140028374, "relays": [ { - "address": "ram-relay1.irota.xyz", - "port": 6000 + "address": "cardano-relays-1.nu.fi", + "port": 3003 }, { - "address": "kyu-relay2.irota.xyz", - "port": 6000 + "address": "cardano-relays-2.nu.fi", + "port": 3001 } ] }, { - "accumulatedStake": 0.8436386253802043, - "relativeStake": 0.0008690541455591156, + "accumulatedStake": 0.8404334123213676, + "relativeStake": 0.0009144655647192009, "relays": [ { - "address": "46.79.208.13", - "port": 6000 + "address": "139.59.200.123", + "port": 3001 + }, + { + "address": "129.212.154.208", + "port": 3001 + }, + { + "address": "129.212.214.149", + "port": 3001 } ] }, { - "accumulatedStake": 0.8445041572285743, - "relativeStake": 0.0008655318483699847, + "accumulatedStake": 0.8413455891703117, + "relativeStake": 0.0009121768489440275, "relays": [ { - "address": "private-pools.fivebinaries.com", + "address": "52.8.37.3", + "port": 3001 + }, + { + "address": "3.125.252.182", + "port": 3001 + }, + { + "address": "52.63.225.190", "port": 3001 } ] }, { - "accumulatedStake": 0.8453667789265603, - "relativeStake": 0.0008626216979860077, + "accumulatedStake": 0.842256772645167, + "relativeStake": 0.0009111834748553768, "relays": [ { - "address": "relay-pool-figment-7-mainnet.cardano.aeq5f.com" + "address": "20.69.213.207", + "port": 3000 } ] }, { - "accumulatedStake": 0.8462288501840641, - "relativeStake": 0.0008620712575038516, + "accumulatedStake": 0.8431648546777616, + "relativeStake": 0.000908082032594599, "relays": [ { - "address": "relay01.nekota.work", - "port": 3001 - }, - { - "address": "relay02.nekota.work", - "port": 3001 + "address": "75.119.157.236", + "port": 6000 }, { - "address": "relay03.nekota.work", - "port": 3001 + "address": "149.102.144.126", + "port": 6000 } ] }, { - "accumulatedStake": 0.8470881801192651, - "relativeStake": 0.0008593299352009455, + "accumulatedStake": 0.8440697482860445, + "relativeStake": 0.000904893608282922, "relays": [ { - "address": "europe-de.popsp.net", - "port": 3001 + "address": "cardano-relays.atomicwallet.io", + "port": 6001 } ] }, { - "accumulatedStake": 0.8479449014327889, - "relativeStake": 0.0008567213135237731, + "accumulatedStake": 0.8449676929155718, + "relativeStake": 0.0008979446295272457, "relays": [ { - "address": "cardano-relays-1.nu.fi", - "port": 3003 + "address": "144.126.145.189", + "port": 6000 }, { - "address": "cardano-relays-2.nu.fi", - "port": 3001 + "address": "144.126.145.190", + "port": 7001 } ] }, { - "accumulatedStake": 0.8487941028530791, - "relativeStake": 0.0008492014202902068, + "accumulatedStake": 0.8458544738638838, + "relativeStake": 0.0008867809483120636, "relays": [ { - "address": "241.0.84.34", - "port": 3000 - }, - { - "address": "77.198.146.34", - "port": 3000 + "address": "118.cardano.staked.cloud", + "port": 3001 } ] }, { - "accumulatedStake": 0.8496345792100001, - "relativeStake": 0.0008404763569209822, + "accumulatedStake": 0.8467402031863849, + "relativeStake": 0.0008857293225010712, "relays": [ { - "address": "relay1.toiro.love", - "port": 6000 - }, + "address": "asia.jazzstakepool.net", + "port": 3001 + } + ] + }, + { + "accumulatedStake": 0.8476106776082822, + "relativeStake": 0.0008704744218973293, + "relays": [ { - "address": "relay2.toiro.love", + "address": "13.208.79.46", "port": 6000 } ] }, { - "accumulatedStake": 0.8504730108983621, - "relativeStake": 0.0008384316883621009, + "accumulatedStake": 0.8484783957471141, + "relativeStake": 0.0008677181388318708, "relays": [ { - "address": "197.255.250.125", - "port": 8000 + "address": "ram-relay1.irota.xyz", + "port": 6000 }, { - "address": "164.158.119.75", + "address": "kyu-relay2.irota.xyz", "port": 6000 } ] }, { - "accumulatedStake": 0.851308854350048, - "relativeStake": 0.0008358434516858715, + "accumulatedStake": 0.849344781382522, + "relativeStake": 0.0008663856354079086, "relays": [ { - "address": "relay-ca.ada.psiloblox.io", - "port": 3002 - }, - { - "address": "2600:ac02:7c06:0:20c:29ff:fe01:4ff9", - "port": 3002 - }, - { - "address": "126.69.118.208", - "port": 3003 - }, - { - "address": "relay-jp.ada.psiloblox.io", + "address": "relay.azureada.com", "port": 3001 }, { - "address": "relay-de.ada.psiloblox.io", - "port": 3002 + "address": "relay.azureada.com", + "port": 3001 } ] }, { - "accumulatedStake": 0.85213467379231, - "relativeStake": 0.0008258194422620232, + "accumulatedStake": 0.8501950095993639, + "relativeStake": 0.0008502282168418203, "relays": [ { - "address": "ipclub29-1.relay.my-ip.at", - "port": 3001 - }, - { - "address": "ipclub29-1.relay.my-ip.at", - "port": 3002 - }, - { - "address": "ipclub29-2.relay.my-ip.at", - "port": 3001 + "address": "20.69.213.207", + "port": 3000 } ] }, { - "accumulatedStake": 0.8529576348240011, - "relativeStake": 0.0008229610316910298, + "accumulatedStake": 0.8510415916030514, + "relativeStake": 0.0008465820036875131, "relays": [ { - "address": "relay1.cerostakepool.com", + "address": "relay1.nedscave.io", "port": 3001 }, { - "address": "relay2.cerostakepool.com", + "address": "relay2.nedscave.io", "port": 3001 }, { - "address": "relay3.cerostakepool.com", + "address": "relay3.nedscave.io", "port": 3001 }, { - "address": "relay4.cerostakepool.com", + "address": "relay4.nedscave.io", "port": 3001 } ] }, { - "accumulatedStake": 0.8537803672548918, - "relativeStake": 0.0008227324308907524, + "accumulatedStake": 0.8518858144835291, + "relativeStake": 0.0008442228804777167, "relays": [ { - "address": "1f018fdb.cardano-relay.bison.run", - "port": 1338 + "address": "re1.reservoir.network", + "port": 3001 + }, + { + "address": "re2.reservoir.network", + "port": 3001 } ] }, { - "accumulatedStake": 0.8545998334627526, - "relativeStake": 0.000819466207860724, + "accumulatedStake": 0.8527225573399895, + "relativeStake": 0.0008367428564604106, "relays": [ { - "address": "127.20.167.52", - "port": 4000 + "address": "relay1.toiro.love", + "port": 6000 + }, + { + "address": "relay2.toiro.love", + "port": 6000 } ] }, { - "accumulatedStake": 0.8554093113305289, - "relativeStake": 0.0008094778677763317, + "accumulatedStake": 0.8535520074602289, + "relativeStake": 0.00082945012023935, "relays": [ { - "address": "91.246.61.202", + "address": "private-pools.fivebinaries.com", "port": 3001 } ] }, { - "accumulatedStake": 0.8562124367451066, - "relativeStake": 0.0008031254145776891, + "accumulatedStake": 0.8543789055658118, + "relativeStake": 0.0008268981055829143, "relays": [ { - "address": "179.28.129.57", - "port": 3001 - }, - { - "address": "180.28.129.57", + "address": "europe3-zzz5relay.zzzpool.net", "port": 3001 } ] }, { - "accumulatedStake": 0.8570114957654169, - "relativeStake": 0.0007990590203103831, + "accumulatedStake": 0.8552041879713961, + "relativeStake": 0.0008252824055843259, "relays": [ { - "address": "relay.azureada.com", - "port": 3001 - }, - { - "address": "relay.azureada.com", - "port": 3001 + "address": "1f018fdb.cardano-relay.bison.run", + "port": 1338 } ] }, { - "accumulatedStake": 0.8578100951931749, - "relativeStake": 0.0007985994277579716, + "accumulatedStake": 0.8560280506838283, + "relativeStake": 0.0008238627124321949, "relays": [ { "address": "LANDrelay1.cardanoland.com", @@ -5799,150 +5725,234 @@ ] }, { - "accumulatedStake": 0.8586057221682988, - "relativeStake": 0.000795626975123897, + "accumulatedStake": 0.8568471775625454, + "relativeStake": 0.0008191268787170317, "relays": [ { - "address": "cardano-relays.atomicwallet.io", - "port": 6001 + "address": "202.61.246.91", + "port": 3001 } ] }, { - "accumulatedStake": 0.8593977383307482, - "relativeStake": 0.0007920161624493633, + "accumulatedStake": 0.8576615753450586, + "relativeStake": 0.0008143977825132582, "relays": [ { - "address": "107.15.195.159", + "address": "benitoite-rohan-d68b9.cardano.bdnodes.net", "port": 6000 }, { - "address": "162.204.251.160", + "address": "brown-lagos-6a470.cardano.bdnodes.net", "port": 6000 } ] }, { - "accumulatedStake": 0.860185078887215, - "relativeStake": 0.0007873405564667428, + "accumulatedStake": 0.8584759478582965, + "relativeStake": 0.000814372513237891, "relays": [ { - "address": "relays.xray.app", - "port": 3000 + "address": "52.167.20.127", + "port": 4000 } ] }, { - "accumulatedStake": 0.8609723125256044, - "relativeStake": 0.0007872336383894583, + "accumulatedStake": 0.859271405913551, + "relativeStake": 0.0007954580552545166, "relays": [ { - "address": "134.228.245.157", - "port": 3001 + "address": "159.195.15.107", + "port": 6000 }, { - "address": "164.120.89.159", + "address": "160.251.204.162", + "port": 6000 + } + ] + }, + { + "accumulatedStake": 0.8600560141223991, + "relativeStake": 0.0007846082088480789, + "relays": [ + { + "address": "cardano-relays.atomicwallet.io", + "port": 6001 + } + ] + }, + { + "accumulatedStake": 0.8608286784825798, + "relativeStake": 0.00077266436018073, + "relays": [ + { + "address": "private-pools.fivebinaries.com", "port": 3001 - }, + } + ] + }, + { + "accumulatedStake": 0.8615974394376814, + "relativeStake": 0.0007687609551016811, + "relays": [ { - "address": "44.186.97.209", + "address": "relay1.cardanesia.com", "port": 3001 }, { - "address": "na.bloompool.io", + "address": "relay2.cardanesia.com", "port": 3001 } ] }, { - "accumulatedStake": 0.8617524527266192, - "relativeStake": 0.0007801402010147795, + "accumulatedStake": 0.8623649342402513, + "relativeStake": 0.0007674948025698021, "relays": [ { - "address": "r1.1percentpool.eu", - "port": 19001 + "address": "202.61.246.91", + "port": 3001 + } + ] + }, + { + "accumulatedStake": 0.863131666068692, + "relativeStake": 0.0007667318284407254, + "relays": [ + { + "address": "relay1.adaocean.com", + "port": 6000 }, { - "address": "r2.1percentpool.eu", - "port": 19002 + "address": "relay2.adaocean.com", + "port": 6000 + }, + { + "address": "relay3.adaocean.com", + "port": 6000 + }, + { + "address": "relay4.adaocean.com", + "port": 6000 + }, + { + "address": "relay5.adaocean.com", + "port": 6000 } ] }, { - "accumulatedStake": 0.8625253888189474, - "relativeStake": 0.0007729360923281876, + "accumulatedStake": 0.8638941468215041, + "relativeStake": 0.0007624807528121378, "relays": [ { - "address": "relay1.cashflowpool.com", + "address": "relay1.cerostakepool.com", + "port": 3001 + }, + { + "address": "relay2.cerostakepool.com", + "port": 3001 + }, + { + "address": "relay3.cerostakepool.com", "port": 3001 }, { - "address": "relay2.cashflowpool.com", + "address": "relay4.cerostakepool.com", "port": 3001 } ] }, { - "accumulatedStake": 0.863295731678632, - "relativeStake": 0.0007703428596847152, + "accumulatedStake": 0.8646496785525102, + "relativeStake": 0.0007555317310060316, "relays": [ { - "address": "232.230.15.51", - "port": 6000 - }, + "address": "relay-pool-figment-20-mainnet.cardano.aeq5f.com" + } + ] + }, + { + "accumulatedStake": 0.8654050771150503, + "relativeStake": 0.0007553985625402018, + "relays": [ { - "address": "58.47.15.51", - "port": 6000 + "address": "relays.xray.app", + "port": 3000 } ] }, { - "accumulatedStake": 0.8640601252151463, - "relativeStake": 0.0007643935365142659, + "accumulatedStake": 0.8661588896271928, + "relativeStake": 0.0007538125121423847, "relays": [ { - "address": "cof-1.cardanocafe.org", - "port": 3005 + "address": "cardano1.vampyre.fund", + "port": 3001 }, { - "address": "cof-2.cardanocafe.org", - "port": 3010 + "address": "cardano2.vampyre.fund", + "port": 3001 }, { - "address": "cap-1.cardanocafe.org", - "port": 4000 + "address": "cardano3.vampyre.fund", + "port": 3001 }, { - "address": "cap-2.cardanocafe.org", - "port": 4005 + "address": "cardano4.vampyre.fund", + "port": 3001 + } + ] + }, + { + "accumulatedStake": 0.8669103147874443, + "relativeStake": 0.0007514251602515734, + "relays": [ + { + "address": "157.245.228.134", + "port": 3001 }, { - "address": "lat-1.cardanocafe.org", - "port": 5001 + "address": "159.89.120.164", + "port": 3001 }, { - "address": "lat-2.cardanocafe.org", - "port": 5002 + "address": "209.97.186.44", + "port": 3001 + }, + { + "address": "na.bloompool.io", + "port": 3001 } ] }, { - "accumulatedStake": 0.8648231509732514, - "relativeStake": 0.0007630257581050348, + "accumulatedStake": 0.8676570164495959, + "relativeStake": 0.0007467016621515776, "relays": [ { - "address": "187.24.236.104", - "port": 5281 + "address": "relay-pool-1-mainnet.cardano.aeq5f.com" + } + ] + }, + { + "accumulatedStake": 0.8683958107368724, + "relativeStake": 0.0007387942872765727, + "relays": [ + { + "address": "cardano-relays-1.nu.fi", + "port": 3003 }, { - "address": "149.140.24.23", - "port": 5282 + "address": "cardano-relays-2.nu.fi", + "port": 3001 } ] }, { - "accumulatedStake": 0.865585732195633, - "relativeStake": 0.0007625812223815421, + "accumulatedStake": 0.8691273229665439, + "relativeStake": 0.0007315122296714482, "relays": [ { "address": "cpr1.sargatxet.cloud", @@ -5959,44 +5969,42 @@ ] }, { - "accumulatedStake": 0.8663476114774958, - "relativeStake": 0.000761879281862981, + "accumulatedStake": 0.8698575510991391, + "relativeStake": 0.0007302281325951941, "relays": [ { - "address": "30.67.77.45", - "port": 3000 + "address": "relay.azureada.com", + "port": 3001 }, { - "address": "230.153.32.45", - "port": 3000 + "address": "relay.azureada.com", + "port": 3001 } ] }, { - "accumulatedStake": 0.8670966083148716, - "relativeStake": 0.000748996837375665, + "accumulatedStake": 0.8705852504860137, + "relativeStake": 0.0007276993868745279, "relays": [ { - "address": "cardano1.vampyre.fund", - "port": 3001 - }, - { - "address": "cardano2.vampyre.fund", - "port": 3001 - }, - { - "address": "cardano3.vampyre.fund", + "address": "relays.wavepool.digital", "port": 3001 - }, + } + ] + }, + { + "accumulatedStake": 0.8713083733212035, + "relativeStake": 0.0007231228351898441, + "relays": [ { - "address": "cardano4.vampyre.fund", - "port": 3001 + "address": "52.167.20.127", + "port": 4000 } ] }, { - "accumulatedStake": 0.8678405944650742, - "relativeStake": 0.0007439861502027078, + "accumulatedStake": 0.8720299573474514, + "relativeStake": 0.0007215840262479048, "relays": [ { "address": "eu.relays.cardanians.io", @@ -6009,304 +6017,342 @@ ] }, { - "accumulatedStake": 0.8685840109752331, - "relativeStake": 0.0007434165101588196, + "accumulatedStake": 0.8727512340899248, + "relativeStake": 0.0007212767424734738, "relays": [ { - "address": "relay-pool-1-mainnet.cardano.aeq5f.com" + "address": "206.81.3.194", + "port": 3001 } ] }, { - "accumulatedStake": 0.8693256009521853, - "relativeStake": 0.0007415899769521833, + "accumulatedStake": 0.8734659422632768, + "relativeStake": 0.0007147081733519788, "relays": [ { - "address": "194.3.81.206", + "address": "35.154.123.251", + "port": 3001 + }, + { + "address": "15.206.230.107", "port": 3001 } ] }, { - "accumulatedStake": 0.8700624783361824, - "relativeStake": 0.0007368773839971416, + "accumulatedStake": 0.8741741444661417, + "relativeStake": 0.0007082022028648699, "relays": [ { - "address": "r1.adaism.uk", - "port": 8081 - }, - { - "address": "r2.adaism.uk", - "port": 8081 + "address": "1e5c4061.cardano-relay.bison.run", + "port": 1338 } ] }, { - "accumulatedStake": 0.8707959937606539, - "relativeStake": 0.0007335154244714667, + "accumulatedStake": 0.8748819199632103, + "relativeStake": 0.0007077754970685601, "relays": [ { - "address": "59.106.28.149", + "address": "40.160.1.159", + "port": 6000 + }, + { + "address": "15.204.108.52", "port": 6000 } ] }, { - "accumulatedStake": 0.8715239509513963, - "relativeStake": 0.0007279571907425242, + "accumulatedStake": 0.8755782831926557, + "relativeStake": 0.0006963632294454958, "relays": [ { - "address": "adar2.stakit.io", - "port": 30501 + "address": "45.77.67.30", + "port": 3000 + }, + { + "address": "45.32.153.230", + "port": 3000 } ] }, { - "accumulatedStake": 0.8722504168201226, - "relativeStake": 0.0007264658687262406, + "accumulatedStake": 0.876272152367215, + "relativeStake": 0.0006938691745592569, "relays": [ { - "address": "cardano-relays-1.nu.fi", - "port": 3003 - }, - { - "address": "cardano-relays-2.nu.fi", + "address": "relays.cardaspians.io", "port": 3001 } ] }, { - "accumulatedStake": 0.8729755771755099, - "relativeStake": 0.0007251603553872573, + "accumulatedStake": 0.8769620357380131, + "relativeStake": 0.0006898833707981206, "relays": [ { - "address": "ACLrelay1.cardanoland.com", + "address": "r1.relaypool.online", + "port": 3000 + } + ] + }, + { + "accumulatedStake": 0.8776503845217858, + "relativeStake": 0.0006883487837726752, + "relays": [ + { + "address": "148.113.17.23", "port": 6000 }, { - "address": "ACLrelay2.cardanoland.com", - "port": 7000 + "address": "158.69.25.103", + "port": 6000 }, { - "address": "ACLrelay3.cardanoland.com", - "port": 8000 + "address": "95.216.70.238", + "port": 6000 }, { - "address": "ACLrelay4.cardanoland.com", + "address": "149.102.140.234", "port": 6000 + } + ] + }, + { + "accumulatedStake": 0.8783344896923029, + "relativeStake": 0.0006841051705170479, + "relays": [ + { + "address": "relay-ca.ada.psiloblox.io", + "port": 3002 }, { - "address": "ACLrelay5.cardanoland.com", - "port": 7000 + "address": "2600:ac02:7c06:0:20c:29ff:fe01:4ff9", + "port": 3002 }, { - "address": "ACLrelay6.cardanoland.com", - "port": 8000 + "address": "208.118.69.126", + "port": 3003 + }, + { + "address": "relay-jp.ada.psiloblox.io", + "port": 3001 + }, + { + "address": "relay-de.ada.psiloblox.io", + "port": 3002 + } + ] + }, + { + "accumulatedStake": 0.8790153630167352, + "relativeStake": 0.0006808733244323725, + "relays": [ + { + "address": "34.192.61.190", + "port": 3001 } ] }, { - "accumulatedStake": 0.873688485563449, - "relativeStake": 0.0007129083879391208, + "accumulatedStake": 0.8796918952110386, + "relativeStake": 0.0006765321943033807, "relays": [ { - "address": "23.17.113.148", + "address": "ACLrelay1.cardanoland.com", "port": 6000 }, { - "address": "103.25.69.158", - "port": 6000 + "address": "ACLrelay2.cardanoland.com", + "port": 7000 }, { - "address": "238.70.216.95", - "port": 6000 + "address": "ACLrelay3.cardanoland.com", + "port": 8000 }, { - "address": "234.140.102.149", + "address": "ACLrelay4.cardanoland.com", "port": 6000 + }, + { + "address": "ACLrelay5.cardanoland.com", + "port": 7000 + }, + { + "address": "ACLrelay6.cardanoland.com", + "port": 8000 } ] }, { - "accumulatedStake": 0.8743996422862106, - "relativeStake": 0.0007111567227616059, + "accumulatedStake": 0.8803623540752887, + "relativeStake": 0.0006704588642501359, "relays": [ { - "address": "233.194.181.135", - "port": 6000 + "address": "relay1.apexpool.info", + "port": 5001 }, { - "address": "200.101.119.168", - "port": 6000 + "address": "relay2.apexpool.info", + "port": 5001 } ] }, { - "accumulatedStake": 0.875106053533861, - "relativeStake": 0.000706411247650283, + "accumulatedStake": 0.8810306352355767, + "relativeStake": 0.000668281160287962, "relays": [ { - "address": "219.79.128.178", - "port": 3001 - }, - { - "address": "73.122.131.104", + "address": "3.222.153.137", "port": 3001 } ] }, { - "accumulatedStake": 0.8758114056591659, - "relativeStake": 0.0007053521253050448, + "accumulatedStake": 0.8816980143440755, + "relativeStake": 0.0006673791084987497, "relays": [ { - "address": "relay-pool-figment-20-mainnet.cardano.aeq5f.com" + "address": "137.117.180.0", + "port": 16112 + }, + { + "address": "20.52.178.196", + "port": 16112 + }, + { + "address": "52.152.187.47", + "port": 16112 } ] }, { - "accumulatedStake": 0.8765067386187408, - "relativeStake": 0.0006953329595748806, + "accumulatedStake": 0.8823614964805508, + "relativeStake": 0.0006634821364753267, "relays": [ { - "address": "1e5c4061.cardano-relay.bison.run", - "port": 1338 + "address": "relay1.pudim.cat", + "port": 3002 + }, + { + "address": "relay2.pudim.cat", + "port": 3002 } ] }, { - "accumulatedStake": 0.8771973953278905, - "relativeStake": 0.0006906567091497046, + "accumulatedStake": 0.8830246901081447, + "relativeStake": 0.0006631936275939012, "relays": [ { - "address": "relay1.thevikingpool.com", - "port": 6000 - }, - { - "address": "relay2.thevikingpool.com", - "port": 6000 + "address": "adar2.stakit.io", + "port": 30501 } ] }, { - "accumulatedStake": 0.877886520868648, - "relativeStake": 0.0006891255407574848, + "accumulatedStake": 0.8836758062340916, + "relativeStake": 0.0006511161259469015, "relays": [ { - "address": "172.196.174.108", - "port": 6000 - }, - { - "address": "195.241.11.142", - "port": 6000 - }, - { - "address": "198.241.11.142", - "port": 6000 + "address": "relay1-ada.cex.io", + "port": 3001 }, { - "address": "247.174.168.104", - "port": 6000 + "address": "relay2-ada.cex.io", + "port": 3002 }, { - "address": "201.204.168.104", - "port": 6001 + "address": "relay3-ada.cex.io", + "port": 3003 } ] }, { - "accumulatedStake": 0.8785750700129158, - "relativeStake": 0.0006885491442677816, + "accumulatedStake": 0.8843205259870812, + "relativeStake": 0.0006447197529896085, "relays": [ { - "address": "159.1.160.40", - "port": 6000 + "address": "csn.relay1.cardanoscan.io", + "port": 3101 }, { - "address": "52.108.204.15", - "port": 6000 + "address": "csn.relay2.cardanoscan.io", + "port": 3101 } ] }, { - "accumulatedStake": 0.8792606337400546, - "relativeStake": 0.0006855637271387668, + "accumulatedStake": 0.8849646263605836, + "relativeStake": 0.0006441003735024348, "relays": [ { - "address": "r1.relaypool.online", - "port": 3000 + "address": "135.181.194.233", + "port": 6000 + }, + { + "address": "168.119.101.200", + "port": 6000 } ] }, { - "accumulatedStake": 0.8799394916056629, - "relativeStake": 0.0006788578656083666, + "accumulatedStake": 0.8856048884855499, + "relativeStake": 0.0006402621249661656, "relays": [ { - "address": "190.61.192.34", + "address": "178.128.79.219", "port": 3001 - } - ] - }, - { - "accumulatedStake": 0.8806139336982663, - "relativeStake": 0.0006744420926033827, - "relays": [ + }, { - "address": "private-pools.fivebinaries.com", + "address": "104.131.122.73", "port": 3001 } ] }, { - "accumulatedStake": 0.8812818634256543, - "relativeStake": 0.0006679297273879275, + "accumulatedStake": 0.8862414893650015, + "relativeStake": 0.0006366008794516403, "relays": [ { - "address": "0.180.117.137", - "port": 16112 - }, - { - "address": "196.178.52.20", - "port": 16112 + "address": "r1.cosd.com", + "port": 5250 }, { - "address": "47.187.152.52", - "port": 16112 + "address": "r2.cosd.com", + "port": 5250 } ] }, { - "accumulatedStake": 0.8819491627526421, - "relativeStake": 0.0006672993269879374, + "accumulatedStake": 0.8868716470151045, + "relativeStake": 0.0006301576501030076, "relays": [ { - "address": "relay1.powerstakepool.com", + "address": "relay1.thevikingpool.com", "port": 6000 }, { - "address": "relay2.powerstakepool.com", + "address": "relay2.thevikingpool.com", "port": 6000 } ] }, { - "accumulatedStake": 0.8826090367210562, - "relativeStake": 0.0006598739684140259, + "accumulatedStake": 0.8874979717723022, + "relativeStake": 0.0006263247571977651, "relays": [ { - "address": "relay1.pudim.cat", - "port": 3002 - }, - { - "address": "relay2.pudim.cat", - "port": 3002 + "address": "85.131.244.123", + "port": 6000 } ] }, { - "accumulatedStake": 0.8832656764225254, - "relativeStake": 0.0006566397014691837, + "accumulatedStake": 0.8881201121303727, + "relativeStake": 0.0006221403580704902, "relays": [ { "address": "relay-1.banderini.net", @@ -6319,22 +6365,8 @@ ] }, { - "accumulatedStake": 0.8839214661854473, - "relativeStake": 0.0006557897629219609, - "relays": [ - { - "address": "128.77.150.54", - "port": 6000 - }, - { - "address": "248.226.72.35", - "port": 6000 - } - ] - }, - { - "accumulatedStake": 0.8845710344651533, - "relativeStake": 0.0006495682797059579, + "accumulatedStake": 0.8887391074050025, + "relativeStake": 0.0006189952746298252, "relays": [ { "address": "germany.cardanode.io", @@ -6355,189 +6387,189 @@ ] }, { - "accumulatedStake": 0.8852181782135868, - "relativeStake": 0.0006471437484335537, + "accumulatedStake": 0.8893495019957984, + "relativeStake": 0.0006103945907958921, "relays": [ { - "address": "134.228.245.157", - "port": 3001 - }, - { - "address": "164.120.89.159", + "address": "relay-kiln-3-0.cardano.mainnet.kiln.fi", "port": 3001 }, { - "address": "44.186.97.209", + "address": "relay-kiln-3-1.cardano.mainnet.kiln.fi", "port": 3001 }, { - "address": "eu.bloompool.io", + "address": "relay-kiln-3-2.cardano.mainnet.kiln.fi", "port": 3001 } ] }, { - "accumulatedStake": 0.8858648642554103, - "relativeStake": 0.0006466860418234723, + "accumulatedStake": 0.8899583857542555, + "relativeStake": 0.0006088837584569803, "relays": [ { - "address": "asia-pacific-japan.popsp.net", - "port": 3001 + "address": "relay1.powerstakepool.com", + "port": 6000 + }, + { + "address": "relay2.powerstakepool.com", + "port": 6000 } ] }, { - "accumulatedStake": 0.8865104790962086, - "relativeStake": 0.0006456148407982857, + "accumulatedStake": 0.8905655136788971, + "relativeStake": 0.0006071279246417523, "relays": [ { - "address": "csn.relay1.cardanoscan.io", - "port": 3101 + "address": "cardano-relays-1.nu.fi", + "port": 3003 }, { - "address": "csn.relay2.cardanoscan.io", - "port": 3101 + "address": "cardano-relays-2.nu.fi", + "port": 3001 } ] }, { - "accumulatedStake": 0.8871560765804258, - "relativeStake": 0.0006455974842171969, + "accumulatedStake": 0.891168213125595, + "relativeStake": 0.0006026994466978245, "relays": [ { - "address": "relay1-ada.cex.io", - "port": 3001 - }, - { - "address": "relay2-ada.cex.io", - "port": 3002 + "address": "202.61.225.111", + "port": 6000 }, { - "address": "relay3-ada.cex.io", - "port": 3003 + "address": "46.38.241.110", + "port": 6000 } ] }, { - "accumulatedStake": 0.8878010941772536, - "relativeStake": 0.0006450175968278112, + "accumulatedStake": 0.8917693209698935, + "relativeStake": 0.0006011078442984997, "relays": [ { - "address": "118.91.195.51", + "address": "157.245.228.134", "port": 3001 }, { - "address": "246.35.161.51", + "address": "159.89.120.164", "port": 3001 }, { - "address": "178.123.12.49", + "address": "209.97.186.44", "port": 3001 }, { - "address": "124.58.217.95", + "address": "eu.bloompool.io", "port": 3001 } ] }, { - "accumulatedStake": 0.8884425611085728, - "relativeStake": 0.0006414669313191455, + "accumulatedStake": 0.8923696724916317, + "relativeStake": 0.0006003515217382172, "relays": [ { - "address": "r1.cosd.com", - "port": 5250 + "address": "143.198.206.176", + "port": 6000 }, { - "address": "r2.cosd.com", - "port": 5250 + "address": "207.154.201.62", + "port": 6000 } ] }, { - "accumulatedStake": 0.8890749204830674, - "relativeStake": 0.0006323593744945571, + "accumulatedStake": 0.8929637870965458, + "relativeStake": 0.0005941146049140991, "relays": [ { - "address": "249.73.25.223", - "port": 6452 + "address": "relay1.nedscave.io", + "port": 3001 }, { - "address": "30.147.199.128", - "port": 6001 + "address": "relay2.nedscave.io", + "port": 3001 + }, + { + "address": "relay3.nedscave.io", + "port": 3001 }, { - "address": "199.141.140.158", - "port": 8082 + "address": "relay4.nedscave.io", + "port": 3001 } ] }, { - "accumulatedStake": 0.88970630547916, - "relativeStake": 0.0006313849960926384, + "accumulatedStake": 0.8935560172716995, + "relativeStake": 0.0005922301751537731, "relays": [ { - "address": "r1.1percentpool.eu", - "port": 19001 + "address": "r1.adaism.uk", + "port": 8081 }, { - "address": "r2.1percentpool.eu", - "port": 19002 + "address": "r2.adaism.uk", + "port": 8081 } ] }, { - "accumulatedStake": 0.8903327162385161, - "relativeStake": 0.0006264107593560782, + "accumulatedStake": 0.8941472277760614, + "relativeStake": 0.0005912105043617867, "relays": [ { - "address": "relay1.squidpool.com", - "port": 3001 - }, - { - "address": "relay2.squidpool.com", - "port": 3001 + "address": "cardano-relays.atomicwallet.io", + "port": 6001 } ] }, { - "accumulatedStake": 0.8909568899208459, - "relativeStake": 0.000624173682329841, + "accumulatedStake": 0.8947379377272121, + "relativeStake": 0.0005907099511507605, "relays": [ { - "address": "105.cardano.staked.cloud", + "address": "relay1.squidpool.com", + "port": 3001 + }, + { + "address": "relay2.squidpool.com", "port": 3001 } ] }, { - "accumulatedStake": 0.8915767624924168, - "relativeStake": 0.0006198725715708883, + "accumulatedStake": 0.8953263111646639, + "relativeStake": 0.000588373437451719, "relays": [ { - "address": "174.147.215.85", + "address": "133.167.33.31", "port": 6000 }, { - "address": "104.187.215.85", + "address": "162.43.71.205", "port": 6000 } ] }, { - "accumulatedStake": 0.8921960747223038, - "relativeStake": 0.0006193122298870549, + "accumulatedStake": 0.8959101178610719, + "relativeStake": 0.000583806696407999, "relays": [ { - "address": "134.228.245.157", + "address": "157.245.228.134", "port": 3001 }, { - "address": "164.120.89.159", + "address": "159.89.120.164", "port": 3001 }, { - "address": "44.186.97.209", + "address": "209.97.186.44", "port": 3001 }, { @@ -6547,32 +6579,28 @@ ] }, { - "accumulatedStake": 0.8928102040458157, - "relativeStake": 0.0006141293235119068, + "accumulatedStake": 0.896491062115562, + "relativeStake": 0.0005809442544901618, "relays": [ { - "address": "176.206.198.143", - "port": 6000 - }, - { - "address": "62.201.154.207", - "port": 6000 + "address": "relay.armadastakepool.com", + "port": 5100 } ] }, { - "accumulatedStake": 0.8934166889096012, - "relativeStake": 0.0006064848637854658, + "accumulatedStake": 0.8970675076857241, + "relativeStake": 0.0005764455701621103, "relays": [ { - "address": "private-pools.fivebinaries.com", + "address": "europe1-relay.jpn-sp.net", "port": 3001 } ] }, { - "accumulatedStake": 0.8940224802433974, - "relativeStake": 0.0006057913337961961, + "accumulatedStake": 0.8976425614580322, + "relativeStake": 0.0005750537723081276, "relays": [ { "address": "cardano-relays-1.nu.fi", @@ -6585,144 +6613,67 @@ ] }, { - "accumulatedStake": 0.8946262894314935, - "relativeStake": 0.0006038091880960784, - "relays": [ - { - "address": "europe1-relay.jpn-sp.net", - "port": 3001 - } - ] - }, - { - "accumulatedStake": 0.89522590159576, - "relativeStake": 0.0005996121642665353, + "accumulatedStake": 0.8982176070281876, + "relativeStake": 0.0005750455701554285, "relays": [ { - "address": "111.225.61.202", - "port": 6000 + "address": "relays.staking4ada.org", + "port": 1818 }, { - "address": "110.241.38.46", - "port": 6000 + "address": "globecast.staking4ada.org", + "port": 6061 } ] }, { - "accumulatedStake": 0.8958246865282061, - "relativeStake": 0.0005987849324461718, + "accumulatedStake": 0.8987897211241973, + "relativeStake": 0.0005721140960095958, "relays": [ { - "address": "cardano-relays-1.nu.fi", - "port": 3003 + "address": "relay1-pub.ahlnet.nu", + "port": 2111 }, { - "address": "cardano-relays-2.nu.fi", - "port": 3001 - } - ] - }, - { - "accumulatedStake": 0.8964210822129903, - "relativeStake": 0.0005963956847841941, - "relays": [ - { - "address": "relay.armadastakepool.com", - "port": 5100 - } - ] - }, - { - "accumulatedStake": 0.8970159328719124, - "relativeStake": 0.0005948506589220541, - "relays": [ - { - "address": "relay-kiln-3-0.cardano.mainnet.kiln.fi", - "port": 3001 + "address": "relay2-pub.ahlnet.nu", + "port": 2111 }, { - "address": "relay-kiln-3-1.cardano.mainnet.kiln.fi", - "port": 3001 + "address": "relay3-pub.ahlnet.nu", + "port": 2111 }, { - "address": "relay-kiln-3-2.cardano.mainnet.kiln.fi", - "port": 3001 + "address": "relay-fallback.ahlnet.nu", + "port": 55218 } ] }, { - "accumulatedStake": 0.8976079775264847, - "relativeStake": 0.0005920446545722655, + "accumulatedStake": 0.8993611830491409, + "relativeStake": 0.0005714619249437082, "relays": [ { - "address": "21.105.167.89", - "port": 6000 + "address": "cardano-relays-1.nu.fi", + "port": 3003 }, { - "address": "250.110.104.178", - "port": 6000 - } - ] - }, - { - "accumulatedStake": 0.8981993783317063, - "relativeStake": 0.0005914008052215263, - "relays": [ - { - "address": "r1.isp-r1.wjg.jp", + "address": "cardano-relays-2.nu.fi", "port": 3001 - }, - { - "address": "r2.isp-r1.wjg.jp", - "port": 3002 - } - ] - }, - { - "accumulatedStake": 0.89878091014264, - "relativeStake": 0.0005815318109338587, - "relays": [ - { - "address": "cardano-relays.atomicwallet.io", - "port": 6001 - } - ] - }, - { - "accumulatedStake": 0.899360192105775, - "relativeStake": 0.0005792819631349694, - "relays": [ - { - "address": "bra-relay.cardanistas.io", - "port": 8081 - }, - { - "address": "usa-relay.cardanistas.io", - "port": 8082 - }, - { - "address": "de-relay.cardanistas.io", - "port": 8083 } ] }, { - "accumulatedStake": 0.8999364519626906, - "relativeStake": 0.0005762598569154913, + "accumulatedStake": 0.8999316278793225, + "relativeStake": 0.0005704448301815358, "relays": [ { - "address": "re1.reservoir.network", - "port": 3001 - }, - { - "address": "re2.reservoir.network", - "port": 3001 + "address": "relay-pool-figment-4-mainnet.cardano.aeq5f.com" } ] }, { - "accumulatedStake": 0.9005070719308936, - "relativeStake": 0.0005706199682030543, + "accumulatedStake": 0.9004963876689663, + "relativeStake": 0.0005647597896438093, "relays": [ { "address": "cardano-relays-1.nu.fi", diff --git a/configuration/cardano/mainnet-topology.json b/configuration/cardano/mainnet-topology.json index 7f400d02136..4019031eebc 100644 --- a/configuration/cardano/mainnet-topology.json +++ b/configuration/cardano/mainnet-topology.json @@ -24,5 +24,5 @@ "advertise": false } ], - "useLedgerAfterSlot": 194140785 + "useLedgerAfterSlot": 200620811 } diff --git a/configuration/cardano/testnet-template-config.json b/configuration/cardano/testnet-template-config.json index 960e8af3718..b219cb4315e 100644 --- a/configuration/cardano/testnet-template-config.json +++ b/configuration/cardano/testnet-template-config.json @@ -13,6 +13,8 @@ "Backend": "V2InMemory", "QueryBatchSize": 100000, "Snapshots": { + "MaxDelay": 1080, + "MinDelay": 300, "NumOfDiskSnapshots": 2, "SlotOffset": 0, "SnapshotInterval": 4320 @@ -26,8 +28,7 @@ "TestMaryHardForkAtEpoch": 0, "TestShelleyHardForkAtEpoch": 0, "TraceOptionForwarder": { - "connQueueSize": 64, - "disconnQueueSize": 128, + "queueSize": 128, "maxReconnectDelay": 30 }, "TraceOptionMetricsPrefix": "cardano.node.metrics.", @@ -100,6 +101,9 @@ "Net.Mux.Remote": { "severity": "Info" }, + "Net.Mux.Remote.Bearer": { + "severity": "Silence" + }, "Net.PeerSelection": { "severity": "Info" }, From c64e0460c35d6a232d0d6d12e7eaed005de3eb81 Mon Sep 17 00:00:00 2001 From: John Lotoski Date: Sun, 11 Oct 2026 03:12:15 -0500 Subject: [PATCH 13/25] nixosModule: add configFormat to select the generated config dialect The published configs and release artifacts moved to the cardano-config envelope, but the service still writes a flat config. Add configFormat, "legacy" or "enveloped", so consumers can move a host at a time. Enveloping happens last, on the assembled instance config, so nodeConfig, extraNodeConfig and extraNodeInstanceConfig stay flat and keep today's key names. mkEnvelope applies the renames and sections each key. A key it does not recognise is kept outside any section, where the node will not resolve it, so opting a host in is worth checking against its warnings. Ignored when nodeConfigFile is set, so workbench is unaffected. The default stays legacy. --- nix/nixos/cardano-node-service.nix | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/nix/nixos/cardano-node-service.nix b/nix/nixos/cardano-node-service.nix index 38c77e842d1..2c67c81056b 100644 --- a/nix/nixos/cardano-node-service.nix +++ b/nix/nixos/cardano-node-service.nix @@ -79,8 +79,12 @@ let }); in i: let instanceConfig = recursiveUpdate (baseInstanceConfig i) (cfg.extraNodeInstanceConfig i); + publishedConfig = + if cfg.configFormat == "enveloped" + then cfg.cardanoNodePackages.cardanoLib.mkEnvelope instanceConfig + else instanceConfig; nodeConfigFile = if (cfg.nodeConfigFile != null) then cfg.nodeConfigFile - else toFile "config-${toString cfg.nodeId}-${toString i}.json" (toJSON instanceConfig); + else toFile "config-${toString cfg.nodeId}-${toString i}.json" (toJSON publishedConfig); consensusParams = { RealPBFT = [ "${optionalString (cfg.signingKey != null) @@ -792,6 +796,29 @@ in { description = ''The actual configuration file.''; }; + configFormat = mkOption { + type = enum [ + "legacy" + "enveloped" + ]; + default = "legacy"; + description = '' + Which dialect the generated node config file is written in, named as + cardano-config names them. Ignored when nodeConfigFile is set, since + that file is used as given. + + On "enveloped" the config is wrapped with cardanoLib.mkEnvelope at the + end, so nodeConfig, extraNodeConfig and extraNodeInstanceConfig stay + flat and keep the key names they use today. mkEnvelope applies the + cardano-config renames and groups each key under the section that owns + it. A key it does not recognise is kept, but outside any section, + where the node will not resolve it. + + The default stays "legacy" while consumers opt in per host. Published + configs and release artifacts are already enveloped. + ''; + }; + forceHardForks = mkOption { type = attrsOf int; default = {}; From 74da57d937c7394fbd77101fc39a032abbde3fb8 Mon Sep 17 00:00:00 2001 From: John Lotoski Date: Sun, 11 Oct 2026 04:00:31 -0500 Subject: [PATCH 14/25] nixosModule: warn about config keys enveloping would strand Added warnings, raised at eval time when configFormat is "enveloped", for keys cardano-config will not resolve. Lifted the config assembly out of mkScript to module level so the warnings check the same document that gets written, rather than a second assembly of it. Needs the cardanoLib exports added in iohk-nix: removedKeys, renamedKeys and unrecognisedKeys. --- nix/nixos/cardano-node-service.nix | 92 ++++++++++++++++++++---------- 1 file changed, 63 insertions(+), 29 deletions(-) diff --git a/nix/nixos/cardano-node-service.nix b/nix/nixos/cardano-node-service.nix index 2c67c81056b..92feda1c77a 100644 --- a/nix/nixos/cardano-node-service.nix +++ b/nix/nixos/cardano-node-service.nix @@ -49,36 +49,41 @@ let then "/etc/cardano-node/topology-${toString i}.json" else selectTopology i; + baseConfig = + recursiveUpdate + (cfg.nodeConfig + // (mapAttrs' (era: epoch: + nameValuePair "Test${era}HardForkAtEpoch" epoch + ) cfg.forceHardForks) + // { + MaxConcurrencyBulkSync = 2; + } // optionalAttrs (cfg.targetNumberOfRootPeers != null) { + TargetNumberOfRootPeers = cfg.targetNumberOfRootPeers; + } // optionalAttrs (cfg.targetNumberOfKnownPeers != null) { + TargetNumberOfKnownPeers = cfg.targetNumberOfKnownPeers; + } // optionalAttrs (cfg.targetNumberOfEstablishedPeers != null) { + TargetNumberOfEstablishedPeers = cfg.targetNumberOfEstablishedPeers; + } // optionalAttrs (cfg.targetNumberOfActivePeers != null) { + TargetNumberOfActivePeers = cfg.targetNumberOfActivePeers; + } + ) cfg.extraNodeConfig; + + baseInstanceConfig = + i: + recursiveUpdate + baseConfig (optionalAttrs (cfg.withUtxoHdLsmt i) { + LedgerDB = { + Backend = "V2LSM"; + LSMDatabasePath = cfg.lsmDatabasePath i; + }; + }); + + mkInstanceConfig = i: + recursiveUpdate (baseInstanceConfig i) (cfg.extraNodeInstanceConfig i); + mkScript = cfg: - let baseConfig = - recursiveUpdate - (cfg.nodeConfig - // (mapAttrs' (era: epoch: - nameValuePair "Test${era}HardForkAtEpoch" epoch - ) cfg.forceHardForks) - // { - MaxConcurrencyBulkSync = 2; - } // optionalAttrs (cfg.targetNumberOfRootPeers != null) { - TargetNumberOfRootPeers = cfg.targetNumberOfRootPeers; - } // optionalAttrs (cfg.targetNumberOfKnownPeers != null) { - TargetNumberOfKnownPeers = cfg.targetNumberOfKnownPeers; - } // optionalAttrs (cfg.targetNumberOfEstablishedPeers != null) { - TargetNumberOfEstablishedPeers = cfg.targetNumberOfEstablishedPeers; - } // optionalAttrs (cfg.targetNumberOfActivePeers != null) { - TargetNumberOfActivePeers = cfg.targetNumberOfActivePeers; - } - ) cfg.extraNodeConfig; - baseInstanceConfig = - i: - recursiveUpdate - baseConfig (optionalAttrs (cfg.withUtxoHdLsmt i) { - LedgerDB = { - Backend = "V2LSM"; - LSMDatabasePath = cfg.lsmDatabasePath i; - }; - }); - in i: let - instanceConfig = recursiveUpdate (baseInstanceConfig i) (cfg.extraNodeInstanceConfig i); + i: let + instanceConfig = mkInstanceConfig i; publishedConfig = if cfg.configFormat == "enveloped" then cfg.cardanoNodePackages.cardanoLib.mkEnvelope instanceConfig @@ -1045,6 +1050,35 @@ in { }; } { + # Only keys cardano-config resolves survive enveloping in a section the + # node reads. A stale name still applies, mkEnvelope renames it, and a + # removed key is dropped on purpose, so neither is a fault. Anything else + # is kept outside every section and ignored, which is. Warnings rather + # than assertions for now: a key may be legitimately absent from the + # cardano-config schema, and blocking a deploy on that is worse than + # reporting it. + warnings = let + inherit (cfg.cardanoNodePackages.cardanoLib) + removedKeys renamedKeys unrecognisedKeys; + flagged = unique (concatMap (i: unrecognisedKeys removedKeys (mkInstanceConfig i)) + (genList trivial.id cfg.instances)); + stale = filter (k: renamedKeys ? ${k}) flagged; + unknown = filter (k: !(renamedKeys ? ${k})) flagged; + in optionals (cfg.configFormat == "enveloped") ( + optional (stale != []) '' + services.cardano-node: these config keys have been renamed by cardano-config: + ${concatMapStringsSep "\n" (k: " ${k} -> ${renamedKeys.${k}}") stale} + They still apply, mkEnvelope renames them, but the new names are what + the schema and the published configs use. + '' + ++ optional (unknown != []) '' + services.cardano-node: cardano-config does not resolve these config keys: + ${concatMapStringsSep "\n" (k: " ${k}") unknown} + Enveloping keeps them outside every section, where the node ignores + them. Remove them or check the name against the cardano-config schema. + '' + ); + assertions = [ { assertion = all (i: hasPrefix cfg.stateDirBase (cfg.stateDir i)) (genList trivial.id cfg.instances); From 5070393276481e6d5e8f2fcdb2c5eb1130096ada Mon Sep 17 00:00:00 2001 From: John Lotoski Date: Sun, 11 Oct 2026 04:27:32 -0500 Subject: [PATCH 15/25] nixosModule: emit the peer target names the selected dialect reads POM reads these only as TargetNumberOf*, cardano-config only as DeadlineTargetNumberOf*. The module emitted the former unconditionally, which mkEnvelope renamed, so an enveloped host warned that four keys were stale when nothing the operator set could change them. --- nix/nixos/cardano-node-service.nix | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/nix/nixos/cardano-node-service.nix b/nix/nixos/cardano-node-service.nix index 92feda1c77a..2588901b7f4 100644 --- a/nix/nixos/cardano-node-service.nix +++ b/nix/nixos/cardano-node-service.nix @@ -49,6 +49,13 @@ let then "/etc/cardano-node/topology-${toString i}.json" else selectTopology i; + # POM reads these only as TargetNumberOf*, cardano-config only as + # DeadlineTargetNumberOf*, so the name depends on the dialect. mkEnvelope + # would rename the legacy spelling, but emitting the one the dialect uses + # keeps the published config canonical and keeps a key the operator cannot + # restate out of the rename warning below. + deadlinePrefix = optionalString (cfg.configFormat == "enveloped") "Deadline"; + baseConfig = recursiveUpdate (cfg.nodeConfig @@ -58,13 +65,13 @@ let // { MaxConcurrencyBulkSync = 2; } // optionalAttrs (cfg.targetNumberOfRootPeers != null) { - TargetNumberOfRootPeers = cfg.targetNumberOfRootPeers; + "${deadlinePrefix}TargetNumberOfRootPeers" = cfg.targetNumberOfRootPeers; } // optionalAttrs (cfg.targetNumberOfKnownPeers != null) { - TargetNumberOfKnownPeers = cfg.targetNumberOfKnownPeers; + "${deadlinePrefix}TargetNumberOfKnownPeers" = cfg.targetNumberOfKnownPeers; } // optionalAttrs (cfg.targetNumberOfEstablishedPeers != null) { - TargetNumberOfEstablishedPeers = cfg.targetNumberOfEstablishedPeers; + "${deadlinePrefix}TargetNumberOfEstablishedPeers" = cfg.targetNumberOfEstablishedPeers; } // optionalAttrs (cfg.targetNumberOfActivePeers != null) { - TargetNumberOfActivePeers = cfg.targetNumberOfActivePeers; + "${deadlinePrefix}TargetNumberOfActivePeers" = cfg.targetNumberOfActivePeers; } ) cfg.extraNodeConfig; From a245915ab2a08f60a12eeca7d64ee92433f13cd4 Mon Sep 17 00:00:00 2001 From: John Lotoski Date: Sun, 11 Oct 2026 04:39:33 -0500 Subject: [PATCH 16/25] nixosTests/cardanoNodeDbtools: raise the global timeout to 300s globalTimeout bounds the whole test, so 45s had to cover the vm boot plus create-env, synthesis, both analyser passes, truncation and the asserted synthesis. It was raised from 30 to 45 in c310c0d7 and is still tight enough that runner variance can reach it. 300s keeps the override useful for surfacing a hang while leaving room under the one hour framework default. --- nix/nixos/tests/cardano-node-dbtools.nix | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/nix/nixos/tests/cardano-node-dbtools.nix b/nix/nixos/tests/cardano-node-dbtools.nix index 34bf19ef56a..ca86257705d 100644 --- a/nix/nixos/tests/cardano-node-dbtools.nix +++ b/nix/nixos/tests/cardano-node-dbtools.nix @@ -55,12 +55,16 @@ ''; }; - # NixosTest script fns supporting a timeout have a default of 900 seconds. + # Budget for the whole test, not per step: the driver kills everything and + # fails once it is reached. It covers the vm boot as well as create-env, + # synthesis, both analyser passes, truncation and the asserted synthesis, so + # it has to absorb runner variance across all of them. Not to be confused + # with the 900 second default on script fns that take their own timeout, + # which is per call and which nothing here sets. # - # There is no pre-existing history for chain synthesis, and default - # cardano-testnet genesis parameters set epochs to be short and fast, so a 45 - # second global timeout should be more than sufficient. - globalTimeout = 45; + # Kept well under the one hour framework default so a hang still surfaces + # quickly, which is the only reason to override at all. + globalTimeout = 300; testDir = "testnet"; in { From 0eab09e91ff31139b15f0ca1bbabe3f9fa242b24 Mon Sep 17 00:00:00 2001 From: John Lotoski Date: Sun, 11 Oct 2026 05:07:51 -0500 Subject: [PATCH 17/25] nixosTests/cardanoOciReadonly: cover graceful shutdown Added SIGTERM and SIGINT cases for both ways into the image, scripts mode and custom mode, asserting docker did not have to SIGKILL after the grace period. These were the first four items of the Manual Testing section in nix/docker/README.md, which nobody ran and which predated merge mode, the /tmp runtime dir, read-only root and non-root UIDs. Its fifth item, cli access, is already covered three times here. Dropped the section. Use util-linux rather than the utillinux alias to resolve eval warn. --- nix/docker/README.md | 66 -------------------- nix/docker/default.nix | 4 +- nix/docker/submit-api.nix | 4 +- nix/docker/tracer.nix | 4 +- nix/nixos/tests/cardano-oci-readonly.nix | 76 ++++++++++++++++++++++-- 5 files changed, 77 insertions(+), 77 deletions(-) diff --git a/nix/docker/README.md b/nix/docker/README.md index 3fec8615388..f71cda06b9e 100644 --- a/nix/docker/README.md +++ b/nix/docker/README.md @@ -591,69 +591,3 @@ docker run \ -e CARDANO_CONFIG_JSON_MERGE='{"network":{"contents":["/ipc/node-tracer.socket"],"tag":"ConnectTo"}}' \ ghcr.io/intersectmbo/cardano-tracer:dev ``` - -# Manual Testing -1. Run -e NETWORK=mainnet and check graceful shutdown SIGINT with -it -2. Run -e NETWORK=mainnet and check graceful shutdown SIGTERM with --detach -3. Run without -e NETWORK and check graceful shutdown SIGINT with -it -4. Run without -e NETWORK and check graceful shutdown SIGTERM with --detach -5. Check cardano-cli access - - -## Run with NETWORK -Run -e NETWORK=mainnet and check graceful shutdown SIGINT with -it -``` -docker run --rm -it \ - -p 3001:3001 \ - -e NETWORK=mainnet \ - -v node-data:/data \ - ghcr.io/intersectmbo/cardano-node:dev -``` - -Run -e NETWORK=mainnet and check graceful shutdown SIGTERM with --detach -``` -docker rm -f relay -docker run --detach \ - --name=relay \ - -p 3001:3001 \ - -e NETWORK=mainnet \ - -v node-data:/data \ - ghcr.io/intersectmbo/cardano-node:dev - -docker logs -f relay -``` - - -## Run without NETWORK -Check graceful shutdown SIGINT with -it -``` -docker run --rm -it \ - -p 3001:3001 \ - -v node-data:/data \ - ghcr.io/intersectmbo/cardano-node:dev run -``` - -Check graceful shutdown SIGTERM with --detach -``` -docker rm -f relay -docker run --detach \ - --name=relay \ - -p 3001:3001 \ - -v node-data:/data \ - -v node-ipc:/ipc \ - ghcr.io/intersectmbo/cardano-node:dev run - -docker logs -f relay -``` - - -## Check cardano-cli -Check successful cardano-cli query -``` -alias cardano-cli="docker run \ - --rm -it \ - -v node-ipc:/ipc \ - ghcr.io/intersectmbo/cardano-node:dev cli" - -cardano-cli query tip --mainnet -``` diff --git a/nix/docker/default.nix b/nix/docker/default.nix index 4c8b71c3552..4900e50cec7 100644 --- a/nix/docker/default.nix +++ b/nix/docker/default.nix @@ -38,7 +38,7 @@ , iputils , jq , socat -, utillinux +, util-linux , lib , exe , script @@ -66,7 +66,7 @@ let iputils # Useful utilities for Linux networking jq # Lightweight and flexible command-line JSON processor socat # Utility for bidirectional data transfer - utillinux # System utilities for Linux + util-linux # System utilities for Linux ]; }; diff --git a/nix/docker/submit-api.nix b/nix/docker/submit-api.nix index 142bcc60664..f57e13aeec4 100644 --- a/nix/docker/submit-api.nix +++ b/nix/docker/submit-api.nix @@ -29,7 +29,7 @@ , iproute2 , iputils , socat -, utillinux +, util-linux , writeScriptBin , runtimeShell , lib @@ -56,7 +56,7 @@ let iproute2 # Utilities for controlling TCP/IP networking iputils # Useful utilities for Linux networking socat # Utility for bidirectional data transfer - utillinux # System utilities for Linux + util-linux # System utilities for Linux ]; }; diff --git a/nix/docker/tracer.nix b/nix/docker/tracer.nix index 09fef77f3a6..fa7329defcf 100644 --- a/nix/docker/tracer.nix +++ b/nix/docker/tracer.nix @@ -33,7 +33,7 @@ , iputils , jq , socat -, utillinux +, util-linux , lib , exe , script @@ -60,7 +60,7 @@ let iputils # Useful utilities for Linux networking jq # Lightweight and flexible command-line JSON processor socat # Utility for bidirectional data transfer - utillinux # System utilities for Linux + util-linux # System utilities for Linux ]; }; diff --git a/nix/nixos/tests/cardano-oci-readonly.nix b/nix/nixos/tests/cardano-oci-readonly.nix index c389151e096..194c448609a 100644 --- a/nix/nixos/tests/cardano-oci-readonly.nix +++ b/nix/nixos/tests/cardano-oci-readonly.nix @@ -18,7 +18,13 @@ # triggers the /tmp runtime dir + relative-path rewriting. The double quotes # are backslash-escaped because these are interpolated into double-quoted # Python string literals in the testScript below. - configMerge = ''{\"MaxConcurrencyBulkSync\":2}''; + # + # The node config merge is section qualified because the published config is + # in the cardano-config envelope. A merge is a deep merge with no key + # relocation, so the flat spelling would add a key outside Configuration that + # the node does not resolve, which is the shape the docker readme warns + # about. Topology and tracer configs are not enveloped and stay flat. + configMerge = ''{\"Configuration\":{\"Network\":{\"MaxConcurrencyBulkSync\":2}}}''; topologyMerge = ''{\"useLedgerAfterSlot\":1}''; tracerConfigMerge = ''{\"verbosity\":\"Minimum\"}''; @@ -81,12 +87,15 @@ in { # The merged config's relative "*File" references (ByronGenesisFile, # ShelleyGenesisFile, ..., CheckpointsFile) must be rewritten to absolute - # paths so they resolve from /tmp. Mirror the entrypoint's predicate -- any - # top-level key ending in "File" with a string value -- and assert all are - # absolute. Use jq from the container. + # paths so they resolve from /tmp. Mirror the entrypoint's predicate, which + # walks rather than reading the top level: in the cardano-config envelope + # these keys sit under Configuration.
, so a top-level scan finds + # none of them. The length guard is what makes that a failure rather than a + # vacuous pass, so keep it. Use jq from the container. machine.succeed( "docker exec n1 jq -e " - "'[to_entries[]|select(.key|endswith(\"File\"))|.value|select(type==\"string\")] as $v " + "'[..|objects|to_entries[]|select((.key|endswith(\"File\")) " + "and (.value|type==\"string\"))|.value] as $v " "| ($v|length>0) and ($v|all(startswith(\"/\")))' " "${rt}/config-merged.json" ) @@ -217,5 +226,62 @@ in { # so it only needs to execute under --read-only and as non-root. machine.succeed("docker load -i ${submitApiDockerImage}") machine.succeed("docker run --rm --read-only --user 1000:0 ${submitApiImageRef} --help >/dev/null") + + # Graceful shutdown on SIGTERM and SIGINT, for both ways in. + # + # Each mode execs the whole way down to cardano-node, so the node is the + # container's pid 1 and takes the signal itself: scripts mode goes + # entrypoint -> run-network -> the per-network script -> exec node, custom + # mode goes entrypoint -> run-node -> exec node. Drop any one of those + # execs and a shell sits at pid 1 forwarding nothing, docker gives up after + # the grace period and SIGKILLs, and the exit code is 137. That is what + # this asserts against rather than a specific clean code, which differs by + # whether the node handles the signal or dies from it. + def shutdown_case(name, args, sig): + # /logs must be a writable mount: the image bakes + # `-t/logs/cardano-node.stats` into its RTS block, and the node aborts + # at startup if it cannot open that file under a read-only root. + machine.succeed( + "docker run -d --name " + name + " --read-only --tmpfs /tmp " + "--user 1000:0 -v " + name + "data:/data -v " + name + "ipc:/ipc " + "-v " + name + "logs:/logs " + args + ) + # Long enough to be past config resolution and into the node proper, + # so the signal lands on a running node rather than on startup. + machine.sleep(10) + if machine.succeed( + "docker inspect -f '{{.State.Running}}' " + name + ).strip() != "true": + _, logs = machine.execute("docker logs " + name + " 2>&1") + raise Exception( + name + " exited before the shutdown signal; docker logs:\n" + logs + ) + + if sig == "TERM": + # Sends SIGTERM, waits, then SIGKILLs if it outlives the grace period. + machine.succeed("docker stop -t 30 " + name) + else: + # docker kill does not wait, so poll for the exit ourselves. + machine.succeed("docker kill --signal=INT " + name) + machine.wait_until_succeeds( + "[ \"$(docker inspect -f '{{.State.Running}}' " + name + ")\" = false ]", + timeout=40, + ) + + code = machine.succeed( + "docker inspect -f '{{.State.ExitCode}}' " + name + ).strip() + if code == "137": + _, logs = machine.execute("docker logs " + name + " 2>&1") + raise Exception( + name + ": SIG" + sig + " did not stop the node, docker had to " + "SIGKILL it after the grace period; docker logs:\n" + logs + ) + machine.succeed("docker rm -f " + name) + + shutdown_case("sd1", "-e NETWORK=${network} ${imageRef}", "TERM") + shutdown_case("sd2", "-e NETWORK=${network} ${imageRef}", "INT") + shutdown_case("sd3", "${imageRef} run", "TERM") + shutdown_case("sd4", "${imageRef} run", "INT") ''; } From fd650cc54d2ab7b6d5c7157e09264c64f89d611c Mon Sep 17 00:00:00 2001 From: John Lotoski Date: Sun, 11 Oct 2026 06:00:51 -0500 Subject: [PATCH 18/25] nixosTests: add submit-api startup coverage, rename to cardanoOci Added a submit-api subtest covering scripts mode startup and a metrics scrape. Renamed cardanoOciReadonly to cardanoOci. The test has covered more than read-only roots since its second commit and the name described only the first. Grouped the stages into subtests so a failure names its concern rather than a line number. Kept as one test: the shared cost is the vm, the docker daemon and four image loads, which a split would pay per test. All eleven subtests pass in ~120s. --- nix/nixos/tests/cardano-oci-readonly.nix | 287 -------------------- nix/nixos/tests/cardano-oci.nix | 329 +++++++++++++++++++++++ nix/nixos/tests/default.nix | 14 +- 3 files changed, 336 insertions(+), 294 deletions(-) delete mode 100644 nix/nixos/tests/cardano-oci-readonly.nix create mode 100644 nix/nixos/tests/cardano-oci.nix diff --git a/nix/nixos/tests/cardano-oci-readonly.nix b/nix/nixos/tests/cardano-oci-readonly.nix deleted file mode 100644 index 194c448609a..00000000000 --- a/nix/nixos/tests/cardano-oci-readonly.nix +++ /dev/null @@ -1,287 +0,0 @@ -{ - pkgs, - dockerImage, - tracerDockerImage, - submitApiDockerImage, - ... -}: let - inherit (pkgs) lib; - - # Image refs as `docker load` will tag them (repoName:gitrev). - imageRef = "${dockerImage.imageName}:${dockerImage.imageTag}"; - tracerImageRef = "${tracerDockerImage.imageName}:${tracerDockerImage.imageTag}"; - submitApiImageRef = "${submitApiDockerImage.imageName}:${submitApiDockerImage.imageTag}"; - - network = "preview"; - - # Harmless merge keys, present only to exercise merge mode which is what - # triggers the /tmp runtime dir + relative-path rewriting. The double quotes - # are backslash-escaped because these are interpolated into double-quoted - # Python string literals in the testScript below. - # - # The node config merge is section qualified because the published config is - # in the cardano-config envelope. A merge is a deep merge with no key - # relocation, so the flat spelling would add a key outside Configuration that - # the node does not resolve, which is the shape the docker readme warns - # about. Topology and tracer configs are not enveloped and stay flat. - configMerge = ''{\"Configuration\":{\"Network\":{\"MaxConcurrencyBulkSync\":2}}}''; - topologyMerge = ''{\"useLedgerAfterSlot\":1}''; - tracerConfigMerge = ''{\"verbosity\":\"Minimum\"}''; - - rt = "/tmp/cardano-node"; - tracerRt = "/tmp/cardano-tracer"; -in { - name = "cardano-oci-readonly-test"; - - nodes = { - machine = {...}: { - nixpkgs.pkgs = pkgs; - - # Room for loading three images (node, tracer, submit-api) + overlay + - # a starting node/tracer. - virtualisation.diskSize = 10240; - virtualisation.memorySize = 4096; - virtualisation.docker.enable = true; - - # Keep dhcpcd off docker's ephemeral interfaces. Starting and stopping - # containers churns veth pairs, dhcpcd tries to manage each one, and - # dhcpcd 10.3.1 segfaults probing one for an IPv4LL address. Harmless to - # the assertions but it core dumps and buries real errors in the log. - networking.dhcpcd.denyInterfaces = ["veth*" "docker0"]; - }; - }; - - # Like the other tests here, this is sandboxed: the node cannot sync, but it - # starts and resolves its configuration, which is all these assertions need. - testScript = '' - start_all() - machine.wait_for_unit("multi-user.target") - machine.wait_until_succeeds("docker info", timeout=120) - machine.succeed("docker load -i ${dockerImage}") - - # Read-only root + non-root UID in group 0 + merge mode. Asserts the - # container starts as read-only and group-0 volume writes work, creates its - # fixed 0700 runtime dir, writes the merged config with absolute genesis - # paths, writes the env snapshot, and the /usr/local/bin/env alias sources - # it. - machine.succeed( - "docker run -d --name n1 --read-only --tmpfs /tmp --user 1000:0 " - "-v n1data:/data -v n1ipc:/ipc -v n1logs:/logs " - "-e NETWORK=${network} " - "-e CARDANO_CONFIG_JSON_MERGE='${configMerge}' " - "-e CARDANO_TOPOLOGY_JSON_MERGE='${topologyMerge}' " - "${imageRef}" - ) - - # The runtime artifacts are written by the entrypoint/run-node before the - # node execs, so they appear shortly after start. Waiting on the env - # snapshot also confirms the container did not crash under --read-only and - # --user since `docker exec` fails against an exited container. - machine.wait_until_succeeds("docker exec n1 test -f ${rt}/env", timeout=60) - machine.succeed("[ \"$(docker inspect -f '{{.State.Running}}' n1)\" = true ]") - - machine.succeed("docker exec n1 test -d ${rt}") - machine.succeed("docker exec n1 sh -c '[ \"$(stat -c %a ${rt})\" = 700 ]'") - machine.succeed("docker exec n1 test -f ${rt}/config-merged.json") - machine.succeed("docker exec n1 test -f ${rt}/topology-merged.json") - - # The merged config's relative "*File" references (ByronGenesisFile, - # ShelleyGenesisFile, ..., CheckpointsFile) must be rewritten to absolute - # paths so they resolve from /tmp. Mirror the entrypoint's predicate, which - # walks rather than reading the top level: in the cardano-config envelope - # these keys sit under Configuration.
, so a top-level scan finds - # none of them. The length guard is what makes that a failure rather than a - # vacuous pass, so keep it. Use jq from the container. - machine.succeed( - "docker exec n1 jq -e " - "'[..|objects|to_entries[]|select((.key|endswith(\"File\")) " - "and (.value|type==\"string\"))|.value] as $v " - "| ($v|length>0) and ($v|all(startswith(\"/\")))' " - "${rt}/config-merged.json" - ) - - # The merged topology's relative peerSnapshotFile must likewise be rewritten - # to an absolute path. - machine.succeed( - "docker exec n1 jq -e " - "'(.peerSnapshotFile|type==\"string\") and (.peerSnapshotFile|startswith(\"/\"))' " - "${rt}/topology-merged.json" - ) - - # The env snapshot is POSIX-sourceable; use sh and `.` to load it and - # confirm it populated the env. - machine.succeed( - "docker exec --user 1000:0 n1 sh -c " - "'. /usr/local/bin/env && [ -n \"$CARDANO_CONFIG\" ]'" - ) - machine.succeed("docker rm -f n1") - - # The runtime dir is a fixed path, so two same-role containers sharing one - # /tmp would otherwise both write it and the last writer would win. Both - # containers here run as the default root, i.e. the same UID, which is the - # case the directory ownership check cannot catch on its own. - machine.succeed( - "docker run -d --name s1 -v shtmp:/tmp " - "-v s1data:/data -v s1ipc:/ipc -v s1logs:/logs " - "-e NETWORK=${network} " - "-e CARDANO_CONFIG_JSON_MERGE='${configMerge}' " - "${imageRef}" - ) - machine.wait_until_succeeds("docker exec s1 test -f ${rt}/env", timeout=60) - - status, out = machine.execute( - "docker run --rm -v shtmp:/tmp -e NETWORK=${network} ${imageRef} 2>&1" - ) - assert status != 0, f"expected non-zero exit for a shared /tmp; got: {out}" - assert "is in use by another container" in out, f"missing lock error; got: {out}" - - # Once the holder is gone the lock is released, so the same volume, now - # carrying a stale runtime dir, must still be usable. This is what separates - # the lock from a blanket refusal whenever the directory already exists. - machine.succeed("docker rm -f s1") - machine.succeed( - "docker run -d --name s2 -v shtmp:/tmp " - "-v s2data:/data -v s2ipc:/ipc -v s2logs:/logs " - "-e NETWORK=${network} " - "-e CARDANO_CONFIG_JSON_MERGE='${configMerge}' " - "${imageRef}" - ) - machine.wait_until_succeeds("docker exec s2 test -f ${rt}/env", timeout=60) - machine.succeed("docker rm -f s2") - - # Read-only root WITHOUT a writable /tmp must fail fast with guidance. - status, out = machine.execute( - "docker run --rm --read-only -e NETWORK=${network} ${imageRef} 2>&1" - ) - assert status != 0, "expected non-zero exit when /tmp is not writable" - assert "/tmp is not writable" in out, f"missing actionable /tmp error; got: {out}" - - # Cli mode must NOT require a writable /tmp (read-only, no tmpfs). - machine.succeed("docker run --rm --read-only ${imageRef} cli version") - - # Cli mode is dispatched before the NETWORK modes, so a NETWORK left in the - # environment, with or without a merge var, must neither start a node nor - # reach the merge block, which writes to the runtime dir cli mode skips. - machine.succeed( - "docker run --rm --read-only -e NETWORK=${network} ${imageRef} cli version" - ) - machine.succeed( - "docker run --rm --read-only -e NETWORK=${network} " - "-e CARDANO_CONFIG_JSON_MERGE='${configMerge}' ${imageRef} cli version" - ) - - # Operator-supplied RTS flags are appended after the image's baked +RTS - # block and merge with it. `-po` covers .prof, .hp and .ticky only, so an - # eventlog without its own `-ol` is created in the container cwd (/) and the - # RTS aborts before main under a read-only root. /logs must be a writable - # mount here or the baked `-t/logs/cardano-node.stats` aborts first, which - # would pass the exit-code check for the wrong reason. - status, out = machine.execute( - "docker run --rm --read-only --tmpfs /tmp -v e0logs:/logs " - "-e NETWORK=${network} ${imageRef} +RTS -l -RTS 2>&1" - ) - assert status != 0, f"expected non-zero exit for -l without -ol; got: {out}" - assert "initEventLogFileWriter" in out, f"expected an eventlog open failure; got: {out}" - - # Given `-ol` under a writable mount it starts and writes the eventlog there. - machine.succeed( - "docker run -d --name e1 --read-only --tmpfs /tmp --user 1000:0 " - "-v e1data:/data -v e1ipc:/ipc -v e1logs:/logs " - "-e NETWORK=${network} " - "${imageRef} +RTS -l -ol/logs/cardano-node.eventlog -RTS" - ) - machine.wait_until_succeeds( - "docker exec e1 test -s /logs/cardano-node.eventlog", timeout=60 - ) - machine.succeed("docker rm -f e1") - - # Tracer image: same read-only + non-root + merge-mode behavior as the - # node, minus the genesis/topology rewrites as tracer config has no - # relative file references. - machine.succeed("docker load -i ${tracerDockerImage}") - machine.succeed( - "docker run -d --name t1 --read-only --tmpfs /tmp --user 1000:0 " - "-v t1data:/data -v t1ipc:/ipc -v t1logs:/logs " - "-e NETWORK=${network} " - "-e CARDANO_CONFIG_JSON_MERGE='${tracerConfigMerge}' " - "${tracerImageRef}" - ) - # Give the entrypoint time to write artifacts and exec the tracer. If the - # container exits early, surface its logs rather than failing later with an - # opaque `docker exec` timeout against a dead container. - machine.sleep(10) - if machine.succeed("docker inspect -f '{{.State.Running}}' t1").strip() != "true": - _, logs = machine.execute("docker logs t1 2>&1") - raise Exception("tracer container exited early; docker logs:\n" + logs) - machine.succeed("docker exec t1 sh -c '[ \"$(stat -c %a ${tracerRt})\" = 700 ]'") - machine.succeed("docker exec t1 test -f ${tracerRt}/tracer-config-merged.json") - machine.succeed("docker exec t1 test -f ${tracerRt}/env") - machine.succeed( - "docker exec --user 1000:0 t1 sh -c " - "'. /usr/local/bin/env && [ -n \"$CARDANO_CONFIG\" ]'" - ) - machine.succeed("docker rm -f t1") - - # Submit-api image: stateless (no env snapshot / merge / state writes), - # so it only needs to execute under --read-only and as non-root. - machine.succeed("docker load -i ${submitApiDockerImage}") - machine.succeed("docker run --rm --read-only --user 1000:0 ${submitApiImageRef} --help >/dev/null") - - # Graceful shutdown on SIGTERM and SIGINT, for both ways in. - # - # Each mode execs the whole way down to cardano-node, so the node is the - # container's pid 1 and takes the signal itself: scripts mode goes - # entrypoint -> run-network -> the per-network script -> exec node, custom - # mode goes entrypoint -> run-node -> exec node. Drop any one of those - # execs and a shell sits at pid 1 forwarding nothing, docker gives up after - # the grace period and SIGKILLs, and the exit code is 137. That is what - # this asserts against rather than a specific clean code, which differs by - # whether the node handles the signal or dies from it. - def shutdown_case(name, args, sig): - # /logs must be a writable mount: the image bakes - # `-t/logs/cardano-node.stats` into its RTS block, and the node aborts - # at startup if it cannot open that file under a read-only root. - machine.succeed( - "docker run -d --name " + name + " --read-only --tmpfs /tmp " - "--user 1000:0 -v " + name + "data:/data -v " + name + "ipc:/ipc " - "-v " + name + "logs:/logs " + args - ) - # Long enough to be past config resolution and into the node proper, - # so the signal lands on a running node rather than on startup. - machine.sleep(10) - if machine.succeed( - "docker inspect -f '{{.State.Running}}' " + name - ).strip() != "true": - _, logs = machine.execute("docker logs " + name + " 2>&1") - raise Exception( - name + " exited before the shutdown signal; docker logs:\n" + logs - ) - - if sig == "TERM": - # Sends SIGTERM, waits, then SIGKILLs if it outlives the grace period. - machine.succeed("docker stop -t 30 " + name) - else: - # docker kill does not wait, so poll for the exit ourselves. - machine.succeed("docker kill --signal=INT " + name) - machine.wait_until_succeeds( - "[ \"$(docker inspect -f '{{.State.Running}}' " + name + ")\" = false ]", - timeout=40, - ) - - code = machine.succeed( - "docker inspect -f '{{.State.ExitCode}}' " + name - ).strip() - if code == "137": - _, logs = machine.execute("docker logs " + name + " 2>&1") - raise Exception( - name + ": SIG" + sig + " did not stop the node, docker had to " - "SIGKILL it after the grace period; docker logs:\n" + logs - ) - machine.succeed("docker rm -f " + name) - - shutdown_case("sd1", "-e NETWORK=${network} ${imageRef}", "TERM") - shutdown_case("sd2", "-e NETWORK=${network} ${imageRef}", "INT") - shutdown_case("sd3", "${imageRef} run", "TERM") - shutdown_case("sd4", "${imageRef} run", "INT") - ''; -} diff --git a/nix/nixos/tests/cardano-oci.nix b/nix/nixos/tests/cardano-oci.nix new file mode 100644 index 00000000000..477c9280e14 --- /dev/null +++ b/nix/nixos/tests/cardano-oci.nix @@ -0,0 +1,329 @@ +{ + pkgs, + dockerImage, + tracerDockerImage, + submitApiDockerImage, + ... +}: let + inherit (pkgs) lib; + + # Image refs as `docker load` will tag them (repoName:gitrev). + imageRef = "${dockerImage.imageName}:${dockerImage.imageTag}"; + tracerImageRef = "${tracerDockerImage.imageName}:${tracerDockerImage.imageTag}"; + submitApiImageRef = "${submitApiDockerImage.imageName}:${submitApiDockerImage.imageTag}"; + + # The metricsPort default of services.cardano-submit-api, which the image + # does not override. See nix/pkgs.nix submitApiDockerImage defaultConfig, + # which sets only socketPath and listenAddress. + submitApiMetricsPort = 8081; + + network = "preview"; + + # Harmless merge keys, present only to exercise merge mode which is what + # triggers the /tmp runtime dir + relative-path rewriting. The double quotes + # are backslash-escaped because these are interpolated into double-quoted + # Python string literals in the testScript below. + # + # The node config merge is section qualified because the published config is + # in the cardano-config envelope. A merge is a deep merge with no key + # relocation, so the flat spelling would add a key outside Configuration that + # the node does not resolve, which is the shape the docker readme warns + # about. Topology and tracer configs are not enveloped and stay flat. + configMerge = ''{\"Configuration\":{\"Network\":{\"MaxConcurrencyBulkSync\":2}}}''; + topologyMerge = ''{\"useLedgerAfterSlot\":1}''; + tracerConfigMerge = ''{\"verbosity\":\"Minimum\"}''; + + rt = "/tmp/cardano-node"; + tracerRt = "/tmp/cardano-tracer"; +in { + name = "cardano-oci-test"; + + nodes = { + machine = {...}: { + nixpkgs.pkgs = pkgs; + + # Room for loading three images (node, tracer, submit-api) + overlay + + # a starting node/tracer. + virtualisation.diskSize = 10240; + virtualisation.memorySize = 4096; + virtualisation.docker.enable = true; + + # Keep dhcpcd off docker's ephemeral interfaces. Starting and stopping + # containers churns veth pairs, dhcpcd tries to manage each one, and + # dhcpcd 10.3.1 segfaults probing one for an IPv4LL address. Harmless to + # the assertions but it core dumps and buries real errors in the log. + networking.dhcpcd.denyInterfaces = ["veth*" "docker0"]; + }; + }; + + # Like the other tests here, this is sandboxed: the node cannot sync, but it + # starts and resolves its configuration, which is all these assertions need. + testScript = '' + start_all() + machine.wait_for_unit("multi-user.target") + machine.wait_until_succeeds("docker info", timeout=120) + machine.succeed("docker load -i ${dockerImage}") + + with subtest("node: read-only root, non-root uid, merge mode"): + # Read-only root + non-root UID in group 0 + merge mode. Asserts the + # container starts as read-only and group-0 volume writes work, creates its + # fixed 0700 runtime dir, writes the merged config with absolute genesis + # paths, writes the env snapshot, and the /usr/local/bin/env alias sources + # it. + machine.succeed( + "docker run -d --name n1 --read-only --tmpfs /tmp --user 1000:0 " + "-v n1data:/data -v n1ipc:/ipc -v n1logs:/logs " + "-e NETWORK=${network} " + "-e CARDANO_CONFIG_JSON_MERGE='${configMerge}' " + "-e CARDANO_TOPOLOGY_JSON_MERGE='${topologyMerge}' " + "${imageRef}" + ) + + # The runtime artifacts are written by the entrypoint/run-node before the + # node execs, so they appear shortly after start. Waiting on the env + # snapshot also confirms the container did not crash under --read-only and + # --user since `docker exec` fails against an exited container. + machine.wait_until_succeeds("docker exec n1 test -f ${rt}/env", timeout=60) + machine.succeed("[ \"$(docker inspect -f '{{.State.Running}}' n1)\" = true ]") + + machine.succeed("docker exec n1 test -d ${rt}") + machine.succeed("docker exec n1 sh -c '[ \"$(stat -c %a ${rt})\" = 700 ]'") + machine.succeed("docker exec n1 test -f ${rt}/config-merged.json") + machine.succeed("docker exec n1 test -f ${rt}/topology-merged.json") + + # The merged config's relative "*File" references (ByronGenesisFile, + # ShelleyGenesisFile, ..., CheckpointsFile) must be rewritten to absolute + # paths so they resolve from /tmp. Mirror the entrypoint's predicate, which + # walks rather than reading the top level: in the cardano-config envelope + # these keys sit under Configuration.
, so a top-level scan finds + # none of them. The length guard is what makes that a failure rather than a + # vacuous pass, so keep it. Use jq from the container. + machine.succeed( + "docker exec n1 jq -e " + "'[..|objects|to_entries[]|select((.key|endswith(\"File\")) " + "and (.value|type==\"string\"))|.value] as $v " + "| ($v|length>0) and ($v|all(startswith(\"/\")))' " + "${rt}/config-merged.json" + ) + + # The merged topology's relative peerSnapshotFile must likewise be rewritten + # to an absolute path. + machine.succeed( + "docker exec n1 jq -e " + "'(.peerSnapshotFile|type==\"string\") and (.peerSnapshotFile|startswith(\"/\"))' " + "${rt}/topology-merged.json" + ) + + # The env snapshot is POSIX-sourceable; use sh and `.` to load it and + # confirm it populated the env. + machine.succeed( + "docker exec --user 1000:0 n1 sh -c " + "'. /usr/local/bin/env && [ -n \"$CARDANO_CONFIG\" ]'" + ) + machine.succeed("docker rm -f n1") + + with subtest("node: runtime dir lock across containers"): + # The runtime dir is a fixed path, so two same-role containers sharing one + # /tmp would otherwise both write it and the last writer would win. Both + # containers here run as the default root, i.e. the same UID, which is the + # case the directory ownership check cannot catch on its own. + machine.succeed( + "docker run -d --name s1 -v shtmp:/tmp " + "-v s1data:/data -v s1ipc:/ipc -v s1logs:/logs " + "-e NETWORK=${network} " + "-e CARDANO_CONFIG_JSON_MERGE='${configMerge}' " + "${imageRef}" + ) + machine.wait_until_succeeds("docker exec s1 test -f ${rt}/env", timeout=60) + + status, out = machine.execute( + "docker run --rm -v shtmp:/tmp -e NETWORK=${network} ${imageRef} 2>&1" + ) + assert status != 0, f"expected non-zero exit for a shared /tmp; got: {out}" + assert "is in use by another container" in out, f"missing lock error; got: {out}" + + # Once the holder is gone the lock is released, so the same volume, now + # carrying a stale runtime dir, must still be usable. This is what separates + # the lock from a blanket refusal whenever the directory already exists. + machine.succeed("docker rm -f s1") + machine.succeed( + "docker run -d --name s2 -v shtmp:/tmp " + "-v s2data:/data -v s2ipc:/ipc -v s2logs:/logs " + "-e NETWORK=${network} " + "-e CARDANO_CONFIG_JSON_MERGE='${configMerge}' " + "${imageRef}" + ) + machine.wait_until_succeeds("docker exec s2 test -f ${rt}/env", timeout=60) + machine.succeed("docker rm -f s2") + + with subtest("node: read-only root without a writable /tmp"): + # Read-only root WITHOUT a writable /tmp must fail fast with guidance. + status, out = machine.execute( + "docker run --rm --read-only -e NETWORK=${network} ${imageRef} 2>&1" + ) + assert status != 0, "expected non-zero exit when /tmp is not writable" + assert "/tmp is not writable" in out, f"missing actionable /tmp error; got: {out}" + + with subtest("node: cli mode dispatch"): + # Cli mode must NOT require a writable /tmp (read-only, no tmpfs). + machine.succeed("docker run --rm --read-only ${imageRef} cli version") + + # Cli mode is dispatched before the NETWORK modes, so a NETWORK left in the + # environment, with or without a merge var, must neither start a node nor + # reach the merge block, which writes to the runtime dir cli mode skips. + machine.succeed( + "docker run --rm --read-only -e NETWORK=${network} ${imageRef} cli version" + ) + machine.succeed( + "docker run --rm --read-only -e NETWORK=${network} " + "-e CARDANO_CONFIG_JSON_MERGE='${configMerge}' ${imageRef} cli version" + ) + + with subtest("node: operator rts flags and the eventlog"): + # Operator-supplied RTS flags are appended after the image's baked +RTS + # block and merge with it. `-po` covers .prof, .hp and .ticky only, so an + # eventlog without its own `-ol` is created in the container cwd (/) and the + # RTS aborts before main under a read-only root. /logs must be a writable + # mount here or the baked `-t/logs/cardano-node.stats` aborts first, which + # would pass the exit-code check for the wrong reason. + status, out = machine.execute( + "docker run --rm --read-only --tmpfs /tmp -v e0logs:/logs " + "-e NETWORK=${network} ${imageRef} +RTS -l -RTS 2>&1" + ) + assert status != 0, f"expected non-zero exit for -l without -ol; got: {out}" + assert "initEventLogFileWriter" in out, f"expected an eventlog open failure; got: {out}" + + # Given `-ol` under a writable mount it starts and writes the eventlog there. + machine.succeed( + "docker run -d --name e1 --read-only --tmpfs /tmp --user 1000:0 " + "-v e1data:/data -v e1ipc:/ipc -v e1logs:/logs " + "-e NETWORK=${network} " + "${imageRef} +RTS -l -ol/logs/cardano-node.eventlog -RTS" + ) + machine.wait_until_succeeds( + "docker exec e1 test -s /logs/cardano-node.eventlog", timeout=60 + ) + machine.succeed("docker rm -f e1") + + with subtest("tracer image"): + # Tracer image: same read-only + non-root + merge-mode behavior as the + # node, minus the genesis/topology rewrites as tracer config has no + # relative file references. + machine.succeed("docker load -i ${tracerDockerImage}") + machine.succeed( + "docker run -d --name t1 --read-only --tmpfs /tmp --user 1000:0 " + "-v t1data:/data -v t1ipc:/ipc -v t1logs:/logs " + "-e NETWORK=${network} " + "-e CARDANO_CONFIG_JSON_MERGE='${tracerConfigMerge}' " + "${tracerImageRef}" + ) + # Give the entrypoint time to write artifacts and exec the tracer. If the + # container exits early, surface its logs rather than failing later with an + # opaque `docker exec` timeout against a dead container. + machine.sleep(10) + if machine.succeed("docker inspect -f '{{.State.Running}}' t1").strip() != "true": + _, logs = machine.execute("docker logs t1 2>&1") + raise Exception("tracer container exited early; docker logs:\n" + logs) + machine.succeed("docker exec t1 sh -c '[ \"$(stat -c %a ${tracerRt})\" = 700 ]'") + machine.succeed("docker exec t1 test -f ${tracerRt}/tracer-config-merged.json") + machine.succeed("docker exec t1 test -f ${tracerRt}/env") + machine.succeed( + "docker exec --user 1000:0 t1 sh -c " + "'. /usr/local/bin/env && [ -n \"$CARDANO_CONFIG\" ]'" + ) + machine.succeed("docker rm -f t1") + + with subtest("submit-api image"): + # Submit-api image: stateless (no env snapshot / merge / state writes), + # so it only needs to execute under --read-only and as non-root. + machine.succeed("docker load -i ${submitApiDockerImage}") + machine.succeed("docker run --rm --read-only --user 1000:0 ${submitApiImageRef} --help >/dev/null") + + # Scripts mode, which --help above cannot reach: it exits before the baked + # tracing config is parsed. That is how the 11.0.1 submit-api image shipped + # broken, aborting at startup on a config trace-dispatcher rejected. + # + # No node is needed behind it: the api listens either way and opens the + # node socket per submission. The image bakes socketPath, so the script + # exports CARDANO_NODE_SOCKET_PATH itself and /ipc need only exist. + machine.succeed( + "docker run -d --name sa1 --read-only --tmpfs /tmp --user 1000:0 " + "-v sa1ipc:/ipc -e NETWORK=${network} " + "-p ${toString submitApiMetricsPort}:${toString submitApiMetricsPort} " + "${submitApiImageRef}" + ) + machine.sleep(10) + if machine.succeed("docker inspect -f '{{.State.Running}}' sa1").strip() != "true": + _, logs = machine.execute("docker logs sa1 2>&1") + raise Exception("submit-api container exited early; docker logs:\n" + logs) + + # The scrape is the real assertion: metrics only serve once tracing is + # configured, so a config the tracing system rejects cannot reach here. + # Metrics are on / rather than /metrics, and the metric name carries + # TraceOptionMetricsPrefix with dots as underscores. + machine.wait_until_succeeds( + "curl -sf http://localhost:${toString submitApiMetricsPort}/ " + "| grep -qF cardano_submit_api_metrics_tx_submit_counter", + timeout=60, + ) + machine.succeed("docker rm -f sa1") + + # Graceful shutdown on SIGTERM and SIGINT, for both ways in. + # + # Each mode execs the whole way down to cardano-node, so the node is the + # container's pid 1 and takes the signal itself: scripts mode goes + # entrypoint -> run-network -> the per-network script -> exec node, custom + # mode goes entrypoint -> run-node -> exec node. Drop any one of those + # execs and a shell sits at pid 1 forwarding nothing, docker gives up after + # the grace period and SIGKILLs, and the exit code is 137. That is what + # this asserts against rather than a specific clean code, which differs by + # whether the node handles the signal or dies from it. + def shutdown_case(name, args, sig): + with subtest("node: graceful shutdown, " + name + " SIG" + sig): + # /logs must be a writable mount: the image bakes + # `-t/logs/cardano-node.stats` into its RTS block, and the node aborts + # at startup if it cannot open that file under a read-only root. + machine.succeed( + "docker run -d --name " + name + " --read-only --tmpfs /tmp " + "--user 1000:0 -v " + name + "data:/data -v " + name + "ipc:/ipc " + "-v " + name + "logs:/logs " + args + ) + # Long enough to be past config resolution and into the node proper, + # so the signal lands on a running node rather than on startup. + machine.sleep(10) + if machine.succeed( + "docker inspect -f '{{.State.Running}}' " + name + ).strip() != "true": + _, logs = machine.execute("docker logs " + name + " 2>&1") + raise Exception( + name + " exited before the shutdown signal; docker logs:\n" + logs + ) + + if sig == "TERM": + # Sends SIGTERM, waits, then SIGKILLs if it outlives the grace period. + machine.succeed("docker stop -t 30 " + name) + else: + # docker kill does not wait, so poll for the exit ourselves. + machine.succeed("docker kill --signal=INT " + name) + machine.wait_until_succeeds( + "[ \"$(docker inspect -f '{{.State.Running}}' " + name + ")\" = false ]", + timeout=40, + ) + + code = machine.succeed( + "docker inspect -f '{{.State.ExitCode}}' " + name + ).strip() + if code == "137": + _, logs = machine.execute("docker logs " + name + " 2>&1") + raise Exception( + name + ": SIG" + sig + " did not stop the node, docker had to " + "SIGKILL it after the grace period; docker logs:\n" + logs + ) + machine.succeed("docker rm -f " + name) + + shutdown_case("sd1", "-e NETWORK=${network} ${imageRef}", "TERM") + shutdown_case("sd2", "-e NETWORK=${network} ${imageRef}", "INT") + shutdown_case("sd3", "${imageRef} run", "TERM") + shutdown_case("sd4", "${imageRef} run", "INT") + ''; +} diff --git a/nix/nixos/tests/default.nix b/nix/nixos/tests/default.nix index 31de2e2c440..9923bc2c0c1 100644 --- a/nix/nixos/tests/default.nix +++ b/nix/nixos/tests/default.nix @@ -31,13 +31,13 @@ in { # Tests a mainnet edge node with submit-api using nixos service config. cardanoNodeEdge = callTest ./cardano-node-edge.nix {}; - # Tests the OCI images (node, tracer, submit-api) under a read-only root, a - # non-root UID in group 0, and a private /tmp: container startup, the fixed - # 0700 runtime dir, merged-config path rewriting, the env snapshot/alias, the - # fail-fast on a missing writable /tmp, that cli mode does not require /tmp, - # and that a second same-role container sharing one /tmp is refused while a - # restart against the same stale runtime dir still succeeds. - cardanoOciReadonly = callTest ./cardano-oci-readonly.nix { + # Tests the OCI images (node, tracer, submit-api), mostly under a read-only + # root, a non-root UID in group 0 and a private /tmp. One subtest per + # concern: startup and the runtime dir, merged-config path rewriting, the + # /tmp lock and fail-fast, cli mode dispatch, operator RTS flags, submit-api + # startup to a metrics scrape, and graceful shutdown on SIGTERM and SIGINT + # for both ways into the image. + cardanoOci = callTest ./cardano-oci.nix { dockerImage = pkgs.dockerImage; tracerDockerImage = pkgs.tracerDockerImage; submitApiDockerImage = pkgs.submitApiDockerImage; From 54da05f50dbeaf57b7ce3ba72330929b6b1c8d13 Mon Sep 17 00:00:00 2001 From: John Lotoski Date: Sun, 11 Oct 2026 23:24:13 -0500 Subject: [PATCH 19/25] nixosTests: cover an enveloped host config Boot a preview node on `configFormat = "enveloped"` with `withUtxoHdLsmt` and an envelope-shaped `extraNodeConfig`, and assert the node took the cardano-config path, that it reported nothing to migrate or ignore, that the LSM backend resolved with its path, that the envelope-shaped key reached the resolved configuration, and that `config resolve` on the generated file says nothing on stderr. The service assembles the config it envelopes, so this is the only check that sees one as a host writes it: iohk-nix lints and envelopes environment configs, which carry neither the flat `V2LSM` pair the service adds nor anything a caller supplies. Reading two settings back out of the resolved `NodeConfiguration` is the part the iohk-nix checks cannot do at all. Those compare against cardano-config's own output, so a key its adapter never maps is lost identically on both sides and agrees. --- nix/nixos/tests/cardano-node-enveloped.nix | 121 +++++++++++++++++++++ nix/nixos/tests/default.nix | 7 ++ 2 files changed, 128 insertions(+) create mode 100644 nix/nixos/tests/cardano-node-enveloped.nix diff --git a/nix/nixos/tests/cardano-node-enveloped.nix b/nix/nixos/tests/cardano-node-enveloped.nix new file mode 100644 index 00000000000..a9220f641b0 --- /dev/null +++ b/nix/nixos/tests/cardano-node-enveloped.nix @@ -0,0 +1,121 @@ +{pkgs, ...}: +with pkgs; let + environment = "preview"; + + # NixosTest script fns supporting a timeout have a default of 900 seconds. + timeout = toString 60; + + lsmPath = "/var/lib/cardano-node/lsm"; + + # Distinctive and unset by the service, so finding it in the resolved + # configuration can only mean the envelope-shaped key below was honoured. + deadlineConcurrency = 7; +in { + name = "cardano-node-enveloped-test"; + nodes = { + machine = {config, ...}: { + nixpkgs.pkgs = pkgs; + imports = [ + ../. + ]; + + services.cardano-node = { + inherit environment; + + enable = true; + port = 3001; + hostAddr = "127.0.0.1"; + topology = commonLib.mkEdgeTopologyP2P { + edgeNodes = [ + { + addr = "127.0.0.1"; + port = 3001; + } + ]; + }; + nodeConfig = config.services.cardano-node.environments.${environment}.nodeConfig; + + # What this test exists for. + configFormat = "enveloped"; + + # The service writes `Backend = "V2LSM"` with a sibling + # `LSMDatabasePath`, which is the legacy flat spelling of the tagged + # `Backend.LSM` form. Nothing but a host produces it, so nothing else + # exercises the fold. + withUtxoHdLsmt = true; + lsmDatabasePath = lsmPath; + + # A caller writing part of its configuration in envelope shape, which is + # where extraNodeConfig is headed once POM is dropped. Section + # qualified, so it reaches mkEnvelope as a `Configuration` key rather + # than a flat one. + extraNodeConfig.Configuration.Network.MaxConcurrencyDeadline = deadlineConcurrency; + }; + + systemd.services.cardano-node.serviceConfig.Restart = lib.mkForce "no"; + }; + }; + + # Sandboxed like the other tests here: the node cannot sync, but it starts and + # resolves its configuration, which is all these assertions need. + testScript = '' + start_all() + + machine.wait_for_unit("cardano-node.service", timeout=${timeout}) + machine.wait_until_succeeds("[ -S /run/cardano-node/node.socket ]", timeout=${timeout}) + machine.succeed("systemctl status cardano-node") + + journal = "journalctl -u cardano-node --no-pager" + + # Positive control: prove the node took the cardano-config path. Without + # this every assertion below would also pass on a legacy configuration, + # which is not what is under test. + machine.succeed( + journal + " | grep -qF 'own parser was not run'" + ) + + # The check this test exists for. cardano-config emits this whenever + # migrate would still change the document, so a generated envelope that is + # not canonical says so here and nowhere else. The node runs either way, + # which is why it went unnoticed until a host was deployed. + machine.fail( + journal + " | grep -qF 'not in the current canonical format'" + ) + + # A key cardano-config does not resolve is kept outside every section and + # ignored, silently changing behaviour to a default. + machine.fail( + journal + " | grep -qF 'unrecognised configuration key(s)'" + ) + + # The flat V2LSM pair survived enveloping as a setting, not just as a shape: + # an unfolded backend resolves to the in-memory default with no path at all. + machine.succeed( + journal + " | grep -qF 'V2LSM (Just \"${lsmPath}\")'" + ) + + # The envelope-shaped extraNodeConfig key reached the resolved + # configuration. A dropped `Configuration` block leaves this at its default. + machine.succeed( + journal + " | grep -qF 'ncMaxConcurrencyDeadline = Just ${toString deadlineConcurrency}'" + ) + + # Tier 3, the same question asked of the file directly rather than of the + # startup log. On an envelope `resolve` has no second parser to cross-check + # against, so it prints the resolved configuration and anything on stderr is + # a complaint about the file. + cfg = machine.succeed( + journal + " | grep -om1 '/nix/store/[^\"]*config-0-0.json'" + ).strip() + print("resolving:", cfg) + machine.succeed( + "${cardanoNodePackages.cardano-node}/bin/cardano-node config resolve --config " + + cfg + + " 2>/tmp/resolve.stderr >/tmp/resolve.stdout" + ) + machine.succeed("[ -s /tmp/resolve.stdout ]") + stderr = machine.succeed("cat /tmp/resolve.stderr") + if stderr.strip(): + raise Exception("resolve reported on the generated config:\n" + stderr) + ''; +} diff --git a/nix/nixos/tests/default.nix b/nix/nixos/tests/default.nix index 9923bc2c0c1..c2371833fba 100644 --- a/nix/nixos/tests/default.nix +++ b/nix/nixos/tests/default.nix @@ -31,6 +31,13 @@ in { # Tests a mainnet edge node with submit-api using nixos service config. cardanoNodeEdge = callTest ./cardano-node-edge.nix {}; + # Tests that a host-assembled enveloped config is canonical: the service's + # own LedgerDB keys and an envelope-shaped extraNodeConfig both survive + # enveloping, and cardano-config has nothing to migrate or ignore. Nothing + # else checks a config as a host writes it; the iohk-nix lint and drift jobs + # only see environments. + cardanoNodeEnveloped = callTest ./cardano-node-enveloped.nix {}; + # Tests the OCI images (node, tracer, submit-api), mostly under a read-only # root, a non-root UID in group 0 and a private /tmp. One subtest per # concern: startup and the runtime dir, merged-config path rewriting, the From 892e17378c86c8c68524bc023b6279480924065b Mon Sep 17 00:00:00 2001 From: John Lotoski Date: Sun, 11 Oct 2026 23:25:31 -0500 Subject: [PATCH 20/25] nixosModule: record why the LedgerDB keys stay flat The service writes `Backend = "V2LSM"` with a sibling `LSMDatabasePath`, which is the legacy spelling of the tagged `Backend.LSM` form. POM reads `Backend` as a string, so the nested form fails to parse on a legacy config, and mkEnvelope folds the flat one anyway, which it must do regardless for a caller supplying the same keys through extraNodeConfig. Writing the nested form here is therefore gated on no consumer still setting `configFormat = "legacy"`, and is a single flip at that point rather than a branch on the dialect. The envelope.nix header lists this as the last of the four conditions for retiring the translation; this is where the mechanics live. --- nix/nixos/cardano-node-service.nix | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/nix/nixos/cardano-node-service.nix b/nix/nixos/cardano-node-service.nix index 2588901b7f4..99b2d517c5a 100644 --- a/nix/nixos/cardano-node-service.nix +++ b/nix/nixos/cardano-node-service.nix @@ -75,6 +75,16 @@ let } ) cfg.extraNodeConfig; + # The flat spelling is deliberate on both dialects. POM reads `Backend` as a + # string with the LSM paths as flat siblings, so the nested `Backend.LSM` form + # fails to parse on a legacy config; and mkEnvelope folds this one into the + # nested form anyway, which it has to do regardless for a caller that supplies + # the same keys through extraNodeConfig. + # + # So writing the nested form here is gated on no consumer still setting + # `configFormat = "legacy"`, and at that point it is a single flip rather than + # a branch on the dialect. Branching earlier buys nothing and makes the shape + # a caller deep-merges against depend on the dialect. baseInstanceConfig = i: recursiveUpdate From 5e5e1856dae5ca98c5bcb26ccdc9d2e813b2e0c5 Mon Sep 17 00:00:00 2001 From: John Lotoski Date: Mon, 12 Oct 2026 01:26:35 -0500 Subject: [PATCH 21/25] nixosModule: add lsmExportPath The LSM backend can export a standalone copy of each snapshot, which is what Mithril signing consumes, but the service had no way to ask for one: it set `LSMDatabasePath` and nothing else. Emitted only when set, and only under `withUtxoHdLsmt`. --- nix/nixos/cardano-node-service.nix | 32 ++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/nix/nixos/cardano-node-service.nix b/nix/nixos/cardano-node-service.nix index 99b2d517c5a..0feab436db6 100644 --- a/nix/nixos/cardano-node-service.nix +++ b/nix/nixos/cardano-node-service.nix @@ -89,10 +89,14 @@ let i: recursiveUpdate baseConfig (optionalAttrs (cfg.withUtxoHdLsmt i) { - LedgerDB = { - Backend = "V2LSM"; - LSMDatabasePath = cfg.lsmDatabasePath i; - }; + LedgerDB = + { + Backend = "V2LSM"; + LSMDatabasePath = cfg.lsmDatabasePath i; + } + // optionalAttrs (cfg.lsmExportPath i != null) { + LSMExportPath = cfg.lsmExportPath i; + }; }); mkInstanceConfig = i: @@ -484,6 +488,26 @@ in { ''; }; + lsmExportPath = mkOption { + type = funcToOr nullOrStr; + default = null; + apply = x : if lib.isFunction x then x else if x == null then _: null else _: x; + description = '' + A node UTxO-HD on-disk LSM-trees standalone snapshot export path, for + each instance. The LSM backend keeps the UTxO set on disk and + snapshots normally without this, so a node restarts without replaying; + what it cannot do is export a standalone copy on every snapshot, which + is what Mithril signing consumes. + + cardano-config warns when the resolved snapshot policy equals the + Mithril one while the backend is LSM with no export path. It compares + the values, not the `Mithril` name, so a policy derived from the + security parameter can match without naming it. + + Only emitted when set, and only with `withUtxoHdLsmt`. + ''; + }; + shelleyKesAgentSocket = mkOption { type = nullOr (either str path); default = null; From acca6c8d2745bb694e75f8a19af6218af50ec1f4 Mon Sep 17 00:00:00 2001 From: John Lotoski Date: Wed, 14 Oct 2026 04:40:45 -0500 Subject: [PATCH 22/25] nixosScripts: generate the config in the environment's dialect --- nix/scripts.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/nix/scripts.nix b/nix/scripts.nix index 421d09f6530..90d7b745b59 100644 --- a/nix/scripts.nix +++ b/nix/scripts.nix @@ -14,6 +14,7 @@ let hostAddr = mkDefault "0.0.0.0"; environment = mkDefault envConfig.name; nodeConfig = cfg.environments.${cfg.environment}.nodeConfig; + configFormat = cfg.environments.${cfg.environment}.configFormat; stateDir = mkDefault "state-node-${cfg.environment}"; runtimeDir = mkDefault null; } // optionalAttrs (envConfig ? topology) { From fa2a4ff9e51499a68ac231e273fc8deffe5c4b73 Mon Sep 17 00:00:00 2001 From: John Lotoski Date: Wed, 14 Oct 2026 04:42:02 -0500 Subject: [PATCH 23/25] nixosTests/cardanoNodeArtifact: give the machine a nameserver The node resolves relay names from the peer snapshot. With no nameserver the dns resolver is built from an empty list and throws BadConfiguration, which on the aarch64 builder escaped diffusion's retry path and took the node down instead of being retried as it is on x86_64. --- nix/nixos/tests/cardano-node-artifact.nix | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nix/nixos/tests/cardano-node-artifact.nix b/nix/nixos/tests/cardano-node-artifact.nix index 9bf97e44188..fd4beb005d3 100644 --- a/nix/nixos/tests/cardano-node-artifact.nix +++ b/nix/nixos/tests/cardano-node-artifact.nix @@ -104,6 +104,10 @@ in { machine = {config, ...}: { nixpkgs.pkgs = pkgs; + # Without a nameserver the dns resolver is built from an empty list and + # throws BadConfiguration, which killed the node on the aarch64 builder. + networking.nameservers = ["127.0.0.1"]; + # The default disk size of 1024 MB is insufficient for the binary artifact # and tar gzip expansion. virtualisation.diskSize = 2048; From 8b05ad04c26fe6d9bc098d664ab39e530b4321ab Mon Sep 17 00:00:00 2001 From: John Lotoski Date: Wed, 14 Oct 2026 04:42:27 -0500 Subject: [PATCH 24/25] testnet: drop the removed Net.ErrorPolicy namespace from the golden --- .../files/golden/node_default_config.json | 3 --- nix/docker/README.md | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/cardano-testnet/test/cardano-testnet-golden/files/golden/node_default_config.json b/cardano-testnet/test/cardano-testnet-golden/files/golden/node_default_config.json index fca77ce4923..6382ebfef6b 100644 --- a/cardano-testnet/test/cardano-testnet-golden/files/golden/node_default_config.json +++ b/cardano-testnet/test/cardano-testnet-golden/files/golden/node_default_config.json @@ -73,9 +73,6 @@ "Net.ConnectionManager.Remote": { "severity": "Info" }, - "Net.ErrorPolicy": { - "severity": "Info" - }, "Net.InboundGovernor": { "severity": "Warning" }, diff --git a/nix/docker/README.md b/nix/docker/README.md index f71cda06b9e..91d35cac462 100644 --- a/nix/docker/README.md +++ b/nix/docker/README.md @@ -582,7 +582,7 @@ docker run \ -v node-ipc:/ipc \ -e NETWORK=mainnet \ -e CARDANO_TRACER_SOCKET_PATH_ACCEPT="/ipc/node-tracer.socket" \ - -e CARDANO_CONFIG_JSON_MERGE='{"TraceOptionNodeName":"node1"}' \ + -e CARDANO_CONFIG_JSON_MERGE='{"Configuration":{"HermodTracing":{"TraceOptionNodeName":"node1"}}}' \ ghcr.io/intersectmbo/cardano-node:dev docker run \ From 721e8b05b144a01eca65632b9c620861407c92a7 Mon Sep 17 00:00:00 2001 From: Pablo Lamela Date: Fri, 23 Oct 2026 22:01:11 +0000 Subject: [PATCH 25/25] Fail instead of dropping tracing settings when enabling trace forwarding --- cardano-testnet/src/Testnet/Start/Cardano.hs | 44 +++++++++++--------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/cardano-testnet/src/Testnet/Start/Cardano.hs b/cardano-testnet/src/Testnet/Start/Cardano.hs index a61b75e0ca7..50f9b665d7d 100644 --- a/cardano-testnet/src/Testnet/Start/Cardano.hs +++ b/cardano-testnet/src/Testnet/Start/Cardano.hs @@ -604,35 +604,39 @@ cardanoTestnet -- | Copy and modify a node configuration file so that its @TraceOptions@ -- enables the @Forwarder@ backend. This is required for nodes to actually -- forward their traces and metrics to cardano-tracer. Returns a path to the --- modified config file. +-- modified config file. Fails if the tracing settings are not an object in the +-- file itself (for example a @HermodTracing@ file path), instead of dropping them. enableTraceForwarding :: FilePath -> IO FilePath enableTraceForwarding configFile = do (document, _warnings) <- readConfigurationDocument configFile - (document', _warnings') <- - configurationDocumentFromValue - . onObject (onKey "Configuration" . onKey "HermodTracing" $ - KeyMap.insertWith mergeTraceOptions "TraceOptions" Defaults.traceOptionsForwarding) + value' <- + either (\err -> throwString $ "enableTraceForwarding: " <> configFile <> ": " <> err) pure + . addForwarding $ configurationDocumentValue document + (document', _warnings') <- configurationDocumentFromValue value' let configFile' = dropExtension configFile <> "-tracer.yaml" writeConfigurationDocument configFile' document' pure configFile' where -- The tracing settings are the @HermodTracing@ object of the @Configuration@ - -- section. A missing object (or one given as a file) is replaced. - onObject :: (KeyMap.KeyMap Aeson.Value -> KeyMap.KeyMap Aeson.Value) -> Aeson.Value -> Aeson.Value - onObject f = \case - Object o -> Object $ f o - other -> other - - onKey - :: KeyMap.Key - -> (KeyMap.KeyMap Aeson.Value -> KeyMap.KeyMap Aeson.Value) - -> KeyMap.KeyMap Aeson.Value - -> KeyMap.KeyMap Aeson.Value - onKey key f o = - KeyMap.insert key (Object . f $ case KeyMap.lookup key o of - Just (Object inner) -> inner - _ -> mempty) o + -- section. A missing one is created; any other shape is an error, because + -- replacing it would silently drop the tracing settings. + addForwarding :: Aeson.Value -> Either String Aeson.Value + addForwarding = \case + Object envelope -> case KeyMap.lookup "Configuration" envelope of + Just (Object configuration) -> do + tracing <- case KeyMap.lookup "HermodTracing" configuration of + Nothing -> Right mempty + Just (Object inline) -> Right inline + Just (String path) -> Left $ + "Configuration.HermodTracing is a file path (" <> Text.unpack path + <> "), but the tracer needs the tracing settings inline" + Just _ -> Left "Configuration.HermodTracing must be an object or a file path" + let tracing' = KeyMap.insertWith mergeTraceOptions "TraceOptions" Defaults.traceOptionsForwarding tracing + configuration' = KeyMap.insert "HermodTracing" (Object tracing') configuration + Right . Object $ KeyMap.insert "Configuration" (Object configuration') envelope + _ -> Left "expected a Configuration object" + _ -> Left "expected a JSON or YAML object" mergeTraceOptions :: Yaml.Value -> Yaml.Value -> Yaml.Value mergeTraceOptions (Object forwarding) (Object existing) =