From 6202bd258d5745944eaa96da3d343ba17028ccb8 Mon Sep 17 00:00:00 2001 From: Nikolaos Bezirgiannis Date: Wed, 11 Dec 2024 16:23:21 +0100 Subject: [PATCH] docusaurus: plutus exe --- .../docs/using-plutus-tx/cli-plutus.md | 378 ++++++++++++++++++ .../static/img/tui_debugger_screenshot.png | Bin 0 -> 80095 bytes .../executables/plutus/AnyProgram/IO.hs | 9 +- plutus-core/executables/plutus/GetOpt.hs | 11 +- .../executables/plutus/Mode/Compile.hs | 2 +- .../executables/plutus/Mode/HelpVersion.hs | 3 +- 6 files changed, 396 insertions(+), 7 deletions(-) create mode 100644 doc/docusaurus/docs/using-plutus-tx/cli-plutus.md create mode 100644 doc/docusaurus/static/img/tui_debugger_screenshot.png diff --git a/doc/docusaurus/docs/using-plutus-tx/cli-plutus.md b/doc/docusaurus/docs/using-plutus-tx/cli-plutus.md new file mode 100644 index 00000000000..c03dc79f860 --- /dev/null +++ b/doc/docusaurus/docs/using-plutus-tx/cli-plutus.md @@ -0,0 +1,378 @@ +--- +sidebar_position: 40 +--- + +# CLI tool for Plutus + +The `plutus` CLI tool allows you to: + +- **check** statically your plutus-related (PIR/TPLC/UPLC) program for common errors. +- **compile** (convert) between plutus-derived languages and code formats. +- **optimise** the code. +- **run** or interactively **debug** your program *locally* (without starting a Cardano Node). + +A pre-built executable of the `plutus` CLI +can be found on the [Latest Release](https://github.com/IntersectMBO/plutus/releases/latest) page in the repository. Alternatively, you can build the tool +using Nix, specifically for your platform: + +``` shell +$ nix build ".#cabalProject.$(nix eval nixpkgs#stdenv.buildPlatform.system).hsPkgs.plutus-core.components.exes.plutus" +``` + +To consult the tool's usage you can invoke `plutus --help` in your command line: + +``` shell +$ plutus --help +USAGE: plutus [--run|--debug] [-OLEVEL] FILES... [-o FILE] +``` + +In general, a *compiler tool* operates in a certain pattern: + +> 1. Read (Parse or Deserialise) input program(s) of a *source* language +>

+> 2. Check program(s) for certain errors +>

+> 3. Compile to a lower-level *target* language +>

+> 4. Optimise the compiled code (*optional*) +>

+> 5. Write code to output (*optional*) + +In case of `plutus` tool, *Step 1* is more or less straightforward: +the input programs are read from the specified `FILES...` in the CLI and/or from Standard Input (`--stdin` option). + +After reading the input program(s), the tool continues +to run certain static **checks** on those programs (*Step 2*); currently there is no way to turn these static checks off. + +In *Step 3* the tool will try to **compile** (convert) the higher-level source language (PIR, TPLC) of the input program to the lower-level target language (TPLC, UPLC). +In case the source and target languages are the same, this step is a "no-op" (has to be for UPLC, since it is the lowest-level Plutus language after all). + +*Step 4* (**Optimising** code) is optional and has to be manually turned on by using the option `-OLEVEL` where *LEVEL* is a number between zero and two. +`-O0` specifies that no optimisations should be run (basically same as omitting the `-OLEVEL` option). `-O1` applies safe optimisations (guarantees no change to the program's semantics), +whereas `-O2` applies aggressive / unsafe optimisations (may alter program's semantics). + +*Step 5* writes the resulting (compiled and/or optimised) code to given output specified with `-o FILE` or `--stdout`. +This step is optional: there is no program output when both options above are omitted. This is so that users can use the `plutus` tool as a background checker when developing a Plutus program +or if they want to continue with an extra *Step 6*: + +> ... +>

