Skip to content

Commit

Permalink
Merge #2967
Browse files Browse the repository at this point in the history
2967: Add Plutus example that computes sum [1..n] r=MarcFontaine a=MarcFontaine

The benchmarking team uses this plutus script to test smart contracts with changing running times. 

Co-authored-by: MarcFontaine <MarcFontaine@users.noreply.github.com>
  • Loading branch information
iohk-bors[bot] and MarcFontaine committed Jul 29, 2021
2 parents ba70f27 + db187de commit 57d8d17
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 2 deletions.
3 changes: 2 additions & 1 deletion plutus-example/plutus-example/app/plutus-example.hs
Expand Up @@ -10,7 +10,7 @@ import Cardano.PlutusExample.CustomDatumRedeemerGuess
import Cardano.PlutusExample.AlwaysSucceeds (alwaysSucceedsScript)
import Cardano.PlutusExample.DatumRedeemerGuess (guessScript)
import Cardano.PlutusExample.MintingScript (apiExamplePlutusMintingScript)

import Cardano.PlutusExample.Sum (sumScript)

main :: IO ()
main = do
Expand All @@ -21,4 +21,5 @@ main = do
_ <- writeFileTextEnvelope (dir </> "guess-42-datum-42-txin.plutus") Nothing guessScript
_ <- writeFileTextEnvelope (dir </> "custom-guess-42-datum-42.plutus") Nothing customGuessScript
_ <- writeFileTextEnvelope (dir </> "anyone-can-mint.plutus") Nothing apiExamplePlutusMintingScript
_ <- writeFileTextEnvelope (dir </> "sum.plutus") Nothing sumScript
return ()
2 changes: 1 addition & 1 deletion plutus-example/plutus-example/plutus-example.cabal
Expand Up @@ -49,7 +49,7 @@ library
Cardano.PlutusExample.DatumRedeemerGuess
Cardano.PlutusExample.MintingScript
Cardano.PlutusExample.CustomDatumRedeemerGuess

Cardano.PlutusExample.Sum
build-depends: bytestring
, cardano-api
, plutus-ledger
Expand Down
68 changes: 68 additions & 0 deletions plutus-example/plutus-example/src/Cardano/PlutusExample/Sum.hs
@@ -0,0 +1,68 @@
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}

module Cardano.PlutusExample.Sum
where

import Prelude hiding (($),(==),(+),(-))

import Cardano.Api.Shelley (PlutusScript (..), PlutusScriptV1)

import Codec.Serialise
import qualified Data.ByteString.Lazy as LBS
import qualified Data.ByteString.Short as SBS

import qualified Ledger.Typed.Scripts as Scripts
import qualified Plutus.V1.Ledger.Scripts as Plutus
import PlutusTx (Data (..))
import qualified PlutusTx
import PlutusTx.Prelude hiding (Semigroup (..), unless)


smartSum :: Integer -> Integer
smartSum a = loop a 0
where
loop !n !acc = if n==0
then acc
else loop (n - 1) (n + acc)

-- | The validation function (DataValue -> RedeemerValue -> ScriptContext -> Bool)
{-# INLINABLE validateSum #-}
validateSum :: Integer -> Integer -> x -> Bool
validateSum n s _ = isGoodSum n s

{-# INLINABLE isGoodSum #-}
isGoodSum :: Integer -> Integer -> Bool
isGoodSum n s = smartSum n == s


data SmartSum
instance Scripts.ValidatorTypes SmartSum where
type instance RedeemerType SmartSum = Integer
type instance DatumType SmartSum = Integer

sumInstance :: Scripts.TypedValidator SmartSum
sumInstance = Scripts.mkTypedValidator @SmartSum
$$(PlutusTx.compile [|| validateSum ||])
$$(PlutusTx.compile [|| wrap ||])
where
wrap = Scripts.wrapValidator @Integer @Integer

validator :: Plutus.Validator
validator = Scripts.validatorScript sumInstance

script :: Plutus.Script
script = Plutus.unValidatorScript validator

sumScriptShortBs :: SBS.ShortByteString
sumScriptShortBs = SBS.toShort . LBS.toStrict $ serialise script

sumScript :: PlutusScript PlutusScriptV1
sumScript = PlutusScriptSerialised sumScriptShortBs

0 comments on commit 57d8d17

Please sign in to comment.