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..be8af66024b 100644 --- a/cardano-node/src/Cardano/Node/Configuration/CardanoConfigResolve.hs +++ b/cardano-node/src/Cardano/Node/Configuration/CardanoConfigResolve.hs @@ -31,11 +31,13 @@ module Cardano.Node.Configuration.CardanoConfigResolve ResolvedNodeConfiguration (..) , CrossCheck (..) , buildNodeConfiguration + , buildFromCardanoConfigWith , NodeConfigurationError (..) -- * Dialects , ConfigurationDialect (..) , classifyConfigurationFile + , tracingConfigSource -- * Command-line layers , nodeCliPartialConfiguration @@ -43,13 +45,13 @@ module Cardano.Node.Configuration.CardanoConfigResolve , cardanoConfigCliLayer ) where -import Cardano.Logging.Types (TraceConfig) +import Cardano.Logging.ConfigurationParser (ConfigSource (..)) 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) @@ -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 :: @@ -167,10 +185,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 $ 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 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/.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 e7440706d20..77d2ef62218 100644 --- a/cardano-testnet/cardano-testnet.cabal +++ b/cardano-testnet/cardano-testnet.cabal @@ -42,9 +42,8 @@ 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 , 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..50f9b665d7d 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 @@ -596,17 +604,40 @@ 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 - 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 + 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 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) = 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..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 @@ -21,5 +21,75 @@ "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.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-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 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 diff --git a/configuration/cardano/mainnet-config.json b/configuration/cardano/mainnet-config.json index 91e40c4beb1..1a178d11662 100644 --- a/configuration/cardano/mainnet-config.json +++ b/configuration/cardano/mainnet-config.json @@ -1,114 +1,125 @@ { - "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/v2/schemas/config.schema.json", + "Configuration": { + "Consensus": { + "ConsensusMode": "GenesisMode" + }, + "HermodTracing": { + "TraceOptionForwarder": { + "maxReconnectDelay": 30, + "queueSize": 128 + }, + "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.Mux.Remote.Bearer": { + "severity": "Silence" + }, + "Net.PeerSelection": { + "severity": "Info" + }, + "Resources": { + "severity": "Silence" + }, + "Startup.DiffusionInit": { + "severity": "Info" + } + } + }, + "Protocol": { + "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" + }, + "Storage": { + "LedgerDB": { + "Backend": "V2InMemory", + "QueryBatchSize": 100000, + "Snapshots": { + "Interval": 86400, + "MaxDelay": 21600, + "MinDelay": 300, + "NumOfDiskSnapshots": 2, + "Offset": 0 + } + } } }, - "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": 2 } diff --git a/configuration/cardano/mainnet-config.yaml b/configuration/cardano/mainnet-config.yaml index 1ae3bd13d11..fd289739300 100644 --- a/configuration/cardano/mainnet-config.yaml +++ b/configuration/cardano/mainnet-config.yaml @@ -1,277 +1,307 @@ ################################################################################ # 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 ##### - -Protocol: Cardano - -# 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 -MaxKnownMajorProtocolVersion: 2 - -##### 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 +# Commented-out examples below show the section each key belongs to, so they are +# correct as written if uncommented. -# 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 +$schema: https://raw.githubusercontent.com/IntersectMBO/cardano-config/v2/schemas/config.schema.json -##### Ledger Configuration ##### - -# 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 ##### -# Min is currently 11.1.0 due to removal of legacy tracing system and -# introduction of deterministic snapshots. -MinNodeVersion: "11.1.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. +# 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" + +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 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 + # 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.Mux.Remote.Bearer: + severity: Silence + + 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: - severity: Silence + Mempool.AttemptAdd: + 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 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 69c75429b39..b219cb4315e 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", @@ -15,15 +13,14 @@ "Backend": "V2InMemory", "QueryBatchSize": 100000, "Snapshots": { + "MaxDelay": 1080, + "MinDelay": 300, "NumOfDiskSnapshots": 2, "SlotOffset": 0, "SnapshotInterval": 4320 } }, "MaxConcurrencyDeadline": 4, - "MaxKnownMajorProtocolVersion": 2, - "PBftSignatureThreshold": 1.1, - "Protocol": "Cardano", "RequiresNetworkMagic": "RequiresMagic", "ShelleyGenesisFile": "shelley-genesis.json", "TestAllegraHardForkAtEpoch": 0, @@ -31,8 +28,7 @@ "TestMaryHardForkAtEpoch": 0, "TestShelleyHardForkAtEpoch": 0, "TraceOptionForwarder": { - "connQueueSize": 64, - "disconnQueueSize": 128, + "queueSize": 128, "maxReconnectDelay": 30 }, "TraceOptionMetricsPrefix": "cardano.node.metrics.", @@ -105,6 +101,9 @@ "Net.Mux.Remote": { "severity": "Info" }, + "Net.Mux.Remote.Bearer": { + "severity": "Silence" + }, "Net.PeerSelection": { "severity": "Info" }, 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 } diff --git a/flake.lock b/flake.lock index 76012b32858..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" } @@ -1198,16 +1217,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..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"; }; @@ -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 = { 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..91d35cac462 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`: ``` @@ -561,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 \ @@ -570,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/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 )' \ 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/cardano-node-service.nix b/nix/nixos/cardano-node-service.nix index 5a4f6622203..0feab436db6 100644 --- a/nix/nixos/cardano-node-service.nix +++ b/nix/nixos/cardano-node-service.nix @@ -49,38 +49,68 @@ 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 + // (mapAttrs' (era: epoch: + nameValuePair "Test${era}HardForkAtEpoch" epoch + ) cfg.forceHardForks) + // { + MaxConcurrencyBulkSync = 2; + } // optionalAttrs (cfg.targetNumberOfRootPeers != null) { + "${deadlinePrefix}TargetNumberOfRootPeers" = cfg.targetNumberOfRootPeers; + } // optionalAttrs (cfg.targetNumberOfKnownPeers != null) { + "${deadlinePrefix}TargetNumberOfKnownPeers" = cfg.targetNumberOfKnownPeers; + } // optionalAttrs (cfg.targetNumberOfEstablishedPeers != null) { + "${deadlinePrefix}TargetNumberOfEstablishedPeers" = cfg.targetNumberOfEstablishedPeers; + } // optionalAttrs (cfg.targetNumberOfActivePeers != null) { + "${deadlinePrefix}TargetNumberOfActivePeers" = cfg.targetNumberOfActivePeers; + } + ) 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 + baseConfig (optionalAttrs (cfg.withUtxoHdLsmt i) { + LedgerDB = + { + Backend = "V2LSM"; + LSMDatabasePath = cfg.lsmDatabasePath i; + } + // optionalAttrs (cfg.lsmExportPath i != null) { + LSMExportPath = cfg.lsmExportPath 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 + 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) @@ -109,18 +139,37 @@ 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}"}" ]; }; + 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}" @@ -330,14 +379,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. ''; }; @@ -407,6 +456,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; @@ -417,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; @@ -751,6 +842,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 = {}; @@ -977,6 +1091,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); @@ -1011,6 +1154,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) 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; 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 { 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/cardano-oci-readonly.nix b/nix/nixos/tests/cardano-oci-readonly.nix deleted file mode 100644 index c389151e096..00000000000 --- a/nix/nixos/tests/cardano-oci-readonly.nix +++ /dev/null @@ -1,221 +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. - configMerge = ''{\"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 -- any - # top-level key ending in "File" with a string value -- and assert all are - # absolute. Use jq from the container. - machine.succeed( - "docker exec n1 jq -e " - "'[to_entries[]|select(.key|endswith(\"File\"))|.value|select(type==\"string\")] 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") - ''; -} 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..c2371833fba 100644 --- a/nix/nixos/tests/default.nix +++ b/nix/nixos/tests/default.nix @@ -31,13 +31,20 @@ 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 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 + # /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; 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) {