Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Wire up simple reference scripts in cardano-cli #4014

Merged
merged 4 commits into from
Jun 13, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions cardano-api/src/Cardano/Api/Script.hs
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ module Cardano.Api.Script (
TimeLocksSupported(..),
timeLocksSupported,
adjustSimpleScriptVersion,
SimpleScriptOrReferenceInput(..),

-- * The Plutus script language
PlutusScript(..),
Expand Down Expand Up @@ -730,6 +731,12 @@ data PlutusScriptOrReferenceInput lang
| PReferenceScript TxIn
deriving (Eq, Show)


data SimpleScriptOrReferenceInput lang
= SScript (SimpleScript lang)
| SReferenceScript TxIn
deriving (Eq, Show)

-- | A /use/ of a script within a transaction body to witness that something is
-- being used in an authorised manner. That can be
--
Expand All @@ -747,7 +754,7 @@ data ScriptWitness witctx era where

SimpleScriptWitness :: ScriptLanguageInEra lang era
-> SimpleScriptVersion lang
-> SimpleScript lang
-> SimpleScriptOrReferenceInput lang
-> ScriptWitness witctx era

PlutusScriptWitness :: ScriptLanguageInEra lang era
Expand Down Expand Up @@ -799,12 +806,14 @@ deriving instance Show (ScriptDatum witctx)
-- Reference scripts exist in the UTxO, so without access to the UTxO we cannot
-- retrieve the script.
scriptWitnessScript :: ScriptWitness witctx era -> Maybe (ScriptInEra era)
scriptWitnessScript (SimpleScriptWitness langInEra version script) =
scriptWitnessScript (SimpleScriptWitness langInEra version (SScript script)) =
Just $ ScriptInEra langInEra (SimpleScript version script)

scriptWitnessScript (PlutusScriptWitness langInEra version (PScript script) _ _ _) =
Just $ ScriptInEra langInEra (PlutusScript version script)

scriptWitnessScript (SimpleScriptWitness _ _ (SReferenceScript _)) =
Nothing
scriptWitnessScript (PlutusScriptWitness _ _ (PReferenceScript _) _ _ _) =
Nothing

Expand Down
1 change: 1 addition & 0 deletions cardano-api/src/Cardano/Api/Shelley.hs
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ module Cardano.Api.Shelley
fromShelleyScriptHash,
PlutusScript(..),
PlutusScriptOrReferenceInput(..),
SimpleScriptOrReferenceInput(..),
toPlutusData,
fromPlutusData,
toAlonzoData,
Expand Down
94 changes: 61 additions & 33 deletions cardano-cli/src/Cardano/CLI/Shelley/Parsers.hs
Original file line number Diff line number Diff line change
Expand Up @@ -229,51 +229,78 @@ pScriptFor name (Just deprecated) help =
<> Opt.internal
)

pPlutusReferenceScriptWitnessFiles
pReferenceScriptWitnessFiles
:: WitCtx witctx
-> BalanceTxExecUnits -- ^ Use the @execution-units@ flag.
-> Parser (ScriptWitnessFiles witctx)
pPlutusReferenceScriptWitnessFiles witctx autoBalanceExecUnits =
pReferenceScriptWitnessFiles witctx autoBalanceExecUnits =
toReferenceScriptWitnessFiles
<$> ( (,,,,) <$> pReferenceTxIn
<*> pAnyScriptLang
<*> pScriptDatumOrFile "reference-tx-in" witctx
<*> pScriptRedeemerOrFile "reference-tx-in"
<*> (case autoBalanceExecUnits of
AutoBalance -> pure (ExecutionUnits 0 0)
ManualBalance -> pExecutionUnits "reference-tx-in")
)
<$> pReferenceTxIn
<*> (simpleWit <|> pPWitness)


where
pReferenceTxIn :: Parser TxIn
pReferenceTxIn =
Opt.option (readerFromParsecParser parseTxIn)
( Opt.long "tx-in-reference"
<> Opt.metavar "TX-IN"
<> Opt.help "TxId#TxIx - Specify a reference input. The reference input may or may not have\
\ a plutus reference script attached."
)
pAnyScriptLang :: Parser AnyScriptLanguage
pAnyScriptLang =
Opt.flag' (AnyScriptLanguage $ SimpleScriptLanguage SimpleScriptV1)
( Opt.long "simple-script-v1"
<> Opt.help "Specify a simple script v1 reference script. \
\See documentation at doc/reference/simple-scripts.md"
) <|>
Opt.flag' (AnyScriptLanguage $ SimpleScriptLanguage SimpleScriptV2)
( Opt.long "simple-script-v2"
<> Opt.help "Specify a simple script v2 reference script. \
\See documentation at doc/reference/simple-scripts.md"
) <|>
pPWitness =
(,,,) <$> pPlutusScriptLanguage
<*> (Just <$> pScriptDatumOrFile "reference-tx-in" witctx)
<*> (Just <$> pScriptRedeemerOrFile "reference-tx-in")
<*> (case autoBalanceExecUnits of
AutoBalance -> pure $ Just (ExecutionUnits 0 0)
ManualBalance -> Just <$> pExecutionUnits "reference-tx-in")

