Материал проверен 12 ноября 2026?
БК

ГЛАВНАЯ / ИНСТРУКЦИИ / ERC-165: КАК КОНТРАКТ СООБЩАЕТ О ПОДДЕРЖИВАЕМЫХ ИНТЕРФЕЙСАХ

ERC-165: как контракт сообщает о поддерживаемых интерфейсах

ERC-165 даёт контрактам общий способ сообщать, какие интерфейсы они поддерживают. Идентификатор интерфейса вычисляется как XOR function selectors входящих в него функций, а проверка выполняется через supportsInterface(bytes4). Перед запросом конкретного ID сначала нужно убедиться, что контракт следует ERC-165, включая отрицательную проверку для 0xffffffff. Положительный ответ означает, что контракт объявляет поддержку интерфейса; он не удостоверяет безопасность или правильность каждой функции.

Как устроен интерфейс

Interface ID объединяет function selectors через XOR

В ERC-165 интерфейс – это набор function selectors из ABI. Каждый selector кодирует сигнатуру функции. Identifier вычисляется как побитовое XOR selectors функций, входящих в интерфейс. Порядок вычисления не меняет итог, но состав набора важен: дополнительные функции, события и типы возврата не входят в такой идентификатор автоматически.

У самого ERC-165 identifier равен 0x01ffc9a7. Стандарт резервирует 0xffffffff как invalid ID, который корректная реализация не должна подтверждать. Несколько наборов selectors теоретически могут дать одинаковый результат XOR, а намеренно написанный контракт может возвращать ожидаемые значения без полноценного поведения интерфейса. Поэтому identifier удобен для обнаружения, но не заменяет просмотр ABI и кода.

  • ID рассчитан из нужных function selectors
  • события и поля хранения исключены
  • совпадение ID не принято за аудит
Проверка ERC-165

Сначала подтвердите сам механизм supportsInterface

Стандартная процедура начинает с STATICCALL supportsInterface(0x01ffc9a7) с лимитом 30000 gas. Если вызов завершается ошибкой или возвращает false, ERC-165 не подтверждён. Если он возвращает true, выполняется ещё один запрос к 0xffffffff. Ошибка или true на invalid ID означает, что контракт не проходит предусмотренный probe.

При чтении через обозреватель или RPC убедитесь, что выбран правильный chain ID и адрес действительно содержит нужный контракт на проверяемой высоте. Для proxy отдельно учитывайте implementation и состояние на выбранном блоке. Не запускайте неограниченный внешний вызов в своём контракте только ради проверки интерфейса; безопасная реализация ограничивает gas и корректно обрабатывает revert.

  • ERC-165 probe ограничен по gas
  • invalid ID вернул false
  • target ID запрошен после probe
ШагЗапросОжидаемое поведение
1supportsInterface(0x01ffc9a7)true
2supportsInterface(0xffffffff)false
3supportsInterface(target ID)true означает заявленную поддержку
Проверка целевого интерфейса

После probe запросите нужный ID и подтвердите методы отдельно

После успешного probe можно спросить целевой interface ID. Например, распространённые интерфейсы NFT имеют собственные IDs, но соответствие нужно сверять с актуальной спецификацией, версией контракта и сетью. Для поддержки нескольких интерфейсов контракт может отвечать на несколько отдельных запросов.

supportsInterface не возвращает ABI, исходный код или список всех методов. False может означать отсутствие поддержки, несовместимый старый контракт или нестандартную реализацию. True может быть ошибочным или намеренно ложным. После обнаружения сверяйте фактическую сигнатуру, mutability, правила revert и влияние вызова на состояние.

  • сеть и высота блока записаны
  • proxy-контекст проверен
  • ABI и поведение сверены отдельно
Границы стандарта

Совместимость – это сигнал для клиента, а не гарантия результата

Интерфейс помогает приложению выбрать подходящий способ взаимодействия, но не доказывает, что функция соблюдает экономические ожидания или безопасно реализована. Контракт может проксировать выполнение, обновлять implementation, менять административные правила или намеренно возвращать некорректное значение. Проверяйте роль администратора и историю обновлений, если от этого зависит решение.

Если supportsInterface отсутствует, не пытайтесь сделать вывод о поддержке по одному совпавшему selector. Используйте ABI и документацию источника, статический анализ и тесты; для действий с активами отдельно проверяйте calldata и результат. Результат вызова всегда привязан к сети, адресу и блоку.

FAQ

Частые вопросы

Что именно складывается в ERC-165 interface ID?

XOR function selectors функций интерфейса. События и поля хранения сами по себе в этот набор не входят.

Зачем проверять 0xffffffff?

ERC-165 задаёт его как invalid ID; ответ true не проходит стандартную процедуру обнаружения.

True подтверждает аудит контракта?

Нет. Это заявление о поддержке интерфейса, а не оценка безопасности или корректности кода.

Почему вызов ограничен 30000 gas?

Именно такой предел использует стандартная процедура probe; ограничение защищает вызывающую сторону от чрезмерного расхода.

Можно ли доверять false?

Это означает, что данный вызов не подтвердил интерфейс в выбранном контексте; проверьте сеть, блок, proxy и реализацию.

Итоговая проверка

Чек-лист: erc-165: как контракт сообщает о поддерживаемых интерфейсах

  • адрес контракта и сеть перепроверены;
  • высота блока и proxy-контекст записаны;
  • ERC-165 ID запрошен с ограниченным gas;
  • invalid ID вернул false;
  • целевой interface ID получен из проверенной спецификации;
  • фактические ABI и поведение сверены отдельно;
  • ответ не принят за аудит кода.

Материал подготовлен редакцией сайта и проверен 12 ноября 2026 года. Условия бирж, кошельков и блокчейн-сетей могут меняться. Перед операцией сверяйте данные в интерфейсе выбранного сервиса.