Skip to content

Commit 0daa172

Browse files
committed
Without oops
1 parent 59c6a02 commit 0daa172

File tree

4 files changed

+68
-36
lines changed

4 files changed

+68
-36
lines changed

Diff for: cardano-api/src/Cardano/Api.hs

+1
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,7 @@ module Cardano.Api (
620620
UTxO(..),
621621
queryNodeLocalState,
622622
executeQueryCardanoMode,
623+
UnsupportedNtcVersionError(..),
623624

624625
-- *** Local tx monitoring
625626
LocalTxMonitorClient(..),

Diff for: cardano-api/src/Cardano/Api/IPC.hs

+4-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,9 @@ module Cardano.Api.IPC (
7777
consensusModeOnly,
7878
toAcquiringFailure,
7979

80-
NodeToClientVersion(..)
80+
NodeToClientVersion(..),
81+
82+
UnsupportedNtcVersionError(..),
8183
) where
8284

8385
import Prelude
@@ -130,6 +132,7 @@ import qualified Ouroboros.Consensus.Shelley.Ledger.Block as Consensus
130132
import Cardano.Api.Block
131133
import Cardano.Api.HasTypeProxy
132134
import Cardano.Api.InMode
135+
import Cardano.Api.IPC.Version
133136
import Cardano.Api.Modes
134137
import Cardano.Api.NetworkId
135138
import Cardano.Api.Protocol

Diff for: cardano-api/src/Cardano/Api/IPC/Monad.hs

+23-10
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import Data.Bifunctor (first)
1919
import Data.Either
2020
import Data.Function
2121
import Data.Maybe
22+
import Data.Ord (Ord(..))
2223
import System.IO
2324

2425
import Cardano.Ledger.Shelley.Scripts ()
@@ -28,6 +29,7 @@ import qualified Ouroboros.Network.Protocol.LocalStateQuery.Type as Net.Query
2829
import Cardano.Api.Block
2930
import Cardano.Api.Eras
3031
import Cardano.Api.IPC
32+
import Cardano.Api.IPC.Version
3133
import Cardano.Api.Modes
3234

3335

@@ -97,21 +99,32 @@ setupLocalStateQueryExpr waitDone mPointVar' resultVar' ntcVersion f =
9799
pure $ Net.Query.SendMsgDone ()
98100
}
99101

102+
-- | Get the node server's Node-to-Client version.
103+
getNtcVersion :: LocalStateQueryExpr block point (QueryInMode mode) r IO NodeToClientVersion
104+
getNtcVersion = LocalStateQueryExpr $ do
105+
v <- ask
106+
pure v
107+
100108
-- | Use 'queryExpr' in a do block to construct monadic local state queries.
101-
queryExpr :: QueryInMode mode a -> LocalStateQueryExpr block point (QueryInMode mode) r IO a
102-
queryExpr q =
103-
LocalStateQueryExpr . ReaderT $ \_ -> ContT $ \f -> pure $
104-
Net.Query.SendMsgQuery q $
105-
Net.Query.ClientStQuerying
106-
{ Net.Query.recvMsgResult = f
107-
}
109+
queryExpr :: QueryInMode mode a -> LocalStateQueryExpr block point (QueryInMode mode) r IO (Either UnsupportedNtcVersionError a)
110+
queryExpr q = do
111+
let minNtcVersion = nodeToClientVersionOf q
112+
ntcVersion <- getNtcVersion
113+
if ntcVersion >= minNtcVersion
114+
then
115+
fmap Right . LocalStateQueryExpr . ReaderT $ \_ -> ContT $ \f -> pure $
116+
Net.Query.SendMsgQuery q $
117+
Net.Query.ClientStQuerying
118+
{ Net.Query.recvMsgResult = f
119+
}
120+
else pure (Left (UnsupportedNtcVersionError minNtcVersion ntcVersion))
108121

109122
-- | A monad expression that determines what era the node is in.
110123
determineEraExpr ::
111124
ConsensusModeParams mode
112-
-> LocalStateQueryExpr block point (QueryInMode mode) r IO AnyCardanoEra
125+
-> LocalStateQueryExpr block point (QueryInMode mode) r IO (Either UnsupportedNtcVersionError AnyCardanoEra)
113126
determineEraExpr cModeParams =
114127
case consensusModeOnly cModeParams of
115-
ByronMode -> return $ AnyCardanoEra ByronEra
116-
ShelleyMode -> return $ AnyCardanoEra ShelleyEra
128+
ByronMode -> return $ Right $ AnyCardanoEra ByronEra
129+
ShelleyMode -> return $ Right $ AnyCardanoEra ShelleyEra
117130
CardanoMode -> queryExpr $ QueryCurrentEra CardanoModeIsMultiEra

