diff --git a/gitlab-pages/docs/intro/what-and-why.md b/gitlab-pages/docs/advanced/michelson.md similarity index 56% rename from gitlab-pages/docs/intro/what-and-why.md rename to gitlab-pages/docs/advanced/michelson.md index 4a68141da..9c11498b7 100644 --- a/gitlab-pages/docs/intro/what-and-why.md +++ b/gitlab-pages/docs/advanced/michelson.md @@ -1,21 +1,19 @@ --- -id: what-and-why +id: michelson-and-ligo title: Michelson and LIGO --- -import Syntax from '@theme/Syntax'; - -Before we get into what LIGO is and why LIGO needs to exist, let us -take a look at what options the Tezos blockchain offers us out of the -box. If you want to implement smart contracts natively on Tezos, you -have to learn -[Michelson](https://tezos.gitlab.io/whitedoc/michelson.html). +Currently LIGO compiles to [Michelson](https://tezos.gitlab.io/whitedoc/michelson.html), +the native smart contract language supported by Tezos. This page explains the +relationship between LIGO and the underlying Michelson it compiles to. Understanding +Michelson is not a requirement to use LIGO, but it does become important if you want +to formally verify contracts using [Mi-Cho-Coq](https://gitlab.com/nomadic-labs/mi-cho-coq/) +or tune the performance of contracts outputted by the LIGO compiler. **The rationale and design of Michelson** -The language native to the Tezos blockchain for writing smart -contracts is *Michelson*, a Domain-Specific Language (DSL) inspired by -Lisp and Forth. This unusual lineage aims at satisfying unusual +Michelson is a Domain-Specific Language (DSL) for writing Tezos smart contracts +inspired by Lisp and Forth. This unusual lineage aims at satisfying unusual constraints, but entails some tensions in the design. First, to measure stepwise gas consumption, *Michelson is interpreted*. @@ -137,131 +135,3 @@ We cannot run Javascript on the Tezos blockchain, but we can choose LIGO, which will abstract the stack management and allow us to create readable, type-safe, and efficient smart contracts. -## LIGO for Programming Smart Contracts on Tezos - -Perhaps the most striking feature of LIGO is that it comes in -different concrete syntaxes, and even different programming -paradigms. In other words, LIGO is not defined by one syntax and one -paradigm, like imperative versus functional. - - - There is **PascaLIGO**, which is inspired by Pascal, hence is an - imperative language with lots of keywords, where values can be - locally mutated after they have been annotated with their types - (declaration). - - - There is **CameLIGO**, which is inspired by the pure subset of - [OCaml](https://ocaml.org/), hence is a functional language with - few keywords, where values cannot be mutated, but still require - type annotations (unlike OCaml, whose compiler performs almost - full type inference). - - - There is **ReasonLIGO**, which is inspired by the pure subset of - [ReasonML](https://reasonml.github.io/), which is based upon - OCaml. - -Let us decline the same LIGO contract in the three flavours above. Do -not worry if it is a little confusing at first; we will explain all -the syntax in the upcoming sections of the documentation. - - - - -```pascaligo group=a -type storage is int - -type parameter is - Increment of int -| Decrement of int -| Reset - -type return is list (operation) * storage - -function main (const action : parameter; const store : storage) : return is - ((nil : list (operation)), - case action of - Increment (n) -> store + n - | Decrement (n) -> store - n - | Reset -> 0 - end) -``` - - - - -```cameligo group=a -type storage = int - -type parameter = - Increment of int -| Decrement of int -| Reset - -type return = operation list * storage - -let main (action, store : parameter * storage) : return = - ([] : operation list), - (match action with - Increment n -> store + n - | Decrement n -> store - n - | Reset -> 0) -``` - - - - -```reasonligo group=a -type storage = int; - -type parameter = - Increment (int) -| Decrement (int) -| Reset; - -type return = (list (operation), storage); - -let main = ((action, store): (parameter, storage)) : return => { - (([] : list (operation)), - (switch (action) { - | Increment (n) => store + n - | Decrement (n) => store - n - | Reset => 0})); -}; -``` - - - - - - - - -This LIGO contract behaves almost exactly* like the Michelson -contract we saw first, and it accepts the following LIGO expressions: -`Increment(n)`, `Decrement(n)` and `Reset`. Those serve as -`entrypoint` identification, same as `%add` `%sub` or `%default` in -the Michelson contract. - -**The Michelson contract also checks if the `AMOUNT` sent is `0`* - ---- - -## Runnable code snippets & exercises - -Some of the sections in this documentation will include runnable code snippets and exercises. Sources for those are available at -the [LIGO Gitlab repository](https://gitlab.com/ligolang/ligo). - -### Snippets -For example **code snippets** for the *Types* subsection of this doc, can be found here: -`gitlab-pages/docs/language-basics/src/types/**` - -### Exercises -Solutions to exercises can be found e.g. here: `gitlab-pages/docs/language-basics/exercises/types/**/solutions/**` - -### Running snippets / exercise solutions -In certain cases it makes sense to be able to run/evaluate the given snippet or a solution, usually there'll be an example command which you can use, such as: - -```shell -ligo evaluate-value -s pascaligo gitlab-pages/docs/language-basics/src/variables-and-constants/const.ligo age -# Outputs: 25 -``` diff --git a/gitlab-pages/docs/intro/ligo-intro.md b/gitlab-pages/docs/intro/ligo-intro.md new file mode 100644 index 000000000..b2dda419f --- /dev/null +++ b/gitlab-pages/docs/intro/ligo-intro.md @@ -0,0 +1,155 @@ +--- +id: introduction +title: Introduction To LIGO +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +LIGO is a programming language for writing [Tezos](https://tezos.com/) smart contracts. +Smart contracts are a unique domain with extreme resource constraints and even +more extreme security risks. Unlike desktop, mobile, or web +application development smart contracts cannot rely on cheap CPU time and memory. +All resources used by contracts are expensive, and tracked as 'gas costs'. Smart +contracts often directly control money or assets, which if stolen could rack up to +a large financial loss to the contracts controllers and users. Tezos smart contracts +live on the blockchain forever, if there's a bug in them they can't be patched or +amended. Naturally under these conditions it's not possible to develop smart contracts +the way we're used to developing user facing applications. + +LIGO is designed with these problems in mind. The design philosophy can be +described in a few bullet points: + +1. Make a clean, simple language with no unnecessary parts. + +2. Offer multiple familiar syntaxes so users can get up and running quickly. + +3. Encourage people to write simple code, so that it's easy to formally verify the +compiled output using a project like [Mi-Cho-Coq](https://gitlab.com/nomadic-labs/mi-cho-coq/). + +4. Significantly reduce the risk that your smart contract will lose its balance to an [avoidable exploit](https://www.wired.com/2016/06/50-million-hack-just-showed-dao-human/). + +LIGO is a functional language designed to include the features you need, while +avoiding patterns that make formal verification hard. Most useful smart contracts +can express their core functionality in under a thousand lines of code. This makes +them a good target for formal methods, and what can't be easily proven can at least +be extensively tested. The simplicity of LIGO also keeps its compiled output +unbloated. Our hope is to have a simple, strongly typed language with a low footprint. + +LIGO currently offers three syntaxes: + + - **PascaLIGO**, a syntax inspired by Pascal which provides an + imperative developer experience. + + - **CameLIGO**, an [OCaml]((https://ocaml.org/)) inspired + syntax that allows you to write in a functional style. + + - **ReasonLIGO**, an [ReasonML]((https://reasonml.github.io/)) inspired syntax + that builds on the strong points of OCaml. It aims to be familiar for those + coming from JavaScript. + +Let's define some LIGO contract in the three flavours above. Do +not worry if it is a little confusing at first; we will explain all +the syntax in the upcoming sections of the documentation. + + + + + +```pascaligo group=a +type storage is int + +type parameter is + Increment of int +| Decrement of int +| Reset + +type return is list (operation) * storage + +function main (const action : parameter; const store : storage) : return is + ((nil : list (operation)), + case action of + Increment (n) -> store + n + | Decrement (n) -> store - n + | Reset -> 0 + end) +``` + + + + +```cameligo group=a +type storage = int + +type parameter = + Increment of int +| Decrement of int +| Reset + +type return = operation list * storage + +let main (action, store : parameter * storage) : return = + ([] : operation list), + (match action with + Increment n -> store + n + | Decrement n -> store - n + | Reset -> 0) +``` + + + + +```reasonligo group=a +type storage = int; + +type parameter = + Increment (int) +| Decrement (int) +| Reset; + +type return = (list (operation), storage); + +let main = ((action, store): (parameter, storage)) : return => { + (([] : list (operation)), + (switch (action) { + | Increment (n) => store + n + | Decrement (n) => store - n + | Reset => 0})); +}; +``` + + + + +This LIGO contract accepts the following LIGO expressions: +`Increment(n)`, `Decrement(n)` and `Reset`. Those serve as +`entrypoint` identification. + +--- + +## Runnable code snippets & exercises + +Some of the sections in this documentation will include runnable code snippets and exercises. Sources for those are available at +the [LIGO Gitlab repository](https://gitlab.com/ligolang/ligo). + +### Snippets +For example **code snippets** for the *Types* subsection of this doc, can be found here: +`gitlab-pages/docs/language-basics/src/types/**` + +### Exercises +Solutions to exercises can be found e.g. here: `gitlab-pages/docs/language-basics/exercises/types/**/solutions/**` + +### Running snippets / exercise solutions +In certain cases it makes sense to be able to run/evaluate the given snippet or a solution, usually there'll be an example command which you can use, such as: + +```shell +ligo evaluate-value -s pascaligo gitlab-pages/docs/language-basics/src/variables-and-constants/const.ligo age +# Outputs: 25 +``` diff --git a/gitlab-pages/website/docusaurus.config.js b/gitlab-pages/website/docusaurus.config.js index d94dd362b..5fd7c6ddd 100644 --- a/gitlab-pages/website/docusaurus.config.js +++ b/gitlab-pages/website/docusaurus.config.js @@ -153,7 +153,7 @@ const siteConfig = { links: [ { href: 'https://ide.ligolang.org/', label: 'Try Online' }, { to: 'docs/intro/installation', label: 'Install' }, - { to: 'docs/intro/what-and-why', label: 'Docs' }, + { to: 'docs/intro/introduction', label: 'Docs' }, { to: 'docs/tutorials/get-started/tezos-taco-shop-smart-contract', label: 'Tutorials' diff --git a/gitlab-pages/website/sidebars.json b/gitlab-pages/website/sidebars.json index 1f5fec284..bde7acba5 100644 --- a/gitlab-pages/website/sidebars.json +++ b/gitlab-pages/website/sidebars.json @@ -1,6 +1,6 @@ { "docs": { - "Intro": ["intro/what-and-why", "intro/installation", "intro/editor-support"], + "Intro": ["intro/introduction", "intro/installation", "intro/editor-support"], "Language Basics": [ "language-basics/types", "language-basics/constants-and-variables", @@ -18,7 +18,8 @@ "advanced/timestamps-addresses", "advanced/entrypoints-contracts", "advanced/include", - "advanced/first-contract" + "advanced/first-contract", + "advanced/michelson-and-ligo" ], "API & Reference": [ "api/cli-commands", diff --git a/src/test/md_file_tests.ml b/src/test/md_file_tests.ml index c728a929d..ca3eb65e3 100644 --- a/src/test/md_file_tests.ml +++ b/src/test/md_file_tests.ml @@ -92,7 +92,7 @@ let md_files = [ "/gitlab-pages/docs/tutorials/get-started/tezos-taco-shop-payout.md"; "/gitlab-pages/docs/intro/installation.md"; "/gitlab-pages/docs/intro/editor-support.md"; - "/gitlab-pages/docs/intro/what-and-why.md"; + "/gitlab-pages/docs/intro/ligo-intro.md"; "/gitlab-pages/docs/language-basics/math-numbers-tez.md"; "/gitlab-pages/docs/language-basics/functions.md"; "/gitlab-pages/docs/language-basics/boolean-if-else.md";