Skip to content

Commit bdaa004

Browse files
committed
Evaluation job checks if a budget is not exceeded.
1 parent 42ec572 commit bdaa004

File tree

3 files changed

+52
-8
lines changed

3 files changed

+52
-8
lines changed

plutus-script-evaluation/lib/Database/Query.hs

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ module Database.Query where
22

33
import Cardano.Slotting.Slot (SlotNo)
44
import Control.Monad.IO.Unlift (MonadUnliftIO, withRunInIO)
5+
import Data.Function ((&))
56
import Data.Profunctor.Product.Default (Default)
67
import Database.Orphans ()
78
import Database.PostgreSQL.Simple (Connection)
@@ -11,10 +12,12 @@ import Opaleye (
1112
Delete (..),
1213
Insert (Insert, iOnConflict, iReturning, iRows, iTable),
1314
ToFields,
15+
asc,
1416
doNothing,
1517
limit,
1618
maybeFields,
1719
optional,
20+
orderBy,
1821
rCount,
1922
runDelete,
2023
runInsert,
@@ -99,7 +102,9 @@ withScriptEvaluationEvents
99102
-> (a -> ScriptEvaluationRecord -> m a)
100103
-> m a
101104
withScriptEvaluationEvents conn a f = do
102-
let select = selectTable scriptEvaluations
105+
let select =
106+
selectTable scriptEvaluations
107+
& orderBy (asc seBlockNo)
103108
withRunInIO \runInIO ->
104109
runSelectFold conn select a \accum record ->
105110
runInIO (f accum record)

plutus-script-evaluation/lib/Evaluate.hs

+45-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
module Evaluate where
22

33
import Codec.Serialise (deserialise)
4+
import Control.Monad (when)
45
import Control.Monad.IO.Unlift (MonadUnliftIO)
56
import Control.Monad.Trans.Except (runExceptT)
67
import Control.Monad.Trans.Writer (WriterT (runWriterT))
@@ -9,20 +10,25 @@ import Data.ByteString.Short qualified as BSS
910
import Database qualified as Db
1011
import Database.PostgreSQL.Simple qualified as Postgres
1112
import Database.Schema (ScriptEvaluationRecord' (..))
13+
import Ouroboros.Consensus.Block (BlockNo)
1214
import PlutusLedgerApi.Common (
1315
Data,
1416
EvaluationContext (..),
1517
ExBudget (..),
1618
MajorProtocolVersion,
1719
PlutusLedgerLanguage (..),
1820
ScriptForEvaluation,
21+
ScriptNamedDeBruijn (..),
1922
VerboseMode (Quiet),
2023
deserialiseScript,
24+
deserialisedScript,
2125
evaluateScriptRestricting,
2226
)
2327
import PlutusLedgerApi.V1 qualified as V1
2428
import PlutusLedgerApi.V2 qualified as V2
2529
import PlutusLedgerApi.V3 qualified as V3
30+
import System.Exit (exitFailure)
31+
import Text.PrettyBy qualified as Pretty
2632

2733
data ScriptEvaluationInput = MkScriptEvaluationInput
2834
{ seiPlutusLedgerLanguage :: PlutusLedgerLanguage
@@ -31,6 +37,8 @@ data ScriptEvaluationInput = MkScriptEvaluationInput
3137
, seiData :: [Data]
3238
, seiScript :: ScriptForEvaluation
3339
, seiExBudget :: ExBudget
40+
, seiEvaluationSuccess :: Bool
41+
, seiBlock :: BlockNo
3442
}
3543

3644
evaluateScripts
@@ -79,6 +87,8 @@ inputFromRecord MkScriptEvaluationRecord'{..} = do
7987
. maybe id (:) seDatum
8088
$ maybe id (:) seRedeemer [seScriptContext]
8189
, seiExBudget = ExBudget seExecBudgetCpu seExecBudgetMem
90+
, seiEvaluationSuccess = seEvaluatedSuccessfully
91+
, seiBlock = seBlockNo
8292
}
8393

8494
onScriptEvaluationInput :: ScriptEvaluationInput -> ExBudget -> IO ExBudget
@@ -94,15 +104,43 @@ onScriptEvaluationInput MkScriptEvaluationInput{..} budget = do
94104
seiScript
95105
seiData
96106

97-
putStrLn ""
107+
let evaluationSuccess =
108+
either (const False) (const True) evaluationResult
109+
110+
print seiBlock
111+
112+
when (evaluationSuccess /= seiEvaluationSuccess) do
113+
putStrLn $
114+
"Script evaluation result ("
115+
++ show evaluationSuccess
116+
++ ") does not match the expected result ("
117+
++ show seiEvaluationSuccess
118+
++ "): "
119+
let ScriptNamedDeBruijn uplc = deserialisedScript seiScript
120+
in putStrLn $ Pretty.display uplc
121+
98122
case evaluationResult of
99-
Left err -> do
123+
Left err ->
100124
putStrLn $ "Script evaluation was not successful: " <> show err
101125
Right (ExBudget cpu mem) -> do
102-
putStrLn "Script evaluation was successful."
103-
putStrLn
104-
let ExBudget cpu' mem' = seiExBudget
105-
in "Expected: " <> show cpu' <> ", " <> show mem'
106-
putStrLn $ "Consumed: " <> show cpu <> ", " <> show mem
126+
let ExBudget cpu' mem' = seiExBudget
127+
if cpu > cpu' || mem > mem'
128+
then do
129+
putStrLn "Budget exceeded!"
130+
putStrLn $ "Paid for: " <> show cpu' <> ", " <> show mem'
131+
putStrLn $ "Consumed: " <> show cpu <> ", " <> show mem
132+
exitFailure
133+
else
134+
if cpu == cpu' && mem == mem'
135+
then do
136+
putStrLn $
137+
"Budget matches exactly: "
138+
<> show cpu
139+
<> ", "
140+
<> show mem
141+
else do
142+
putStrLn "Budget is sufficient:"
143+
putStrLn $ "Paid for: " <> show cpu' <> ", " <> show mem'
144+
putStrLn $ "Consumed: " <> show cpu <> ", " <> show mem
107145

108146
pure budget

plutus-script-evaluation/plutus-script-evaluation.cabal

+1
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ library
104104
, plutus-ledger-api
105105
, plutus-ledger-api:plutus-ledger-api-testlib
106106
, postgresql-simple
107+
, prettyprinter-configurable
107108
, product-profunctors
108109
, serialise
109110
, some

0 commit comments

Comments
 (0)