Калькулятор селекторов функций & топиков событий

Вставьте сигнатуру функции или события, чтобы получить её селектор и хеш топика, либо вставьте селектор из calldata, чтобы узнать, какой распространённой функции он принадлежит.

Имена параметров, function, indexed, memory и секция returns удаляются автоматически; uint превращается в uint256.

Вычисляется в вашем браузере на JavaScript. Адреса никогда не загружаются на сервер и не сохраняются.

Что такое селектор функции?

Селектор функции — это первые 4 байта хеша Keccak-256 от канонической сигнатуры функции: имя, за которым в скобках идут типы параметров без пробелов и имён, например transfer(address,uint256) → 0xa9059cbb. Он образует первые 4 байта calldata каждого вызова контракта и сообщает контракту, какую функцию выполнить; остальные байты — это ABI-кодированные аргументы.

Распространённые селекторы

Таблица вычисляется на этой странице той же реализацией Keccak, что и сам инструмент, поэтому она заодно служит самопроверкой. Вставьте любой селектор в поле выше, чтобы найти его.

Наглядный пример

Возьмём function approve(address spender, uint256 amount) external returns (bool). Уберите ключевое слово, имена параметров, видимость и тип возврата — получится approve(address,uint256). Keccak-256 этой ASCII-строки начинается с 0x095ea7b3…, значит селектор — 0x095ea7b3. Calldata для approve на 1 USDT (6 знаков) — это селектор, адрес spender, дополненный слева до 32 байт, и 1000000 как 32-байтное слово: 4 + 32 + 32 = 68 байт.

Селекторы ERC-20, которые встречаются чаще всего

СигнатураСелектор
totalSupply()0x18160ddd
balanceOf(address)0x70a08231
transfer(address,uint256)0xa9059cbb
transferFrom(address,address,uint256)0x23b872dd
approve(address,uint256)0x095ea7b3
allowance(address,address)0xdd62ed3e

Типичные ошибки

Принимаемые форматы ввода

Чтобы собрать или прочитать полную calldata, переходите к ABI-кодировщику / декодеру.

Часто задаваемые вопросы

Что такое селектор функции?

Первые четыре байта хеша Keccak-256 от канонической сигнатуры функции: имя плюс типы параметров без пробелов и имён, например transfer(address,uint256) → 0xa9059cbb. EVM использует его, чтобы направить вызов нужной функции.

Почему нужно писать uint256, а не uint?

Каноническая сигнатура использует полные имена типов. В Solidity uint — это псевдоним uint256, и хеширование псевдонима даёт неверный селектор. Этот инструмент автоматически переписывает uint/int и удаляет имена параметров и ключевые слова расположения данных.

Как записываются кортежи (структуры)?

Как списки типов в скобках: exactInputSingle((address,address,uint24,address,uint256,uint256,uint256,uint160)). Перечислите поля структуры по порядку; само имя структуры в сигнатуру не входит.

Что такое топик события?

Полный 32-байтный Keccak-256 от сигнатуры события, хранящийся как topics[0] в каждом логе, который это событие генерирует, например Transfer(address,address,uint256) → 0xddf252ad…. Индексированные параметры становятся topics[1..3].

Сколько всего возможных селекторов?

4 байта дают 232, то есть около 4,3 млрд возможных значений. При десятках тысяч известных сигнатур коллизии редки, но реальны; внутри одного контракта компилятор Solidity не допускает двух функций с одинаковым селектором.

Могут ли две функции иметь один селектор?

Да, коллизии существуют, поскольку используются только 4 байта; именно поэтому поиск может вернуть несколько сигнатур, а EVM не может различить их внутри одного контракта. Для неизвестных селекторов используйте публичные базы 4byte.directory и openchain.xyz.