| Фрагмент | Как читать | Чего он не доказывает |
|---|---|---|
| Первые 4 байта | Selector = первые байты Keccak-256 канонической сигнатуры | Единственное имя функции или безопасность кода |
| Байты с позиции 5 | ABI-кодированный tuple аргументов | Типы без внешней схемы ABI |
| Пустой input | Возможен простой перевод native asset или receive/fallback | Отсутствие исполнения contract code |
| Декодированная строка | Гипотеза ABI для конкретного адреса и блока | Что вызов успешно исполнится |
- Фрагмент
- Первые 4 байта
- Как читать
- Selector = первые байты Keccak-256 канонической сигнатуры
- Чего он не доказывает
- Единственное имя функции или безопасность кода
- Фрагмент
- Байты с позиции 5
- Как читать
- ABI-кодированный tuple аргументов
- Чего он не доказывает
- Типы без внешней схемы ABI
- Фрагмент
- Пустой input
- Как читать
- Возможен простой перевод native asset или receive/fallback
- Чего он не доказывает
- Отсутствие исполнения contract code
- Фрагмент
- Декодированная строка
- Как читать
- Гипотеза ABI для конкретного адреса и блока
- Чего он не доказывает
- Что вызов успешно исполнится
Selector — индекс функции, а не полный перевод транзакции
Каноническая сигнатура записывается как имя и типы без пробелов: например, тип uint для selector нормализуется до uint256, а return type не входит в хеш. Первые четыре байта слишком коротки, чтобы исключить коллизии. Публичная база сигнатур даёт кандидатов; авторитетный ответ даёт ABI кода, который реально исполнялся на нужном блоке.
Не смешивайте calldata с логами receipt. Input описывает запрос верхнего уровня, события — то, что контракты записали во время исполнения, а call trace показывает вложенные вызовы. Успешная декодировка input не заменяет разбор событий и call trace после транзакции.
ABI выбирают по коду и состоянию выбранного блока
Воспроизводимый разбор
- 1Зафиксировать контекст
Запишите chain ID, transaction hash, to, value, input и block number; pending-состояние пометьте отдельно.
- 2Определить исполняемый код
Проверьте bytecode адреса to на этом block tag. Для proxy найдите implementation или beacon по применимой схеме и сохраните оба адреса.
- 3Получить ABI
Берите ABI из воспроизводимо verified source либо compiler artifact той же реализации; не склеивайте интерфейсы разных версий.
- 4Сопоставить selector
Вычислите selector из каждой подходящей канонической сигнатуры и оставьте только точное совпадение первых четырёх байтов.
- 5Декодировать и проверить
Разберите аргументы по типам, нормализуйте address/amount/deadline/bytes, затем выполните eth_call с тем же block number, tag или hash. RPC должен хранить состояние выбранного блока; иначе historical call не является воспроизводимым.
Proxy особенно важен: внешняя транзакция адресована proxy, но delegatecall может исполнить implementation. Стандарт EIP-1967 задаёт известные storage slots, однако контракт может использовать другую схему. Проверяйте proxy, implementation и admin/upgrade boundary отдельно.
У dynamic types ABI хранит в основной области offsets, а содержимое строк, bytes, массивов и вложенных tuples — в хвосте. Поэтому визуальное разбиение по 32 байта ещё не даёт значений: offset должен указывать внутрь корректной длины payload, длины и padding должны согласовываться со схемой. Декодер, который молча подставил неверный tuple или обрезал хвост, может показать правдоподобные addresses и amounts. Сохраняйте raw input и воспроизводите декодирование второй библиотекой; расхождение считается stop-сигналом.
Когда результат можно считать подтверждённым
| Наблюдение | Вывод | Действие |
|---|---|---|
| ABI, selector и длина аргументов согласованы | Декодировка структурно возможна | Проверить смысл адресов, сумм, дедлайнов и вложенных bytes |
| Selector имеет несколько кандидатов | Имя не определено четырьмя байтами | Остановиться до ABI фактической реализации |
| Proxy implementation неизвестна на нужном блоке | Исполняемый интерфейс не установлен | Не переносить текущий ABI назад во времени |
| eth_call успешен | В выбранном state вызов не вернул revert | Не обещать включение, цену или идентичный будущий state |
| Аргументы содержат непонятный target/approval/delegatecall payload | Риск не классифицирован | Не подписывать; расшифровать вложенные данные |
- Наблюдение
- ABI, selector и длина аргументов согласованы
- Вывод
- Декодировка структурно возможна
- Действие
- Проверить смысл адресов, сумм, дедлайнов и вложенных bytes
- Наблюдение
- Selector имеет несколько кандидатов
- Вывод
- Имя не определено четырьмя байтами
- Действие
- Остановиться до ABI фактической реализации
- Наблюдение
- Proxy implementation неизвестна на нужном блоке
- Вывод
- Исполняемый интерфейс не установлен
- Действие
- Не переносить текущий ABI назад во времени
- Наблюдение
- eth_call успешен
- Вывод
- В выбранном state вызов не вернул revert
- Действие
- Не обещать включение, цену или идентичный будущий state
- Наблюдение
- Аргументы содержат непонятный target/approval/delegatecall payload
- Вывод
- Риск не классифицирован
- Действие
- Не подписывать; расшифровать вложенные данные
Итоговый артефакт разбора — chain ID, to, block tag, hash bytecode/implementation, источник ABI, каноническая сигнатура, selector, таблица аргументов в raw и нормализованном виде, value и simulation result. Перед подписью сопоставьте этот набор с тем, что показывает кошелёк: понятный интерфейс не меняет фактические байты.
Источники
Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.
- Solidity — Contract ABI Specification Solidity · Проверено 23 августа 2026 г. в 15:43 GMT+5
- Solidity — ABI encoding and decoding functions Solidity · Проверено 23 августа 2026 г. в 15:43 GMT+5
- EIP-1967 — Proxy Storage Slots Ethereum Improvement Proposals · Проверено 23 августа 2026 г. в 15:43 GMT+5
- Solidity — Contract Metadata Solidity · Проверено 23 августа 2026 г. в 15:43 GMT+5
- Ethereum Execution APIs — eth_call Ethereum Execution APIs · Проверено 23 августа 2026 г. в 17:07 GMT+5
