shazow / whatsabi

Extract the ABI (and resolve proxies, and get other metadata) from Ethereum bytecode, even without source code.
https://shazow.github.io/whatsabi/
MIT License
1.04k stars 71 forks source link

WIP: abiFromBytecode backends #62

Open shazow opened 11 months ago

shazow commented 11 months ago

Experimenting with more modular EVM disassembly backends.

shazow commented 11 months ago

Notes for current results:

 BENCH  Summary

  disassemble with whatsabi - src/__tests__/sevm.bench.ts > bench: whatsabi vs sevm > decompile '0x7a250d5630b4cf539739df2c5dacb4c659f2488d' ('Uniswap v2')
    3.15x faster than disassemble with sevm

  disassemble with whatsabi - src/__tests__/sevm.bench.ts > bench: whatsabi vs sevm > decompile '0x00000000006c3852cbEf3e08E8dF289169EdE581' ('Seaport v1.1')
    25.82x faster than disassemble with sevm

  disassemble with whatsabi - src/__tests__/sevm.bench.ts > bench: whatsabi vs sevm > decompile '0x4A137FD5e7a256eF08A7De531A17D0BE0cc7B6b6' ('Random unverified')
    4.43x faster than disassemble with sevm

  disassemble with whatsabi - src/__tests__/sevm.bench.ts > bench: whatsabi vs sevm > decompile '0x000000000000Df8c944e775BDe7Af50300999283' ('Has 0x0 selector')
    590.52x faster than disassemble with sevm
 ❯ src/__tests__/sevm.test.ts (4) 339ms
   ❯ whatsabi vs sevm: abiFromBytecode (4) 339ms
     ✓ decompile '0x7a250d5630b4cf539739df2c5dacb4c659f2488d' ('Uniswap v2') (1)
       ✓ compare selectors
     ✓ decompile '0x00000000006c3852cbEf3e08E8dF289169EdE581' ('Seaport v1.1') (1)
       ✓ compare selectors
     ✓ decompile '0x4A137FD5e7a256eF08A7De531A17D0BE0cc7B6b6' ('Random unverified') (1)
       ✓ compare selectors
     ❯ decompile '0x000000000000Df8c944e775BDe7Af50300999283' ('Has 0x0 selector') (1)
       × compare selectors

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Failed Tests 1 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯

 FAIL  src/__tests__/sevm.test.ts > whatsabi vs sevm: abiFromBytecode > decompile '0x000000000000Df8c944e775BDe7Af50300999283' ('Has 0x0 selector') > compare selectors
AssertionError: expected [ '0x83197ef0', '0xcc066bb8', …(1) ] to strictly equal [ '0x00000000', '0xf04f2707' ]

- Expected
+ Received

  Array [
-   "0x00000000",
+   "0x83197ef0",
+   "0xcc066bb8",
    "0xf04f2707",
  ]

Seems sevm fails to find the zero selector, and finds two extraneous selectors for that one example?