simpleWit
:: Parser ( AnyScriptLanguage
, Maybe (ScriptDatumOrFile witctx)
, Maybe ScriptRedeemerOrFile
, Maybe ExecutionUnits
)
simpleWit =
(,,,) <$> pSimpleScriptLang
<*> pure Nothing
<*> pure Nothing
<*> pure Nothing

pPlutusScriptLanguage :: Parser AnyScriptLanguage
pPlutusScriptLanguage =
Opt.flag' (AnyScriptLanguage $ PlutusScriptLanguage PlutusScriptV2)
( Opt.long "plutus-script-v2"
<> Opt.help "Specify a plutus script v2 reference script."
)

pSimpleScriptLang :: Parser AnyScriptLanguage
pSimpleScriptLang =
Opt.flag' (AnyScriptLanguage $ SimpleScriptLanguage SimpleScriptV2)
( Opt.long "simple-script"
<> Opt.help "Specify a simple script reference script. \
\See documentation at doc/reference/simple-scripts.md"
)

toReferenceScriptWitnessFiles
:: (TxIn, AnyScriptLanguage, ScriptDatumOrFile witctx, ScriptRedeemerOrFile, ExecutionUnits)
:: TxIn
-> ( AnyScriptLanguage
, Maybe (ScriptDatumOrFile witctx)
, Maybe ScriptRedeemerOrFile
, Maybe ExecutionUnits
)
-> ScriptWitnessFiles witctx
toReferenceScriptWitnessFiles (txin, sLang, d,r, e) = PlutusReferenceScriptWitnessFiles txin sLang d r e
toReferenceScriptWitnessFiles txin (sLang, mD, mR, mE) =
case sLang of
AnyScriptLanguage (SimpleScriptLanguage _) ->
SimpleReferenceScriptWitnessFiles txin sLang
AnyScriptLanguage (PlutusScriptLanguage _) ->
case (mD, mR, mE) of
(Just d, Just r, Just e) -> PlutusReferenceScriptWitnessFiles txin sLang d r e
(_,_,_) -> panic "toReferenceScriptWitnessFiles: Should not be possible"


pReferenceTxIn :: Parser TxIn
pReferenceTxIn =
Opt.option (readerFromParsecParser parseTxIn)
( Opt.long "tx-in-reference"
<> Opt.metavar "TX-IN"
<> Opt.help "TxId#TxIx - Specify a reference input. The reference input may or may not have\
\ a plutus reference script attached."
)

pScriptWitnessFiles :: forall witctx.
WitCtx witctx
Expand Down Expand Up @@ -2077,7 +2104,8 @@ pTxIn balance =
pScriptWitnessFiles WitCtxTxIn balance
"tx-in" (Just "txin")
"the spending of the transaction input." <|>
pPlutusReferenceScriptWitnessFiles WitCtxTxIn balance
pReferenceScriptWitnessFiles WitCtxTxIn balance


pTxInCollateral :: Parser TxIn
pTxInCollateral =
Expand Down
44 changes: 37 additions & 7 deletions cardano-cli/src/Cardano/CLI/Shelley/Run/Transaction.hs
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,10 @@ runTxBuildRaw (AnyCardanoEra era)
let referenceInputsWithWits = [ (input, wit)
| (_, wit@(Just (PlutusReferenceScriptWitnessFiles input _ _ _ _)))
<- inputsAndScripts
] ++
[(input, wit)
| (_, wit@(Just (SimpleReferenceScriptWitnessFiles input _)))
<- inputsAndScripts
]

txBodyContent <-
Expand Down Expand Up @@ -482,6 +486,10 @@ runTxBuild (AnyCardanoEra era) (AnyConsensusModeParams cModeParams) networkId mS
referenceInputsWithWits = [ (input, wit)
| (_, wit@(Just (PlutusReferenceScriptWitnessFiles input _ _ _ _)))
<- txins
] ++
[(input, wit)
| (_, wit@(Just (SimpleReferenceScriptWitnessFiles input _)))
<- txins
]
referenceInputs = map fst referenceInputsWithWits
case (consensusMode, cardanoEraStyle era) of
Expand Down Expand Up @@ -697,7 +705,10 @@ validateTxInsReference era txins =
return $ Just refIn
PlutusScriptWitness _ _ PScript{} _ _ _ ->
return Nothing
SimpleScriptWitness {} -> return Nothing
SimpleScriptWitness _ _ (SReferenceScript refIn) ->
return $ Just refIn
SimpleScriptWitness _ _ SScript{} ->
return Nothing
Nothing -> return Nothing

validateTxOuts :: forall era.
Expand Down Expand Up @@ -1063,8 +1074,8 @@ createScriptWitness era (SimpleScriptWitnessFile (ScriptFile scriptFile)) = do
ScriptInEra langInEra script' <- validateScriptSupportedInEra era script
case script' of
SimpleScript version sscript ->
return $ SimpleScriptWitness
langInEra version sscript
return . SimpleScriptWitness
langInEra version $ SScript sscript

