In this repository we provide a model of the EVM in K.
These may be useful for learning KEVM and K (newest to oldest):
- Jello Paper, generated using Sphinx Documentation Generation.
- 20 minute tour of the semantics at 2017 Devcon3.
- KEVM 1.0 technical report, especially sections 3 and 5.
- KEVM Paper at CSF'18/FLoC.
To get support for KEVM, please join our Riot Room.
The following files constitute the KEVM semantics:
- krypto.md sets up some basic cryptographic primitives.
- data.md provides the (functional) data of EVM (256 bit words, wordstacks, etc...).
- network.md provides the status codes which are reported to an Ethereum client on execution exceptions.
- evm.md is the main KEVM semantics, containing the configuration and transition rules of EVM.
These additional files extend the semantics to make the repository more useful:
- driver.md is an execution harness for KEVM, providing a simple language for describing tests/programs.
- edsl.md defines high-level notations of eDSL, a domain-specific language for EVM specifications, for formal verification of EVM bytecode using K Reachability Logic Prover.
- evm-node.md is the protobuf interface that an external Ethereum client can connect to for using KEVM as the execution engine.
There are three backends of K available: LLVM (default) for concrete execution and Java (default) and Haskell for symbolic execution.
This repository generates the build-products for each backend in .build/defn/.
The following are needed for building/running KEVM:
- git
- Pandoc >= 1.17 is used to generate the
*.kfiles from the*.mdfiles. - GNU Bison, Flex, and Autoconf.
- GNU libmpfr and libtool.
- Java 8 JDK (eg. OpenJDK)
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 \
openjdk-11-jdk pandoc pkg-config protobuf-compiler z3 \
zlib1g-devOn Ubuntu < 18.04, you'll need to skip libsecp256k1-dev and instead build it from source (via our Makefile):
make libsecp256k1On ArchLinux:
sudo pacman -S \
base base-devel boost clang cmake crypto++ curl git gmp \
gflags jdk-openjdk jemalloc libsecp256k1 lld llvm maven \
mpfr python stack yaml-cpp z3 zlibIn addition, you'll need the glog-git AUR package: https://aur.archlinux.org/packages/glog-git/.
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 z3 libffi
make libsecp256k1NOTE: 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.
- Haskell Stack.
Note that the version of the
stacktool provided by your package manager might not be recent enough. Please follow installation instructions from the Haskell Stack website linked above.
To upgrade stack (if needed):
stack upgrade
export PATH=$HOME/.local/bin:$PATHGet the submodules:
git submodule update --init --recursiveAnd finally build the repository specific dependencies:
make RELEASE=1 depsIf 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 depsFinally, you can install repository specific dependencies and build the semantics:
make build RELEASE=1You can also build specific backends as so:
make build-haskell
make build-llvm RELEASE=1
make build-javaAfter 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.jsonTo run proofs, you can similarly use ./kevm.
For example, to prove one of the specifications:
./kevm prove tests/specs/erc20/ds/transfer-failure-1-a-spec.k VERIFICATIONThe 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:
make test: All of the quick tests.make test-all: All of the quick and slow tests.
These are the individual test-suites (all of these can be suffixed with -all to also run slow tests):
make test-vm: VMTests from the Ethereum Test Set.make test-bchain: Subset of BlockchainTests from the Ethereum Test Set.make test-proof: Proofs from the Verified Smart Contracts.make test-interactive: Tests of the./kevmcommand.
When running tests with the Makefile, you can specify the TEST_CONCRETE_BACKEND (for concrete tests), or TEST_SYMBOLIC_BACKEND (for proofs).
This repository can build two pieces of documentation for you, the Jello Paper and the 2017 Devcon3 presentation.
For the presentations in the media directory, you'll need pdflatex, commonly provided with texlive-full.
sudo apt install texlive-fullTo build all the PDFs (presentations and reports) available in the media/ directory, use:
make media- EVM Yellowpaper: Original specification of EVM.
- LEM Semantics of EVM
For more information about The K Framework, refer to these sources:
- The K Tutorial
- Semantics-Based Program Verifiers for All Languages
- Reachability Logic Resources
- Matching Logic Resources
- Logical Frameworks: Discussion of logical frameworks.