EVM-эквивалентность: что значит EVM-equivalent и чем это отличается от EVM-compatible

EVM-эквивалентность (EVM-equivalence) — это свойство сети (обычно L2-роллапа), при котором её исполнительная среда повторяет поведение EVM максимально точно на уровне байткода, опкодов, газа и предкомпилов. Идея в том, что клиент Ethereum L1 мог бы, по сути, выполнить блоки такой сети без изменений логики EVM.

Чаще всего термин используется в контексте L2: одни решения называют себя *EVM-compatible*, другие — *EVM-equivalent*. Для разработчиков и протоколов эта разница важна: от неё зависят переносимость кода, инструменты и тонкие детали безопасности.

EVM-эквивалентность: что значит EVM-equivalent и чем это отличается от EVM-compatible

Что такое EVM-эквивалентность

Под EVM-эквивалентностью обычно подразумевают:

  • тот же набор опкодов и та же семантика их выполнения;
  • те же правила по газу (стоимость опкодов, учёт памяти, storage, «тёплых»/«холодных» доступов);
  • тот же набор предкомпилированных контрактов (precompiles) с тем же поведением и газ-формулами;
  • такое же поведение по стеку, памяти, storage, ограничениям по глубине стека и рекурсии;
  • предсказуемое соответствие полей блока/контекста (timestamp, basefee, chainid и т.д.).

Другими словами, байткод, который валиден и корректно работает на Ethereum L1, должен вести себя идентично на EVM-equivalent L2 (с учётом разницы в окружении: номер сети, адреса системных контрактов, параметры L2-специфичных протоколов).

EVM-equivalent vs EVM-compatible vs EVM-like

Обычно различают три уровня близости к EVM:

  • EVM-equivalent
    • цель — воспроизвести EVM «по жёлтой бумаге» (Yellow Paper);
    • любой контракт, скомпилированный под Ethereum, работает без изменений;
    • инструменты низкого уровня (дебаггеры, трейсеры, формальная верификация) могут использовать те же предположения, что и для L1.
  • EVM-compatible
    • сеть поддерживает Solidity / Vyper и большую часть экосистемы инструментов;
    • но могут отличаться:
      • набор precompiles;
      • стоимость газа;
      • поведение отдельных опкодов или ограничения;
      • некоторые поля контекста;
    • переносимость кода обычно высокая, но возможны “подводные камни” в оптимизациях и криптопротоколах.
  • EVM-like / EVM-inspired
    • архитектура напоминает EVM, но:
      • другие типы транзакций;
      • другие системные вызовы;
      • нестандартные расширения (например, дополнительные регистры, параллельное исполнение, иной формат блоков);
    • требуются более заметные изменения в инструментах и коде.

Маркетинг часто сглаживает грань между этими терминами, поэтому разработчику важно смотреть на конкретные детали реализации, а не только на словам «совместимый».

Почему EVM-эквивалентность важна для L2

Для L2-роллапов (см. обзор L2-rollups и Layer2) ставка на EVM-equivalence даёт несколько преимуществ:

  • Максимальная совместимость с существующим стеком

Hardhat, Foundry, Truffle, OpenZeppelin, аудитные тулзы, формальные проверки — всё это можно использовать «как есть», без форков и костылей.

  • Простота миграции протоколов

DeFi-, NFT-, инфраструктурные протоколы могут переносить свои контракты практически без переписывания логики и без глубокого ре-дизайна.

  • Проще безопасность и аудит

Аудиторы уже знают поведение L1-EVM. Если L2 строго ему соответствует, меньше «сюрпризов» из-за необычной семантики или нестандартных precompiles.

  • Прозрачность для пользователей и экосистемы

Если L2 ведёт себя как «ещё одна EVM-среда», пользователям и кошелькам проще поддерживать её наряду с другими сетями.

Требования к EVM-equivalent сети

Чтобы сеть можно было честно называть EVM-equivalent, она должна соблюсти ряд технических требований:

  • Полное покрытие опкодов

Все стандартизованные опкоды должны:

  • существовать;
  • иметь ту же семантику (включая пограничные случаи и поведение при ошибках).
  • Совместимая модель газа

Стоимость:

  • арифметических операций;
  • операций памяти (MLOAD/MSTORE и расширение памяти);
  • операций storage (SLOAD/SSTORE, warm/cold доступы);
  • precompiles

— должна соответствовать L1-модели, либо иметь документированные и предсказуемые отличия.

  • Те же precompiles

Наличие и поведение предкомпилов (ecRecover, SHA256, RIPEMD160, alt_bn128, BLAKE2, KZG и т.д.) — критично для криптопротоколов. Любое отличие должно быть явно описано.

  • Совместимая модель состояния и DA

Хотя слой Data Availability может быть реализован иначе (см. решения DA для L2), для контракта модель account-based и Merkle/PATRICIA-структуры должны выглядеть привычно.

  • Предсказуемый контекст блока

Параметры block.timestamp, block.number, block.chainid, basefee, лимиты газа блока и прочие поля должны вести себя либо так же, как на L1, либо чётко документированно отличаться.

Зачем некоторым L2 достаточно EVM-совместимости, а не эквивалентности

Не все L2 стремятся к строгой эквивалентности. Причины:

  • Оптимизация под zk-доказательства или высокую пропускную способность

Для zk-rollup’ов иногда выгодно слегка изменить семантику или добавить специальные precompiles, чтобы ускорить генерацию доказательств и снизить стоимость.

  • Новые функции протокола

Некоторые сети вводят расширения:

  • дополнительные системные контракты;
  • новые типы транзакций;
  • особые модели комиссий или приоритизации транзакций.
  • Упрощение реализации

Строгая эквивалентность к полноценному L1-EVM может усложнять реализацию L2. В некоторых случаях разработчики выбирают «чуть упростить» EVM ради меньшей сложности кода.

Для dApp’а это означает, что:

  • обычный Solidity-код, как правило, будет работать;
  • но низкоуровневые допущения (о газе, precompiles, лимитах) нужно проверить отдельно.

На что смотреть разработчику при выборе L2

Если протокол завязан на детали EVM, полезно пройтись по чек-листу:

  • Требуется ли строгая эквивалентность (например, для сложных DeFi-протоколов, формальной верификации, кастомных VM-интеграций)?
  • Совпадают ли газ-модели с L1 или протокол чувствителен к стоимости отдельных операций?
  • Используете ли вы специфические precompiles (pairing, KZG, BLAKE2) и как они реализованы в целевой сети?
  • Есть ли отличия в контексте блока (например, упрощённый или синтетический block.timestamp)?
  • Поддерживаются ли ваши любимые инструменты без форков или требуются адаптации?

Чем ближе сеть к EVM-equivalent, тем меньше «сюрпризов» при миграции и тем проще сопровождать код.

См. также

Task Runner