В среду в сети Ethereum произошел масштабный сбой. Изначально предполагалось, что он был вызван Infura, поставщиком инфраструктурных решений для Ethereum.
Infura перестал работать около 11:00 МСК, вместе с чем была нарушена функциональность таких популярных приложений, как Metamask, MakerDAO, Uniswap, Compound и MyCrypto. Вскоре после этого биржа Binance остановила вывод эфира.
Позже стало известно, что причина — в баге клиента Go Ethereum (Geth), используемого 80% приложений, который спровоцировал раскол сети на две цепи. В результате пользователи некоторое время взаимодействовали с разными версиями блокчейна Ethereum.
Позднее Infura и остальные обновили свои клиенты, что позволило восстановить работоспособность большинства сервисов, однако на выяснение причин и перевод инфраструктуры на актуальное ПО потребовалось несколько часов. Все они использовали старые версии Geth и оказались отделены от пользователей нового клиента в результате «неанонсированного хардфорка».
На фоне инцидента пользователи стали задаваться вопросами о децентрализации Ethereum и о том, почему разработчики Geth не скооперировались с другими командами для гладкого прохождения обновления. Разработчик обозревателя блокчейна Blockchair Никита Жаворонков считает «провал консенсуса» в среду самым серьезным инцидентом в Ethereum с момента форка The DAO в 2016 году.
Что произошло
Ведущий разработчик Ethereum Петер Силадьи опубликовал отчет по поводу инцидента, подтвердив, что хардфорк «был запущен преднамеренно». Представитель проекта Optimism, специализирующегося на масштабировании Ethereum, объявил, что именно его команда стоит за запуском хардфорка:
«Мы посмотрели на Etherscan и увидели, что почти все ноды обновились до версии с поддержкой фикса. Тогда мы решили протестировать баг. Теперь понятно, что это было глупо. Мы не осознавали влияние небольшого числа нод, которые не были обновлены».
Активация последнего обновления в сети Ethereum привела к возникновению двух цепей. В одной находились пользователи и сервисы, установившие обновленную версию Geth, в другой — не сделавшие этого. Никита Жаворонков говорит:
«Фикс был внедрен несколько месяцев назад, и только сегодня была осуществлена транзакция, вызвавшая раскол».
В Blockchair считали, что новая версия ПО Geth содержит «небольшое изменение кода» и не стали ее устанавливать, поскольку им потребовалось бы приостановить работу сервиса. Силадьи заявил:
«Команда Geth действительно изменила имплементацию консенсуса в релизе v1.9.17, однако команда не создавала никаких новых правил, о которых сообщество Ethereum не знало бы или с которыми не соглашалось бы».
Он добавил, что правила были установлены в предложении по улучшению Ethereum (EIP) три года назад.
Непредвиденные последствия
Изначально хардфорк задумывался ради решения проблемы в консенсусе, которую он и вызвал. Разработчик Джон Янг, недавно присоединившийся к экосистеме Ethereum, получил вознаграждение за обнаружение этой и еще одной уязвимости. Разработчик Geth Мартин Холст Свенде объявил, что они не стали предупреждать сообщество об изменениях, так как не хотели привлекать внимание к уязвимости. Основатель Thesis Мэтт Луонго заявил:
«Каждый крупный проект должен иметь контакты для уведомлений по поводу безопасности, что помогает проводить обновления слаженно и гладко. Когда хардфорки происходят без предупреждения, все, кто создает на Ethereum, включая нас, могут потерять деньги».
Thesis стоит за разработкой токенизированного биткоина tBTC. Луонго сообщил, что форк подверг риску активы пользователей tBTC, но не из-за раскола, а из-за неработоспособности сервиса, в результате которого держатели токена невольно могли нарушить свои финансовые обязательства.
Несмотря на вызванные форком проблемы, цена эфира после появления новостей выросла на 4,6%, а значит, трейдеры не видят в произошедшем угроз для долгосрочного благополучия Ethereum.
Разбор полетов
Жаворонков заявляет, что разработчики Geth сами не ожидали такого развития ситуации и, если бы могли предвидеть масштабный раскол, то наверняка объявили бы о хардфорке. Луонго разделяет это мнение, называя команду Geth «хорошими разработчиками, которым не хватает опыта обслуживания инфраструктуры и финансирования».
Жаворонков также отметил, что разработчики не имели злых намерений:
«Если бы Geth знали, что так может произойти, они подготовили бы руководство для операторов нод».
Представители сообщества продолжают недоумевать, почему о баге перед активацией форка для его устранения не знали даже в Infura, являющейся ключевым элементом экосистемы Ethereum. Силадьи пишет:
«Это, в некотором роде, серая зона. Требуется индивидуальное обсуждение в каждом конкретном случае. Мы согласны с тем, что прозрачность необходима и к ней следует максимально стремиться, но также важно разобраться во всех деталях, прежде чем покатятся головы. В случае Ethereum требуется много времени (недели, месяцы), чтобы операторы нод обновились даже к запланированному хардфорку. Подчеркивая, что релиз содержит важные фиксы консенсуса или DoS-атак, мы рискуем привлечь злоумышленников, которые попытаются вывести сеть из строя».
В конечном счете команда Geth решила, что раскрытие уязвимости повлечет слишком большой риск, и оставила ее в тайне. Силадьи говорит:
«Мы утверждаем, что это сработало, хотя обновление и приняло неожиданный поворот во время вчерашнего раскола сети».
Теперь разработчикам предстоит извлечь урок из произошедшего по вопросу координации клиентов на фоне приближения релиза Ethereum 2.0. Луонго заявил:
«Самое главное, что ребята прозрачны, признают ошибки и растут. Monero в прошлом хорошо справлялся с консенсусными багами, как делали это биткоин и Zcash. Есть множество примеров. Координировать всю отрасль всегда непросто, но избегать координации чрезвычайно опасно. Надеюсь, этот форк приведет к укреплению отношений и переосмыслению того, как проекты на базе Ethereum взаимодействуют с разработчиками клиентов».