View on GitHub

evm-semantics

K Semantics of the Ethereum Virtual Machine (EVM)

KEVM: Semantics of EVM in K

In this repository we provide a model of the EVM in K.

Documentation/Support

These may be useful for learning KEVM and K (newest to oldest):

To get support for KEVM, please join our Riot Room.

Repository Structure

The following files constitute the KEVM semantics:

These additional files extend the semantics to make the repository more useful:

Installing/Building

K Backends

There are four backends of K available: LLVM (default) and OCaml for concrete execution and Java (default) and Haskell for symbolic execution. This repository generates the build-products for each backend in .build/defn/.

System Dependencies

The following are needed for building/running KEVM:

On Ubuntu >= 18.04 (for example):

sudo apt install                                                       \
            autoconf bison clang++-8 clang-8 cmake curl flex gcc git   \
            libboost-test-dev libgmp-dev libjemalloc-dev libmpfr-dev   \
            libprocps-dev libprotobuf-dev libsecp256k1-dev libtool     \
            libyaml-dev libz3-dev lld-8 llvm-8 llvm-8-tools make maven \
            opam openjdk-11-jdk pandoc pkg-config protobuf-compiler    \
            z3 zlib1g-dev

On Ubuntu < 18.04, you’ll need to skip libsecp256k1-dev and instead build it from source (via our Makefile):

make libsecp256k1

On ArchLinux:

sudo pacman -S                                              \
    base base-devel boost clang cmake crypto++ curl git gmp \
    jdk-openjdk jemalloc libsecp256k1 lld llvm maven mpfr   \
    opam python stack yaml-cpp z3 zlib

On OSX, using Homebrew, after installing the command line tools package:

brew tap caskroom/cask
brew cask install adoptopenjdk12
brew install automake libtool gmp mpfr pkg-config pandoc maven opam z3 libffi
make libsecp256k1

NOTE: a previous version of these instructions required the user to run brew link flex --force. After fetching this revision, you should first run brew unlink flex, as it is no longer necessary and will cause an error if you have the homebrew version of flex installed instead of the xcode command line tools version.

To upgrade stack (if needed):

stack upgrade
export PATH=$HOME/.local/bin:$PATH

Build K Dependency

Get the submodules:

git submodule update --init --recursive

And finally build the repository specific dependencies:

make RELEASE=1 deps

If you are a developer, you probably should omit RELEASE from the above commands unless you are testing performance, as the build is somewhat slower.

On Arch, instead do:

make LIBFF_CC=clang LIBFF_CXX=clang++ RELEASE=1 deps

Building

Finally, you can install repository specific dependencies and build the semantics:

make build RELEASE=1

You can also build specific backends as so:

make build-haskell
make build-llvm RELEASE=1
make build-java

OPTIONAL: OCaml Backend

If you wish to build the OCaml backend, you will need to take some additional steps.

First, make sure you have our custom OCaml compiler installed (should only need to do this once):

./deps/k/k-distribution/src/main/scripts/bin/k-configure-opam-dev

Next you need to install the specific OCaml packages we requires:

make ocaml-deps

And next you can build the OCaml backend:

make build-ocaml

Installing

To install the kevm-vm binary for use in Firefly and other full-nodes, do:

make install RELEASE=1

You can set DESTDIR and INSTALL_PREFIX to change where the installation goes.

Example Usage

After building the definition, you can run the definition using ./kevm. Read the ./kevm script for examples of the actual invocations of krun that ./kevm makes.

Run the file tests/ethereum-tests/VMTests/vmArithmeticTest/add0.json:

./kevm run tests/ethereum-tests/VMTests/vmArithmeticTest/add0.json

To run proofs, you can similarly use ./kevm. For example, to prove one of the specifications:

./kevm prove tests/specs/ds-token-erc20/transfer-failure-1-a-spec.k -m VERIFICATION

Running Tests

The tests are run using the supplied Makefile. First, run make split-tests to generate some of the tests from the markdown files.

The following subsume all other tests:

These are the individual test-suites (all of these can be suffixed with -all to also run slow tests):

When running tests with the Makefile, you can specify the TEST_CONCRETE_BACKEND (for concrete tests), or TEST_SYMBOLIC_BACKEND (for proofs).

Media

This repository can build two pieces of documentation for you, the Jello Paper and the 2017 Devcon3 presentation.

System Dependencies

If you also want to build the Jello Paper, you’ll additionally need:

sudo apt install python-pygments python-sphinx python-recommonmark
git clone 'https://github.com/kframework/k-editor-support'
cd k-editor-support/pygments
easy_install --user .

For the 2017 Devcon3 presentation, you’ll need pdflatex, commonly provided with texlive-full.

sudo apt install texlive-full

Building

The Makefile supplies targets for building:

Resources

For more information about The K Framework, refer to these sources: