Перейти к содержанию

Идентификатор сети

Руководство с приоритетом проверки: идентификаторы EVM-сетей, домены защиты legacy-транзакций от повтора по EIP-155, типизированные транзакции, CHAINID, проверки кошелька и RPC, домены EIP-712 и идентификаторы сетей вне EVM.

Обновлено

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

Краткий ответ

В экосистеме EVM идентификатор сети — это настроенное целое число, используемое как параметр домена защиты от повтора. EIP-155 связывает его с защищёнными подписями legacy-транзакций; типизированные форматы, например тип 2, включают его в собственную подписываемую нагрузку; CHAINID предоставляет его во время исполнения EVM; eth_chainId сообщает его через JSON-RPC. Это связанные интерфейсы, а не универсальный сертификат идентичности.

Глобальная уникальность и постоянство значения не гарантированы. Частные сети и спорные форки могут повторно использовать его, RPC способен сообщить ложное значение, а по одному адресу в разных сетях могут находиться разные код и состояние. В EIP-712 поле идентификатора сети в домене необязательно, а для необработанных сообщений и систем вне EVM действуют другие правила повтора и идентификации сети. Поэтому нужно точно установить схему подписи, конечную точку, генезис или контрольную точку и домен приложения.

Как это работает

  1. Сначала определите экосистему и смысл идентификатора: целое EIP-155 в EVM, домен EIP-712, пространство имён и ссылка CAIP-2, строковый идентификатор Cosmos, хеш генезиса Solana или другая схема. Не сравнивайте число без квалификатора между экосистемами.
  2. Зафиксируйте доверенный снимок сети: URL RPC, ожидаемый идентификатор сети в десятичном и шестнадцатеричном виде, генезис или финализированную контрольную точку, головной блок, конфигурацию клиента, codeHash ключевого контракта и время источника. Название и значок сети в кошельке — недоверенные метаданные.
  3. Для подписи EVM запросите eth_chainId и без потери точности разберите шестнадцатеричную величину JSON-RPC. Сравните нормализованное целое с ожидаемой конфигурацией и состоянием провайдера кошелька; не подменяйте его net_version и отклоняйте несовпадение до создания подписи.
  4. Точно восстановите домен подписи. Различайте незащищённые legacy-транзакции, защищённое legacy-кодирование EIP-155 и типизированные конверты; для EIP-712 проверяйте поля домена, verifyingContract, nonce и срок действия; для ретранслируемых намерений и намерений смарт-аккаунта исследуйте внутренний хеш протокола.
  5. Проверьте цель исполнения в активной сети: получателя, сумму, calldata, адрес токена, код контракта или реализацию прокси, nonce аккаунта, комиссии и смоделированное состояние. Идентификатор сети разделяет домены, но не подтверждает подлинность этих объектов.
  6. Считайте EIP-1193 chainChanged, смену аккаунтов и отключение жёсткими границами состояния. Сбросьте кэшированные котировки, разрешения, nonce, результаты симуляции и запросы подписи, перечитайте сеть и цель и отправляйте проверенную сырую транзакцию только в закреплённую конечную точку.
  7. Сверьте транзакцию в целевой сети: сырые подписанные байты и хеш, принятие RPC, статус квитанции, номер и хеш блока, использование nonce, изменения состояния и требуемую финальность. Отслеживайте расколы сети, изменение идентификатора, путаницу доменов L1/L2 и дрейф провайдера; при необъяснимом различии прекращайте операцию.

Примеры с расчётами

  • Шлюз между шестнадцатеричным и десятичным значениями RPC. Десятичный идентификатор Base равен 8453, а eth_chainId представляет его как 0x2105: 2 * 4096 + 1 * 256 + 0 * 16 + 5 = 8453. Ethereum Mainnet — 1 = 0x1, Arbitrum One — 42161 = 0xa4b1. Если кошелёк ожидает 8453, но получает 0x1, он должен прекратить операцию до подписи, а не доверять показанному названию сети.
  • Значение v защищённой legacy-транзакции. Для legacy-транзакций EIP-155 v = 35 + 2 * chainId + yParity. При идентификаторе 1 получаются 37 или 38, при идентификаторе 61157 или 158. Обратно, floor((37 - 35) / 2) = 1. Этот расчёт неприменим к полю y-parity типизированной транзакции и к незащищённым legacy-подписям со значениями 27 или 28.
  • Типизированная транзакция и отклонение не той сетью. Нагрузка типа 2 привязана к chain_id=8453. При 21,000 gas, базовой комиссии 20 gwei, максимальной приоритетной комиссии 2 gwei и максимальной комиссии 30 gwei эффективная цена газа равна min(30, 20 + 2) = 22 gwei, а комиссия — 21,000 * 22 gwei = 0.000462 ETH. Корректно проверяющая сеть с идентификатором 1 отклонит подписанную нагрузку из-за несовпадения домена, поэтому само отклонение не расходует газ в этой сети; в сети 8453 транзакция всё равно может завершиться неудачей по другой причине.
  • Система вне EVM и два идентификатора. Развёртывание Cosmos EVM может иметь строковый идентификатор Cosmos SDK local-1 и независимый целочисленный идентификатор EVM 262144 = 0x40000. Нативная подпись Cosmos использует строку вместе с номером и sequence аккаунта, а подпись EVM-транзакции — числовой домен. Solana вместо этого предоставляет хеш генезиса и использует недавний хеш блока или долговечный nonce в сообщениях транзакций, а не целое EIP-155.

Риски

  • Подключение не к той конечной точке RPC или не к той активной сети кошелька.
  • Доверие вредоносному RPC, который лжёт об идентификаторе, состоянии или результате отправки.
  • Путаница шестнадцатеричного и десятичного представления идентификатора.
  • Потеря точности при разборе большого идентификатора небезопасным числовым типом.
  • Использование net_version как безусловного эквивалента eth_chainId.
  • Пропуск EIP-1193 chainChanged или гонка при переключении сети.
  • Повторное использование кэшированных nonce, котировок, разрешений или симуляций после переключения.
  • Предположение о глобальной регистрации и отсутствии коллизий идентификаторов.
  • Подпись в частных сетях или форках, повторно использующих один идентификатор.
  • Отсутствие заданного поведения при смене или сохранении идентификатора после форка.
  • Принятие незащищённой legacy-транзакции без домена EIP-155.
  • Применение legacy-формулы v к типизированным транзакциям или другим подписям.
  • Предположение, что сырое сообщение или запрос personal_sign содержит домен сети.
  • Пропуск или неверное кодирование идентификатора в домене EIP-712.
  • Пропуск verifyingContract, nonce приложения, срока действия или назначения.
  • Доверие одинаковым адресам контрактов без сравнения кода и состояния.
  • Путаница доменов L1, L2, исходной и целевой сторон моста.
  • Игнорирование внутреннего домена ретранслируемого намерения, permit или операции смарт-аккаунта.
  • Восприятие метаданных добавления сети, меток обозревателя или значков как проверки подлинности сети.
  • Перенос семантики EVM на Cosmos, Solana, Bitcoin или другой протокол.

Распространённые заблуждения

  • Идентификатор сети — глобально уникальный и постоянный официальный регистрационный номер.
  • Верный идентификатор подтверждает подлинность RPC, сети и контрактов.
  • Каждая подпись Ethereum автоматически включает идентификатор сети.
  • Разные идентификаторы предотвращают повтор любого подписанного сообщения и намерения приложения.
  • Каждый блокчейн использует целочисленный идентификатор в стиле EIP-155.

Связанные темы

Источники

Навигация

Поиск по вики...