Hera is an ewasm virtual machine implemented in C++ conforming to EVMC.
It can be used with aleth and perhaps in the future with other implementations through appropriate bindings.
Currently it uses Binaryen‘s interpreter for running WebAssembly bytecode and it should be improved to support wabt and wavm as backends.
Build options
-DHERA_DEBUGGING=ON will turn on debugging features and messages
-DBUILD_SHARED_LIBS=ON is a standard CMake option to build libraries as shared. This will build Hera shared library that can be then dynamically loaded by EVMC compatible Clients (e.g. eth from [cpp-ethereum]).
wabt support
Unfinished support, work in progress.
-DHERA_WABT=ON will request the compilation of wabt support
WAVM support
Unfinished support, work in progress.
-DHERA_WAVM=ON will request the compilation of WAVM support
-DLLVM_DIR=... one will need to specify the path to LLVM’s CMake file. In most installations this has to be within the lib/cmake/llvm directory, such as /usr/local/Cellar/llvm/6.0.1/lib/cmake/llvm on Homebrew.
Runtime options
These are to be used via EVMC set_option:
engine=<engine> will select the underlying WebAssembly engine, where the only accepted value currently is binaryen
metering=true will enable metering of bytecode at deployment using the Sentinel system contract (set to false by default)
evm2wasm=true will enable metering of bytecode at deployment using the EVM Transcompiler (set to false by default)
fallback=true will allow EVM bytecode to be passed through to the client for execution (if set to false, the default, it will be rejected as invalid) (note: is ignored if evm2wasm is true)
evm2wasm.js=true will use a evm2wasm.js as an external commandline tool instead of the system contract
evm2wasm.js-trace=true will turn on EVM tracing for evm2wasm.js
evm2wasm.cpp=true will use a evm2wasm as a compiled-in dependency instead of the system contract
evm2wasm.cpp-trace=true will turn on EVM tracing for evm2wasm.cpp
Interfaces
Hera implements two interfaces: EEI and a debugging module.
Hera
Hera is an ewasm virtual machine implemented in C++ conforming to EVMC.
It can be used with aleth and perhaps in the future with other implementations through appropriate bindings.
Currently it uses Binaryen‘s interpreter for running WebAssembly bytecode and it should be improved to support wabt and wavm as backends.
Build options
-DHERA_DEBUGGING=ONwill turn on debugging features and messages-DBUILD_SHARED_LIBS=ONis a standard CMake option to build libraries as shared. This will build Hera shared library that can be then dynamically loaded by EVMC compatible Clients (e.g.ethfrom [cpp-ethereum]).wabt support
Unfinished support, work in progress.
-DHERA_WABT=ONwill request the compilation of wabt supportWAVM support
Unfinished support, work in progress.
-DHERA_WAVM=ONwill request the compilation of WAVM support-DLLVM_DIR=...one will need to specify the path to LLVM’s CMake file. In most installations this has to be within thelib/cmake/llvmdirectory, such as/usr/local/Cellar/llvm/6.0.1/lib/cmake/llvmon Homebrew.Runtime options
These are to be used via EVMC
set_option:engine=<engine>will select the underlying WebAssembly engine, where the only accepted value currently isbinaryenmetering=truewill enable metering of bytecode at deployment using the Sentinel system contract (set tofalseby default)evm2wasm=truewill enable metering of bytecode at deployment using the EVM Transcompiler (set tofalseby default)fallback=truewill allow EVM bytecode to be passed through to the client for execution (if set tofalse, the default, it will be rejected as invalid) (note: is ignored ifevm2wasmistrue)evm2wasm.js=truewill use aevm2wasm.jsas an external commandline tool instead of the system contractevm2wasm.js-trace=truewill turn on EVM tracing forevm2wasm.jsevm2wasm.cpp=truewill use aevm2wasmas a compiled-in dependency instead of the system contractevm2wasm.cpp-trace=truewill turn on EVM tracing forevm2wasm.cppInterfaces
Hera implements two interfaces: EEI and a debugging module.
Debugging module
debug::print32(value: i32)- print valuedebug::print64(value: i64)- print valuedebug::printMem(offset: i32, len: i32)- print memory segment as printable charactersdebug::printMemHex(offset: i32, len: i32)- print memory segment as hexdebug::printStorage(pathOffset: i32)- print storage value as printable charactersdebug::printStorageHex(pathOffset: i32)- print storage value as hexThese are only enabled if Hera is compiled with debugging on.
EVM Tracing
debug::evmTrace(pc: i32, opcode: i32, cost: i32, sp: i32)This is useful to trace the transpiled code from evm2wasm. This is only enabled if Hera is compiled with debugging on.
Note: it is valid to invoke
evmTracewith a negative value forsp. In this case, no stack values will be printed.Caveats
Although Hera enables the execution of ewasm bytecode, there are more elements to ewasm an Ethereum node must be aware of:
All of the above must be implemented outside of Hera.
Author(s)
Alex Beregszaszi, Jake Lang
License
Apache 2.0