KEVM: Semantics of EVM in K
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:
- network.md provides the status codes which are reported to an Ethereum client on execution exceptions.
- json-rpc.md is an implementation of JSON RPC in K.
- evm-types.md provides the (functional) data of EVM (256 bit words, wordstacks, etc...).
- serialization.md provides helpers for parsing and unparsing data (hex strings, recursive-length prefix, merkle trees, etc.).
- 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:
- buf.md defines the
#bufbyte-buffer abstraction for use during symbolic execution.
- abi.md defines the Contract ABI Specification for use in proofs and easy contract/function specification.
- hashed-locations.md defines the
#hashedLocationabstraction which makes it easier to specify Solidity-generate storage layouts.
- edsl.md combines the previous three abstractions for ease-of-use.
- state-loader.md provides functionality for EVM initialization and setup.
- driver.md is an execution harness for KEVM, providing a simple language for describing tests/programs.
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
The following are needed for building/running KEVM:
For the exact dependencies check the Dockerfile, but they should look something like this. On Ubuntu >= 18.04 (for example):
sudo apt-get install --yes \ autoconf bison clang-8 cmake curl flex gcc jq libboost-test-dev \ libcrypto++-dev libffi-dev libgflags-dev libjemalloc-dev libmpfr-dev \ libprocps-dev libsecp256k1-dev libssl-dev libtool libyaml-dev \ lld-8 llvm-8-tools make maven netcat-openbsd openjdk-11-jdk \ pkg-config python3 python-pygments python-recommonmark \ python-sphinx rapidjson-dev time z3 zlib1g-dev
On Ubuntu < 18.04, you'll need to skip
libsecp256k1-dev and instead build it from source (via our
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 zlib
In 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 homebrew/cask brew install --cask java brew install automake libtool gmp mpfr pkg-config maven z3 libffi openssl 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.
- 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.
stack (if needed):
stack upgrade export PATH=$HOME/.local/bin:$PATH
kevm will work with either a (i) globally installed K, or (ii) a K submodule included in this repository.
If you want to use the K submodule, follow these instructions get the submodule and build K:
git submodule update --init --recursive -- deps/k make k-deps
If you don't need either the LLVM or Haskell backend, there are flags to skip them:
make k-deps SKIP_LLVM=true SKIP_HASKELL=true
You also need to get the blockchain plugin submodule and install it.
git submodule update --init --recursive -- deps/plugin make plugin-deps
Finally, you can build the semantics.
After building the definition, you can run the definition using
./kevm script for examples of the actual invocations of
Run the file
./kevm run tests/ethereum-tests/VMTests/vmArithmeticTest/add0.json
To run proofs, you can similarly use
For example, to prove one of the specifications:
./kevm prove tests/specs/erc20/ds/transfer-failure-1-a-spec.k VERIFICATION
The tests are run using the supplied
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
When running tests with the
Makefile, you can specify the
TEST_CONCRETE_BACKEND (for concrete tests), or
TEST_SYMBOLIC_BACKEND (for proofs).
For the presentations in the
media directory, you'll need
pdflatex, commonly provided with
sudo apt install texlive-full pandoc
To build all the PDFs (presentations and reports) available in the
media/ directory, use:
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.