diff --git a/cardano-api/internal/Cardano/Api/Query.hs b/cardano-api/internal/Cardano/Api/Query.hs index cf71e0397..23e79a663 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: @@ -328,6 +332,7 @@ instance NodeToClientVersionOf (QueryInShelleyBasedEra era result) where nodeToClientVersionOf QuerySPOStakeDistr{} = NodeToClientV_16 nodeToClientVersionOf QueryCommitteeMembersState{} = NodeToClientV_16 nodeToClientVersionOf QueryStakeVoteDelegatees{} = NodeToClientV_16 + nodeToClientVersionOf QueryLedgerPeerSnapshot = NodeToClientV_19 deriving instance Show (QueryInShelleyBasedEra era result) @@ -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 ca737dd68..f230e9241 100644 --- a/cardano-api/internal/Cardano/Api/Query/Expr.hs +++ b/cardano-api/internal/Cardano/Api/Query/Expr.hs @@ -27,6 +27,7 @@ module Cardano.Api.Query.Expr , queryStakeSnapshot , querySystemStart , queryUtxo + , queryLedgerPeerSnapshot , L.MemberStatus (..) , L.CommitteeMembersState (..) , queryCommitteeMembersState @@ -65,6 +66,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) @@ -133,6 +136,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) diff --git a/cardano-api/internal/Cardano/Api/ReexposeNetwork.hs b/cardano-api/internal/Cardano/Api/ReexposeNetwork.hs index d9ea8c073..e1d1e5ba2 100644 --- a/cardano-api/internal/Cardano/Api/ReexposeNetwork.hs +++ b/cardano-api/internal/Cardano/Api/ReexposeNetwork.hs @@ -1,5 +1,12 @@ -module Cardano.Api.ReexposeNetwork (Target (..), Serialised (..), SubmitResult (..)) where +module Cardano.Api.ReexposeNetwork + ( LedgerPeerSnapshot (..) + , Target (..) + , Serialised (..) + , SubmitResult (..) + ) +where import Ouroboros.Network.Block (Serialised (..)) +import Ouroboros.Network.PeerSelection.LedgerPeers.Type (LedgerPeerSnapshot (..)) import Ouroboros.Network.Protocol.LocalStateQuery.Type (Target (..)) import Ouroboros.Network.Protocol.LocalTxSubmission.Type (SubmitResult (..)) diff --git a/cardano-api/src/Cardano/Api.hs b/cardano-api/src/Cardano/Api.hs index 7438af2ed..e3b127b17 100644 --- a/cardano-api/src/Cardano/Api.hs +++ b/cardano-api/src/Cardano/Api.hs @@ -972,6 +972,7 @@ module Cardano.Api , queryCurrentEpochState , queryCurrentEra , queryDebugLedgerState + , queryLedgerPeerSnapshot , queryEpoch , queryConstitutionHash , queryEraHistory diff --git a/cardano-api/src/Cardano/Api/Shelley.hs b/cardano-api/src/Cardano/Api/Shelley.hs index 6ae36572f..615bde434 100644 --- a/cardano-api/src/Cardano/Api/Shelley.hs +++ b/cardano-api/src/Cardano/Api/Shelley.hs @@ -244,6 +244,7 @@ module Cardano.Api.Shelley , StakeSnapshot (..) , SerialisedStakeSnapshots (..) , decodeStakeSnapshot + , decodeBigLedgerPeerSnapshot , UTxO (..) , AcquiringFailure (..) , SystemStart (..)