pyevmasm
pyevmasm is an assembler and disassembler library for the Ethereum Virtual Machine (EVM). It includes a commandline utility and a Python API.
CLI Examples with evmasm
evmasm
is a commandline utility that uses pyevmasm to assemble or disassemble EVM:
usage: evmasm [-h] (-a | -d | -t) [-bi] [-bo] [-i [INPUT]] [-o [OUTPUT]] [-f FORK]
pyevmasm the EVM assembler and disassembler
optional arguments:
-h, --help show this help message and exit
-a, --assemble Assemble EVM instructions to opcodes
-d, --disassemble Disassemble EVM to opcodes
-t, --print-opcode-table
List supported EVM opcodes
-bi, --binary-input Binary input mode (-d only)
-bo, --binary-output Binary output mode (-a only)
-i [INPUT], --input [INPUT]
Input file, default=stdin
-o [OUTPUT], --output [OUTPUT]
Output file, default=stdout
-f FORK, --fork FORK Fork, default: byzantium. Possible: frontier,
homestead, tangerine_whistle, spurious_dragon,
byzantium, constantinople, serenity. Also an unsigned
block number is accepted to select the fork.
Disassembling the preamble of compiled contract:
$ echo -n "608060405260043610603f57600035" | evmasm -d
00000000: PUSH1 0x80
00000002: PUSH1 0x40
00000004: MSTORE
00000005: PUSH1 0x4
00000007: CALLDATASIZE
00000008: LT
00000009: PUSH1 0x3f
0000000b: JUMPI
0000000c: PUSH1 0x0
0000000e: CALLDATALOAD
Python API Examples
>>> from pyevmasm import instruction_tables, disassemble_hex, disassemble_all, assemble_hex
>>> instruction_table = instruction_tables['byzantium']
>>> instruction_table[20]
Instruction(0x14, 'EQ', 0, 2, 1, 3, 'Equality comparision.', None, 0)
>>> instruction_table['EQ']
Instruction(0x14, 'EQ', 0, 2, 1, 3, 'Equality comparision.', None, 0)
>>> instrs = list(disassemble_all(binascii.unhexlify('608060405260043610603f57600035')))
>>> instrs.insert(1, instruction_table['JUMPI'])
>>> a = assemble_hex(instrs)
>>> a
'0x60805760405260043610603f57600035'
>>> print(disassemble_hex(a))
PUSH1 0x80
JUMPI
PUSH1 0x40
MSTORE
...
>>> assemble_hex('PUSH1 0x40\nMSTORE\n')
'0x604052'
Installation
Python >=2.7 or Python >=3.3 is required.
Install the latest stable version using pip:
pip install pyevmasm
Or, install the library from source:
git clone https://github.com/trailofbits/pyevmasm
cd pyevmasm
python setup.py install --user
Documentation
https://pyevmasm.readthedocs.io
New issues, feature requests, and contributions are welcome. Join us in #ethereum channel on the Empire Hacking Slack to discuss Ethereum security tool development.