Skip to content

Commit 1a93000

Browse files
authored
Merge pull request #727 from IntersectMBO/mwojtowicz/ledger-query-peer-snapshot
Query a node for a snapshot of big ledger peers
2 parents eecd898 + 667e129 commit 1a93000

20 files changed

+469
-2
lines changed

cardano-cli/src/Cardano/CLI/EraBased/Commands/Query.hs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ module Cardano.CLI.EraBased.Commands.Query
2828
, QueryDRepStakeDistributionCmdArgs (..)
2929
, QuerySPOStakeDistributionCmdArgs (..)
3030
, QueryTreasuryValueCmdArgs (..)
31+
, QueryLedgerPeerSnapshotCmdArgs (..)
3132
, renderQueryCmds
3233
, IncludeStake (..)
3334
)
@@ -69,6 +70,7 @@ data QueryCmds era
6970
| QueryCommitteeMembersStateCmd !(QueryCommitteeMembersStateCmdArgs era)
7071
| QueryTreasuryValueCmd !(QueryTreasuryValueCmdArgs era)
7172
| QueryProposalsCmd !(QueryProposalsCmdArgs era)
73+
| QueryLedgerPeerSnapshotCmd !QueryLedgerPeerSnapshotCmdArgs
7274
deriving (Generic, Show)
7375

7476
-- | Fields that are common to most queries
@@ -140,6 +142,12 @@ data QueryLedgerStateCmdArgs = QueryLedgerStateCmdArgs
140142
}
141143
deriving (Generic, Show)
142144

145+
data QueryLedgerPeerSnapshotCmdArgs = QueryLedgerPeerSnapshotCmdArgs
146+
{ commons :: !QueryCommons
147+
, outFile :: !(Maybe (File () Out))
148+
}
149+
deriving (Generic, Show)
150+
143151
data QueryProtocolStateCmdArgs = QueryProtocolStateCmdArgs
144152
{ commons :: !QueryCommons
145153
, mOutFile :: !(Maybe (File () Out))
@@ -266,6 +274,8 @@ renderQueryCmds = \case
266274
"query utxo"
267275
QueryLedgerStateCmd{} ->
268276
"query ledger-state"
277+
QueryLedgerPeerSnapshotCmd{} ->
278+
"query ledger-peer-snapshot"
269279
QueryProtocolStateCmd{} ->
270280
"query protocol-state"
271281
QueryStakeSnapshotCmd{} ->

cardano-cli/src/Cardano/CLI/EraBased/Options/Query.hs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ pQueryCmdsTopLevel envCli =
4646
, pPoolState envCli
4747
, pTxMempool envCli
4848
, pSlotNumber envCli
49+
, pQueryLedgerPeerSnapshot envCli
4950
]
5051
i =
5152
Opt.progDesc $
@@ -164,6 +165,20 @@ pSlotNumber envCli =
164165
Opt.info (pQuerySlotNumberCmd ShelleyBasedEraConway envCli) $
165166
Opt.progDesc "Query slot number for UTC timestamp"
166167

168+
pQueryLedgerPeerSnapshot :: EnvCli -> Parser (QueryCmds ConwayEra)
169+
pQueryLedgerPeerSnapshot envCli =
170+
subParser "ledger-peer-snapshot" $
171+
Opt.info (pQueryLedgerPeerSnapshotCmd ShelleyBasedEraConway envCli) $
172+
Opt.progDesc $
173+
mconcat
174+
[ "Dump the current snapshot of big ledger peers. "
175+
, "These are the largest pools that cumulatively hold "
176+
, "90% of total stake."
177+
]
178+
179+
-- \^ TODO use bigLedgerPeerQuota from Ouroboros.Network.PeerSelection.LedgerPeers.Utils
180+
-- which must be re-exposed thru cardano-api
181+
167182
pQueryCmds
168183
:: ()
169184
=> ShelleyBasedEra era
@@ -216,6 +231,17 @@ pQueryCmds era envCli =
216231
[ "Dump the current ledger state of the node (Ledger.NewEpochState -- advanced command)"
217232
]
218233
, Just $
234+
subParser "ledger-peer-snapshot" $
235+
Opt.info (pQueryLedgerPeerSnapshotCmd era envCli) $
236+
Opt.progDesc $
237+
mconcat
238+
[ "Dump the current snapshot of ledger peers."
239+
, "These are the largest pools that cumulatively hold "
240+
, "90% of total stake."
241+
]
242+
, -- \^ TODO use bigLedgerPeerQuota from Ouroboros.Network.PeerSelection.LedgerPeers.Utils
243+
-- which must be re-exposed thru cardano-api
244+
Just $
219245
subParser "protocol-state" $
220246
Opt.info (pQueryProtocolStateCmd era envCli) $
221247
Opt.progDesc $
@@ -327,6 +353,13 @@ pQueryLedgerStateCmd era envCli =
327353
<$> pQueryCommons era envCli
328354
<*> pMaybeOutputFile
329355

356+
pQueryLedgerPeerSnapshotCmd :: ShelleyBasedEra era -> EnvCli -> Parser (QueryCmds era)
357+
pQueryLedgerPeerSnapshotCmd era envCli =
358+
fmap QueryLedgerPeerSnapshotCmd $
359+
QueryLedgerPeerSnapshotCmdArgs
360+
<$> pQueryCommons era envCli
361+
<*> pMaybeOutputFile
362+
330363
pQueryProtocolStateCmd :: ShelleyBasedEra era -> EnvCli -> Parser (QueryCmds era)
331364
pQueryProtocolStateCmd era envCli =
332365
fmap QueryProtocolStateCmd $

