НовостиКриптовалютыEthereum откладывает форк тестнета Hoodi: repricing газа в Glamsterdam ломает допущения контрактов

Ethereum откладывает форк тестнета Hoodi: repricing газа в Glamsterdam ломает допущения контрактов

Автор: Coindoo·

Ключевые выводы

  • •Основные разработчики отложили форк тестнета Hoodi для обновления Glamsterdam до устранения проблем, выявленных ChainSecurity; новая дата не объявлена.
  • •EIP-8037 и EIP-8038 существенно повышают стоимость операций с состоянием: запись в новый слот хранилища вырастает с 22 100 до 110 020 газа, а развёртывание кода — с 200 до 1 530 газа за байт.
  • •Неудачная транзакция делегирования EIP-7702 может опубликовать всё ещё действительную авторизацию, и если контракт-делегат позволяет кому угодно вызывать setup, злоумышленник может завладеть аккаунтом.
  • •Зафиксированные до форка объёмы газа могут стать недостаточными: переводы, укладывающиеся сегодня в 65 000 газа, могут потребовать более 150 000, чаще всего при отправке получателям впервые.
  • •Фонд называет переоценку предпосылкой для дальнейшего повышения лимита газа в рамках целевого показателя примерно трёхкратного роста базовой пропускной способности; предстоящие звонки разработчиков могут скорректировать оба EIP.
Ethereum откладывает форк тестнета Hoodi: repricing газа в Glamsterdam ломает допущения контрактов

Разработчик Ethereum Foundation Мариус ван дер Вейден сообщил в обновлении от 6 ноября, что основные разработчики не будут форкать тестнет Hoodi до устранения проблем, выявленных компанией безопасности ChainSecurity. Hoodi — это публичная тестовая сеть, в которой Ethereum репетирует изменения протокола до их попадания в мейннет. Он попросил разработчиков контрактов и аудиторов проверить свои проекты на соответствие восьми газовым инвариантам, которые ломает предстоящее обновление Glamsterdam. Газ — это единица, в которой Ethereum оценивает каждую операцию, выполняемую транзакцией, поэтому при изменении этих цен код, написанный под старые значения, может вести себя иначе, даже если сам код не менялся.

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

Два предложения меняют стоимость газа

Изменения обусловлены двумя предложениями. EIP-8037 повышает цену создания нового состояния — новых аккаунтов, слотов хранилища и развёрнутого кода — и учитывает её отдельно от обычного выполнения. EIP-8038 повышает цену чтения и обновления уже существующего состояния. По спецификации, с которой тестируется репозиторий, запись в новый слот хранилища вырастает с 22 100 газа до 110 020, обновление «тёплого» существующего слота — с 2 900 до 10 100, а развёртывание кода — с 200 газа за байт до 1 530. Эти цифры изменятся, если изменится спецификация.

Пауза в тестировании Glamsterdam последовала за обзором ChainSecurity от 13 октября, о чём уже сообщалось. Репозиторий расширяет эти находки собственным сканированием фондом контрактов, верифицированных в Sourcify — публичном реестре исходного кода контрактов, — а также офчейн-случаями, например программным обеспечением, читающим квитанции транзакций.

Замайненная транзакция больше не доказывает, что делегирование применено

EIP-7702 позволяет обычному аккаунту Ethereum выполнять код смарт-контракта путём подписания авторизации, указывающей на контракт-делегат. Механизм заработал с обновлением Pectra в 2025 году и лежит в основе функций смарт-аккаунтов, которые кошельки внедряют с тех пор. Авторизация предназначена для однократного использования. До Glamsterdam её полная стоимость взималась заранее, поэтому транзакция, которая не могла оплатить её, считалась недействительной и никогда не попадала в блок. Если транзакция была замайнена, делегирование было применено.

Запись INV-8 в репозитории объясняет, что меняет EIP-8037. Часть стоимости теперь зависит от состояния аккаунта и взимается только во время обработки авторизации. Делегирование с пустого аккаунта стоит 235 606 газа против 25 000 ранее. Транзакция с бюджетом по старому значению может быть принята, израсходовать газ при применении авторизации и попасть в блок со статусом «неудачная». Делегирование откатывается, как и увеличение nonce аккаунта — счётчика, отмечающего авторизацию как использованную. Однако подписанная авторизация теперь публична и остаётся действительной.

Само по себе это оставляет кошелёк ненастроенным, а не скомпрометированным. Опасность возникает, когда контракт-делегат позволяет кому угодно вызывать свою функцию setup. Тогда злоумышленник может повторно отправить раскрытую авторизацию в собственной транзакции, сначала вызвать setup и назначить себя владельцем аккаунта. Опережение авторизаций в публичном мемпуле было возможно и раньше. Суть в том, что неудачная транзакция теперь сама публикует действительную авторизацию, поэтому приватная маршрутизация не даёт защиты. Паттерн задокументирован с примером кода, затронутые кошельки не называются.

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

Газовые бюджеты часто находятся вне контракта

Самая широкая запись, INV-4, охватывает любое количество газа, зафиксированное до форка. Теперь оно может оказаться недостаточным где бы оно ни было записано: в коде контракта, значении настроек, подписанном сообщении или офчейн-программном обеспечении. Последняя группа включает релеи — сервисы, отправляющие транзакции от имени пользователей, — а также киперов и системы вывода средств бирж.

Чаще всего триггером становятся получатели впервые. Отправка токена на адрес с нулевым балансом создаёт новый слот баланса, а отправка ETH на пустой адрес создаёт новый аккаунт — и то и другое EIP-8037 оценивает значительно дороже. По данным репозитория, перевод, который сегодня укладывается в 65 000 газа, может потребовать более 150 000.

