EVM (Ethereum VM 1.0) to eWASM transcompiler. Here is a online frontend.
Clone the repository and run npm install
There is a commandline tool to transcompile EVM input:
$ bin/evm2wasm.js -e `evm_bytecode_file` -o `wasm_output_file`
$ bin/evm2wasm.js -e `evm_bytecode_file` -o `wasm_output_file` --wast
$ bin/evm2wasm.js -e `evm_bytecode_file` -o `wasm_output_file` --wast --trace
$ bin/evm2wasm.js -e `evm_bytecode_file` -o `wasm_output_file` --wast --charge-per-op
- After any changes to
.wast
file,npm run build
needs to be run to compile the files into a .json file - To rebuild the documentation run
npm run build:docs
- To lint run
npm run lint
- And make sure you test with
npm test
andnpm run vmTests
which runs the offical Ethereum test suite
EVM is stack based and offers access to memory, storage and state via special instructions.
Here we replicate the stack layout in WebAssembly (WASM) and implement each operation working on this stack.
Every opcode (bar some special instructions) receives the current stack pointer ($sp
) as i32
and must return the adjusted stack pointer.
The stack grows from memory location 0, where 256 bit values are stored linearly in LSB byteorder.
The $sp
points to the starting position of the top stack entry (and not the next free stack position). If the stack is empty, it is set to -32
.
The resulting (after transpilation) contract memory layout is currently as follows:
.---------------------------------------------------
| Reserved space for the stack (32768 bytes)
| - each stack entry is 256 bits
| - the stack is limited to 1024 entries
+---------------------------------------------------
| Word count (4 bytes)
| (Number of 256 bit words stored in memory)
+---------------------------------------------------
| Previous memory cost in word count (4 bytes)
| (The cost charged for the last memory allocation)
+---------------------------------------------------
| Scratch space (32 bytes)
+---------------------------------------------------
| Reserved space for the Keccak-256 context (1024 bytes)
+---------------------------------------------------
| "EVM 1.0" contract memory starts here ("unlimited" in size)
`---------------------------------------------------
The generated eWASM contract contains gas metering. It is assumed evm2wasm will become a deployed trusted contract, which returns eWASM code that does not need to be run through the gas injector contract.