Событие слияния в сети Ethereum — это переход к модели консенсуса Proof-of-Stake из используемой в настоящее время модели Proof-of-Work. Это слияние означает, что текущая система основной сети Ethereum и новая цепочка Beacon, часто называемая Ethereum 2.0, сольются в одну цепочку блоков.
Для проверки слияния в декабре была развернута тестовая сеть Kintsugi. Цель тестовой сети — запускать различные пограничные случаи и наблюдать за поведением системы. Одним из разработчиков, участвующих в тестировании Kintsugi, является Мариус ван дер Вийден, основной разработчик Ethereum, работающий с клиентской командой Geth (Go-Ethereum).
«Тестнет работал без сбоев в течение пары недель. На прошлой неделе я создал фаззер, который отправлял недействительные блоки. Блок содержит много информации, например транзакции, хэш предыдущего блока, лимит газа и так далее», — говорит Мариус ван дер Вийден.
Некоторые реализации не выполняли и не проверяли блок
Фаззер — это распространенный тип инструмента тестирования, используемый разработчиками для генерации случайных входных данных для функций или других фрагментов кода и попытки заставить их так или иначе сломаться. Речь идет о создании искаженных и неожиданных входных данных и наблюдении за тем, что происходит с системой.
Фаззер, созданный ван дер Вейденом, создает допустимый блок и изменяет один его элемент, чтобы сделать его недействительным. Один из методов, который он использует, заключается в замене одного элемента другим. В этом случае фаззер изменил хэш блока на родительский.
«Узлы должны отклонять такой измененный блок. Однако, поскольку родительский хеш указывал на действительный блок, некоторые реализации фактически не выполняли и не проверяли блок, а вместо этого искали его в кэше. Поскольку предыдущий блок был действительным и в cache, они предполагали, что новый блок также действителен», — объясняет ван дер Вийден.
Сеть разделилась дважды
В результате половина сети, клиенты Geth, отклонили блок, а другая половина, клиенты Nethermind и Besu, приняли его, что привело к разделению цепочки, поскольку теперь у нас было два разных представления о правильном состоянии. Что еще хуже, была еще одна проблема.
По словам ван дер Вейдена, узлы цепочки гетов, в свою очередь, состоящую из Маяк-Гет, Призм-Гет, Лодестар-Гет, Нимбус-Гет и Теку-Гет, также разделены между собой.
«Это расщепление все еще исследуется, но похоже, что у Teku также может быть какой-то механизм кэширования, который дал сбой», — говорит ван дер Вийден.
Поскольку на момент написания статьи существует несколько разных форков тестовой сети Kintsugi, и каждый узел считает, что они находятся на правильном форке, сеть больше не завершается.
«Мы что-нибудь придумаем, чтобы восстановить сеть. Мы уже обновили клиент Nethermind, и теперь эти узлы находятся в правильной цепочке. Нам все еще нужно исправить Teku, так как более 33 процентов узлов являются Teku, иначе цепочка не будет завершена», — говорит ван дер Вейден.
Инцидент приносит пользу
По словам ван дер Вейдена, этот инцидент не запрещает и не задерживает дальнейшее тестирование слияния Ethereum, а также не задерживает само слияние. На самом деле, ван дер Вейден говорит, что этот инцидент действительно помогает тестировать крайние случаи, которые было бы трудно проверить, если бы сеть работала должным образом.
«Долгие периоды незавершенности являются сложной задачей для узлов, и для нас очень важно увидеть, как они ведут себя прямо сейчас. Мы думаем, что тестовая сеть в конечном итоге снова соберется, но я не думаю, что мы будем пытаться исправить это вручную, так как это дает нам возможность протестировать интересные пограничные случаи».
«Я не думаю, что это задержит слияние, так как слияние еще не запланировано. Но оно показывает, насколько важно тестирование. Я думаю, что слияние продвигается очень хорошо. приемлемое состояние, а затем нам понадобится пара месяцев на его тестирование», — говорит ван дер Вийден.
Что, если это произойдет в основной сети?
Интересный вопрос: что было бы, если бы в основной цепочке произошла подобная ошибка?
«Мы начали тестирование довольно рано, поэтому ожидали пару таких ошибок. Такая ошибка в основной сети была бы довольно неприятной, так как нам нужно было бы найти и исправить ошибку, в которой мы довольно хороши, выпустить код, а затем сообщите всем заинтересованным сторонам, что они должны обновить свои узлы. Последняя часть, на мой взгляд, самая трудная часть, поскольку некоторые пользователи не слишком внимательно следят за разработкой», — говорит ван дер Вийден.
Для получения более подробной информации заинтересованному читателю предлагается прочитать твиты Мариуса ван дер Вейдена об этом инциденте.
Источник