Skip to content

Commit 79e3b20

Browse files
committed
Better logging for the evaluate-scripts job
1 parent 9277b56 commit 79e3b20

File tree

2 files changed

+59
-29
lines changed

2 files changed

+59
-29
lines changed

plutus-script-evaluation/lib/Evaluate.hs

+58-29
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import Control.Monad.Trans.Except (runExceptT)
77
import Control.Monad.Trans.Writer (WriterT (runWriterT))
88
import Data.ByteString qualified as BSL
99
import Data.ByteString.Short qualified as BSS
10+
import Data.Text qualified as Text
11+
import Data.Text.IO qualified as TIO
12+
import Data.Time.Clock (getCurrentTime)
1013
import Database qualified as Db
1114
import Database.PostgreSQL.Simple qualified as Postgres
1215
import Database.Schema (ScriptEvaluationRecord' (..))
@@ -27,7 +30,6 @@ import PlutusLedgerApi.Common (
2730
import PlutusLedgerApi.V1 qualified as V1
2831
import PlutusLedgerApi.V2 qualified as V2
2932
import PlutusLedgerApi.V3 qualified as V3
30-
import System.Exit (exitFailure)
3133
import Text.PrettyBy qualified as Pretty
3234

3335
data ScriptEvaluationInput = MkScriptEvaluationInput
@@ -41,6 +43,26 @@ data ScriptEvaluationInput = MkScriptEvaluationInput
4143
, seiBlock :: BlockNo
4244
}
4345

46+
renderScriptEvaluationInput :: ScriptEvaluationInput -> String
47+
renderScriptEvaluationInput MkScriptEvaluationInput{..} =
48+
"\n\nseiPlutusLedgerLanguage = "
49+
++ show seiPlutusLedgerLanguage
50+
++ "\n\nseiMajorProtocolVersion = "
51+
++ show seiMajorProtocolVersion
52+
++ "\n\nseiEvaluationContext = <evaluation context>"
53+
++ "\n\nseiExBudget = "
54+
++ show seiExBudget
55+
++ "\n\nseiEvaluationSuccess = "
56+
++ show seiEvaluationSuccess
57+
++ "\n\nseiBlock = "
58+
++ show seiBlock
59+
++ "\n\nseiData = "
60+
++ Pretty.display seiData
61+
++ "\n\nseiScript = "
62+
++ ( let ScriptNamedDeBruijn uplc = deserialisedScript seiScript
63+
in Pretty.display uplc
64+
)
65+
4466
evaluateScripts
4567
:: (MonadFail m, MonadUnliftIO m)
4668
=> Postgres.Connection
@@ -91,56 +113,63 @@ inputFromRecord MkScriptEvaluationRecord'{..} = do
91113
, seiBlock = seBlockNo
92114
}
93115

94-
onScriptEvaluationInput :: ScriptEvaluationInput -> ExBudget -> IO ExBudget
95-
onScriptEvaluationInput MkScriptEvaluationInput{..} budget = do
116+
onScriptEvaluationInput :: ScriptEvaluationInput -> () -> IO ()
117+
onScriptEvaluationInput input@MkScriptEvaluationInput{..} _accum = do
96118
let
97119
(_logOutput, evaluationResult) =
98120
evaluateScriptRestricting
99121
seiPlutusLedgerLanguage
100122
seiMajorProtocolVersion
101123
Quiet
102124
seiEvaluationContext
103-
(ExBudget maxBound maxBound)
125+
(ExBudget maxBound maxBound) -- will check the budget separately
104126
seiScript
105127
seiData
106128

129+
let budgetExceeded (ExBudget cpu mem) =
130+
let ExBudget cpuPaidFor memPaidFor = seiExBudget
131+
in cpu > cpuPaidFor || mem > memPaidFor
132+
107133
let evaluationSuccess =
108-
either (const False) (const True) evaluationResult
134+
either (const False) (not . budgetExceeded) evaluationResult
109135

110136
print seiBlock
111137

112138
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
139+
let msg =
140+
"Script evaluation result ("
141+
++ show evaluationSuccess
142+
++ ") does not match the recorded result ("
143+
++ show seiEvaluationSuccess
144+
++ ")"
145+
146+
nonce <- getCurrentTime
147+
let logFile = show seiBlock ++ "_" ++ show nonce ++ ".log"
148+
149+
putStrLn msg
150+
putStrLn $ "Writing log to " ++ logFile
151+
152+
TIO.writeFile logFile $
153+
Text.pack msg
154+
<> "\n\nEvaluation result:\n"
155+
<> Text.pack (show evaluationResult)
156+
<> "\n\nScript evaluation inputs:\n"
157+
<> Text.pack (renderScriptEvaluationInput input)
121158

122159
case evaluationResult of
123160
Left err ->
124161
putStrLn $ "Script evaluation was not successful: " <> show err
125-
Right (ExBudget cpu mem) -> do
126-
let ExBudget cpu' mem' = seiExBudget
127-
if cpu > cpu' || mem > mem'
162+
Right spentExBudget -> do
163+
if budgetExceeded spentExBudget
128164
then do
129165
putStrLn "Budget exceeded!"
130-
putStrLn $ "Paid for: " <> show cpu' <> ", " <> show mem'
131-
putStrLn $ "Consumed: " <> show cpu <> ", " <> show mem
132-
exitFailure
166+
putStrLn $ "Paid for: " <> show seiExBudget
167+
putStrLn $ "Consumed: " <> show spentExBudget
133168
else
134-
if cpu == cpu' && mem == mem'
169+
if seiExBudget == spentExBudget
135170
then do
136-
putStrLn $
137-
"Budget matches exactly: "
138-
<> show cpu
139-
<> ", "
140-
<> show mem
171+
putStrLn $ "Budget matches exactly: " <> show spentExBudget
141172
else do
142173
putStrLn "Budget is sufficient:"
143-
putStrLn $ "Paid for: " <> show cpu' <> ", " <> show mem'
144-
putStrLn $ "Consumed: " <> show cpu <> ", " <> show mem
145-
146-
pure budget
174+
putStrLn $ "Paid for: " <> show seiExBudget
175+
putStrLn $ "Consumed: " <> show spentExBudget

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

+1
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ library
110110
, some
111111
, string-interpolate ^>=0.3
112112
, text
113+
, time
113114
, transformers
114115
, unliftio-core
115116
, vector

0 commit comments

Comments
 (0)