cardano-cli/src/Cardano/CLI/EraBased/Run/Query.hs

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
{-# LANGUAGE NamedFieldPuns #-}
1111
{-# LANGUAGE RankNTypes #-}
1212
{-# LANGUAGE ScopedTypeVariables #-}
13-
{-# LANGUAGE TupleSections #-}
1413
{-# LANGUAGE TypeApplications #-}
1514
{-# LANGUAGE TypeOperators #-}
1615

@@ -19,6 +18,7 @@ module Cardano.CLI.EraBased.Run.Query
1918
, runQueryKesPeriodInfoCmd
2019
, runQueryLeadershipScheduleCmd
2120
, runQueryLedgerStateCmd
21+
, runQueryLedgerPeerSnapshot
2222
, runQueryPoolStateCmd
2323
, runQueryProtocolParametersCmd
2424
, runQueryProtocolStateCmd
@@ -43,7 +43,7 @@ import qualified Cardano.Api as Api
4343
import qualified Cardano.Api.Consensus as Consensus
4444
import Cardano.Api.Ledger (StandardCrypto, strictMaybeToMaybe)
4545
import qualified Cardano.Api.Ledger as L
46-
import Cardano.Api.Network (Serialised (..))
46+
import Cardano.Api.Network (LedgerPeerSnapshot, Serialised (..))
4747
import qualified Cardano.Api.Network as Consensus
4848
import Cardano.Api.Shelley hiding (QueryInShelleyBasedEra (..))
4949

@@ -103,6 +103,7 @@ runQueryCmds = \case
103103
Cmd.QueryStakeDistributionCmd args -> runQueryStakeDistributionCmd args
104104
Cmd.QueryStakeAddressInfoCmd args -> runQueryStakeAddressInfoCmd args
105105
Cmd.QueryLedgerStateCmd args -> runQueryLedgerStateCmd args
106+
Cmd.QueryLedgerPeerSnapshotCmd args -> runQueryLedgerPeerSnapshot args
106107
Cmd.QueryStakeSnapshotCmd args -> runQueryStakeSnapshotCmd args
107108
Cmd.QueryProtocolStateCmd args -> runQueryProtocolStateCmd args
108109
Cmd.QueryUTxOCmd args -> runQueryUTxOCmd args
@@ -834,6 +835,41 @@ runQueryLedgerStateCmd
834835
& onLeft (left . QueryCmdAcquireFailure)
835836
& onLeft left
836837

838+
runQueryLedgerPeerSnapshot
839+
:: ()
840+
=> Cmd.QueryLedgerPeerSnapshotCmdArgs
841+
-> ExceptT QueryCmdError IO ()
842+
runQueryLedgerPeerSnapshot
843+
Cmd.QueryLedgerPeerSnapshotCmdArgs
844+
{ Cmd.commons =
845+
Cmd.QueryCommons
846+
{ Cmd.nodeSocketPath
847+
, Cmd.consensusModeParams
848+
, Cmd.networkId
849+
, Cmd.target
850+
}
851+
, Cmd.outFile
852+
} = do
853+
let localNodeConnInfo = LocalNodeConnectInfo consensusModeParams networkId nodeSocketPath
854+
855+
join $
856+
lift
857+
( executeLocalStateQueryExpr localNodeConnInfo target $ runExceptT $ do
858+
AnyCardanoEra era <-
859+
lift queryCurrentEra
860+
& onLeft (left . QueryCmdUnsupportedNtcVersion)
861+
862+
sbe <-
863+
requireShelleyBasedEra era
864+
& onNothing (left QueryCmdByronEra)
865+
866+
result <- easyRunQuery (queryLedgerPeerSnapshot sbe)
867+
868+
pure $ shelleyBasedEraConstraints sbe (writeLedgerPeerSnapshot outFile) result
869+
)
870+
& onLeft (left . QueryCmdAcquireFailure)
871+
& onLeft left
872+
837873
runQueryProtocolStateCmd
838874
:: ()
839875
=> Cmd.QueryProtocolStateCmdArgs
@@ -1040,6 +1076,23 @@ writeLedgerState mOutFile qState@(SerialisedDebugLedgerState serLedgerState) =
10401076
LBS.writeFile fpath $
10411077
unSerialised serLedgerState
10421078

1079+
-- | Writes JSON-encoded big ledger peer snapshot
1080+
writeLedgerPeerSnapshot
1081+
:: Maybe (File () Out)
1082+
-> Serialised LedgerPeerSnapshot
1083+
-> ExceptT QueryCmdError IO ()
1084+
writeLedgerPeerSnapshot mOutPath serBigLedgerPeerSnapshot = do
1085+
case decodeBigLedgerPeerSnapshot serBigLedgerPeerSnapshot of
1086+
Left (bs, _decoderError) ->
1087+
firstExceptT QueryCmdHelpersError $ pPrintCBOR bs
1088+
Right snapshot ->
1089+
case mOutPath of
1090+
Nothing -> liftIO . LBS.putStrLn $ Aeson.encode snapshot
1091+
Just fpath ->
1092+
firstExceptT QueryCmdWriteFileError $
1093+
newExceptT . writeLazyByteStringFile fpath $
1094+
encodePretty snapshot
1095+
10431096
writeStakeSnapshots
10441097
:: forall era ledgerera
10451098
. ()

0 commit comments

Comments
 (0)