Plutus Core is the scripting language embedded in the Cardano ledger and forms the basis of the Plutus Platform, an application development platform for developing distributed applications using the Cardano blockchain. For more information about the projects, see the User documentation.
This repository contains:
-
The implementation, specification, and mechanized metatheory of Plutus Core
-
Plutus Tx, the compiler from Haskell to Plutus Core.
The rest of this README is focussed on people who want to develop or contribute to the project.
For people who want to use the project, please consult the User documentation.
Important
|
This repository used to contain the code for the Plutus Application Framework and Marlowe. These have now moved: Please ensure that you make PRs and issues in the appropriate repository! |
Important
|
DO NOT IGNORE THIS If you want to use Nix with this project, make sure to set up the IOHK binary cache. If you do not do this, you will end up building GHC, which takes several hours. If you find yourself building GHC, STOP and fix the cache. |
The main documentation is located here.
-
Functional Smart Contracts on Cardano (2020): an overview of the ideas behind the Plutus Platform.
-
The Plutus Platform (2020): an overview of the Platform as a whole (including the Application Framework) at the time.
-
Plutus Technical Report (draft): a technical report and design document for the project.
-
Plutus Core Specification: the formal specification of the core language.
-
Extended UTXO Model: a design document for the core changes to the Cardano ledger.
-
Unraveling Recursion: a description of some of the compilation strategies used in Plutus IR (published version).
-
System F in Agda: a formal model of System F in Agda (published version).
-
The Extended UTXO Model: a full presentation of the EUTXO ledger extension (published version).
-
UTXOma: UTXO with Multi-Asset Support: a full presentation of the multi-asset ledger extension (published version).
-
Native Custom Tokens in the Extended UTXO Model: a discussion of the interaction of the multi-asset support with EUTXO (published version).
Issues can be filed in the GitHub Issue tracker.
However, note that this is pre-release software, so we will not usually be providing support.
See CONTRIBUTING, which describes our processes in more detail including development environments.
None of our libraries are on Hackage, unfortunately (many of our dependencies aren’t either). So for the time being, you need to:
-
Add
plutus
as asource-repository-package
to yourcabal.project
. -
Copy the
source-repository-package
stanzas from ourcabal.project
to yours. -
Copy additional stanzas from our
cabal.project
as you need, e.g. you may need some of theallow-newer
stanzas.
The plutus-starter project provides an example.
This section contains information about how to build the project’s artifacts for independent usage. For development work see How to develop and contribute to the project for more information.
The Haskell libraries in Plutus Core are built with cabal
and Nix.
The other artifacts (docs etc.) are also most easily built with Nix.
Install Nix (recommended). following the instructions on the Nix website.
Make sure you have read and understood the cache warning. DO NOT IGNORE THIS.
See Nix for further advice on using Nix.
You can build some of the Haskell packages without Nix, but this is not recommended and we don’t guarantee that these prerequisites are sufficient.
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
cabal
, then install it. -
If you want to build our Haskell packages with
stack
, then install it. -
If you want to build our Agda code, then install Agda and the standard library.
Run nix build -f default.nix plutus.haskell.packages.plutus-core.components.library
from the root to build the Plutus Core library.
See Which attributes to use to build different artifacts to find out what other attributes you can build.
The Haskell packages can be built directly with cabal
.
We do this during development (see How to develop and contribute to the project).
The best way is to do this is inside a nix-shell
.
Note
|
For fresh development setups, you also need to run |
Run cabal build plutus-core
from the root to build the Plutus Core library.
See the cabal project file to see the other packages that you can build with cabal
.
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:
-
On non-NixOS, edit
/etc/nix/nix.conf
and add the following lines:substituters = 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=
NoteIf you don’t have an
/etc/nix/nix.conf
or don’t want to edit it, you may add thenix.conf
lines to~/.config/nix/nix.conf
instead. You must be a trusted user to do this. -
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: after changing /etc/nix/nix.conf you must restart the nix-daemon on non-NixOS for the changes to take effect!
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 previous section:
sandbox = true extra-sandbox-paths = /System/Library/Frameworks /System/Library/PrivateFrameworks /usr/lib /private/tmp /private/var/tmp /usr/bin/env
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 docs.papers.eutxo
-
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
-
There are other attributes defined in default.nix
.