Что такое селектор функции?
Селектор функции — это первые 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 |
Типичные ошибки
- Хеширование
uintвместоuint256.transfer(address,uint)даёт другое значение; каноническая форма всегда указывает разрядность полностью. - Имена параметров или пробелы в сигнатуре.
transfer(address to, uint256 amount)— не каноническая сигнатура. - Имя структуры вместо кортежа. Структуры записываются как типы их полей в скобках, а не как
MyStruct. - Путаница между селектором и топиком. У функций 4 байта; у событий — полный 32-байтный хеш.
Принимаемые форматы ввода
transfer(address,uint256): каноническая форма.function transfer(address to, uint256 amount) external returns (bool): объявление Solidity; имена, видимость и returns удаляются.event Transfer(address indexed from, address indexed to, uint256 value): ключевое словоindexedпри вычислении топика игнорируется.0xa9059cbbили 32-байтный топик: обратный поиск по встроенному списку.
Чтобы собрать или прочитать полную calldata, переходите к ABI-кодировщику / декодеру.