|
| 1 | +{-# LANGUAGE DataKinds #-} |
| 2 | +{-# LANGUAGE NoImplicitPrelude #-} |
| 3 | +{-# LANGUAGE TemplateHaskell #-} |
| 4 | + |
| 5 | +module Cardano.Benchmarking.PlutusScripts.SchnorrSecp256k1LoopV3 (script) where |
| 6 | + |
| 7 | +import Cardano.Api (PlutusScript (..), PlutusScriptV3, |
| 8 | + PlutusScriptVersion (..), Script (..), toScriptInAnyLang) |
| 9 | +import Cardano.Benchmarking.ScriptAPI |
| 10 | +import qualified Data.ByteString.Short as SBS |
| 11 | +import Language.Haskell.TH.Syntax (Exp (LitE), Lit (StringL), Loc (loc_module), qLocation) |
| 12 | +import qualified PlutusLedgerApi.V3 as PlutusV3 |
| 13 | +import qualified PlutusTx (compile) |
| 14 | +import qualified PlutusTx.Builtins as Builtins |
| 15 | +import qualified PlutusTx.Builtins.Internal as BI (BuiltinList, head, snd, tail, unitval, |
| 16 | + unsafeDataAsConstr) |
| 17 | +import PlutusTx.Prelude as P hiding (Semigroup (..), (.), (<$>)) |
| 18 | +import Prelude as Haskell (String, (.), (<$>)) |
| 19 | + |
| 20 | + |
| 21 | +scriptName :: Haskell.String |
| 22 | +scriptName |
| 23 | + = prepareScriptName $(LitE . StringL . loc_module <$> qLocation) |
| 24 | + |
| 25 | +script :: PlutusBenchScript |
| 26 | +script = mkPlutusBenchScript scriptName (toScriptInAnyLang (PlutusScript PlutusScriptV3 scriptSerialized)) |
| 27 | + |
| 28 | + |
| 29 | +{-# INLINABLE mkValidator #-} |
| 30 | +mkValidator :: BuiltinData -> BuiltinUnit |
| 31 | +mkValidator arg = |
| 32 | + if red_n < (1000000 :: Integer) -- large number ensures same bitsize for all counter values |
| 33 | + then traceError "redeemer is < 1000000" |
| 34 | + else loop red_n red_vkey red_msg red_sig |
| 35 | + where |
| 36 | + -- lazily decode script context up to redeemer, which is less expensive and results in much smaller tx size |
| 37 | + constrArgs :: BuiltinData -> BI.BuiltinList BuiltinData |
| 38 | + constrArgs = BI.snd . BI.unsafeDataAsConstr |
| 39 | + |
| 40 | + redeemerFollowedByScriptInfo :: BI.BuiltinList BuiltinData |
| 41 | + redeemerFollowedByScriptInfo = BI.tail (constrArgs arg) |
| 42 | + |
| 43 | + redeemer :: BuiltinData |
| 44 | + redeemer = BI.head redeemerFollowedByScriptInfo |
| 45 | + |
| 46 | + red_n :: Integer |
| 47 | + red_vkey :: BuiltinByteString |
| 48 | + red_msg :: BuiltinByteString |
| 49 | + red_sig :: BuiltinByteString |
| 50 | + (red_n, red_vkey, red_msg, red_sig) = PlutusV3.unsafeFromBuiltinData redeemer |
| 51 | + |
| 52 | + loop i v m s |
| 53 | + | i == 1000000 = BI.unitval |
| 54 | + | Builtins.verifySchnorrSecp256k1Signature v m s = loop (pred i) v m s |
| 55 | + | otherwise = P.traceError "Trace error: Schnorr validation failed" |
| 56 | + |
| 57 | +schnorrLoopScriptShortBs :: SBS.ShortByteString |
| 58 | +schnorrLoopScriptShortBs = PlutusV3.serialiseCompiledCode $$(PlutusTx.compile [|| mkValidator ||]) |
| 59 | + |
| 60 | +scriptSerialized :: PlutusScript PlutusScriptV3 |
| 61 | +scriptSerialized = PlutusScriptSerialised schnorrLoopScriptShortBs |
| 62 | + |
0 commit comments