Примерно в 16:30 UTC в среду, 1 июня, бета-кластер Mainnet компании Solana прекратил производство блоков в результате застопорившегося консенсуса, вызванного ошибкой в функции долговременных одноразовых транзакций. В течение следующих четырех с половиной часов операторы валидаторов работали над определением точки наибольшего прогресса и коллективно инициировали перезапуск сети, в результате чего долгосрочные одноразовые транзакции были временно отключены. Производство блоков возобновилось в 21:00 UTC в тот же день, и сетевые операторы продолжали восстанавливать обслуживание клиентов в течение следующих нескольких часов.
Примечание: Эта проблема не была связана с улучшениями в версиях 1.10 и 1.11. Подробнее об этих предстоящих улучшениях вы можете прочитать здесь.
Что стало причиной отключения электроэнергии?
Ошибка во время выполнения, вызванная функцией долговременных одноразовых транзакций, позволяла при определенном наборе обстоятельств дважды обрабатывать неудачную долговременную одноразовую транзакцию. Это привело к недетерминизму, когда валидатор обработал транзакцию во второй раз, и некоторые узлы отклонили последующий блок, в то время как другие приняли его. Критически важно, что более 33% валидаторов приняли блок, но это число не дотягивало до 66%, необходимых для согласования недетерминизма.
Как должны работать одноразовые транзакции и чем они отличаются от обычных транзакций?
Solana использует параллельную обработку непересекающихся транзакций для значительного повышения пропускной способности. Сети, которые обрабатывают транзакции последовательно, могут использовать увеличивающийся одноразовый номер; Solana использует другой метод, чтобы гарантировать, что транзакции не обрабатываются дважды. Для обычных транзакций, которые составляют более 99,99% транзакций в блокчейне Solana, сеть использует хэш последнего блока и ведет запись обработанных транзакций в этом окне, чтобы гарантировать, что дубликаты не обрабатываются.
Поскольку долгосрочные одноразовые транзакции предназначены для того, чтобы срок их действия не истекал, они требуют другого механизма для предотвращения двойной обработки и обрабатываются последовательно. В таких транзакциях используется значение в цепочке, специфичное для каждой учетной записи, которое меняется каждый раз, когда обрабатывается долговременная одноразовая транзакция. После того, как значение будет изменено, одна и та же долговременная одноразовая транзакция не сможет быть обработана снова.
Что случилось?
Обработка долговременной одноразовой транзакции при определенном наборе обстоятельств выявила ошибку во время выполнения, которая препятствовала продвижению сети. Эта ошибка требовала, чтобы длительная одноразовая транзакция завершилась неудачей и не была бы вызвана успешной транзакцией.
Долговременная одноразовая транзакция была обработана, в то время как ее блокчейн был еще достаточно свежим, чтобы транзакция обрабатывалась как обычная транзакция
Увидев недавнюю блокировку, среда выполнения предположила, что она обрабатывает обычную транзакцию, а не долговременную одноразовую транзакцию
Эта транзакция завершилась неудачей, и поскольку она не была обработана как долговременная транзакция, обработка не увеличила значение одноразового номера в цепочке, как предполагалось
Поскольку неудачная транзакция была успешно добавлена в блок, плата за ее транзакцию была выплачена
После того, как долговременная транзакция была обработана один раз и завершилась неудачей, ее все еще можно было обработать снова как долговременную транзакцию, поскольку значение одноразового номера, на которое она ссылалась, не было расширено и все еще можно было использовать.
После того, как неудачная транзакция была обработана, но до того, как одноразовый номер был использован снова, пользователь повторно отправил ту же транзакцию для обработки. Эта повторная отправка активировала ошибку во время выполнения.
Неудачная транзакция долговременного одноразового использования была повторно отправлена в кластер
Производитель блока неправильно принял эту транзакцию в блок, который он создавал, потому что значение одноразового номера в цепочке не было передано
Когда валидаторы проверили блок, часть обнаружила, что новый блок содержит транзакцию, которая ранее была обработана, вызванную включением этой долговременной одноразовой транзакции.
Один набор валидаторов отклонил блок, в то время как другой набор принял блок, поскольку предыдущий экземпляр транзакции больше не находился в их недавно обработанном кэше.
Критически важно, что более 33% валидаторов приняли блок, но это число не дотягивало до 66%, необходимых для согласования недетерминизма.
Что делается?
Функция долговременной одноразовой транзакции была отключена в версиях v1.9.28/v1.10.23, чтобы предотвратить остановку сети в случае повторения подобной ситуации. Долгосрочные одноразовые транзакции не будут обрабатываться до тех пор, пока не будет применено смягчение и функция не будет повторно активирована в предстоящем выпуске.
Источник информации и фото: https://solana.com/news/06-01-22-solana-mainnet-beta-outage-report-2
#криптовалюта #blockchain #solana