Diff for: cardano-cli/src/Cardano/CLI/Shelley/Run/Query.hs

+40-25
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
{-# LANGUAGE FlexibleContexts #-}
55
{-# LANGUAGE FlexibleInstances #-}
66
{-# LANGUAGE GADTs #-}
7+
{-# LANGUAGE LambdaCase #-}
78
{-# LANGUAGE RankNTypes #-}
89
{-# LANGUAGE ScopedTypeVariables #-}
910
{-# LANGUAGE TypeApplications #-}
@@ -130,6 +131,7 @@ data ShelleyQueryCmdError
130131
-- ^ Operational certificate of the unknown stake pool.
131132
| ShelleyQueryCmdPoolStateDecodeError DecoderError
132133
| ShelleyQueryCmdStakeSnapshotDecodeError DecoderError
134+
| ShelleyQueryCmdUnsupportedNtcVersion !UnsupportedNtcVersionError
133135

134136
deriving Show
135137

@@ -169,6 +171,10 @@ renderShelleyQueryCmdError err =
169171
"Failed to decode PoolState. Error: " <> Text.pack (show decoderError)
170172
ShelleyQueryCmdStakeSnapshotDecodeError decoderError ->
171173
"Failed to decode StakeSnapshot. Error: " <> Text.pack (show decoderError)
174+
ShelleyQueryCmdUnsupportedNtcVersion (UnsupportedNtcVersionError minNtcVersion ntcVersion) ->
175+
"Unsupported feature for the node-to-client protocol version.\n" <>
176+
"This query requires at least " <> show minNtcVersion <> " but the node negotiated " <> show ntcVersion <> ".\n" <>
177+
"Later node versions support later protocol versions (but development protocol versions are not enabled in the node by default)."
172178

173179
runQueryCmd :: QueryCmd -> ExceptT ShelleyQueryCmdError IO ()
174180
runQueryCmd cmd =
@@ -211,7 +217,11 @@ runQueryProtocolParameters (AnyConsensusModeParams cModeParams) network mOutFile
211217
let localNodeConnInfo = LocalNodeConnectInfo cModeParams network sockPath
212218

213219
result <- liftIO $ executeLocalStateQueryExpr localNodeConnInfo Nothing $ runExceptT $ do
214-
anyE@(AnyCardanoEra era) <- lift $ determineEraExpr cModeParams
220+
eraResult <- lift $ determineEraExpr cModeParams
221+
222+
anyE@(AnyCardanoEra era) <- case eraResult of
223+
Right a -> pure a
224+
Left e -> throwE $ ShelleyQueryCmdUnsupportedNtcVersion e
215225

216226
case cardanoEraStyle era of
217227
LegacyByronEra -> left ShelleyQueryCmdByronEra
@@ -223,7 +233,10 @@ runQueryProtocolParameters (AnyConsensusModeParams cModeParams) network mOutFile
223233

224234
ppResult <- lift . queryExpr $ QueryInEra eInMode $ QueryInShelleyBasedEra sbe QueryProtocolParameters
225235

226-
except ppResult & firstExceptT ShelleyQueryCmdEraMismatch
236+
case ppResult of
237+
Right (Right a) -> pure a
238+
Right (Left e) -> throwE $ ShelleyQueryCmdEraMismatch e
239+
Left e -> throwE $ ShelleyQueryCmdUnsupportedNtcVersion e
227240

228241
writeProtocolParameters mOutFile =<< except (join (first ShelleyQueryCmdAcquireFailure result))
229242
where
@@ -285,26 +298,24 @@ runQueryTip (AnyConsensusModeParams cModeParams) network mOutFile = do
285298
CardanoMode -> do
286299
let localNodeConnInfo = LocalNodeConnectInfo cModeParams network sockPath
287300

288-
eLocalState <- liftIO $ executeLocalStateQueryExpr localNodeConnInfo Nothing $ do
289-
ntcVersion <- ask
290-
era <- queryExpr (QueryCurrentEra CardanoModeIsMultiEra)
291-
eraHistory <- queryExpr (QueryEraHistory CardanoModeIsMultiEra)
292-
mChainBlockNo <- if ntcVersion >= NodeToClientV_10
293-
then Just <$> queryExpr QueryChainBlockNo
294-
else return Nothing
295-
mChainPoint <- if ntcVersion >= NodeToClientV_10
296-
then Just <$> queryExpr (QueryChainPoint CardanoMode)
297-
else return Nothing
298-
mSystemStart <- if ntcVersion >= NodeToClientV_9
299-
then Just <$> queryExpr QuerySystemStart
300-
else return Nothing
301-
302-
return O.QueryTipLocalState
303-
{ O.era = era
304-
, O.eraHistory = eraHistory
305-
, O.mSystemStart = mSystemStart
306-
, O.mChainTip = makeChainTip <$> mChainBlockNo <*> mChainPoint
307-
}
301+
eLocalState <- ExceptT $ fmap sequence $
302+
executeLocalStateQueryExpr localNodeConnInfo Nothing $ runExceptT $ do
303+
era <- ExceptT $ fmap (first ShelleyQueryCmdUnsupportedNtcVersion) $
304+
queryExpr (QueryCurrentEra CardanoModeIsMultiEra)
305+
306+
eraHistory <- ExceptT $ fmap (first ShelleyQueryCmdUnsupportedNtcVersion) $
307+
queryExpr (QueryEraHistory CardanoModeIsMultiEra)
308+
309+
mChainBlockNo <- fmap Just $ ExceptT $ fmap (first ShelleyQueryCmdUnsupportedNtcVersion) $ queryExpr QueryChainBlockNo
310+
mChainPoint <- fmap Just $ ExceptT $ fmap (first ShelleyQueryCmdUnsupportedNtcVersion) $ queryExpr (QueryChainPoint CardanoMode)
311+
mSystemStart <- fmap Just $ ExceptT $ fmap (first ShelleyQueryCmdUnsupportedNtcVersion) $ queryExpr QuerySystemStart
312+
313+
return O.QueryTipLocalState
314+
{ O.era = era
315+
, O.eraHistory = eraHistory
316+
, O.mSystemStart = mSystemStart
317+
, O.mChainTip = makeChainTip <$> mChainBlockNo <*> mChainPoint
318+
}
308319

309320
mLocalState <- hushM (first ShelleyQueryCmdAcquireFailure eLocalState) $ \e ->
310321
liftIO . T.hPutStrLn IO.stderr $ "Warning: Local state unavailable: " <> renderShelleyQueryCmdError e
@@ -1036,16 +1047,20 @@ runQueryStakePools (AnyConsensusModeParams cModeParams)
10361047
anyE@(AnyCardanoEra era) <- case consensusModeOnly cModeParams of
10371048
ByronMode -> return $ AnyCardanoEra ByronEra
10381049
ShelleyMode -> return $ AnyCardanoEra ShelleyEra
1039-
CardanoMode -> lift . queryExpr $ QueryCurrentEra CardanoModeIsMultiEra
1050+
CardanoMode -> ExceptT $ fmap (first ShelleyQueryCmdUnsupportedNtcVersion) $ queryExpr $ QueryCurrentEra CardanoModeIsMultiEra
10401051

10411052
let cMode = consensusModeOnly cModeParams
10421053

10431054
case toEraInMode era cMode of
10441055
Just eInMode -> do
10451056
sbe <- getSbe $ cardanoEraStyle era
10461057

1047-
firstExceptT ShelleyQueryCmdEraMismatch . ExceptT $
1048-
queryExpr . QueryInEra eInMode . QueryInShelleyBasedEra sbe $ QueryStakePools
1058+
r <- ExceptT $ fmap (first ShelleyQueryCmdUnsupportedNtcVersion) $ queryExpr $
1059+
QueryInEra eInMode $ QueryInShelleyBasedEra sbe $ QueryStakePools
1060+
1061+
case r of
1062+
Right a -> pure a
1063+
Left e -> throwE (ShelleyQueryCmdEraMismatch e)
10491064

10501065
Nothing -> left $ ShelleyQueryCmdEraConsensusModeMismatch (AnyConsensusMode cMode) anyE
10511066

0 commit comments

Comments
 (0)