From 235849b31cf12bfebfd984700b67ee1a78ba800d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20W=C3=B3jtowicz?= Date: Sat, 30 Mar 2024 22:56:03 +0100 Subject: [PATCH] Adds new query for a snapshot of big ledger peers This change introduces a new query tag and handler to support retrieval of a snapshot of big ledger peers from the current tip of a node. --- cardano-api/internal/Cardano/Api/Query.hs | 17 +++++++++++++++++ .../internal/Cardano/Api/Query/Expr.hs | 19 +++++++++++++++++-- cardano-api/src/Cardano/Api.hs | 1 + 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/cardano-api/internal/Cardano/Api/Query.hs b/cardano-api/internal/Cardano/Api/Query.hs index cf71e03976..29c66c5768 100644 --- a/cardano-api/internal/Cardano/Api/Query.hs +++ b/cardano-api/internal/Cardano/Api/Query.hs @@ -57,6 +57,7 @@ module Cardano.Api.Query , LedgerState (..) , getProgress , getSlotForRelativeTime + , decodeBigLedgerPeerSnapshot -- * Internal conversion functions , toLedgerUTxO @@ -112,6 +113,7 @@ import qualified Ouroboros.Consensus.Shelley.Ledger as Consensus import qualified Ouroboros.Consensus.Shelley.Ledger.Query.Types as Consensus import Ouroboros.Network.Block (Serialised (..)) import Ouroboros.Network.NodeToClient.Version (NodeToClientVersion (..)) +import Ouroboros.Network.PeerSelection.LedgerPeers.Type (LedgerPeerSnapshot) import Ouroboros.Network.Protocol.LocalStateQuery.Client (Some (..)) import Control.Monad.Trans.Except @@ -296,6 +298,8 @@ data QueryInShelleyBasedEra era result where QueryStakeVoteDelegatees :: Set StakeCredential -> QueryInShelleyBasedEra era (Map StakeCredential (Ledger.DRep StandardCrypto)) + QueryLedgerPeerSnapshot + :: QueryInShelleyBasedEra era (Serialised LedgerPeerSnapshot) -- | Mapping for queries in Shelley-based eras returning minimal node-to-client protocol versions. More -- information about queries versioning can be found: @@ -314,6 +318,7 @@ instance NodeToClientVersionOf (QueryInShelleyBasedEra era result) where nodeToClientVersionOf QueryDebugLedgerState = NodeToClientV_9 nodeToClientVersionOf QueryProtocolState = NodeToClientV_9 nodeToClientVersionOf QueryCurrentEpochState = NodeToClientV_9 + nodeToClientVersionOf QueryLedgerPeerSnapshot = NodeToClientV_9 -- Babbage >= v13 nodeToClientVersionOf (QueryPoolState _) = NodeToClientV_14 nodeToClientVersionOf (QueryPoolDistribution _) = NodeToClientV_14 @@ -468,6 +473,11 @@ decodeStakeSnapshot -> Either DecoderError (StakeSnapshot era) decodeStakeSnapshot (SerialisedStakeSnapshots (Serialised ls)) = StakeSnapshot <$> Plain.decodeFull ls +decodeBigLedgerPeerSnapshot + :: Serialised LedgerPeerSnapshot + -> Either DecoderError LedgerPeerSnapshot +decodeBigLedgerPeerSnapshot = Plain.decodeFull . unSerialised + toShelleyAddrSet :: CardanoEra era -> Set AddressAny @@ -703,6 +713,8 @@ toConsensusQueryShelleyBased sbe = \case where creds' :: Set (Shelley.Credential Shelley.Staking StandardCrypto) creds' = Set.map toShelleyStakeCredential creds + QueryLedgerPeerSnapshot -> + Some (consensusQueryInEraInMode era (Consensus.GetCBOR Consensus.GetBigLedgerPeerSnapshot)) where era = toCardanoEra sbe @@ -984,6 +996,11 @@ fromConsensusQueryResultShelleyBased sbe sbeQuery q' r' = Consensus.GetFilteredVoteDelegatees{} -> Map.mapKeys fromShelleyStakeCredential r' _ -> fromConsensusQueryResultMismatch + QueryLedgerPeerSnapshot{} -> + case q' of + Consensus.GetCBOR Consensus.GetBigLedgerPeerSnapshot -> + r' + _ -> fromConsensusQueryResultMismatch -- | This should /only/ happen if we messed up the mapping in 'toConsensusQuery' -- and 'fromConsensusQueryResult' so they are inconsistent with each other. diff --git a/cardano-api/internal/Cardano/Api/Query/Expr.hs b/cardano-api/internal/Cardano/Api/Query/Expr.hs index 43415793ce..6bba2f318a 100644 --- a/cardano-api/internal/Cardano/Api/Query/Expr.hs +++ b/cardano-api/internal/Cardano/Api/Query/Expr.hs @@ -26,6 +26,7 @@ module Cardano.Api.Query.Expr , queryStakeSnapshot , querySystemStart , queryUtxo + , queryLedgerPeerSnapshot , L.MemberStatus (..) , L.CommitteeMembersState (..) , queryCommitteeMembersState @@ -64,6 +65,8 @@ import Cardano.Ledger.SafeHash import qualified Cardano.Ledger.Shelley.LedgerState as L import Cardano.Slotting.Slot import Ouroboros.Consensus.HardFork.Combinator.AcrossEras as Consensus +import Ouroboros.Network.Block (Serialised) +import Ouroboros.Network.PeerSelection.LedgerPeers (LedgerPeerSnapshot) import Data.Map (Map) import Data.Set (Set) @@ -132,6 +135,19 @@ queryDebugLedgerState queryDebugLedgerState sbe = queryExpr $ QueryInEra $ QueryInShelleyBasedEra sbe QueryDebugLedgerState +queryLedgerPeerSnapshot + :: () + => ShelleyBasedEra era + -> LocalStateQueryExpr + block + point + QueryInMode + r + IO + (Either UnsupportedNtcVersionError (Either EraMismatch (Serialised LedgerPeerSnapshot))) +queryLedgerPeerSnapshot sbe = + queryExpr $ QueryInEra $ QueryInShelleyBasedEra sbe QueryLedgerPeerSnapshot + queryEraHistory :: () => LocalStateQueryExpr block point QueryInMode r IO (Either UnsupportedNtcVersionError EraHistory) @@ -303,8 +319,7 @@ queryStakePoolParameters (Either UnsupportedNtcVersionError (Either EraMismatch (Map PoolId StakePoolParameters))) queryStakePoolParameters sbe poolIds | S.null poolIds = pure . pure $ pure mempty - | otherwise = - queryExpr $ QueryInEra $ QueryInShelleyBasedEra sbe $ QueryStakePoolParameters poolIds + | otherwise = queryExpr $ QueryInEra $ QueryInShelleyBasedEra sbe $ QueryStakePoolParameters poolIds queryStakePools :: () diff --git a/cardano-api/src/Cardano/Api.hs b/cardano-api/src/Cardano/Api.hs index 0baabb2da8..01a4b7a6ec 100644 --- a/cardano-api/src/Cardano/Api.hs +++ b/cardano-api/src/Cardano/Api.hs @@ -949,6 +949,7 @@ module Cardano.Api , queryCurrentEpochState , queryCurrentEra , queryDebugLedgerState + , queryLedgerPeerSnapshot , queryEpoch , queryConstitutionHash , queryEraHistory