От того, где хранится фиксированное число, зависит тяжесть последствий нехватки. В офчейн-программах откатывается вся транзакция, и её можно отправить повторно с большим количеством газа. В контракте, его настройках или подписанном сообщении не проходит только внутренний вызов. Если внешний контракт перехватывает этот сбой, исход часто окончателен: сообщение сохранено как неудачное, колбэк пропущен или вознаграждения учтены неверно. Некоторые из этих чисел вообще нельзя изменить, включая мультисиг-транзакции, подписанные до форка, подписанные метатранзакции и уже находящиеся в пути межчейновые сообщения.

INV-7 распространяет ту же проблему на резервный газ. Функции transfer и send в Solidity передают фиксированные 2 300 газа, но принимающему контракту, записывающему новый слот хранилища, теперь нужно более 110 000. Очевидные кандидаты — смарт-кошельки, сплиттеры платежей и хранилища с логикой в функциях receive.

Пути выполнения, которые раньше откатывались, теперь могут завершиться

Анализ ChainSecurity от 13 октября объясняет, почему некоторые защиты, прошедшие более ранние аудиты, могут перестать работать. Контракты часто перехватывают неудачный внешний вызов, чтобы зафиксировать сбой, пропустить элемент или попробовать запасной вариант. Это становится опасным, когда кто-то намеренно предоставляет слишком мало газа — атака, называемая insufficient gas griefing, — потому что операция, которая должна быть повторяемой, помечается как окончательно неудачная.

Контракты обычно защищаются от этого двумя способами. Одни проверяют, сколько газа осталось после вызова. Другие полагаются на то, что обработчик сбоя слишком дорог для завершения. Glamsterdam ослабляет оба. EIP-8037 даёт транзакциям с лимитом газа выше 16 777 216 отдельный резервуар для расходов на хранилище, который обычная проверка gasleft() не видит. Откат вызова или очистка только что записанного слота также могут вернуть израсходованный газ. По словам ChainSecurity, «даже с неизменным кодом контракта путь выполнения, который ранее откатывался, теперь может завершиться».

Компания теперь не рекомендует делать выводы о причине сбоя вызова по оставшемуся газу. Её предпочтительный подход — позволить всей операции откатиться, где это возможно, либо сохранить путь восстановления вместо принятия необратимого решения на основе оставшегося газа.

Более ранний аудит сам по себе не закрывает этот пробел, поскольку он оценивал код по действовавшим на тот момент газовым правилам. Фонд привлек ChainSecurity и Dedaub в дополнение к внутренним аудитам, но в публикации от 6 ноября признаёт, что не может проверить каждый проект, особенно офчейн-код. На выбор решения влияют и проектные решения: лимит газа, хранящийся как настраиваемый параметр, можно просто повысить, а записанный как фиксированная константа может оставить перевёртывание и миграцию единственным путём.

Почему Ethereum продолжает переоценку

Аргумент фонда в пользу изменений основан на точности ценообразования. В руководстве от августа для разработчиков контрактов говорилось, что цены газа за операции с состоянием в последний раз корректировались при форке Berlin в 2021 году — том самом, который установил текущее разграничение цен «холодного» и «тёплого» чтения состояния. Состояние Ethereum — текущий учёт аккаунтов, балансов и хранилища контрактов, отслеживаемый узлами, — с тех пор значительно выросло, а недавние повышения лимита газа ускорили этот рост. В публикации переоценка названа предпосылкой для дальнейшего повышения лимита газа, а новый тариф выведен из целевого показателя производительности, поддерживающего примерно трёхкратный рост базовой пропускной способности.

В той же публикации сообщалось, что воспроизведение исторических транзакций мейннета по новым ценам оставило подавляющее большинство без изменений и что большинство выявленных проблем можно устранить повышением лимита газа. Обычным пользователям сообщили, что действий не требуется, поскольку обновлённые кошельки и инфраструктура обработают изменения. Ноябрьские находки придают больший вес последнему пункту. Работа с изменениями теперь включает проверку состояния аккаунта после неудавшегося делегирования и расчёт бюджетов релеев с учётом получателей впервые — то, чего старые газовые правила никогда не требовали.

Что решат следующие звонки основных разработчиков

Согласно репозиторию, фонд собирает отзывы перед следующим звонком All Core Developers — постоянным форумом, где согласуются изменения протокола Ethereum. В зависимости от реакции он может слегка изменить EIP-8037 и EIP-8038 или оставить их как есть. Hoodi остаётся без форка до устранения проблем, и публикация от 6 ноября не даёт новой даты. По той же публикации работа над Hegota — обновлением, запланированным после Glamsterdam, — продолжается параллельно.

До форка Hoodi: кто и что проверяет

  • Команды контрактов: вставьте адреса в поиск затронутых контрактов фонда, затем проверьте любой код, где жёстко заданы значения газа или логика ветвится по оставшемуся газу, независимо от того, числится ли он в списке.
  • Кошельки и RPC-провайдеры: обновите оценку газа под новый тариф. Фонд предупреждает, что кэшированные константы газа приведут к занижению стоимости и неудачным транзакциям.
  • Релеи, киперы и бандлеры: сделайте лимиты настраиваемыми и пересчитайте их по новым правилам с запасом, тестируя транзакции по обе стороны порога резервуара.
  • Аудиторы: в репозитории есть инструкции по запуску проверок с помощью ИИ-агента для кода, причём код и результаты остаются локально.

Сигналы, за которыми стоит следить: дата форка Hoodi в блоге фонда, любые изменения спецификаций обоих EIP и подтверждения исправлений от затронутых проектов. Фонд попросил команды сообщать о проблемах приватно на glamsterdam@ethereum.org, а не в публичных issue, чтобы проблемы можно было устранить до распространения деталей.

Эта статья изначально опубликована на Coindoo.