-- If the supplied cli flags were for a simple script (i.e. the user did
-- not supply the datum, redeemer or ex units), but the script file turns
Expand Down Expand Up @@ -1107,20 +1118,39 @@ createScriptWitness era (PlutusReferenceScriptWitnessFiles refTxIn
Nothing -> left $ ShelleyTxCmdReferenceScriptsNotSupportedInEra
$ getIsCardanoEraConstraint era (AnyCardanoEra era)
Just _ -> do
datum <- readScriptDatumOrFile datumOrFile
redeemer <- readScriptRedeemerOrFile redeemerOrFile

case scriptLanguageSupportedInEra era anyScriptLanguage of
Just sLangInEra ->
case languageOfScriptLanguageInEra sLangInEra of
SimpleScriptLanguage _v -> panic "TODO: createScriptWitness: SimpleScriptLanguage"
PlutusScriptLanguage version ->
SimpleScriptLanguage _v ->
-- TODO: We likely need another datatype eg data ReferenceScriptWitness lang
-- in order to make this branch unrepresentable.
panic "createScriptWitness: Should not be possible to specify a simple script"
PlutusScriptLanguage version -> do
datum <- readScriptDatumOrFile datumOrFile
redeemer <- readScriptRedeemerOrFile redeemerOrFile
return $ PlutusScriptWitness
sLangInEra
version
(PReferenceScript refTxIn)
datum redeemer execUnits
Nothing ->
left $ ShelleyTxCmdScriptLanguageNotSupportedInEra anyScrLang (anyCardanoEra era)
createScriptWitness era (SimpleReferenceScriptWitnessFiles refTxIn
anyScrLang@(AnyScriptLanguage anyScriptLanguage)) = do
case refInsScriptsAndInlineDatsSupportedInEra era of
Nothing -> left $ ShelleyTxCmdReferenceScriptsNotSupportedInEra
$ getIsCardanoEraConstraint era (AnyCardanoEra era)
Just _ -> do
case scriptLanguageSupportedInEra era anyScriptLanguage of
Just sLangInEra ->
case languageOfScriptLanguageInEra sLangInEra of
SimpleScriptLanguage v ->
return . SimpleScriptWitness sLangInEra v $ SReferenceScript refTxIn
PlutusScriptLanguage{} ->
panic "createScriptWitness: Should not be possible to specify a plutus script"
Nothing ->
left $ ShelleyTxCmdScriptLanguageNotSupportedInEra anyScrLang (anyCardanoEra era)

getIsCardanoEraConstraint
:: CardanoEra era -> (IsCardanoEra era => a) -> a
Expand Down
11 changes: 7 additions & 4 deletions cardano-cli/src/Cardano/CLI/Types.hs
Original file line number Diff line number Diff line change
Expand Up @@ -288,21 +288,24 @@ data ScriptWitnessFiles witctx where
-> ScriptWitnessFiles witctx

PlutusScriptWitnessFiles :: ScriptFile
-> ScriptDatumOrFile witctx -- TODO: Babbage Modify to allow specification of inline datums
-> ScriptDatumOrFile witctx
-> ScriptRedeemerOrFile
-> ExecutionUnits
-> ScriptWitnessFiles witctx

-- TODO: SimpleReferenceScriptWitnessFiles :: ScriptWitnessFiles witctx

PlutusReferenceScriptWitnessFiles
:: TxIn
-> AnyScriptLanguage
-> ScriptDatumOrFile witctx -- TODO: Babbage Modify to allow specification of inline datums
-> ScriptDatumOrFile witctx
-> ScriptRedeemerOrFile
-> ExecutionUnits
-> ScriptWitnessFiles witctx

SimpleReferenceScriptWitnessFiles
:: TxIn
-> AnyScriptLanguage
-> ScriptWitnessFiles witctx


deriving instance Show (ScriptWitnessFiles witctx)

Expand Down
2 changes: 1 addition & 1 deletion doc/reference/plutus/plutus-spending-script-example.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ cardano-cli transaction sign \
--out-file alonzo.tx
```

If there is ADA at `$dummyaddress` then the Plutus script was successfully executed. Conversely, if the Plutus script failed, the collateral input would have been consumed.
If there is ADA at `$dummyaddress` then the Plutus script was successfully executed.

You can use the [example-txin-locking-plutus-script.sh](../../../scripts/plutus/example-txin-locking-plutus-script.sh) in conjunction with [mkfiles.sh alonzo](../../../scripts/byron-to-alonzo/mkfiles.sh) script to automagically run the `AlwaysSucceeds` script.

1 change: 1 addition & 0 deletions scripts/plutus/example-babbage-script-usage.sh
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ $CARDANO_CLI transaction build \
--tx-out "$plutusscriptaddr+$lovelaceattxindiv3" \
--tx-out-inline-datum-file "$datumfilepath" \
--tx-out "$dummyaddress+$lovelaceattxindiv3" \
--tx-out-inline-datum-file "$datumfilepath" \
--tx-out-reference-script-file "$plutusscriptinuse" \
--protocol-params-file "$WORK/pparams.json" \
--out-file "$WORK/create-datum-output.body"
Expand Down
Loading