From def7d721e5a41d0f784401f201d335adeaf6f968 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20W=C3=B3jtowicz?= Date: Mon, 15 Apr 2024 19:10:43 +0200 Subject: [PATCH] Add ledger-peer-snapshot to query command: This change introduces query subcommand ledger-peer-snapshot to serialize a snapshot of big ledger peers from the tip of the current chain. --- cardano-cli/CHANGELOG.md | 5 + .../Cardano/CLI/EraBased/Commands/Query.hs | 12 ++ .../src/Cardano/CLI/EraBased/Options/Query.hs | 15 +++ .../src/Cardano/CLI/EraBased/Run/Query.hs | 41 ++++++ .../src/Cardano/CLI/Legacy/Commands/Query.hs | 10 ++ cardano-cli/src/Cardano/CLI/Legacy/Options.hs | 13 ++ .../src/Cardano/CLI/Legacy/Run/Query.hs | 8 ++ .../cardano-cli-golden/files/golden/help.cli | 120 ++++++++++++++++-- 8 files changed, 215 insertions(+), 9 deletions(-) diff --git a/cardano-cli/CHANGELOG.md b/cardano-cli/CHANGELOG.md index 1757833a90..ea57bf32e0 100644 --- a/cardano-cli/CHANGELOG.md +++ b/cardano-cli/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog for cardano-cli +- added `runQueryLedgerPeerSnapshot` function to retrieve and store + a snapshot of big ledger peers. This function is invoked by ledger-peer-snapshot + subcommand of query. + [PR 727](https://github.com/IntersectMBO/cardano-cli/pull/727) + ## 8.22.0.0 - Add `ref-script-size` query command diff --git a/cardano-cli/src/Cardano/CLI/EraBased/Commands/Query.hs b/cardano-cli/src/Cardano/CLI/EraBased/Commands/Query.hs index c8bd9464bf..9945c3592a 100644 --- a/cardano-cli/src/Cardano/CLI/EraBased/Commands/Query.hs +++ b/cardano-cli/src/Cardano/CLI/EraBased/Commands/Query.hs @@ -25,6 +25,7 @@ module Cardano.CLI.EraBased.Commands.Query , QueryNoArgCmdArgs(..) , QueryDRepStateCmdArgs(..) , QueryDRepStakeDistributionCmdArgs(..) + , QueryLedgerPeerSnapshotCmdArgs (..) , renderQueryCmds , IncludeStake (..) ) where @@ -50,6 +51,7 @@ data QueryCmds era | QueryStakeAddressInfoCmd !QueryStakeAddressInfoCmdArgs | QueryUTxOCmd !QueryUTxOCmdArgs | QueryLedgerStateCmd !QueryLedgerStateCmdArgs + | QueryLedgerPeerSnapshotCmd !QueryLedgerPeerSnapshotCmdArgs | QueryProtocolStateCmd !QueryProtocolStateCmdArgs | QueryStakeSnapshotCmd !QueryStakeSnapshotCmdArgs | QueryKesPeriodInfoCmd !QueryKesPeriodInfoCmdArgs @@ -144,6 +146,14 @@ data QueryLedgerStateCmdArgs = QueryLedgerStateCmdArgs , mOutFile :: !(Maybe (File () Out)) } deriving (Generic, Show) +data QueryLedgerPeerSnapshotCmdArgs = QueryLedgerPeerSnapshotCmdArgs + { nodeSocketPath :: !SocketPath + , consensusModeParams :: !ConsensusModeParams + , networkId :: !NetworkId + , target :: !(Consensus.Target ChainPoint) + , outFile :: !(File () Out) + } deriving (Generic, Show) + data QueryProtocolStateCmdArgs = QueryProtocolStateCmdArgs { nodeSocketPath :: !SocketPath , consensusModeParams :: !ConsensusModeParams @@ -273,6 +283,8 @@ renderQueryCmds = \case "query utxo" QueryLedgerStateCmd {} -> "query ledger-state" + QueryLedgerPeerSnapshotCmd {} -> + "query ledger-peer-snapshot" QueryProtocolStateCmd {} -> "query protocol-state" QueryStakeSnapshotCmd {} -> diff --git a/cardano-cli/src/Cardano/CLI/EraBased/Options/Query.hs b/cardano-cli/src/Cardano/CLI/EraBased/Options/Query.hs index c440b8ab82..a349e24306 100644 --- a/cardano-cli/src/Cardano/CLI/EraBased/Options/Query.hs +++ b/cardano-cli/src/Cardano/CLI/EraBased/Options/Query.hs @@ -71,6 +71,11 @@ pQueryCmds era envCli = $ Opt.progDesc $ mconcat [ "Dump the current ledger state of the node (Ledger.NewEpochState -- advanced command)" ] + , Just + $ subParser "ledger-peer-snapshot" + $ Opt.info (pQueryLedgerPeerSnapshotCmd era envCli) + $ Opt.progDesc $ mconcat + [ "Dump the current snapshot of ledger peers" ] , Just $ subParser "protocol-state" $ Opt.info (pQueryProtocolStateCmd era envCli) @@ -194,6 +199,16 @@ pQueryLedgerStateCmd era envCli = <*> pTarget era <*> pMaybeOutputFile +pQueryLedgerPeerSnapshotCmd :: CardanoEra era -> EnvCli -> Parser (QueryCmds era) +pQueryLedgerPeerSnapshotCmd era envCli = + fmap QueryLedgerPeerSnapshotCmd $ + QueryLedgerPeerSnapshotCmdArgs + <$> pSocketPath envCli + <*> pConsensusModeParams + <*> pNetworkId envCli + <*> pTarget era + <*> pOutputFile + pQueryProtocolStateCmd :: CardanoEra era -> EnvCli -> Parser (QueryCmds era) pQueryProtocolStateCmd era envCli = fmap QueryProtocolStateCmd $ diff --git a/cardano-cli/src/Cardano/CLI/EraBased/Run/Query.hs b/cardano-cli/src/Cardano/CLI/EraBased/Run/Query.hs index cd9569fd47..84cb0af598 100644 --- a/cardano-cli/src/Cardano/CLI/EraBased/Run/Query.hs +++ b/cardano-cli/src/Cardano/CLI/EraBased/Run/Query.hs @@ -20,6 +20,7 @@ module Cardano.CLI.EraBased.Run.Query , runQueryKesPeriodInfoCmd , runQueryLeadershipScheduleCmd , runQueryLedgerStateCmd + , runQueryLedgerPeerSnapshot , runQueryPoolStateCmd , runQueryProtocolParametersCmd , runQueryProtocolStateCmd @@ -66,6 +67,7 @@ import qualified Ouroboros.Consensus.Protocol.Abstract as Consensus import qualified Ouroboros.Consensus.Protocol.Praos.Common as Consensus import Ouroboros.Consensus.Protocol.TPraos (StandardCrypto) import Ouroboros.Network.Block (Serialised (..)) +import Ouroboros.Network.PeerSelection.LedgerPeers.Type (LedgerPeerSnapshot) import qualified Ouroboros.Network.Protocol.LocalStateQuery.Type as Consensus import Control.Monad (forM, forM_, join) @@ -113,6 +115,7 @@ runQueryCmds = \case Cmd.QueryStakeDistributionCmd args -> runQueryStakeDistributionCmd args Cmd.QueryStakeAddressInfoCmd args -> runQueryStakeAddressInfoCmd args Cmd.QueryLedgerStateCmd args -> runQueryLedgerStateCmd args + Cmd.QueryLedgerPeerSnapshotCmd args -> runQueryLedgerPeerSnapshot args Cmd.QueryStakeSnapshotCmd args -> runQueryStakeSnapshotCmd args Cmd.QueryProtocolStateCmd args -> runQueryProtocolStateCmd args Cmd.QueryUTxOCmd args -> runQueryUTxOCmd args @@ -795,6 +798,36 @@ runQueryLedgerStateCmd & onLeft (left . QueryCmdAcquireFailure) & onLeft left +runQueryLedgerPeerSnapshot :: () + => Cmd.QueryLedgerPeerSnapshotCmdArgs + -> ExceptT QueryCmdError IO () +runQueryLedgerPeerSnapshot + Cmd.QueryLedgerPeerSnapshotCmdArgs + { Cmd.nodeSocketPath + , Cmd.consensusModeParams + , Cmd.networkId + , Cmd.target + , Cmd.outFile + } = do + let localNodeConnInfo = LocalNodeConnectInfo consensusModeParams networkId nodeSocketPath + + join $ lift + ( executeLocalStateQueryExpr localNodeConnInfo target $ runExceptT $ do + AnyCardanoEra era <- lift queryCurrentEra + & onLeft (left . QueryCmdUnsupportedNtcVersion) + + sbe <- requireShelleyBasedEra era + & onNothing (left QueryCmdByronEra) + + result <- lift (queryLedgerPeerSnapshot sbe) + & onLeft (left . QueryCmdUnsupportedNtcVersion) + & onLeft (left . QueryCmdLocalStateQueryError . EraMismatchError) + + pure $ shelleyBasedEraConstraints sbe (writeLedgerPeerSnapshot outFile) result + ) + & onLeft (left . QueryCmdAcquireFailure) + & onLeft left + runQueryProtocolStateCmd :: () => Cmd.QueryProtocolStateCmdArgs -> ExceptT QueryCmdError IO () @@ -960,6 +993,14 @@ writeLedgerState mOutFile qState@(SerialisedDebugLedgerState serLedgerState) = handleIOExceptT (QueryCmdWriteFileError . FileIOError fpath) $ LBS.writeFile fpath $ unSerialised serLedgerState +-- | Writes a snapshot of peers from the ledger out to a file +writeLedgerPeerSnapshot :: File () Out + -> Serialised LedgerPeerSnapshot + -> ExceptT QueryCmdError IO () +writeLedgerPeerSnapshot (File outPath) (Serialised bytes) = + handleIOExceptT (QueryCmdWriteFileError . FileIOError outPath) + (LBS.writeFile outPath bytes) + writeStakeSnapshots :: forall era ledgerera. () => ShelleyLedgerEra era ~ ledgerera => L.EraCrypto ledgerera ~ StandardCrypto diff --git a/cardano-cli/src/Cardano/CLI/Legacy/Commands/Query.hs b/cardano-cli/src/Cardano/CLI/Legacy/Commands/Query.hs index 10388723bb..e7379a9d6e 100644 --- a/cardano-cli/src/Cardano/CLI/Legacy/Commands/Query.hs +++ b/cardano-cli/src/Cardano/CLI/Legacy/Commands/Query.hs @@ -20,6 +20,7 @@ module Cardano.CLI.Legacy.Commands.Query , LegacyQueryPoolStateCmdArgs (..) , LegacyQueryTxMempoolCmdArgs (..) , LegacyQuerySlotNumberCmdArgs (..) + , LegacyQueryLedgerPeerSnapshotCmdArgs (..) , renderLegacyQueryCmds ) where @@ -47,8 +48,16 @@ data LegacyQueryCmds | QueryPoolStateCmd !LegacyQueryPoolStateCmdArgs | QueryTxMempoolCmd !LegacyQueryTxMempoolCmdArgs | QuerySlotNumberCmd !LegacyQuerySlotNumberCmdArgs + | QueryLedgerPeerSnapshotCmd !LegacyQueryLedgerPeerSnapshotCmdArgs deriving (Generic, Show) +data LegacyQueryLedgerPeerSnapshotCmdArgs = LegacyQueryLedgerPeerSnapshotCmdArgs + { nodeSocketPath :: !SocketPath + , consensusModeParams :: !ConsensusModeParams + , networkId :: !NetworkId + , outFile :: !(File () Out) + } deriving (Generic, Show) + data LegacyQueryLeadershipScheduleCmdArgs = LegacyQueryLeadershipScheduleCmdArgs { nodeSocketPath :: !SocketPath , consensusModeParams :: !ConsensusModeParams @@ -184,6 +193,7 @@ renderLegacyQueryCmds = \case QueryPoolStateCmd {} -> "query pool-state" QueryTxMempoolCmd (LegacyQueryTxMempoolCmdArgs _ _ _ txMempoolQuery _) -> "query tx-mempool" <> renderTxMempoolQuery txMempoolQuery QuerySlotNumberCmd {} -> "query slot-number" + QueryLedgerPeerSnapshotCmd {} -> "query ledger-peer-snapshot" where renderTxMempoolQuery = \case TxMempoolQueryTxExists tx -> "tx-exists " <> serialiseToRawBytesHexText tx diff --git a/cardano-cli/src/Cardano/CLI/Legacy/Options.hs b/cardano-cli/src/Cardano/CLI/Legacy/Options.hs index a8a97266e2..7a59af939c 100644 --- a/cardano-cli/src/Cardano/CLI/Legacy/Options.hs +++ b/cardano-cli/src/Cardano/CLI/Legacy/Options.hs @@ -587,6 +587,10 @@ pQueryCmds envCli = $ Opt.progDesc $ mconcat [ "Get a portion of the current UTxO: by tx in, by address or the whole." ] + , subParser "ledger-peer-snapshot" + $ Opt.info pQueryLedgerSnapshot + $ Opt.progDesc $ mconcat + [ "Dump the current ledger peer snapshot" ] , subParser "ledger-state" $ Opt.info pQueryLedgerState $ Opt.progDesc $ mconcat @@ -692,6 +696,15 @@ pQueryCmds envCli = <*> pNetworkId envCli <*> pMaybeOutputFile + pQueryLedgerSnapshot :: Parser LegacyQueryCmds + pQueryLedgerSnapshot = + fmap QueryLedgerPeerSnapshotCmd $ + LegacyQueryLedgerPeerSnapshotCmdArgs + <$> pSocketPath envCli + <*> pConsensusModeParams + <*> pNetworkId envCli + <*> pOutputFile + pQueryProtocolState :: Parser LegacyQueryCmds pQueryProtocolState = fmap QueryProtocolStateCmd $ diff --git a/cardano-cli/src/Cardano/CLI/Legacy/Run/Query.hs b/cardano-cli/src/Cardano/CLI/Legacy/Run/Query.hs index 7504915dcd..fccd127c7e 100644 --- a/cardano-cli/src/Cardano/CLI/Legacy/Run/Query.hs +++ b/cardano-cli/src/Cardano/CLI/Legacy/Run/Query.hs @@ -33,7 +33,15 @@ runLegacyQueryCmds = \case Cmd.QueryPoolStateCmd args -> runLegacyQueryPoolStateCmd args Cmd.QueryTxMempoolCmd args -> runLegacyQueryTxMempoolCmd args Cmd.QuerySlotNumberCmd args -> runLegacyQuerySlotNumberCmd args + Cmd.QueryLedgerPeerSnapshotCmd args -> runLegacyQueryPeerSnapshot args +runLegacyQueryPeerSnapshot :: () + => Cmd.LegacyQueryLedgerPeerSnapshotCmdArgs + -> ExceptT QueryCmdError IO () +runLegacyQueryPeerSnapshot Cmd.LegacyQueryLedgerPeerSnapshotCmdArgs {..} = + EraBased.runQueryLedgerPeerSnapshot + EraBased.QueryLedgerPeerSnapshotCmdArgs {target = Consensus.VolatileTip, ..} + runLegacyQueryProtocolParametersCmd :: () => Cmd.LegacyQueryProtocolParametersCmdArgs -> ExceptT QueryCmdError IO () diff --git a/cardano-cli/test/cardano-cli-golden/files/golden/help.cli b/cardano-cli/test/cardano-cli-golden/files/golden/help.cli index 82614eb69b..d44ac80bbb 100644 --- a/cardano-cli/test/cardano-cli-golden/files/golden/help.cli +++ b/cardano-cli/test/cardano-cli-golden/files/golden/help.cli @@ -440,7 +440,7 @@ Usage: cardano-cli shelley node issue-op-cert Issue a node operational certificate -Usage: cardano-cli shelley query +Usage: cardano-cli shelley query ( protocol-parameters | tip | stake-pools @@ -448,6 +448,7 @@ Usage: cardano-cli shelley query | stake-address-info | utxo | ledger-state + | ledger-peer-snapshot | protocol-state | stake-snapshot | leadership-schedule @@ -533,6 +534,16 @@ Usage: cardano-cli shelley query ledger-state --socket-path SOCKET_PATH Dump the current ledger state of the node (Ledger.NewEpochState -- advanced command) +Usage: cardano-cli shelley query ledger-peer-snapshot --socket-path SOCKET_PATH + [--cardano-mode + [--epoch-slots SLOTS]] + ( --mainnet + | --testnet-magic NATURAL + ) + --out-file FILE + + Dump the current snapshot of ledger peers + Usage: cardano-cli shelley query protocol-state --socket-path SOCKET_PATH [--cardano-mode [--epoch-slots SLOTS]] @@ -1632,7 +1643,7 @@ Usage: cardano-cli allegra node issue-op-cert Issue a node operational certificate -Usage: cardano-cli allegra query +Usage: cardano-cli allegra query ( protocol-parameters | tip | stake-pools @@ -1640,6 +1651,7 @@ Usage: cardano-cli allegra query | stake-address-info | utxo | ledger-state + | ledger-peer-snapshot | protocol-state | stake-snapshot | leadership-schedule @@ -1725,6 +1737,16 @@ Usage: cardano-cli allegra query ledger-state --socket-path SOCKET_PATH Dump the current ledger state of the node (Ledger.NewEpochState -- advanced command) +Usage: cardano-cli allegra query ledger-peer-snapshot --socket-path SOCKET_PATH + [--cardano-mode + [--epoch-slots SLOTS]] + ( --mainnet + | --testnet-magic NATURAL + ) + --out-file FILE + + Dump the current snapshot of ledger peers + Usage: cardano-cli allegra query protocol-state --socket-path SOCKET_PATH [--cardano-mode [--epoch-slots SLOTS]] @@ -2822,7 +2844,7 @@ Usage: cardano-cli mary node issue-op-cert Issue a node operational certificate -Usage: cardano-cli mary query +Usage: cardano-cli mary query ( protocol-parameters | tip | stake-pools @@ -2830,6 +2852,7 @@ Usage: cardano-cli mary query | stake-address-info | utxo | ledger-state + | ledger-peer-snapshot | protocol-state | stake-snapshot | leadership-schedule @@ -2915,6 +2938,16 @@ Usage: cardano-cli mary query ledger-state --socket-path SOCKET_PATH Dump the current ledger state of the node (Ledger.NewEpochState -- advanced command) +Usage: cardano-cli mary query ledger-peer-snapshot --socket-path SOCKET_PATH + [--cardano-mode + [--epoch-slots SLOTS]] + ( --mainnet + | --testnet-magic NATURAL + ) + --out-file FILE + + Dump the current snapshot of ledger peers + Usage: cardano-cli mary query protocol-state --socket-path SOCKET_PATH [--cardano-mode [--epoch-slots SLOTS]] @@ -4002,7 +4035,7 @@ Usage: cardano-cli alonzo node issue-op-cert Issue a node operational certificate -Usage: cardano-cli alonzo query +Usage: cardano-cli alonzo query ( protocol-parameters | tip | stake-pools @@ -4010,6 +4043,7 @@ Usage: cardano-cli alonzo query | stake-address-info | utxo | ledger-state + | ledger-peer-snapshot | protocol-state | stake-snapshot | leadership-schedule @@ -4095,6 +4129,16 @@ Usage: cardano-cli alonzo query ledger-state --socket-path SOCKET_PATH Dump the current ledger state of the node (Ledger.NewEpochState -- advanced command) +Usage: cardano-cli alonzo query ledger-peer-snapshot --socket-path SOCKET_PATH + [--cardano-mode + [--epoch-slots SLOTS]] + ( --mainnet + | --testnet-magic NATURAL + ) + --out-file FILE + + Dump the current snapshot of ledger peers + Usage: cardano-cli alonzo query protocol-state --socket-path SOCKET_PATH [--cardano-mode [--epoch-slots SLOTS]] @@ -5219,7 +5263,7 @@ Usage: cardano-cli babbage node issue-op-cert Issue a node operational certificate -Usage: cardano-cli babbage query +Usage: cardano-cli babbage query ( protocol-parameters | tip | stake-pools @@ -5227,6 +5271,7 @@ Usage: cardano-cli babbage query | stake-address-info | utxo | ledger-state + | ledger-peer-snapshot | protocol-state | stake-snapshot | leadership-schedule @@ -5312,6 +5357,16 @@ Usage: cardano-cli babbage query ledger-state --socket-path SOCKET_PATH Dump the current ledger state of the node (Ledger.NewEpochState -- advanced command) +Usage: cardano-cli babbage query ledger-peer-snapshot --socket-path SOCKET_PATH + [--cardano-mode + [--epoch-slots SLOTS]] + ( --mainnet + | --testnet-magic NATURAL + ) + --out-file FILE + + Dump the current snapshot of ledger peers + Usage: cardano-cli babbage query protocol-state --socket-path SOCKET_PATH [--cardano-mode [--epoch-slots SLOTS]] @@ -6689,7 +6744,7 @@ Usage: cardano-cli conway node issue-op-cert Issue a node operational certificate -Usage: cardano-cli conway query +Usage: cardano-cli conway query ( protocol-parameters | tip | stake-pools @@ -6697,6 +6752,7 @@ Usage: cardano-cli conway query | stake-address-info | utxo | ledger-state + | ledger-peer-snapshot | protocol-state | stake-snapshot | leadership-schedule @@ -6799,6 +6855,19 @@ Usage: cardano-cli conway query ledger-state --socket-path SOCKET_PATH Dump the current ledger state of the node (Ledger.NewEpochState -- advanced command) +Usage: cardano-cli conway query ledger-peer-snapshot --socket-path SOCKET_PATH + [--cardano-mode + [--epoch-slots SLOTS]] + ( --mainnet + | --testnet-magic NATURAL + ) + [ --volatile-tip + | --immutable-tip + ] + --out-file FILE + + Dump the current snapshot of ledger peers + Usage: cardano-cli conway query protocol-state --socket-path SOCKET_PATH [--cardano-mode [--epoch-slots SLOTS]] @@ -8104,7 +8173,7 @@ Usage: cardano-cli latest node issue-op-cert Issue a node operational certificate -Usage: cardano-cli latest query +Usage: cardano-cli latest query ( protocol-parameters | tip | stake-pools @@ -8112,6 +8181,7 @@ Usage: cardano-cli latest query | stake-address-info | utxo | ledger-state + | ledger-peer-snapshot | protocol-state | stake-snapshot | leadership-schedule @@ -8197,6 +8267,16 @@ Usage: cardano-cli latest query ledger-state --socket-path SOCKET_PATH Dump the current ledger state of the node (Ledger.NewEpochState -- advanced command) +Usage: cardano-cli latest query ledger-peer-snapshot --socket-path SOCKET_PATH + [--cardano-mode + [--epoch-slots SLOTS]] + ( --mainnet + | --testnet-magic NATURAL + ) + --out-file FILE + + Dump the current snapshot of ledger peers + Usage: cardano-cli latest query protocol-state --socket-path SOCKET_PATH [--cardano-mode [--epoch-slots SLOTS]] @@ -9143,13 +9223,14 @@ Usage: cardano-cli legacy genesis hash --genesis FILE Compute the hash of a genesis file -Usage: cardano-cli legacy query +Usage: cardano-cli legacy query ( protocol-parameters | tip | stake-pools | stake-distribution | stake-address-info | utxo + | ledger-peer-snapshot | ledger-state | protocol-state | stake-snapshot @@ -9235,6 +9316,16 @@ Usage: cardano-cli legacy query ledger-state --socket-path SOCKET_PATH Dump the current ledger state of the node (Ledger.NewEpochState -- advanced command) +Usage: cardano-cli legacy query ledger-peer-snapshot --socket-path SOCKET_PATH + [--cardano-mode + [--epoch-slots SLOTS]] + ( --mainnet + | --testnet-magic NATURAL + ) + --out-file FILE + + Dump the current ledger peer snapshot + Usage: cardano-cli legacy query protocol-state --socket-path SOCKET_PATH [--cardano-mode [--epoch-slots SLOTS]] @@ -10408,13 +10499,14 @@ Usage: cardano-cli genesis hash --genesis FILE Compute the hash of a genesis file -Usage: cardano-cli query +Usage: cardano-cli query ( protocol-parameters | tip | stake-pools | stake-distribution | stake-address-info | utxo + | ledger-peer-snapshot | ledger-state | protocol-state | stake-snapshot @@ -10494,6 +10586,16 @@ Usage: cardano-cli query ledger-state --socket-path SOCKET_PATH Dump the current ledger state of the node (Ledger.NewEpochState -- advanced command) +Usage: cardano-cli query ledger-peer-snapshot --socket-path SOCKET_PATH + [--cardano-mode + [--epoch-slots SLOTS]] + ( --mainnet + | --testnet-magic NATURAL + ) + --out-file FILE + + Dump the current ledger peer snapshot + Usage: cardano-cli query protocol-state --socket-path SOCKET_PATH [--cardano-mode [--epoch-slots SLOTS]] (--mainnet | --testnet-magic NATURAL)