Удивительно, что такой серьезный баг мог присутствовать в алгоритме майнинга биткоина с момента его запуска 🚀! Исследователь Лоик Морель рассказал об этой проблеме, которая связана с механизмом пересчета целевого показателя каждые 2016 блоков 📊.
Каждые две недели узлы пересчитывают целевой показатель, чтобы поддерживать скорость появления новых блоков в сети — один блок каждые 10 минут, независимо от вычислительной мощности майнеров 📉 Для этой корректировки узлы измеряют продолжительность последнего периода и сравнивают его с целевым значением.
Именно в этих расчетах кроется ошибка, которая связана с измерением тайминга блоков в прошедшем периоде ⚡
Узел сравнивает метку времени первого блока периода с меткой времени последнего, но это оказывается ошибкой, поскольку между первым и последним блоками периода всего 2015 интервалов, а не 2016 📊.
Если обозначить t0 как метку времени первого блока, а t2015 как метку времени последнего, узел вычисляет прошедшее время как T = t2015 — t0 📊 Однако для получения 2016 интервалов необходимо использовать другую формулу: T = t2015 — t-1, где t-1 — метка времени последнего блока предыдущего периода.
Эта ошибка называется ошибкой «смещения на одну единицу» и вносит погрешность примерно в 0,05% в сторону слегка завышенной сложности 📉
Однако настоящая проблема кроется в другом — недочет приводит к тому, что периоды корректировки не перекрываются.
Майнер, который контролировал большую часть вычислительной мощности, может начать установку минимально допустимых временных меток для всех блоков за период (кроме последнего) ⚡ В последнем блоке периода он искусственно назначает максимально допустимую временную метку, что позволяет ему манипулировать временем и снижать сложность.
Повторяя процесс несколько раз, злоумышленник теоретически может снизить сложность майнинга до уровня, при котором создается до шести блоков в секунду (вместо одного каждые 10 минут) 🚀! Последствия были бы ужасными: временные блокировки бесполезны, сеть перегружена, число реорганизаций увеличилось, а подтверждения транзакций потеряли ценность.
Исправить эту ошибку можно с помощью софтфорка, который подразумевает, что первый блок нового периода сложности имеет временную метку, которая не превышает временную метку последнего блока предыдущего периода более чем на два часа 📊
Это ограничение восстанавливает «некоторую форму непрерывности» между периодами и предотвращает манипулирование временными промежутками.
Итак, мы можем сделать вывод, что безопасность биткоина зависит не только от его алгоритма, но и от внимания разработчиков и исследователей к таким проблемам 🐋 Надеюсь, эта ошибка будет исправлена в ближайшее время и сеть биткоина станет еще более безопасной и стабильной 💰!
По материалам ForkLog