
По данным исследователя Лоика Мореля, с момента запуска в алгоритме майнинга биткоина присутствовала вычислительная неточность, которая теоретически позволяла добывать блоки с аномально высокой скоростью.
Как отмечается в его анализе, проблема связана с механизмом пересчета сложности сети.
Каждые 2016 блоков (примерно раз в две недели) узлы корректируют сложность так, чтобы среднее время создания блока оставалось на уровне 10 минут вне зависимости от общей вычислительной мощности майнеров. Для этого они измеряют длительность предыдущего периода и сравнивают ее с целевым значением (2016 × 600 = 1 209 600 секунд), после чего соответствующим образом изменяют сложность.
По словам Мореля, ошибка возникает именно на этапе измерения времени. Узел сравнивает метки времени первого и последнего блока периода, что выглядит логично, но на деле некорректно: между ними не 2016, а 2015 интервалов.
Если обозначить метку времени первого блока как t0, а последнего — как t2015, то расчет выполняется по формуле T = t2015 — t0, что учитывает только 2015 промежутков (t0→t1, t1→t2 и так далее до t2014→t2015).
Чтобы получить корректные 2016 интервалов, необходимо использовать другую формулу: T = t2015 — t−1, где t−1 — время последнего блока предыдущего периода.
Такой дефект известен как ошибка «смещения на единицу» и приводит к небольшой погрешности — около 0,05% в сторону слегка завышенной сложности.
Однако ключевая проблема заключается в другом: из-за этой неточности периоды пересчета не перекрываются, поскольку временная метка последнего блока одного периода не учитывается при расчете следующего.