Из-за хардфорка Constantinople аналитический сервис BlockCypher временно остался без API эфириума. В своей статье на Medium CEO BlockCypher Кэтрин Николсон объясняет, почему это произошло, какие уроки из этого можно извлечь, и что это в целом говорит об экосистеме эфириума.
Эфириум объявил о хардфорке Constantinople в середине декабря 2018 года — он должен был состояться 15 января 2019 года. Разработчики эфириума заявили, что «предстоящий форк станет наименее насыщенным событием в истории эфириума». Мы не согласились: хардфорк влиял на сотни исходников. Следуя инструкциям Ethereum Foundation мы активно начали готовится к этому событию. Подготовка также предполагала изменения в наших резервных копиях. Мы работали во время рождественских каникул и завершили работу на первой неделе января 2019 года.
Мы думали, что были готовы.
8 января: что-то пошло не так.
В ночь на 8 января мы поняли, что что-то не так с данными эфириума, но мы не знали, что именно. Мы получили ошибку, которая говорила, что пропал какой-то небольшой фрагмент данных. Состояние эфириума довольно загадочная вещь — все данные хэшируются в дереве — и мы не могли понять, что именно было не так.
Мы попытались провести несколько процедур восстановления — безуспешно. Мы продолжали получать ошибку отсутствующих данных (нода префиксного дерева, Trie).
Мы начали процесс «быстрой» синхронизации, для завершения которой потребовалось более двух дней. К сожалению, это не помогло нам восстановить недостающие данные и не восстановило наше состояние.
Сразу отвечу на возможные вопросы:
- Почему быстрая синхронизация не сработала? Потому что она включает в себя только небольшое подмножество данных всего блокчейна. Чтобы обеспечить надёжную работу с нашими API, нам нужны все данные.
- Почему мы не сделали резервную копию состояния перед обновлением Constantinople? Мы сделали, но она было частично повреждена восстановлением. Кроме того, состояние эфириума не является базой данных, которая может быть просто скопирована и исправлена. Это не может быть сделано, когда нода эфириума онлайн, это не может быть сделано постепенно (а ещё это весит больше терабайта).
Урок №1: Состояние эфириума сильно отличается от состояния других блокчейнов. Его нельзя восстановить никаким традиционным методом резервного копирования.
Начался долгий, очень долгий путь к полной синхронизации
12 января мы начали «полную» синхронизацию состояния эфириума, которое весило более 2 терабайт. Зная размер, с которым нам придётся работать, мы обзавелись самыми ёмкими из доступных машин, чтобы ускорить синхронизацию. Это не очень помогло. Наши проблемы усугублялись тем, что в этом процессе нет прозрачности, — мы не знали о нашем статусе в обновлении и не имели никакой информации по обновлению наших клиентов.
Мы остались в беспомощном ожидании.
14 января — за день до предполагаемого харфорка Constantinople — всё отменилось. По-видимому, аудит безопасности обнаружил уязвимость, которая может позволить потенциальному злоумышленнику украсть криптовалюту из смарт-контракта. Отмена в последнюю минуту стала невероятно деморализующей для нас. Если бы мы ждали активации Constantinople ПОСЛЕ того, как он вступил в силу, мы бы сэкономили невероятное количество времени и средств... и наш API эфириума работал бы.
Урок №2: не планируйте заранее обновления эфириума. Подождите, пока они не произойдут.
А через две недели мы узнали, что «полная» синхронизация на самом деле не является восстановлением полного состояния.
Через две недели наше состояние эфириума было восстановлено, но это не было концом наших бед. Как оказалось, полная синхронизация по умолчанию НЕ включает полное состояние Trie. Если вы делаете полную синхронизацию, почему настройка по умолчанию НЕ включает всё? Это не поддается логике. Нашей следующей задачей было выяснить, как добавить состояние Trie в наше «полное» состояние.
Виталик, помоги!
Изучив все возможные способы добавления состояния Trie в наше состояние эфириума, мы попросили Виталика о помощи. Его первый комментарий к нам был: «О, вы одни из немногих, кто управляет одной из этих больших, страшных нод». Мы спросили его, знает ли он кого-нибудь, кто управляет «большой, страшной нодой», чтобы посмотреть, сможем ли мы синхронизироваться с ним. Он никого не знал, даже Ethereum Foundation не хранит полную архивную копию эфириума. Мы снова запустили полную синхронизацию, на этот раз с включенным состоянием Trie.
Урок №3: В случае реорганизации сети мы, возможно, единственные, кто знает всю историю транзакций эфириума.
Что мы делаем, чтобы это не повторилось?
Нам стало ясно, что состояние эфириума сильно отличается от любого другого блокчейна: нет возможности откатить блоки, нет простого восстановления состояния и нет простого способа резервного копирования состояния. Как только мы с этим разобрались, возник вопрос: как мы можем предотвратить это в будущем? Краткий ответ: с этого момента мы будем ждать до тех пор, пока не вступит в силу обновление эфириума, чтобы обновить резервные копии. Более длинный ответ заключается в том, что мы сделали непрерывное ступенчатое дублирование состояний, чтобы нам больше никогда (тук-тук по дереву) не пришлось выполнять полную синхронизацию.
Как мы уже видели много раз, блокчейны сталкиваются с трудностями роста. Некоторые из блокчейнов более проблемны, и мы получили очень болезненный урок с Constantinople. Когда хардфорк был наконец-то активирован 28 февраля, это было почти легко!