diff --git a/app/App.hs b/app/App.hs index 3136c97..dad95ce 100644 --- a/app/App.hs +++ b/app/App.hs @@ -34,7 +34,7 @@ main = do run :: Options -> IO () run Options{..} = do config@CM.ConfigMap{..} <- - CM.readConfigMap scriptYaml networkId socketPath >>= either error pure + CM.readConfigMap scriptYaml networkId socketPath leashId >>= either error pure start <- maybe (C.chainTipToChainPoint <$> C.getLocalChainTip cmLocalNodeConn) pure cmStart let points = [start] diff --git a/app/Options.hs b/app/Options.hs index 68c2f25..92d7c59 100644 --- a/app/Options.hs +++ b/app/Options.hs @@ -4,6 +4,7 @@ import Cardano.Api import Data.Foldable (fold) import Network.Wai.Handler.Warp (Port) import Options.Applicative +import Ouroboros.Network.Protocol.LocalStateQuery.Type (LeashID (..)) import System.Environment.Blank (getEnvDefault) import Text.Read (readMaybe) @@ -24,6 +25,7 @@ data Options = Options , httpServerPort :: Port , logsPath :: Maybe FilePath , sqlitePath :: Maybe FilePath + , leashId :: LeashID } deriving (Show, Eq) @@ -39,6 +41,7 @@ mkParseOptions = do <*> optHTTPServerPort <*> optional optLogsPath <*> optional optSqlitePath + <*> optLeashId where optSocketPath nodeSocketPath = ( File @@ -95,6 +98,14 @@ mkParseOptions = do <> metavar "SQLITE_PATH" <> help "Path to sqlite database" ) + optLeashId = + LeashID + <$> option + auto + ( long "leash-id" + <> metavar "LEASH_ID" + <> help "ID to use when leashing the node" + ) mkPsrOpts :: IO (ParserInfo Options) mkPsrOpts = do diff --git a/cabal.project b/cabal.project index b9e0549..df94390 100644 --- a/cabal.project +++ b/cabal.project @@ -31,16 +31,16 @@ constraints: source-repository-package type: git location: https://github.com/tweag/ouroboros-network - tag: 8aa240eef5673d4f397f2037fa95b6fec250f89b - --sha256: sha256-rBWeRG83zu67KJGl+eYxB1tZ7GWyjeKaegVnk+YUcCE= + tag: 63601d2bd9fa447c1f21efa1a2466e131945cf6e + --sha256: sha256-FC/CI67Jk4GNgPPyrWCWl5trCxeon2RSHzhHRZHluak= subdir: ouroboros-network-protocols source-repository-package type: git location: https://github.com/tweag/ouroboros-consensus - tag: c65cc4b73f9bd17d67bb0d50caf1b0da2a650013 - --sha256: sha256-mimWIpW6DBeYPjqPY+K1ZiPzyHJvlzYdtvU26BUZOAU= + tag: 5ac599db62d287ee5db7823008f81a801e1384b8 + --sha256: sha256-UnrXFqOBIUmjYwJJMy88KNEtVvHN5IHCXu+c9vzqQMw= subdir: ouroboros-consensus ouroboros-consensus-diffusion @@ -48,7 +48,7 @@ source-repository-package source-repository-package type: git location: https://github.com/tweag/cardano-api - tag: 9ffe8b21aff66862506fef05b9711e7d62c158fd - --sha256: sha256-yqOdD2gA+g146UjUGE+ynlPrzIvlci2JUm0fgPb8msg= + tag: df4db4a4b49c54661743f62c487539e18426c5a5 + --sha256: sha256-Es4iWiR4oFPV29KRA2/AlcI6+k50M4u/uDrWM4oToD4= subdir: cardano-api diff --git a/dev-local/process-compose.yaml b/dev-local/process-compose.yaml index 2faa1e9..4650ef6 100644 --- a/dev-local/process-compose.yaml +++ b/dev-local/process-compose.yaml @@ -33,7 +33,7 @@ processes: disabled: true script-reexecutor: - command: "cabal run plutus-script-reexecutor -- run --node-socket devnet-env/socket/node1/sock --testnet-magic 42 --script-yaml local-config/scripts.yaml --logs-path events.log --sqlite-path plutus-script-reexecutor.db --http-server-port 8090" + command: "cabal run plutus-script-reexecutor -- run --node-socket devnet-env/socket/node1/sock --testnet-magic 42 --script-yaml local-config/scripts.yaml --logs-path events.log --sqlite-path plutus-script-reexecutor.db --http-server-port 8090 --leash-id 2600" depends_on: cardano-testnet: condition: process_healthy diff --git a/flake.lock b/flake.lock index f1f2510..e44e56c 100644 --- a/flake.lock +++ b/flake.lock @@ -248,17 +248,17 @@ "utils": "utils" }, "locked": { - "lastModified": 1770036244, - "narHash": "sha256-E+dF8QyoHtX43aCtaJirPqpPyptLXwICowhrvIuGofg=", + "lastModified": 1771467823, + "narHash": "sha256-KgWpBnape5EqgOexJlBK7xSw4G+4mxJHEpz9KHmeFuA=", "owner": "tweag", "repo": "cardano-node", - "rev": "fc02d1ef2126ffe5b62a6eda5a08a52347ebb6ef", + "rev": "276fe0b213d2f2235306872e136df65617c70686", "type": "github" }, "original": { "owner": "tweag", "repo": "cardano-node", - "rev": "fc02d1ef2126ffe5b62a6eda5a08a52347ebb6ef", + "rev": "276fe0b213d2f2235306872e136df65617c70686", "type": "github" } }, diff --git a/flake.nix b/flake.nix index 2624533..52e59f5 100644 --- a/flake.nix +++ b/flake.nix @@ -29,17 +29,17 @@ flake-utils.url = "github:numtide/flake-utils"; - cardano-node.url = "github:tweag/cardano-node/fc02d1ef2126ffe5b62a6eda5a08a52347ebb6ef"; + cardano-node.url = "github:tweag/cardano-node/276fe0b213d2f2235306872e136df65617c70686"; }; - outputs = inputs: inputs.flake-utils.lib.eachDefaultSystem (system: + outputs = inputs: inputs.flake-utils.lib.eachDefaultSystem (system: import ./nix/outputs.nix { inherit inputs system; } ); nixConfig = { - extra-substituters = [ - "https://cache.iog.io" - "https://cache.zw3rk.com" + extra-substituters = [ + "https://cache.iog.io" + "https://cache.zw3rk.com" "https://plutus-script-reexecutor.cachix.org" ]; extra-trusted-public-keys = [ diff --git a/lib/PSR/Chain.hs b/lib/PSR/Chain.hs index e320ee8..748352c 100644 --- a/lib/PSR/Chain.hs +++ b/lib/PSR/Chain.hs @@ -117,11 +117,12 @@ sysStartQuery = do runLocalStateQueryExpr :: C.LocalNodeConnectInfo -> + Net.Query.LeashID -> C.ChainPoint -> C.LocalStateQueryExpr C.BlockInMode C.ChainPoint C.QueryInMode () IO a -> IO a -runLocalStateQueryExpr conn cp query = do - res <- C.executeLocalStateQueryExprLeashed conn (Net.Query.SpecificPoint cp) query +runLocalStateQueryExpr conn leashId cp query = do + res <- C.executeLocalStateQueryExprLeashed conn leashId False (Net.Query.SpecificPoint cp) query case res of Left err -> throw $ QeAcquiringFailure err Right val -> pure val diff --git a/lib/PSR/ConfigMap.hs b/lib/PSR/ConfigMap.hs index 274fd8a..61b0769 100644 --- a/lib/PSR/ConfigMap.hs +++ b/lib/PSR/ConfigMap.hs @@ -20,6 +20,7 @@ import Data.Map qualified as Map import Data.Text (Text) import Data.Text qualified as Text import Data.Yaml (decodeFileEither) +import Ouroboros.Network.Protocol.LocalStateQuery.Type (LeashID) import PSR.Chain (mkLocalNodeConnectInfo) import PSR.Types (deriveJSONRecord, deriveJSONSimpleSum) import PlutusLedgerApi.Common ( @@ -81,6 +82,7 @@ data ConfigMap = ConfigMap { cmStart :: Maybe C.ChainPoint , cmScripts :: Map C.ScriptHash [ResolvedScript] , cmLocalNodeConn :: C.LocalNodeConnectInfo + , cmLeashId :: LeashID } -- | Information relating to a loaded script @@ -181,8 +183,8 @@ readScriptFile scriptYamlDir scrutScriptHash (ix, ScriptDetails{..}) = do } -- | Parse the config from a given Yaml file on disk -readConfigMap :: FilePath -> C.NetworkId -> C.SocketPath -> IO (Either String ConfigMap) -readConfigMap scriptYaml networkId socketPath = runExceptT $ do +readConfigMap :: FilePath -> C.NetworkId -> C.SocketPath -> LeashID -> IO (Either String ConfigMap) +readConfigMap scriptYaml networkId socketPath leashId = runExceptT $ do ConfigMapFile{..} <- withExceptT show $ ExceptT $ decodeFileEither scriptYaml let scriptYamlDir = dropFileName scriptYaml -- NOTE: The list of substitutions here can be empty, it just signals that @@ -200,4 +202,5 @@ readConfigMap scriptYaml networkId socketPath = runExceptT $ do { cmStart = cmfStart , cmScripts = Map.fromList kvPairs , cmLocalNodeConn = mkLocalNodeConnectInfo networkId socketPath + , cmLeashId = leashId } diff --git a/lib/PSR/ContextBuilder.hs b/lib/PSR/ContextBuilder.hs index 0f790d7..e8fcf27 100644 --- a/lib/PSR/ContextBuilder.hs +++ b/lib/PSR/ContextBuilder.hs @@ -32,6 +32,7 @@ import Data.Map.Ordered qualified as OMap import Data.Maybe (mapMaybe) import Data.Set (Set) import Data.Set qualified as Set +import Ouroboros.Network.Protocol.LocalStateQuery.Type (LeashID) import PSR.Chain import PSR.ConfigMap (ConfigMap (..), ResolvedScript (..)) import PSR.Evaluation.Api (evaluateTransactionExecutionUnitsShelley) @@ -95,11 +96,12 @@ mkBlockContext :: ContextBuilderMetrics -> C.BlockHeader -> C.LocalNodeConnectInfo -> + LeashID -> C.ChainPoint -> C.AlonzoEraOnwards era -> [C.Tx era] -> IO (BlockContext era) -mkBlockContext metrics bh conn prevCp era txs = do +mkBlockContext metrics bh conn leashId prevCp era txs = do let sbe = C.convert era query = BlockContext bh prevCp era txs @@ -109,17 +111,18 @@ mkBlockContext metrics bh conn prevCp era txs = do <*> sysStartQuery -- NOTE: We can catch CostModelsQueryException and choose to retry or skip. observeDuration metrics.mkBlockContext_query $ - runLocalStateQueryExpr conn prevCp query + runLocalStateQueryExpr conn leashId prevCp query -- NOTE: This is a costly function, but we only run it once. getSpendProjectedUtxoMap :: C.LocalNodeConnectInfo -> + LeashID -> C.ChainPoint -> C.ShelleyBasedEra era -> Set C.ScriptHash -> IO (Map C.TxIn C.ScriptHash) -getSpendProjectedUtxoMap conn cp sbe confHashes = do - C.UTxO umap <- runLocalStateQueryExpr conn cp (utxoWholeQuery sbe) +getSpendProjectedUtxoMap conn leashId cp sbe confHashes = do + C.UTxO umap <- runLocalStateQueryExpr conn leashId cp (utxoWholeQuery sbe) pure $ Map.filter (flip Set.member confHashes) $ Map.mapMaybe getTxOutScriptAddr umap -------------------------------------------------------------------------------- @@ -336,5 +339,5 @@ evaluateTransaction BlockContext{..} (C.ShelleyTx era tx) scriptMap = do -- TODO: Report this error to the user. mkLedgerScript ResolvedScript{..} = do scr <- C.toScriptInEra (C.convert ctxAlonzoEraOnwards) rsScriptFileContent - pure $ (rsName, C.toShelleyScript scr) + pure (rsName, C.toShelleyScript scr) subMap = Map.map (mapMaybe mkLedgerScript) scriptMap diff --git a/lib/PSR/Streaming.hs b/lib/PSR/Streaming.hs index da564b9..74b8865 100644 --- a/lib/PSR/Streaming.hs +++ b/lib/PSR/Streaming.hs @@ -275,17 +275,17 @@ mainLoop events cm@CM.ConfigMap{..} points = do & void where confHashes = Map.keysSet cmScripts - consumeBlock metrics cbMetrics mUtxoMap (previousChainPt, (Block bh sbe txList)) = do + consumeBlock metrics cbMetrics mUtxoMap (previousChainPt, Block bh sbe txList) = do let getUtxoMap = case mUtxoMap of Nothing -> - getSpendProjectedUtxoMap cmLocalNodeConn previousChainPt sbe confHashes + getSpendProjectedUtxoMap cmLocalNodeConn cmLeashId previousChainPt sbe confHashes Just utxoMap -> pure utxoMap -- NOTE: We only consume a specific set of transactions and not all -- the transactions in a block. We use the internal UTxO map to -- decide which transaction meet the criteria. consumeTransactions era selectedTxs = do - ctx1 <- mkBlockContext cbMetrics bh cmLocalNodeConn previousChainPt era selectedTxs + ctx1 <- mkBlockContext cbMetrics bh cmLocalNodeConn cmLeashId previousChainPt era selectedTxs streamTransactionContext cbMetrics cm ctx1 & Stream.trace (traceTransactionExecutionResult events) & Stream.fold Fold.drain diff --git a/plutus-script-reexecutor.cabal b/plutus-script-reexecutor.cabal index bf709a2..b6c62af 100644 --- a/plutus-script-reexecutor.cabal +++ b/plutus-script-reexecutor.cabal @@ -127,9 +127,10 @@ executable plutus-script-reexecutor hs-source-dirs: app build-depends: , async - , base >=4.9 && <5 + , base >=4.9 && <5 , cardano-api , optparse-applicative + , ouroboros-network-protocols , plutus-script-reexecutor , streamly-core , warp