Обещание модульного будущего Ethereum звучит как «написал один раз, развернул везде». Разработчики ошибочно полагают, что смарт-контракт, работающий в Ethereum Mainnet, будет функционировать идентично в сетях Optimism, Arbitrum, Base или Moonbeam.
«EVM-эквивалентность» — это спектр, а не бинарное состояние. Сети второго уровня (L2) и сайдчейны — это отдельные операционные среды с уникальными архитектурными решениями для оптимизации скорости и стоимости. Эти оптимизации часто нарушают стандартные допущения Solidity-разработчиков, приводя к «тихим» сбоям и критическим уязвимостям при переносе кода.
Контракт, прошедший аудит для Ethereum Mainnet, не считается проверенным для деплоя в L2.
1. Минное поле опкодов
Фундаментальные переменные контекста ведут себя по-разному в разных сетях. Использование их для логики программы — основной источник кросс-чейн багов.
- block.difficulty / block.prevrandao: В Mainnet после The Merge это значение связано со случайностью Beacon Chain. В Optimistic Rollups на уровне исполнения нет майнинга или PoS-консенсуса. Следовательно, этот опкод часто возвращает константу (например, 0 или 1) или устаревшее значение из L1. Контракты, использующие это для псевдорандома, становятся детерминированными и уязвимыми в L2.
- block.coinbase: В Mainnet это адрес валидатора, создающего блок. В L2 с централизованными секвенсорами этот адрес часто фиксирован и принадлежит самому секвенсору. Механики вознаграждения msg.sender или третьих лиц через coinbase перестают работать корректно.
- block.number vs block.timestamp: Время блока в L2 значительно быстрее, чем 12 секунд в Mainnet (часто менее секунды). Оракулы TWAP (средневзвешенная цена по времени) и временные блокировки (Timelocks), рассчитанные в номерах блоков, в L2 пройдут экспоненциально быстрее, ломая финансовые модели и периоды безопасности.
2. Расхождение прекомпилов (Precompiles)
Ethereum Mainnet резервирует адреса с 0x01 по 0x09 для прекомпилированных контрактов (например, ecrecover, sha256). L2 используют более высокие адресные пространства для своих системных контрактов (мосты, оракулы газа).
Критические отличия:
- Отсутствие: Специфический криптографический прекомпил из Mainnet может просто отсутствовать в конкретной L2-сети.
- Тихий сбой (Silent Failure): Стандарт EVM диктует, что вызов пустого адреса возвращает успех (true) и отсутствие данных. Если ваш код вызывает прекомпил, которого нет в целевой сети, транзакция не отменится (revert). Она вернет пустые данные, что контракт может интерпретировать как валидный результат (например, криптографическая проверка вернет 0x0 и пройдет валидацию).
3. Смерть SELFDESTRUCT
Опкод SELFDESTRUCT активно выводится из употребления в Mainnet, но многие L2 уже изменили или полностью отключили его функционал.
В ряде крупных L2-сетей выполнение SELFDESTRUCT удаляет код контракта, но не переводит оставшийся баланс ETH на целевой адрес. Средства фактически сжигаются.
Контракты, полагающиеся на SELFDESTRUCT для механизмов аварийного вывода (Emergency Exit) или апгрейда архитектуры, при деплое в такие сети навсегда заблокируют пользовательские активы. Это необратимый сценарий отказа.
Вывод
Относиться к L2 как к «быстрому клону» Ethereum — стратегическая ошибка. Каждая сеть развертывания требует отдельного набора тестов и проверки безопасности, основанной на документации именно этой сети. Если вы не тестируете код в среде исполнения конкретного L2, вы не тестируете его вовсе.