HOT news!

Ошибка нулевого дня в майнинге биткоина

В механизме майнинга биткоина была обнаружена ошибка нулевого дня, о которой сообщил исследователь Лоик Морель. С момента запуска алгоритма майнинга в биткоине существовала вычислительная ошибка, позволяющая добывать блоки с высокой скоростью. 

Неисправность связана с механизмом корректировки сложности, который происходит каждые 2016 блоков, что примерно соответствует двум неделям. Узлы пересчитывают целевой показатель так, чтобы блоки появлялись каждые 10 минут, независимо от вычислительной мощности майнеров. Для этой корректировки узлы измеряют продолжительность последнего периода и сравнивают ее с целевым значением, равным 2016 x 600 = 1 209 600 секунд.

Однако, как объяснил Морель, в расчетах кроется ошибка. Узел сравнивает метку времени первого блока периода с меткой времени последнего, что инстинктивно кажется логичным. Но на самом деле это ошибка, так как между первым и последним блоками всего 2015 интервалов, а не 2016. 

Если обозначить t0 как метку времени первого блока, а t2015 как метку последнего, узел вычисляет прошедшее время как T = t2015 — t0. Таким образом, получается 2015 интервалов. Для получения 2016 интервалов необходимо использовать другую формулу: T = t2015 — t-1, где t-1 — метка времени последнего блока предыдущего периода. Эта ошибка называется «смещение на одну единицу» и вносит погрешность примерно в 0,05% в сторону слегка завышенной сложности.

Настоящая проблема заключается в том, что недочет приводит к тому, что периоды корректировки не перекрываются. Временная метка последнего блока одного периода не учитывается при расчете следующего. Это создает возможность для атаки «искривления времени». 

Суть атаки заключается в том, что майнер, контролирующий большую часть вычислительной мощности, устанавливает минимально допустимые временные метки для всех блоков за период, кроме последнего. В последнем блоке он назначает максимально допустимую временную метку. После завершения периода корректируется сложность, и из-за манипуляций злоумышленника измеренный период длится дольше, чем на самом деле, что приводит к снижению сложности.

Атакующий может повторять аналогичную манипуляцию в следующем периоде. Поскольку периоды не перекрываются, первый блок второго периода может иметь временную метку, относящуюся к прошлому, в то время как предыдущий блок имеет временную метку в будущем. Этот разрыв увеличивается от периода к периоду, и повторяя процесс несколько раз, злоумышленник теоретически может снизить сложность майнинга до уровня, при котором создается до шести блоков в секунду.

Морель отметил, что исправить эту проблему можно с помощью софтфорка в рамках BIP-0054. Инициатива подразумевает, что первый блок нового периода сложности имеет временную метку, которая не превышает временную метку последнего блока предыдущего периода более чем на два часа. Это ограничение восстанавливает некоторую форму непрерывности между периодами, предотвращает манипулирование временными промежутками и делает невозможной атаку «искажения времени».