#evm #bytecode #human-readable #opcode #string #individual #disassembler

evm-disassembler

Disassemble EVM bytecode into individual Opcodes and format into human readable strings

5 releases (breaking)

0.5.0 Mar 15, 2024
0.4.0 Jan 19, 2024
0.3.0 Oct 24, 2023
0.2.0 Mar 13, 2023
0.1.0 Mar 10, 2023

#17 in #opcode

Download history 2666/week @ 2024-07-20 1864/week @ 2024-07-27 2783/week @ 2024-08-03 1749/week @ 2024-08-10 1741/week @ 2024-08-17 2014/week @ 2024-08-24 2779/week @ 2024-08-31 1850/week @ 2024-09-07 1614/week @ 2024-09-14 1733/week @ 2024-09-21 1448/week @ 2024-09-28 1610/week @ 2024-10-05 2185/week @ 2024-10-12 1460/week @ 2024-10-19 1294/week @ 2024-10-26 980/week @ 2024-11-02

6,172 downloads per month

MIT/Apache

130KB
543 lines

Disassemble EVM bytecode

Lightweight library with the sole purpose of decoding evm bytecode into individual Opcodes and formatting them in a human readable way

Inspiration

This library was inspired by the pyevmasm. When formatting the decoded operations using the inbuilt function the output should be equivalent to that of pyevasm, which is tested on the bytecode of several large evm contracts.

Installation

cargo add evm-disassembler

Documentation

See the API reference here.

Example

use evm_disassembler::{disassemble_str, disassemble_bytes, format_operations};

fn main() {
   
  let bytecode = "608060405260043610603f57600035";
  // Decode from string directly
  let instructions = disassemble_str(bytecode).unwrap();
  println!("{}", format_operations(instructions));

  let bytes = hex::decode(bytecode).unwrap();
  // Decode from Vec<u8> with identical output as above
  let instructions_from_bytes = disassemble_bytes(bytes).unwrap();
  println!("{}", format_operations(instructions_from_bytes));

}

Tests

You can run the tests as usual with cargo test. The main tests compare the output of this library when decoding contract bytecode against the output from pyevasm. The input and reference files for these tests are saved in testdata. To generate new testdata for these tests you can run the generate_testdata.sh script with an array of ethereum mainnet addresses. (Requires prior installation of foundry and pyevasm).

Dependencies

~200KB