Skip to content

Commit

Permalink
Add memoization for MonadBlockchainCardanoNodeT queries related to th…
Browse files Browse the repository at this point in the history
…e MonadBlockchain instance
  • Loading branch information
koslambrou committed Oct 22, 2024
1 parent 85b1365 commit f678cc9
Show file tree
Hide file tree
Showing 9 changed files with 256 additions and 63 deletions.
4 changes: 2 additions & 2 deletions src/base/lib/Convex/BuildTx.hs
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ instance MonadBlockchain m => MonadBlockchain (BuildTxT m) where
querySystemStart = lift querySystemStart
queryEraHistory = lift queryEraHistory
querySlotNo = lift querySlotNo
networkId = lift networkId
queryNetworkId = lift queryNetworkId

instance MonadMockchain m => MonadMockchain (BuildTxT m) where
modifyMockChainState = lift . modifyMockChainState
Expand Down Expand Up @@ -631,7 +631,7 @@ scripts easier to trigger
-}
addScriptWithdrawal :: (MonadBlockchain m, MonadBuildTx m) => ScriptHash -> C.Quantity -> C.ScriptWitness C.WitCtxStake C.ConwayEra -> m ()
addScriptWithdrawal sh quantity witness = do
n <- networkId
n <- queryNetworkId
let addr = C.StakeAddress (C.toShelleyNetwork n) $ C.toShelleyStakeCredential $ C.StakeCredentialByScript sh
wit = C.ScriptWitness C.ScriptWitnessForStakeAddr witness
addWithdrawal addr quantity wit
Expand Down
215 changes: 169 additions & 46 deletions src/base/lib/Convex/Class.hs

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion src/coin-selection/lib/Convex/CoinSelection.hs
Original file line number Diff line number Diff line change
Expand Up @@ -604,7 +604,7 @@ balanceForWallet ::
ChangeOutputPosition ->
m (C.Tx ERA, BalanceChanges)
balanceForWallet dbg wallet walletUtxo txb changePosition = do
n <- networkId
n <- queryNetworkId
let walletAddress = Wallet.addressInEra n wallet
txOut = C.InAnyCardanoEra C.ConwayEra $ L.emptyTxOut walletAddress
balanceForWalletReturn dbg wallet walletUtxo txOut txb changePosition
Expand Down
4 changes: 2 additions & 2 deletions src/coin-selection/lib/Convex/MockChain/CoinSelection.hs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ balanceAndSubmit ::
[C.ShelleyWitnessSigningKey] ->
m (Either SendTxFailed (C.Tx CoinSelection.ERA))
balanceAndSubmit dbg wallet tx changePosition keys = do
n <- networkId
n <- queryNetworkId
let walletAddress = Wallet.addressInEra n wallet
txOut = C.InAnyCardanoEra C.ConwayEra $ emptyTxOut walletAddress
balanceAndSubmitReturn dbg wallet txOut tx changePosition keys
Expand All @@ -63,7 +63,7 @@ tryBalanceAndSubmit ::
[C.ShelleyWitnessSigningKey] ->
m (C.Tx CoinSelection.ERA)
tryBalanceAndSubmit dbg wallet tx changePosition keys = do
n <- networkId
n <- queryNetworkId
let walletAddress = Wallet.addressInEra n wallet
txOut = C.InAnyCardanoEra C.ConwayEra $ emptyTxOut walletAddress
balanceAndSubmitReturn dbg wallet txOut tx changePosition keys >>= either (fail . show) pure
Expand Down
4 changes: 2 additions & 2 deletions src/devnet/lib/Convex/Devnet/Wallet.hs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ import Control.Tracer (Tracer, traceWith)
import Convex.BuildTx (TxBuilder)
import qualified Convex.BuildTx as BuildTx
import Convex.CardanoApi.Lenses (emptyTxOut)
import Convex.Class (MonadBlockchain (networkId),
import Convex.Class (MonadBlockchain (queryNetworkId),
runMonadBlockchainCardanoNodeT,
sendTx)
import Convex.CoinSelection (ChangeOutputPosition (TrailingChange))
Expand Down Expand Up @@ -98,7 +98,7 @@ runningNodeBlockchain tracer RunningNode{rnNodeSocket, rnNetworkId} h =
-}
balanceAndSubmit :: Tracer IO WalletLog -> RunningNode -> Wallet -> TxBuilder -> ChangeOutputPosition -> [C.ShelleyWitnessSigningKey] -> IO (Tx ConwayEra)
balanceAndSubmit tracer node wallet tx changePosition keys = do
n <- runningNodeBlockchain @String tracer node networkId
n <- runningNodeBlockchain @String tracer node queryNetworkId
let walletAddress = Wallet.addressInEra n wallet
txOut = emptyTxOut walletAddress
balanceAndSubmitReturn tracer node wallet txOut tx changePosition keys
Expand Down
82 changes: 76 additions & 6 deletions src/devnet/test/Spec.hs
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,16 @@ import Cardano.Ledger.Api.PParams (ppMaxTxSizeL)
import Cardano.Ledger.Slot (EpochSize (..))
import Control.Concurrent (threadDelay)
import Control.Lens (view)
import Control.Monad (unless)
import Control.Monad (unless, void)
import Control.Monad.Except (runExceptT)
import Control.Tracer (Tracer)
import Control.Monad.IO.Class (liftIO, MonadIO)
import Control.Monad.State (gets, MonadTrans (lift), MonadState)
import Control.Tracer (Tracer, nullTracer)
import Convex.Class (MonadBlockchainError,
memoizedSystemStartQuery,
queryNetworkId,
querySystemStart,
runMonadBlockchainCardanoNodeT, runMemoizedCardanoNodeStateQueryT, MonadBlockchain, MemoizedCardanoNodeStateQueryResponses)
import Convex.Devnet.CardanoNode (NodeLog (..),
getCardanoNodeVersion,
withCardanoNodeDevnet,
Expand All @@ -30,17 +37,19 @@ import Convex.Devnet.CardanoNode.Types (GenesisConfigChanges (..),
forkIntoConwayInEpoch)
import Convex.Devnet.Logging (contramap, showLogsOnFailure,
traceWith)
import Convex.Devnet.NodeQueries (loadConnectInfo)
import Convex.Devnet.NodeQueries (loadConnectInfo,
localNodeConnectInfo)
import qualified Convex.Devnet.NodeQueries as Queries
import Convex.Devnet.Utils (failAfter, failure,
withTempDir)
import Convex.Devnet.Wallet (WalletLog)
import Convex.Devnet.Wallet (WalletLog, runTracerMonadLogT)
import qualified Convex.Devnet.Wallet as W
import Convex.Devnet.WalletServer (getUTxOs, withWallet)
import qualified Convex.Devnet.WalletServer as WS
import Convex.NodeQueries (queryProtocolParameters,
queryStakeAddresses,
queryStakePools)
queryStakePools, queryEraHistory)
import Convex.Utils (failOnLeft)
import qualified Convex.Utxos as Utxos
import Data.Aeson (FromJSON, ToJSON)
import Data.List (isInfixOf)
Expand All @@ -57,10 +66,15 @@ import Test.Tasty.HUnit (assertBool, assertEqual,
main :: IO ()
main = do
setLocaleEncoding utf8
defaultMain $ testGroup "test"
defaultMain $ testGroup "node devnet tests"
[ testCase "cardano-node is available" checkCardanoNode
, testCase "start local node" startLocalNode
, testCase "transition to conway era" transitionToConway
, testGroup "node devnet queries"
[ testCase "query network id" queryNetworkIdTest
, testCase "query system start" querySystemStartTest
, testCase "query era history" queryEraHistoryTest
]
, testCase "make a payment" makePayment
, testCase "start local stake pool node" startLocalStakePoolNode
, testCase "stake pool registration" registeredStakePoolNode
Expand Down Expand Up @@ -98,6 +112,62 @@ transitionToConway = do
Queries.queryEra rnNetworkId rnNodeSocket
>>= assertBool "Should be in conway era" . (==) (C.anyCardanoEra C.ConwayEra)

queryNetworkIdTest :: IO ()
queryNetworkIdTest = do
showLogsOnFailure $ \tr -> do
failAfter 5 $
withTempDir "cardano-cluster" $ \tmp -> do
withCardanoNodeDevnet tr tmp $ \RunningNode{rnNetworkId, rnNodeSocket} -> do
let connectInfo = localNodeConnectInfo rnNetworkId rnNodeSocket
networkIdE <- runTracerMonadLogT nullTracer $ runMonadBlockchainCardanoNodeT connectInfo queryNetworkId
networkId <- failOnLeft (\(e :: MonadBlockchainError String) -> show e) networkIdE
assertEqual
"Queried networkId should be the same as the networkId provided as input"
rnNetworkId
networkId

querySystemStartTest :: IO ()
querySystemStartTest = do
showLogsOnFailure $ \tr -> do
failAfter 5 $
withTempDir "cardano-cluster" $ \tmp -> do
withCardanoNodeDevnet tr tmp $ \RunningNode{rnNetworkId, rnNodeSocket} -> do
let connectInfo = localNodeConnectInfo rnNetworkId rnNodeSocket
void $
runTracerMonadLogT
nullTracer
(runMonadBlockchainCardanoNodeT connectInfo $ runMemoizedCardanoNodeStateQueryT action)
>>= failOnLeft (\(e :: MonadBlockchainError String) -> show e)
where
action :: MonadIO m => MonadState MemoizedCardanoNodeStateQueryResponses m => MonadBlockchain m => m ()
action = do
gets memoizedSystemStartQuery >>=
liftIO . assertEqual "The memoized value of SystemStart should be Nothing" Nothing
systemStart <- querySystemStart
gets memoizedSystemStartQuery >>=
liftIO . assertEqual "The memoized value of SystemStart should be Just" (Just systemStart)

queryEraHistoryTest :: IO ()
queryEraHistoryTest = do
showLogsOnFailure $ \tr -> do
failAfter 5 $
withTempDir "cardano-cluster" $ \tmp -> do
withCardanoNodeDevnet tr tmp $ \RunningNode{rnNetworkId, rnNodeSocket} -> do
let connectInfo = localNodeConnectInfo rnNetworkId rnNodeSocket
void $
runTracerMonadLogT
nullTracer
(runMonadBlockchainCardanoNodeT connectInfo $ runMemoizedCardanoNodeStateQueryT action)
>>= failOnLeft (\(e :: MonadBlockchainError String) -> show e)
where
action :: MonadIO m => MonadState MemoizedCardanoNodeStateQueryResponses m => MonadBlockchain m => m ()
action = do
gets memoizedSystemStartQuery >>=
liftIO . assertEqual "The memoized value of SystemStart should be Nothing" Nothing
systemStart <- querySystemStart
gets memoizedSystemStartQuery >>=
liftIO . assertEqual "The memoized value of SystemStart should be Just" (Just systemStart)

startLocalStakePoolNode :: IO ()
startLocalStakePoolNode = do
showLogsOnFailure $ \tr -> do
Expand Down
2 changes: 1 addition & 1 deletion src/mockchain/lib/Convex/MockChain.hs
Original file line number Diff line number Diff line change
Expand Up @@ -425,7 +425,7 @@ instance Monad m => MonadBlockchain (MockchainT m) where
toLedgerStakeCredentials creds' = Set.fromList $ C.toShelleyStakeCredential <$> Set.toList creds'
fromLedgerStakeAddress = C.makeStakeAddress nid . C.fromShelleyStakeCredential
queryStakePools = MockchainT (asks npStakePools)
networkId = MockchainT (asks npNetworkId)
queryNetworkId = MockchainT (asks npNetworkId)
querySystemStart = MockchainT (asks npSystemStart)
queryEraHistory = MockchainT (asks npEraHistory)
querySlotNo = MockchainT $ do
Expand Down
2 changes: 1 addition & 1 deletion src/node-client/lib/Convex/NodeClient/WaitForTxnClient.hs
Original file line number Diff line number Diff line change
Expand Up @@ -119,4 +119,4 @@ instance (MonadIO m, MonadBlockchain m, MonadLog m) => MonadBlockchain (MonadBlo

querySlotNo = MonadBlockchainWaitingT querySlotNo

networkId = MonadBlockchainWaitingT networkId
queryNetworkId = MonadBlockchainWaitingT queryNetworkId
4 changes: 2 additions & 2 deletions src/wallet/lib/Convex/Wallet/Operator.hs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ import Cardano.Api (ConwayEra, CtxTx, PaymentCredential,
TxOut)
import qualified Cardano.Api.Shelley as C
import Convex.CardanoApi.Lenses (emptyTxOut)
import Convex.Class (MonadBlockchain (networkId))
import Convex.Class (MonadBlockchain (queryNetworkId))
import Convex.PlutusLedger (transPubKeyHash, transStakeKeyHash)
import Convex.Utils (readSigningKeyFromFile,
readStakingKeyFromFile,
Expand Down Expand Up @@ -163,7 +163,7 @@ operatorReturnOutput = returnOutputFor . operatorPaymentCredential
returnOutputFor :: MonadBlockchain m => PaymentCredential -> m (TxOut ctx ConwayEra)
returnOutputFor cred = do
addr <- C.makeShelleyAddress
<$> networkId
<$> queryNetworkId
<*> pure cred
<*> pure C.NoStakeAddress
pure $ emptyTxOut $ C.AddressInEra (C.ShelleyAddressInEra C.ShelleyBasedEraConway) addr
Expand Down

0 comments on commit f678cc9

Please sign in to comment.