Skip to content

Commit bbab426

Browse files
committed
bench: plutus-scripts-bench: add CustomCallV3
1 parent 6fc6db1 commit bbab426

3 files changed

Lines changed: 86 additions & 0 deletions

File tree

bench/plutus-scripts-bench/plutus-scripts-bench.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ library
6969

7070
other-modules:
7171
Cardano.Benchmarking.PlutusScripts.CustomCall
72+
Cardano.Benchmarking.PlutusScripts.CustomCallV3
7273
Cardano.Benchmarking.PlutusScripts.EcdsaSecp256k1Loop
7374
Cardano.Benchmarking.PlutusScripts.EcdsaSecp256k1LoopV3
7475
Cardano.Benchmarking.PlutusScripts.HashOntoG2AndAdd

bench/plutus-scripts-bench/src/Cardano/Benchmarking/PlutusScripts.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import System.FilePath (takeBaseName)
2323
import Cardano.Api
2424

2525
import qualified Cardano.Benchmarking.PlutusScripts.CustomCall as CustomCall
26+
import qualified Cardano.Benchmarking.PlutusScripts.CustomCallV3 as CustomCallV3
2627
import qualified Cardano.Benchmarking.PlutusScripts.EcdsaSecp256k1Loop as ECDSA
2728
import qualified Cardano.Benchmarking.PlutusScripts.EcdsaSecp256k1LoopV3 as ECDSAV3
2829
import qualified Cardano.Benchmarking.PlutusScripts.HashOntoG2AndAdd as HashG2Add
@@ -38,6 +39,7 @@ import Cardano.Benchmarking.ScriptAPI
3839
getAllScripts :: [PlutusBenchScript]
3940
getAllScripts =
4041
[ CustomCall.script
42+
, CustomCallV3.script
4143
, ECDSA.script
4244
, ECDSAV3.script
4345
, HashG2Add.script
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
{-# LANGUAGE DataKinds #-}
2+
{-# LANGUAGE NoImplicitPrelude #-}
3+
{-# LANGUAGE TemplateHaskell #-}
4+
5+
{-# OPTIONS_GHC -fno-warn-orphans #-}
6+
7+
module Cardano.Benchmarking.PlutusScripts.CustomCallV3 (script) where
8+
9+
import Cardano.Api (PlutusScript (..), PlutusScriptV3,
10+
PlutusScriptVersion (..),Script (..), toScriptInAnyLang)
11+
import Cardano.Benchmarking.PlutusScripts.CustomCallTypes
12+
import Cardano.Benchmarking.ScriptAPI
13+
import qualified Data.ByteString.Short as SBS
14+
import Language.Haskell.TH.Syntax (Exp (LitE), Lit (StringL), Loc (loc_module), qLocation)
15+
import qualified PlutusLedgerApi.V3 as PlutusV3
16+
import qualified PlutusTx (compile)
17+
import qualified PlutusTx.Builtins.Internal as BI (BuiltinList, head, snd, tail, unitval,
18+
unsafeDataAsConstr)
19+
import PlutusTx.Foldable (sum)
20+
import PlutusTx.List (all, length)
21+
import PlutusTx.Prelude as Plutus hiding (Semigroup (..), (.), (<$>))
22+
import Prelude as Haskell (String, (.), (<$>))
23+
24+
25+
script :: PlutusBenchScript
26+
script = mkPlutusBenchScript scriptName (toScriptInAnyLang (PlutusScript PlutusScriptV3 scriptSerialized))
27+
28+
scriptName :: Haskell.String
29+
scriptName
30+
= prepareScriptName $(LitE . StringL . loc_module <$> qLocation)
31+
32+
33+
instance Plutus.Eq CustomCallData where
34+
CCNone == CCNone = True
35+
CCInteger i == CCInteger i' = i == i'
36+
CCSum i is == CCSum i' is' = i == i' && is == is'
37+
CCByteString s == CCByteString s' = s == s'
38+
CCConcat s ss == CCConcat s' ss' = s == s' && ss == ss'
39+
_ == _ = False
40+
41+
{-# INLINABLE mkValidator #-}
42+
mkValidator :: BuiltinData -> BuiltinUnit
43+
mkValidator arg =
44+
let
45+
result = case cmd of
46+
EvalSpine -> length redeemerArg == length datumArg
47+
EvalValues -> redeemerArg == datumArg
48+
EvalAndValidate -> all validateValue redeemerArg && redeemerArg == datumArg
49+
in if result then BI.unitval else error ()
50+
where
51+
-- lazily decode script context up to datum and redeemer
52+
constrArgs :: BuiltinData -> BI.BuiltinList BuiltinData
53+
constrArgs = BI.snd . BI.unsafeDataAsConstr
54+
55+
ctxFields :: BI.BuiltinList BuiltinData
56+
ctxFields = constrArgs arg
57+
58+
datum :: BuiltinData
59+
datum = BI.head ctxFields
60+
61+
redeemerFollowedByScriptInfo :: BI.BuiltinList BuiltinData
62+
redeemerFollowedByScriptInfo = BI.tail ctxFields
63+
64+
redeemer :: BuiltinData
65+
redeemer = BI.head redeemerFollowedByScriptInfo
66+
67+
datumArg = snd (unwrap datum)
68+
(cmd, redeemerArg) = unwrap redeemer
69+
70+
validateValue :: CustomCallData -> Bool
71+
validateValue (CCSum i is) = i == sum is
72+
validateValue (CCConcat s ss) = s == mconcat ss
73+
validateValue _ = True
74+
75+
{-# INLINABLE unwrap #-}
76+
unwrap :: BuiltinData -> CustomCallArg
77+
unwrap = PlutusV3.unsafeFromBuiltinData
78+
79+
customCallScriptShortBs :: SBS.ShortByteString
80+
customCallScriptShortBs = PlutusV3.serialiseCompiledCode $$(PlutusTx.compile [|| mkValidator ||])
81+
82+
scriptSerialized :: PlutusScript PlutusScriptV3
83+
scriptSerialized = PlutusScriptSerialised customCallScriptShortBs

0 commit comments

Comments
 (0)