input-output-hk / Plutus
Projects that are alternatives of or similar to Plutus
= https://github.com/input-output-hk/plutus[Plutus Platform] ✉️ [email protected] :author: Input Output HK Limited :toc: left :reproducible:
The Plutus Platform enables you to:
- Work with Plutus Core, the smart contract language embedded in the Cardano ledger.
- Write Haskell programs that create and use embedded Plutus Core programs using Plutus Tx.
- Write smart contract executables which can be distributed for use with the Plutus Smart Contract Backend.
You are free to copy, modify, and distribute the Plutus Platform with under the terms of the Apache 2.0 license. See the link:./LICENSE[LICENSE] and link:./NOTICE[NOTICE] files for details.
== How to use the project
This section contains brief information about how to use this project. For development work see <> for more information.
[[prerequisites]] === Prerequisites
The Haskell libraries in the Plutus Platform can be built in a number of ways. The prerequisites depend on how you want to build the libraries. The other artifacts (docs etc.) are most easily built with Nix, so we recommend installing it regardless.
==== Nix
Install https://nixos.org/nix/[Nix] (recommended). following the instructions on the https://nixos.org/nix/[Nix website].
[IMPORTANT]
Even if you already have Nix installed, make sure to set up the xref:iohk-binary-cache[IOHK binary cache].
See <> for further advice on using Nix.
==== Non-Nix
If you use Nix, these tools are provided for you via shell.nix
, and you do not need to install them yourself.
- If you want to build our Haskell packages with https://www.haskell.org/cabal/[`cabal`], then install it.
- If you want to build our Haskell packages with https://haskellstack.org/[`stack`], then install it.
- If you want to build our Agda code, then install https://github.com/agda/agda[Agda] and the https://github.com/agda/agda-stdlib[standard library].
=== How to get started using the libraries
There is an example project in the example
folder, see its link:./example/README.md[README]
for more details.
=== How to build the Haskell packages and other artifacts
[[building-with-nix]] ==== How to build Haskell packages and other artifacts with Nix
Run nix build -f default.nix plutus.haskell.packages.plutus-core.components.library
from the root to build the Plutus Core library.
See <> to find out what other attributes you can build.
==== How to build Haskell packages with cabal
Run cabal build plutus-core
from the root to build the
Plutus Core library.
See the link:./cabal.project[cabal project file] to see the other
projects that you can build with cabal
.
==== How to build the Haskell packages with stack
Run stack build plutus-core
from the root to build the
Plutus Core library. The stack
build is less well supported than the cabal
build, we do not promise that it will work.
See the link:./stack.yaml[stack project file] to see the other projects that you can build with stack.
=== How to get the most recent documentation PDFs from CI
==== Specifications and design
- https://hydra.iohk.io/job/Cardano/plutus/linux.docs.plutus-report/latest/download-by-type/doc-pdf/plutus[Plutus Technical Report] (draft)
- https://hydra.iohk.io/job/Cardano/plutus/linux.docs.plutus-core-spec/latest/download-by-type/doc-pdf/plutus-core-specification[Plutus Core Specification]
- https://hydra.iohk.io/job/Cardano/plutus/linux.docs.extended-utxo-spec/latest/download-by-type/doc-pdf/extended-utxo-specification[Extended UTXO Model]
==== Academic papers
- https://hydra.iohk.io/job/Cardano/plutus/linux.docs.papers.unraveling-recursion/latest/download-by-type/doc-pdf/unraveling-recursion[Unraveling Recursion] (https://doi.org/10.1007/978-3-030-33636-3_15[published version])
- https://hydra.iohk.io/job/Cardano/plutus/linux.docs.papers.system-f-in-agda/latest/download-by-type/doc-pdf/paper[System F in Agda] (https://doi.org/10.1007/978-3-030-33636-3_10[published version])
- https://hydra.iohk.io/job/Cardano/plutus/linux.docs.papers.eutxo/latest/download-by-type/doc-pdf/eutxo[The Extended UTXO Model] (in press)
- https://hydra.iohk.io/job/Cardano/plutus/linux.docs.papers.utxoma/latest/download-by-type/doc-pdf/utxoma[UTXOma: UTXO with Multi-Asset Support] (in press)
- https://hydra.iohk.io/job/Cardano/plutus/linux.docs.papers.eutxoma/latest/download-by-type/doc-pdf/eutxoma[Native Custom Tokens in the Extended UTXO Model] (in press)
== Where to go next
=== Where to find tutorials
The link:./doc[doc] folder contains the documentation site.
To build a full HTML version of the site that you can view locally, build the docs.site
attribute xref:building-with-nix[using Nix].
The online version of the tutorial can be found https://docs.cardano.org/projects/plutus/en/latest/index.html[here]
=== How to submit an issue
User issues can be filed in the https://github.com/input-output-hk/plutus/issues[GitHub Issue tracker].
However, note that this is pre-release software, so we will not usually be providing support.
=== How to communicate with us
We’re active on the https://forum.cardano.org/[Cardano
forum]. Tag your post with the plutus
tag so we’ll see it.
Use the Github issue tracker for bugs and feature requests, but keep other discussions to the forum.
[[how-to-develop]] === How to develop and contribute to the project
See link:CONTRIBUTING{outfilesuffix}[CONTRIBUTING], which describes our processes in more detail including development environments; and link:ARCHITECTURE{outfilesuffix}[ARCHITECTURE], which describes the structure of the repository.
[[nix]] == Nix
[[iohk-binary-cache]] === How to set up the IOHK binary caches
Adding the IOHK binary cache to your Nix configuration will speed up builds a lot, since many things will have been built already by our CI.
If you find you are building packages that are not defined in this repository, or if the build seems to take a very long time then you may not have this set up properly.
To set up the cache:
/etc/nix/nix.conf
and add the following lines:
+
. On non-NixOS, edit https://hydra.iohk.io https://iohk.cachix.org https://cache.nixos.org/ trusted-public-keys = hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ= iohk.cachix.org-1:DpRUyj7h7V830dp/i6Nti+NEO2/nhblbov/8MW7Rqoo= cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=
substituters =. On NixOS, set the following NixOS options: +
nix = { binaryCaches = [ "https://hydra.iohk.io" "https://iohk.cachix.org" ]; binaryCachePublicKeys = [ "hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ=" "iohk.cachix.org-1:DpRUyj7h7V830dp/i6Nti+NEO2/nhblbov/8MW7Rqoo=" ]; };
NOTE: If you are a https://nixos.org/nix/manual/#ssec-multi-user[trusted user] you may add the
nix.conf
lines to ~/.config/nix/nix.conf
instead.
=== Nix on macOS
Nix on macOS can be a bit tricky. In particular, sandboxing is disabled by default, which can lead to strange failures.
These days it should be safe to turn on sandboxing on macOS with a few exceptions. Consider setting the following Nix settings, in the same way as in xref:iohk-binary-cache[previous section]:
sandbox = true extra-sandbox-paths = /System/Library/Frameworks /System/Library/PrivateFrameworks /usr/lib /private/tmp /private/var/tmp /usr/bin/env
[[nix-build-attributes]] === Which attributes to use to build different artifacts
link:./default.nix[default.nix
] defines a package set with attributes for all the
artifacts you can build from this repository. These can be built
using nix build
. For example:
nix build -f default.nix plutus.haskell.packages.plutus-core
.Example attributes
- Project packages: defined inside
plutus.haskell.packages
** e.g.plutus.haskell.packages.plutus-core.components.library
- Documents: defined inside
docs
** e.g.docs.plutus-core-spec
- Development scripts: defined inside
dev
** e.g.dev.scripts.fixStylishHaskell
There are other attributes defined in link:./default.nix[default.nix
].