# Как узнать ABI неверифицированного контракта

By [Разнорабочий × 9kDAO](https://paragraph.com/@raznorabochiy) · 2023-08-15

---

Если вам попался контракт у которого на сайте скана пусто во вкладке Contract / Code и вы видите только байткод, ещё не всё так плохо, есть способ восстановить ABI из кода контракта.

Немного расскажу, как это работает.

При компиляции контракта имена всех методов становятся утерянными, они не нужны EVM, вместо них в байткоде можно увидеть четырёхбайтовый MethodID, который выглядит примерно так `0x8433e7f3`

Этот MethodID не что иное, как первые 4 байта от хеша Keccak-256 взятого от строки «имяМетода(типАргумента)»

Например Keccak-256("activateOrRefund(address)") даст нам хеш `0x8433e7f315e0fb49ae73d262618ba3d4540a76cf19bd515eceada64d21f6c6b9`

Возьмём от него первые 4 байта и получим `0x8433e7f3`, можете сами [поиграться и проверить](https://emn178.github.io/online-tools/keccak_256.html)

Существует большая база данных четырёхбайтных кусочков, по которой можно восстанавливать сигнатуры методов:

*   [ethereum-lists/4bytes](https://github.com/ethereum-lists/4bytes)
    
*   [4byte.directory](https://www.4byte.directory)
    

Есть один минус, так как четыре байта это не так много информации для точной идентификации, это приводит к коллизиям на большой выборке. Вот пример, когда для MethodID `a9059cbb` находятся [5 разных сигнатур](https://www.4byte.directory/signatures/?bytes4_signature=a9059cbb)

Существуют более удобные инструменты, которые вытаскивают из байткода все MethodID и ищут известные сигнатуры методов и формируют код ABI.

Одна из таких утилит [https://abi.w1nt3r.xyz/](https://abi.w1nt3r.xyz/) её минус в том, что она работает только для контрактов Ethereum

Попробуем проверить этот контракт: [0xf008eaad3760e2f0175f47a4d1d87e5c468bfd6d](https://etherscan.io/address/0xf008eaad3760e2f0175f47a4d1d87e5c468bfd6d#code)

Открываем [abi.w1nt3r.xyz](https://abi.w1nt3r.xyz/mainnet/0xf008eaad3760e2f0175f47a4d1d87e5c468bfd6d) и видим только одну расшифрованную сигнатуру: `0x56973ee5 IMPL()`

Скорее всего это прокси-контракт, открываем [https://etherscan.io/proxycontractchecker?a=0xf008eaad3760e2f0175f47a4d1d87e5c468bfd6d](https://etherscan.io/proxycontractchecker?a=0xf008eaad3760e2f0175f47a4d1d87e5c468bfd6d)

Находим реальную реализацию `0x8e357490dc8e94e9594ae910ba261163631a6a3a`

Опять пробуем и получаем все сигнатуры: [https://abi.w1nt3r.xyz/mainnet/0x8e357490dc8e94e9594ae910ba261163631a6a3a](https://abi.w1nt3r.xyz/mainnet/0x8e357490dc8e94e9594ae910ba261163631a6a3a)

Что делать если это не Ethereum, а какая-нибудь другая EVM-сеть?

Смотрим, что abi.w1nt3r.xyz под капотом использует библиотеку whatsabi - [https://github.com/shazow/whatsabi](https://github.com/shazow/whatsabi)

Можем написать простой код, в который нужно будет вставить только RPC и адрес контракта, а на выходе получим ABI:

![](https://storage.googleapis.com/papyrus_images/add6cf72be329c46967b5d6fccbb385700b9e0c291d9bd135e8d3989964444fc.png)

После написания этой статьи я решил написать веб-утилиту, похожую на abi.w1nt3r.xyz, но работающую с любыми EVM сетями, нужно только указать rpc url и адрес контракта — [https://whatsabi.surge.sh/](https://whatsabi.surge.sh/)

---

*Originally published on [Разнорабочий × 9kDAO](https://paragraph.com/@raznorabochiy/abi)*