+> 5. Write code to output (*optional*) +>

+> 6. Run *OR* Debug code (*optional*) + +Users can pass a `--run` *or* `--debug` as an extra option to **run** or **debug** the resulting program of the compilation, +using the tool's built-in interpreter and debugger, respectively. + +## Optimising UPLC with the CLI + +In this section we only focus on UPLC; a prerequisite is that you have already acquired (extracted) the UPLC code corresponding to your high-level source program. +The process to *extract* plutus code varies depending on the source language you are using (Plutus Tx, Aiken, ...); +if Plutus Tx is the source language, you can follow the instructions on [how to inspect compiled code](./inspecting.md#inspecting-the-compiled-code). + +Since UPLC is the lowest-level language, compiling (*Step 3*) is not applicable for UPLC input programs and thus omitted +— for actual compiling (converting) between different intermediate languages (PIR, TPLC) or serialisation formats (e.g. Flat, CBOR) +see the [Advanced section](#converting) on converting between Plutus languages & formats. +Instead, we can use the `plutus` tool to check for certain static errors in our UPLC, as in the example: + +``` shell +$ echo '(program 1.1.0 (lam x (lam y z)))' > const_err.uplc +$ plutus const_err.uplc +Error from the PLC compiler: +Variable 2 is free at () +``` + +After fixing the error: + +``` +$ echo '(program 1.1.0 (lam x (lam y x)))' | plutus --stdin +Compilation succeeded, but no output file was written; use -o or --stdout. +``` + +We can try to turn on some optimisations and write the resulting optimised code to standard output: + +``` shell +# no optimisations by default +$ echo '(program 1.1.0 (force (delay (con unit ()))))' | plutus --stdin --stdout +(program 1.1.0 (force (delay (con unit ())))) + +$ echo '(program 1.1.0 (force (delay (con unit ()))))' | plutus --stdin --stdout -O1 +(program 1.1.0 (con unit ())) +``` + +When multiple input programs (files) are passed to the CLI, the `plutus` tool +will **check**, **compile** (not applicable for UPLC), and (optionally) **optimise** each program separately. +After this is done for *all* programs, the tool gathers the result of each compilation/optimisation and combines them into a single output program. +This is done by placing (interposing) an `Apply` term between the code of each compiled/optimised program, similar +to Haskell's juxtaposition of a function and its series of applied arguments. + +``` shell +$ echo '(program 1.1.0 (lam x (lam y x)))' > func.uplc +$ echo '(program 1.1.0 (con string "OK"))' > arg1.uplc +$ echo '(program 1.1.0 (con bool True))' > arg2.uplc +$ plutus func.uplc arg1.uplc arg2.uplc --stdout -O2 +(program 1.1.0 [ [ (lam x (lam y x)) (con string "OK") ] (con bool True) ]) +``` + +In the example above, even with all optimisations turned on (`-O2`), the `plutus` tool will not reduce +the obviously reducible function applications in the output program; this is because the input programs are optimised only *individually* (separately). You can +instruct the tool to perform an **extra** optimisation pass of the whole (combined) program +by passing `--whole-opt` to the CLI — the given `-OLEVEL` will be taken into account also for this final extra pass (`-O2` in this case). + +``` shell +$ plutus func.uplc arg1.uplc arg2.uplc --stdout -O2 --whole-opt +(program 1.1.0 (con string "OK")) +``` + +## Running UPLC with the CLI {#running} + +Certain errors in `uplc` code cannot be caught by the static checks (*Step 2*) +because the UPLC language is untyped: + +``` shell +# Pseudocode: 1 + True +$ echo "(program 1.1.0 [(builtin addInteger) (con integer 1) (con bool True)])" > typ_err.uplc +$ plutus typ_err.uplc +Compilation succeeded, but no output file was written; use -o or --stdout. +``` + +Alternatively we can try to run the program using the tool's built-in *interpreter* and look for any runtime (type) errors. +The `--run` option will invoke the interpreter passing to it the final output program. +An execution that raised an error will show information about the error and in which term +the error happened: + +``` shell +$ plutus typ_err.uplc --run +Running the program: An error has occurred: +Could not unlift a value: +Type mismatch: expected: integer; actual: bool +Caused by: addInteger 1 True +``` + +Other times catching such (type) errors at runtime is not even possible. Consider the following +example program which contains a type error but the execution nevertheless succeeds with the final +evaluated result (term): + +``` shell +# Pseudocode: if True then "" else unit +$ echo '(program 1.1.0 [(force (builtin ifThenElse)) (con bool True) (con string "") (con unit ())])' > if.uplc +$ plutus if.uplc --run +Running the program: Execution succeeded, final term: +(con string "") +Used budget: ExBudget {exBudgetCPU = ExCPU 204149, exBudgetMemory = ExMemory 901} +``` + +> :pushpin: **NOTE** +> The above example demonstrates that `uplc` — the language which actually *runs on the chain* — +> is low-level and more akin to assembly. Users that are concerned about the safety of their smart contracts +> are advised instead to develop in a higher-level (typed) language (e.g. Plutus Tx) which compiles down to `uplc`. + +After plutus program's execution is completed (either succeeded or failed), the final used budget will be printed as well. +Because the CLI tool employs the same `uplc` interpreter as the one that the Cardano node runs, you can be sure +that the program's execution result&budget match *precisely* — assuming same program +and cost model — the result&budget computed by the chain. + +You can pass a maximum *CPU* and/or *Memory* budget that is allowed to be spent with the `--budget=CPU` or `-budget=,MEM` or `--budget=CPU,MEM` options; if given budget runs out, the execution will fail and stop earlier. +If there is no CPU and/or MEM limit given, the budget is practically unlimited. + +``` shell +$ plutus if.uplc --run --budget=204148,903 +Running the program: An error has occurred: +The machine terminated part way through evaluation due to overspending the budget. +The budget when the machine terminated was: +({cpu: -1 +| mem: 2}) +Negative numbers indicate the overspent budget; note that this only indicates the budget that was needed for the next step, not to run the program to completion. + +$ plutus if.uplc --run --budget=,903 +Running the program: Execution succeeded, final term: +(con string "") +Remaining budget: ExBudget {exBudgetCPU = ExCPU 9223372036854571658, exBudgetMemory = ExMemory 2} +Used budget: ExBudget {exBudgetCPU = ExCPU 204149, exBudgetMemory = ExMemory 901} +``` + +> :pushpin: **NOTE** +> Attempting to run a `tplc` target will use the `tplc` interpreter. Although +> the `tplc` interpreter behaves the same as the default `uplc` interpreter (for *type correct* programs), +> it comes with caveats: cannot execute `uplc` code, +> cannot have budget accounting and budget limits, runs way slower and your program must be fully type correct. +> The last point is not necessarily a caveat, but it diverges from the on-chain behavior: +> the `tplc` interpreter accepts less programs than the chain (and the default `uplc` interpreter) would accept. +> PIR target programs cannot be directly executed. + +## Debugging UPLC with the CLI *(Experimental)* {#debugging} + +> :pushpin: **NOTE** +> The debugger is in a *preliminary* , *experimental* state. What is described below is +> subject to change when new features are added to the debugger. + +Another way to check for runtime errors or the execution budget +is by firing up the tool's built-in debugger. Again, the debugger utilises underneath the same UPLC interpreter +as the one the Cardano node runs, so you can be sure about its execution results and budget costs. +The difference compared to "running the code" is that with the debugger you can step by step progress over the execution +over your UPLC program's sub-terms, or interactively decide to pause the execution on specific UPLC sub-term(s) of interest. + +> :pushpin: **NOTE** +> Unlike the `--run` option that can execute both UPLC *and* TPLC target programs, the `--debug` option works *exclusively* for UPLC targets. + +The `--debug` option will launch the debugger after +the prior checking/compilation/optimisation steps of your input program(s) have been completed, for example: + +``` shell +$ plutus if.uplc -O1 --debug +``` + +The debugger has a Terminal User Interface (TUI) with three windows that are kept automatically updated: (1) +the compiled/optimised target UPLC program, (2) the log/trace messages, and (3) the (current) return value. + +![TUI Debugger Screenshot](../../static/img/tui_debugger_screenshot.png) + +You can interact (issue **Commands**) to the debugger by pressing keyboard shortcuts: + +|Keyboard Shortcut|Command| +|-----|-----| +|?|Show help dialog| +|Esc|Quit help dialog or debugger| +|Ctrl+up/down/left/right|Resize window| +|Tab|Switch focus to other window| +|s|Step once the interpreter| + +Unlike the `--run` option, the `step` command does not execute the program +to completion. Instead, the underlying `uplc` interpreter is moved one "budgeting" step forward — +the smallest step possible that gets accounted for and subtracted from the current budget. + +After every such `step`, the debugger +highlights in window (1) the code region (sub-term) which will be executed in the future (next `step`); +A footer in the TUI screen will update to show the remaining budget. +You can combine `--debug` with the `--budget=CPU,MEM` option to limit the starting total budget: +the debugger fails the execution the moment the budget runs out, similar as to what happens with `--run`. + +## Advanced: Converting between languages & formats {#converting} + +``` shell +$ plutus IN_FILES... -o OUT_FILE +``` + +The filename extensions of the input files and output file +determine the language and format of the *sources* and *target*, respectively. +You can take a look at the [Table of Filename Extensions](#extensions) recognised by the `plutus` tool. +Alternatively, you can [manually set](#override) (or override) the language&format. + +You are allowed to mix and match different input *sources* as long +as that make sense: the *target* must be a lower- or equal-level language to the sources. +All sources will be then compiled and combined to the given target, for example: + +``` shell +$ plutus func.pir arg1.tplc arg2.uplc -o fully_applied.uplc + +$ plutus func.pir arg1.tplc -o partially_applied.tplc +$ plutus partially_applied.tplc arg2.uplc -o also_fully_applied.uplc + +$ plutus arg2.uplc -o arg2.tplc # does not make sense, cannot lift to a higher level language +$ plutus -O2 func.pir -o func_optimised.pir # makes sense for check / optimise +``` + +It is worth to re-iterate that the input files are checked/compiled/optimised **separately**; +this means that although the input programs are *individually* type correct, when *combined* to a specific target +they may become type incorrect: + +``` shell +$ echo "(program 1.1.0 (lam x (con integer) [(builtin addInteger) x (con integer 1)]))" > inc.pir +$ echo "(program 1.1.0 (con bool True))" > true.pir + +$ plutus inc.pir true.pir -o applied.uplc # NO TYPE ERROR because target is untyped (UPLC) +$ echo applied.uplc +(program + 1.1.0 + [ (lam i [ [ (builtin addInteger) (con integer 1) ] i ]) (con bool True) ] +) + +$ plutus inc.pir true.pir -o applied.pir # TYPE ERROR because PIR target +$ plutus inc.pir true.pir -o applied.tplc # TYPE ERROR because TPLC target +``` + +### Filename Extensions {#extensions} + +The following table lists the recognized extensions. + +|Filename Extension|Format Type|Description| +|---|---|---| +|\**NO-EXTENSION\**|Textual|Untyped Plutus Core with Names| +|.uplc|Textual|Untyped Plutus Core with Names| +|.tplc|Textual|Typed Plutus Core with Names| +|.pir|Textual|PIR with Names| +|.data|Binary|Values of `Data` serialised in CBOR| +|.data-txt|Textual|Values of `Data` in Haskell's `Show` format| +|.uplc-flat|Binary|Untyped PlutusCore with NamedDeBruijn serialised in Flat| +|.uplc-cbor|Binary|Untyped PlutusCore with DeBruijn serialised in CBOR
(the on-chain format)| + +> :pushpin: **NOTE** If file has no extension or in case of `--stdin` / `--stdout`, the extension is assumed to be `.uplc` + +### Manually set language&format {#override} + +If the extension cannot be determined (missing / `--stdin` / `--stdout`) +or you would like to override the recognised extension, +you may use the `-x .EXTENSION` option (with or without the leading dot `.` taken from [Table](#extensions) above) to manually set the +extension for the given file(s): + +``` shell +$ plutus file1 -x pir file2 file3 +``` + +Note `-x` is positional: it applies its effect to all files after the option till the end or another `-x` is reached. +In the example above the effect (set to `pir`) will not apply to `file1`, but will apply to `file2`, `file3` **and** target. +Possible filename extensions on `file2` and `file3` will be ignored. Using multiple invocations of `-x` may come handy +for mixing different sources or setting the output target. The next example sets the first two files +to be `pir`, the following two to `tplc`, and the target (the last invocation of `-x`) to `uplc`. + +``` shell +$ plutus -x pir Pir_File Also_Pir -x tplc Now_Tplc Also_Tplc -x uplc +``` + +In case `-x` is not enough and the *format* is more complex because it contains a non-default variable-naming scheme or annotations, +you may extra specify the `-n NAMING` and `-a ANNOTATION` options to override the defaults. + +|-n Short Option|-n Long Option|Description| +|---|---|---| +|-n n|-n name|Use descriptive textual names for variables| +|-n d|-n debruijn|Use debruijn indices for variables| +|-n nd|-n named-debruijn|Use name with debruijn index for variables: "name-index"| + +|-a Option|Description| +|---|---| +|-a unit|Code does not contain any annotations (default)| +|-a srcspan|Code is annotated with source spans| + +The `-n` and `-a` options are also positional. + +### Pretty-printing output + +If the output's format type is *textual* (see the [Filename Extensions Table](#extensions)) the compiled code +will be printed to the designated output (file or stdout) in a "pretty" format. +You can change how the output's looks by specifying a different `-p STYLE` style (defaults to `classic`). + +|-p Option|Description| +|---|---| +|-p classic|Lisp-like syntax with unique variable names (default)| +|-p classic-simple|Lisp-like syntax with ambiguous (no unique) variable names| +|-p readable|Succinct syntax with unique variable names| +|-p readable-simple|Succinct syntax with ambiguous (no unique) variable names| + + +``` shell +$ plutus inc.pir -x pir --stdout +(program + 1.1.0 (lam x-0 (con integer) [ [ (builtin addInteger) x-0 ] (con integer 1) ]) +) + +$ plutus inc.pir -x pir --stdout --pretty=readable-simple +program 1.1.0 (\(x : integer) -> addInteger x 1) +``` + +> :pushpin: **NOTE** Specifying a textual *output* with pretty style other than the default (classic) may not be possible to be read +back again (as textual *input* this time) in the CLI. + +Using the standard output to capture the (pretty-printed) output program is safe, +because the tool's logs and error messages are sent by default to `stderr`. +You can of course silence those messages using `--quiet` option, or instead +increase their rate using `--verbose` (for tracing through the compilation process). diff --git a/doc/docusaurus/static/img/tui_debugger_screenshot.png b/doc/docusaurus/static/img/tui_debugger_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..1ab3e24a8250c419c06da09ec6dd60589d32859c GIT binary patch literal 80095 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%0A@JO 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 literal 0 HcmV?d00001 diff --git a/plutus-core/executables/plutus/AnyProgram/IO.hs b/plutus-core/executables/plutus/AnyProgram/IO.hs index de25acb0563..49345b50c26 100644 --- a/plutus-core/executables/plutus/AnyProgram/IO.hs +++ b/plutus-core/executables/plutus/AnyProgram/IO.hs @@ -68,8 +68,8 @@ readProgram sngS fileS = Json -> error "FIXME: not implemented yet." writeProgram :: (?opts :: Opts) - => SLang s -> FromLang s -> File s -> IO () -writeProgram sng ast file = + => SLang s -> FromLang s -> File s -> AfterCompile -> IO () +writeProgram sng ast file afterCompile = case file^.fName of Just fn -> do printED $ show $ "Outputting" <+> pretty file @@ -86,7 +86,10 @@ writeProgram sng ast file = Proved Refl -> serialise ast _ -> withLang @Flat sng $ serialise (SerialiseViaFlat ast) Json -> error "FIXME: not implemented yet" - _ -> printE "Program passed all checks. No output file was written, use -o or --stdout." + _ -> case afterCompile of + Exit -> printE + "Compilation succeeded, but no output file was written; use -o or --stdout." + _ -> pure () prettyWithStyle :: PP.PrettyPlc a => PrettyStyle -> a -> Doc ann prettyWithStyle = \case diff --git a/plutus-core/executables/plutus/GetOpt.hs b/plutus-core/executables/plutus/GetOpt.hs index b3db80e9eef..58e83930be3 100644 --- a/plutus-core/executables/plutus/GetOpt.hs +++ b/plutus-core/executables/plutus/GetOpt.hs @@ -171,7 +171,7 @@ optDescrs = , Option ['x'] [] -- taken from GHC's -x -- If that suffix is not known, defaults to def - (ReqArg (set lastFileType . Just . read) "SUFFIX") "Causes all files following this option on the command line to be processed as if they had the suffix SUFFIX" + (ReqArg (set lastFileType . Just . readMaybeDot) "SUFFIX") "Causes all files following this option on the command line to be processed as if they had the suffix SUFFIX" -- FIXME: naming,ann partial for data , Option ['n'] ["nam"] (ReqArg (overFileTypeDefault (fLang . naming) read) "NAMING") "Change naming to `name` (default), `debruijn` or `named-debruijn`" @@ -324,3 +324,12 @@ instance Read DebugInterface where one :: a -> [(a,String)] one x = [(x,"")] + + +-- maybe drop a leading dot +readMaybeDot :: Read a => String -> a +readMaybeDot = + \case + ('.': ext) -> read ext + ext -> read ext + diff --git a/plutus-core/executables/plutus/Mode/Compile.hs b/plutus-core/executables/plutus/Mode/Compile.hs index 743be944806..350b5a83031 100644 --- a/plutus-core/executables/plutus/Mode/Compile.hs +++ b/plutus-core/executables/plutus/Mode/Compile.hs @@ -36,7 +36,7 @@ runCompile afterCompile = case ?opts of then compile sngT sngT astT else pure astT - writeProgram sngT optAstT fileT + writeProgram sngT optAstT fileT afterCompile case afterCompile of Exit{} -> exitSuccess -- nothing left to do diff --git a/plutus-core/executables/plutus/Mode/HelpVersion.hs b/plutus-core/executables/plutus/Mode/HelpVersion.hs index e485d9a9dd5..073225cb0fd 100644 --- a/plutus-core/executables/plutus/Mode/HelpVersion.hs +++ b/plutus-core/executables/plutus/Mode/HelpVersion.hs @@ -10,8 +10,7 @@ runHelp = do putStr $ GetOpt.usageInfo usageHeader GetOpt.optDescrs usageHeader :: String -usageHeader = - "USAGE: plutus [FILES...] [--stdin] [-o FILE | --stdout] [--run|--bench|--debug]..." +usageHeader = "USAGE: plutus [--compile|--run|--bench|--debug] FILES..." runVersion :: IO () runVersion = putStrLn "Version 0"