Glamsterdam буксует: что сломалось в форке Ethereum и куда Виталик ведёт сеть дальше
Ethereum обновляется большими хардфорками примерно раз в год: в мае 2025 года вышла Pectra, в декабре — Fusaka с PeerDAS. Следующим должен был стать Glamsterdam. С 6 октября он работает в тестовой сети Sepolia, 26 октября его собирались включить во второй тестовой сети Hoodi, а затем в основной сети, возможно, уже в декабре.
Не вышло. 22 октября на созвоне разработчиков исполнительного слоя запуск в Hoodi отменили без новой даты, а в итогах созвона записано: форк в декабре 2026 года «очень маловероятен», ожидается 2027 год. Причина — два предложения по газу, EIP-8037 и EIP-8038. Ниже разбираем, что в них сломалось, почему спор оказался таким острым и что в это же время говорит о будущем Ethereum Виталик Бутерин.1
Зачем вообще меняют цену газа
Газ — это цена операций в Ethereum. Чем дороже операция для узлов сети, тем больше газа она должна стоить, иначе сеть можно перегрузить дешёвыми, но тяжёлыми действиями.
EIP-8037 решает проблему роста состояния — всего, что каждый узел обязан хранить: балансов, кода контрактов, их хранилища. По данным авторов, после того как лимит газа в блоке подняли с 30 до 60 миллионов, новое состояние стало прибавляться втрое быстрее, около 116 ГиБ в год. А лимит собираются поднимать дальше: вместе с Glamsterdam в Hoodi должны были включить график роста до 200 миллионов. Поэтому создание нового состояния дорожает в разы и учитывается отдельно: у транзакции появляется отдельный «резервуар» газа на создание состояния.
EIP-8038 поднимает цену доступа к состоянию. Последний раз её пересматривали в 2021 году, а с тех пор состояние сильно выросло и чтение из базы замедлилось.
Обе идеи разумны, и без них сеть трудно масштабировать. Проблема оказалась в другом месте: в контрактах, которые годами полагаются на старые цены.
Что именно ломается
Контракт часто вызывает другой контракт и, если тот упал, записывает неудачу: помечает платёж проваленным, переходит к следующему элементу пачки, выбирает запасной путь. Здесь есть известная атака — недостаточный газ. Злоумышленник нарочно даёт вызову слишком мало газа, вызов падает, а контракт навсегда записывает «провал» операции, которая при нормальном газе прошла бы.
Защита от этого держится на арифметике газа. Самый простой вариант — вообще без проверки:
(bool ok,) = target.call(data);
if (!ok) failed[id] = true; // запись в новый слот хранилища
По правилу из EIP-150 вызов получает не больше 63/64 оставшегося газа. Если вызов съел всё, у контракта остаётся лишь 1/64. Сегодня запись в новый слот стоит 22 100 газа, и этого остатка на неё просто не хватает: транзакция откатывается целиком, и «провал» не записывается. Защита срабатывает сама собой.2
ChainSecurity посчитала, что после Glamsterdam та же запись стоит 12 100 газа исполнения плюс 97 920 газа на создание состояния. Но вторая часть может оплачиваться из резервуара, который передаётся в вызовы целиком, а не по правилу 63/64. В итоге около 15 000 газа исполнения хватает, чтобы записать провал. Код контракта не изменился, но то, что раньше откатывалось, теперь успешно записывается навсегда.
Ethereum Foundation собрала все такие случаи в репозиторий из восьми «инвариантов» — допущений, которые перестают быть верными. Среди них:
- если вызов закончился газом, падает вся транзакция;
- газ, потраченный откатившимся вызовом, потерян;
- оставшийся газ только убывает, поэтому разница двух
gasleft()— это цена работы; - фиксированного запаса газа на операцию хватает.
Больше всего реальных находок пока по двум последним пунктам: захардкоженные бюджеты газа и запасы, рассчитанные на сегодняшние цены.3
Насколько это реально, хорошо видно по OpenZeppelin, самой популярной библиотеке смарт-контрактов. 7 ноября её команда проверила свой код по этим инвариантам. Проверку газа после вызова в ERC2771Forwarder можно обойти. PaymasterERC20 начнёт недобирать плату за газ, потому что обновление хранилища дорожает с 2 900 до 10 100 газа. Ещё по отдельному разбору получили кроссчейн-исполнитель и инициализаторы, которые используют делегирование EIP-7702.
Хронология
- 13 октября. ChainSecurity публикует разбор: после форка обработчики неудачных вызовов могут успешно завершаться там, где раньше откатывались.
- 22 октября, ACDE #248. Запуск в Hoodi отменён. На созвоне говорят о 13 крупных DeFi-проектах, которые могут пострадать; часть из них не ответила по каналам баг-баунти, а поиск был неполным. Дата основной сети отложена до полного анализа.
- 26 октября, ACDT #102. Позиция по умолчанию: затронутые контракты исправляются сами, менять спецификацию — только в крайнем случае. По итогам анализа, включая скан контрактов из Sourcify, значимых находок не нашли, и изменение спецификации называют очень маловероятным.
- 6 ноября. Ethereum Foundation просит разработчиков и аудиторов проверить свои проекты и сообщить о найденном.
- 7–8 ноября. Отчёт OpenZeppelin, публичные призывы не выпускать форк в нынешнем виде и два альтернативных предложения в репозитории EIP.
- 9 ноября. Ethereum Foundation сообщает о четырёх новых отчётах и признаёт «более широкую обеспокоенность» тем, что изменениям, затрагивающим неизменяемые контракты, не уделяют должного внимания.
Два лагеря
Спор не о том, есть ли проблема, а о том, кто должен её решать.
Одна позиция: протокол не может навсегда заморозить цены газа ради старых контрактов. Состояние растёт, сеть должна масштабироваться, и любое изменение стоимости операций рано или поздно что-то задевает. Отсюда и курс по умолчанию с созвона 26 октября: контракты подстраиваются, а спецификация меняется в последнюю очередь. Поначалу за быстрый запуск выступал и известный участник сообщества Райан Беркманс.
Другая позиция: многие контракты, которые держат деньги пользователей, неизменяемы, и «подстроиться» они не могут. Изменение, которое без единой правки байткода меняет поведение такого контракта, — это нарушение обещания, на котором стоит Ethereum. Исследователь безопасности pcaversaccio ещё 21 октября писал, что эти EIP могут вынудить контракты обновляться только ради того, чтобы вернуть задуманное поведение, хотя их байткод не менялся. 7 ноября Беркманс изменил мнение: по его словам, продолжать путь к скорейшей активации явно не стоит, и он ошибался, предлагая это.5
Между этими полюсами — варианты исправлений. Лео Глисич предложил версионированные опкоды: старые контракты работают по старым ценам, а новые цены применяются к новым опкодам. Джулио Ребуффо предложил разделить газ на кредиты исполнения и кредиты оплаты. Авторы самих EIP готовят точечные правки под каждый инвариант. Цена любого исправления — ещё больше сложности в и без того непростой модели газа.
Что дальше по Glamsterdam
У Ethereum Foundation расписан план на ближайшие дни:
- 13 ноября аудиторы Dedaub и ChainSecurity публикуют отчёты;
- 16 ноября их обсуждают на созвоне по тестированию, разработчиков приложений приглашают присоединиться;
- 19 ноября на созвоне ACDE обсуждают находки и следующие шаги.
При этом в посте отдельно сказано, что «никакое решение не предрешено». Если влияние на развёрнутые контракты окажется слишком широким, спецификацию изменят. Если нет — форк пойдёт в нынешнем виде, а контрактам придётся адаптироваться.
Hegotá: последний «обычный» форк
Пока Glamsterdam стоит, работа над следующим форком идёт полным ходом: на тех же созвонах уже утверждают его состав и запускают тестовые сети. На созвоне 29 октября предложили начать тестовые сети Hegotá с FOCIL, механизма против цензуры транзакций, и PeerDAS, а мелкие EIP добавлять следом. Как FOCIL уживётся с фреймовыми транзакциями, новым форматом для абстракции аккаунтов, разработчики обсуждают на Devcon.
В эссе «The cryptographic world computer» от 27 сентября Виталик Бутерин пишет, что Hegotá, запланированная на следующий год, скорее всего, станет последним «обычным» форком Ethereum. Его возможности, технологии и сам процесс разработки были бы понятны человеку из 2015 года. Всё, что после, — это рекурсивные STARK-доказательства, автоматическая формальная верификация, сильно оптимизированный консенсус и защита от квантовых компьютеров.
Главная мысль эссе: Ethereum после обновлений Lean называют блокчейном во многом по историческим причинам. Узлы уже не скачивают и не перевыполняют каждый блок, а выборочно проверяют данные через PeerDAS и проверяют SNARK-доказательство; блок строят несколько участников; доказательства с нулевым разглашением встроены в базовый слой. Отсюда и неожиданный для разработчиков вывод: структура вычислений начнёт стоить денег. Одна огромная последовательная транзакция обойдётся дороже, чем та же работа, разбитая на независимые части, которые можно распараллелить.6
ETH — средство сбережения, а не сжигаемый токен
В разгар спора о Glamsterdam, 8 ноября, Виталик опубликовал тред о ценности самого ETH. Его тезис: о ETH стоит думать как о средстве сбережения, а не как о токене, который ценен тем, что комиссии в сети сжигаются. Он приводит три причины. Сжигание как опора цены никогда не было таким сильным, как казалось. А попытка оптимизировать сеть под доход от комиссий потребовала бы от Ethereum решений, плохо совместимых с децентрализацией и устойчивостью к захвату.
В первой части треда он разбирает теорию, на которой держится образ сжигаемого токена: капитализация равна сжигаемым комиссиям, делённым на ставку дисконтирования. Как пересказывает The Block, по словам Виталика, сжигание «никогда не было настоящим полом» цены, а оптимизация под комиссии потребовала бы больших расходов протокола и вмешательского управления. Сам механизм сжигания из EIP-1559 он предлагает сохранить, но не держаться за него как за главный источник ценности.
Реакция разделилась. Сооснователь Solana Анатолий Яковенко согласился, что комиссии не могут быть продуктом: нужно выбрать то, что приносит людям пользу, и делать это хорошо. Критики спрашивают, как средство сбережения сочетается с тем, что предложение ETH продолжает расти.7
Эти две линии связаны. Если ETH ценен как надёжное средство сбережения, то главное, что должен обеспечить протокол, — безопасность, нейтральность и предсказуемость. Спор о Glamsterdam проверяет как раз предсказуемость: можно ли менять правила, на которые опираются работающие контракты, и кто решает, когда это допустимо.
Что делать разработчикам контрактов
Если вы пишете или поддерживаете контракты на Solidity, ждать решения 19 ноября не стоит:
- Пройдитесь по восьми инвариантам и проверьте, на что опирается ваш код. Начните с захардкоженных бюджетов газа и фиксированных запасов.
- Не полагайтесь на остаток газа после вызова как на признак того, что вызову не хватило газа.
- Не используйте разницу
gasleft()как меру стоимости работы. - Если нашли проблему, напишите на glamsterdam@ethereum.org: команда Ethereum Foundation собирает такие отчёты.
Как устроен газ, как писать и тестировать контракты так, чтобы они переживали изменения протокола, и как искать уязвимости до деплоя — разбираем на курсе «Solidity, Foundry и viem».
Курсы по теме
У каждого курса есть бесплатная часть: оставьте почту и начните сразу.
Solidity, Foundry и viem
Код, который хранит деньгиСредний уровень14 уроков бесплатно →