358 lines
13 KiB
HTML
358 lines
13 KiB
HTML
<h1 id="awesome-ethereum-virtual-machine">Awesome Ethereum Virtual
|
||
Machine</h1>
|
||
<p>A curated list of resources on the Ethereum Virtual Machine (EVM),
|
||
which is the virtual machine executed on the <a
|
||
href="https://ethereum.org/">Ethereum</a> network.</p>
|
||
<p>Not listed there yet, but in the spirit of <a
|
||
href="https://github.com/sindresorhus/awesome"><img
|
||
src="https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg"
|
||
alt="Awesome" /></a></p>
|
||
<p>Here is <a href="./contributing.md">how to contribute</a>.</p>
|
||
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
|
||
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
||
<p><strong>Table of Contents</strong> <em>generated with <a
|
||
href="https://github.com/thlorenz/doctoc">DocToc</a></em></p>
|
||
<ul>
|
||
<li><a href="#specification">Specification</a></li>
|
||
<li><a href="#illustration">Illustration</a></li>
|
||
<li><a href="#tutorials">Tutorials</a></li>
|
||
<li><a href="#tests">Tests</a></li>
|
||
<li><a href="#evm-implementations">EVM Implementations</a></li>
|
||
<li><a href="#programming-languages-that-compile-into-evm">Programming
|
||
Languages that Compile into EVM</a></li>
|
||
<li><a href="#debuggers">Debuggers</a></li>
|
||
<li><a href="#code-analyzers">Code Analyzers</a></li>
|
||
<li><a href="#improvement-proposals">Improvement Proposals</a></li>
|
||
<li><a href="#related-resources">Related Resources</a></li>
|
||
<li><a href="#license-of-this-list">License of This List</a></li>
|
||
</ul>
|
||
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
||
<h2 id="specification">Specification</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/ethereum/yellowpaper">Yellow Paper</a>
|
||
<ul>
|
||
<li>A terse specification of EVM and Ethereum blocks</li>
|
||
</ul></li>
|
||
</ul>
|
||
<h2 id="illustration">Illustration</h2>
|
||
<ul>
|
||
<li><a href="https://ethereum.stackexchange.com/a/6413/280">A detailed
|
||
illustration of the Ethereum Virtual Machine</a>
|
||
<ul>
|
||
<li>The illustration shows the contents of blocks and block headers
|
||
faithfully</li>
|
||
</ul></li>
|
||
</ul>
|
||
<h2 id="tutorials">Tutorials</h2>
|
||
<ul>
|
||
<li><a
|
||
href="https://github.com/CoinCulture/evm-tools/blob/master/analysis/guide.md">CoinCulture’s
|
||
Guide to the EVM</a>
|
||
<ul>
|
||
<li>A hands on guide to understanding how the EVM works, with examples
|
||
written in raw byte-code and solidity</li>
|
||
</ul></li>
|
||
<li><a
|
||
href="https://medium.com/@hayeah/diving-into-the-ethereum-vm-6e8d5d2f3c30">Diving
|
||
Into The Ethereum Virtual Machine</a>
|
||
<ul>
|
||
<li>An article series examining different aspects of the EVM by walking
|
||
you through Solidity’s assembly output</li>
|
||
</ul></li>
|
||
</ul>
|
||
<h2 id="tests">Tests</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/ethereum/tests">Consensus test suite</a>
|
||
<ul>
|
||
<li>EVM implementations can be tested against this test suite</li>
|
||
</ul></li>
|
||
</ul>
|
||
<h2 id="evm-implementations">EVM Implementations</h2>
|
||
<h3 id="live-on-main-network">Live on Main Network</h3>
|
||
<ul>
|
||
<li><a href="https://github.com/ethereum/go-ethereum">go-ethereum</a>
|
||
<ul>
|
||
<li>A popular Ethereum client with its own EVM implementation (<a
|
||
href="https://github.com/ethereum/go-ethereum/tree/master/core/vm">core/vm</a>
|
||
directory)</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/paritytech/parity">Parity</a> in Rust
|
||
<ul>
|
||
<li>Another popular Ethereum client with its own EVM implementation (<a
|
||
href="https://github.com/paritytech/parity/tree/master/ethcore">ethcore</a>
|
||
directory)</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/ethereum/cpp-ethereum">cpp-ethereum</a>
|
||
<ul>
|
||
<li>An Ethereum client that generates the consensus test suite (<a
|
||
href="https://github.com/ethereum/cpp-ethereum/blob/develop/libevm/VM.cpp">libevm/VM.cpp</a>)</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/ethereum/pyethereum">Pyethereum</a> in
|
||
Python
|
||
<ul>
|
||
<li>A mostly deprecated client (<a
|
||
href="https://github.com/ethereum/pyethereum/blob/develop/ethereum/vm.py">ethereum/vm.py</a>)</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/pipermerriam/py-evm">Py-EVM</a> in
|
||
Python
|
||
<ul>
|
||
<li>A Python implementation designed to be highly configurable and
|
||
modular and compliant with the Ethereum test suite, work is in progress
|
||
on it to run a full node and develop sharding.</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/ethereum/ethereumj">EthereumJ</a> in
|
||
Java
|
||
<ul>
|
||
<li>A client with its own EVM implementation</li>
|
||
</ul></li>
|
||
<li>For more, see <a
|
||
href="https://github.com/ethereum/wiki/wiki/Clients">here</a>.</li>
|
||
</ul>
|
||
<h3 id="other-implementations">Other Implementations</h3>
|
||
<ul>
|
||
<li><a href="https://github.com/ethereumproject/sputnikvm">SputnikVM</a>
|
||
in Rust for Ethereum Classic
|
||
<ul>
|
||
<li>A standalone EVM featuring <a
|
||
href="https://github.com/ethereumproject/sputnikvm-dev">a developer
|
||
environment</a>, a <a
|
||
href="https://github.com/sorpaas/sputnikvm-in-browser">browser through
|
||
wasm32-unknown-emscripten target</a>, and for <a
|
||
href="https://github.com/sorpaas/sputnikvm-on-rux">embedded
|
||
devices</a></li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/kframework/evm-semantics">Modeling EVM
|
||
in the K framework</a> (<a
|
||
href="https://www.ideals.illinois.edu/handle/2142/97207">whitepaper</a>)
|
||
<ul>
|
||
<li>An EVM implementation for <a
|
||
href="http://www.kframework.org/index.php/Main_Page">K
|
||
framework</a></li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/dapphub/hevm">hevm</a>
|
||
<ul>
|
||
<li>An EVM implementation written in Haskell with debugging in mind</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/pirapira/eth-isabelle">eth-isabelle</a>
|
||
<ul>
|
||
<li>An EVM implementation for theorem provers</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/hyperledger/burrow">Burrow</a>
|
||
<ul>
|
||
<li>An EVM implementation in Go extended with a native name registry and
|
||
permissioning layer</li>
|
||
</ul></li>
|
||
<li><a
|
||
href="https://github.com/ethereumjs/ethereumjs-vm">Ethereumjs-VM</a>
|
||
<ul>
|
||
<li>Implements Ethereum’s VM in JS</li>
|
||
</ul></li>
|
||
<li><a
|
||
href="https://github.com/cryptape/ruby-ethereum">ruby-ethereum</a>
|
||
<ul>
|
||
<li>An EVM implementation in Ruby (passed all tests in <a
|
||
href="https://github.com/ethereum/tests/tree/55a18b3ded93bf6083f23ea1f4bf7be4ba973016">ethereum
|
||
tests</a>)</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/nervous-systems/sputter">sputter</a>
|
||
<ul>
|
||
<li>An EVM implementation in Clojure (so far passes VM tests)</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/Ohalo-Ltd/solevm">solevm</a>
|
||
<ul>
|
||
<li>An EVM implementation in Solidity</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/zchn/eth-acl2">eth-acl2</a>
|
||
<ul>
|
||
<li>An EVM implementation in ACL2 (work in progress)</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/poanetwork/mana/">mana</a>
|
||
<ul>
|
||
<li>An EVM implementation in Elixir (work in progress)</li>
|
||
</ul></li>
|
||
</ul>
|
||
<h2 id="programming-languages-that-compile-into-evm">Programming
|
||
Languages that Compile into EVM</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/ethereum/solidity">Solidity</a>
|
||
<ul>
|
||
<li>The most popular programming language for Ethereum contracts</li>
|
||
<li><a href="https://github.com/bkrem/awesome-solidity">Awesome
|
||
Solidity</a></li>
|
||
<li>The LLL compiler is also in the same repository</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/ethereum/vyper">Vyper</a>
|
||
<ul>
|
||
<li>A language with overflow-checking, numeric units but without
|
||
unlimited loops</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/MichaelBurge/pyramid-scheme">Pyramid
|
||
Scheme</a> (experimental)
|
||
<ul>
|
||
<li>A Scheme compiler into EVM that follows the <a
|
||
href="https://mitpress.mit.edu/sicp/full-text/book/book-Z-H-35.html#%_sec_5.5">SICP
|
||
compilation approach</a></li>
|
||
<li><a href="https://github.com/MichaelBurge/ceagle">ceagle</a> compiles
|
||
C into Pyramid Scheme</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/franklinsch/flint">Flint</a>
|
||
<ul>
|
||
<li>A language with several security features: e.g. asset types with a
|
||
restricted set of atomic operations</li>
|
||
</ul></li>
|
||
<li><a
|
||
href="https://github.com/mmalvarez/eth-isabelle/blob/master/example/LLLL.thy">LLLL</a>
|
||
<ul>
|
||
<li>An LLL-like compiler being implemented in Isabelle/HOL</li>
|
||
</ul></li>
|
||
<li><a
|
||
href="https://github.com/takenobu-hs/haskell-ethereum-assembly">HAseembly-evm</a>
|
||
<ul>
|
||
<li>An EVM assembly implemented as a Haskell DSL</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/pirapira/bamboo">Bamboo</a>
|
||
(experimental) - A language without loops but with explicit
|
||
constructor invocation at the end of every call</li>
|
||
</ul>
|
||
<h3
|
||
id="programming-languages-that-compile-zk-snark-circuits-and-proofs">Programming
|
||
Languages that Compile zk-SNARK Circuits and Proofs</h3>
|
||
<ul>
|
||
<li><a href="https://github.com/JacobEberhardt/ZoKrates">Zokrates</a>
|
||
<ul>
|
||
<li>A toolbox for zkSNARKs on Ethereum</li>
|
||
<li><a href="https://github.com/jstoxrocky/zksnarks_example">a
|
||
third-party tutorial</a></li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/o1-labs/snarky">snarky</a>
|
||
<ul>
|
||
<li>An OCaml front-end for writing R1CS SNARKs (parametrized over the
|
||
backend SNARK libraries)</li>
|
||
<li>Shallowly embedded DSL that can be compiled into SNARK circuits</li>
|
||
<li>The verifier is an OCaml function, so some more work is necessary
|
||
before using it on Ethereum</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/akosba/jsnark">jsnark</a>
|
||
<ul>
|
||
<li>A Java front-end for writing R1CS SNARKs</li>
|
||
</ul></li>
|
||
</ul>
|
||
<h2 id="debuggers">Debuggers</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/ethereum/remix">REMIX</a>
|
||
<ul>
|
||
<li>An IDE containing an EVM code debugger</li>
|
||
</ul></li>
|
||
<li><a
|
||
href="https://github.com/ethereum/go-ethereum/wiki/Management-APIs#debug_tracetransaction">debug_traceTransaction
|
||
method</a>
|
||
<ul>
|
||
<li>An instruction-wise trace information provided by go-ethereum</li>
|
||
</ul></li>
|
||
<li><a href="https://www.4byte.directory/">Ethereum Function Signature
|
||
Database</a>
|
||
<ul>
|
||
<li>A database for deciphering <code>0x165ffd10</code> into
|
||
<code>restart(bytes32,bytes32)</code>.</li>
|
||
</ul></li>
|
||
</ul>
|
||
<h2 id="code-analyzers">Code Analyzers</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/trailofbits/echidna">Echidna</a>
|
||
<ul>
|
||
<li>A fuzzer on EVM that also takes Solidity input</li>
|
||
<li>Able to fuzz a program with sequences of multiple transactions</li>
|
||
</ul></li>
|
||
<li><a href="https://arxiv.org/abs/1802.06038">MAIAN</a>
|
||
<ul>
|
||
<li>An automatic tool that detects trace vulnerabilities (Greedy,
|
||
Prodigal and Suicidal) with depth-first search of symbolic execution of
|
||
multiple invocations</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/b-mueller/mythril">Mythril</a>
|
||
<ul>
|
||
<li>A blockchain exploration tool that indexes all contracts on the
|
||
network, containing a disassembler, an ABI function detector and a
|
||
control flow analyzer</li>
|
||
<li>Comes with a <a
|
||
href="https://hackernoon.com/crafting-ethereum-exploits-by-laser-fire-1c9acf25af4f">–fire-laser
|
||
option</a></li>
|
||
<li>Powered by <a
|
||
href="https://github.com/b-mueller/laser-ethereum">laser-ethereum</a></li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/comaeio/porosity">porosity</a>
|
||
<ul>
|
||
<li>A reverse enginering tool, a disassembler, an ABI function detector
|
||
and a decompiler that also highlights vulnerabilities</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/trailofbits/manticore">Manticore</a>
|
||
<ul>
|
||
<li>A symtolic execution engine that can generate inputs to cover
|
||
codepaths (<a href="https://asciinema.org/a/154012">asciicast</a>),
|
||
which also comes with a Python API</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/arachnid/evmdis">evmdis</a>
|
||
<ul>
|
||
<li>A disassembler for EVM code</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/trailofbits/ethersplay">ethersplay</a>
|
||
<ul>
|
||
<li>An EVM plugin for <a href="https://binary.ninja/">Binary
|
||
Ninja</a></li>
|
||
</ul></li>
|
||
<li><a href="http://securify.ch/">Securify</a>
|
||
<ul>
|
||
<li>A tool that strives to achieve no false-negatives</li>
|
||
<li>The implementation seems not public as of now</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/melonproject/oyente">Oyente</a>
|
||
<ul>
|
||
<li>An automatic EVM code analyzer based on symbolic execution and <a
|
||
href="https://github.com/Z3Prover/z3">Z3</a> SMT solver</li>
|
||
</ul></li>
|
||
<li><a href="http://dry.yoichihirai.com/">Dr. Y’s Ethereum Contract
|
||
Analyzer</a>
|
||
<ul>
|
||
<li>A symbolic executor for EVM code</li>
|
||
</ul></li>
|
||
</ul>
|
||
<h2 id="improvement-proposals">Improvement Proposals</h2>
|
||
<ul>
|
||
<li><a href="https://github.com/ethereum/EIPs">Ethereum Improvement
|
||
Proposals</a>
|
||
<ul>
|
||
<li>A portal for EVM & Ethereum improvements</li>
|
||
<li>The soonest changes are listed in the README</li>
|
||
</ul></li>
|
||
<li><a
|
||
href="https://github.com/ethereum/EIPs/blob/master/EIPS/eip-615.md">EVM
|
||
1.5</a>
|
||
<ul>
|
||
<li>A proposal to tame jumps so that a linear-time scan can determine
|
||
stack layouts</li>
|
||
</ul></li>
|
||
<li><a href="https://github.com/ewasm">eWASM</a>
|
||
<ul>
|
||
<li>A proposal to use a <a
|
||
href="http://webassembly.org/">WebAssembly</a> for Ethereum contract
|
||
execution</li>
|
||
</ul></li>
|
||
</ul>
|
||
<h2 id="related-resources">Related Resources</h2>
|
||
<ul>
|
||
<li><a href="http://awesome-ethereum.com/">Awesome Ethereum</a></li>
|
||
</ul>
|
||
<h2 id="license-of-this-list">License of This List</h2>
|
||
<p>Awesome Ethereum Virtual Machine</p>
|
||
<p>Written in 2017 by Yoichi Hirai <a href="mailto:i@yoichihirai.com"
|
||
class="email">i@yoichihirai.com</a></p>
|
||
<p>[other author/contributor lines as appropriate]</p>
|
||
<p>To the extent possible under law, the author(s) have dedicated all
|
||
copyright and related and neighboring rights to this software to the
|
||
public domain worldwide. This software is distributed without any
|
||
warranty.</p>
|
||
<p>You should have received a copy of the CC0 Public Domain Dedication
|
||
along with this software. If not, see <a
|
||
href="http://creativecommons.org/publicdomain/zero/1.0/"
|
||
class="uri">http://creativecommons.org/publicdomain/zero/1.0/</a>.</p>
|