У механізмі майнінгу біткоїна виявили помилку нульового дня

У механізмі майнінгу біткоїна виявили помилку нульового дня

Від самого запуску в алгоритмі майнінгу біткоїна існувала обчислювальна помилка, яка дозволяла добувати блоки з украй високою швидкістю. Про це розповів дослідник Лоїк Морель.

Згідно з публікацією, несправність пов’язана з механізмом коригування складності.

Щоразу після 2016 блоків (приблизно раз на два тижні) вузли перераховують цільовий показник так, щоб один блок з’являвся кожні 10 хвилин незалежно від обчислювальної потужності майнерів. Для цієї корекції вузли вимірюють тривалість останнього періоду, порівнюють її з цільовим значенням (2016 x 600 = 1 209 600 секунд), а потім відповідно змінюють складність.

«Саме в цих розрахунках криється помилка. Щоб виміряти таймінг блоків у минулому періоді, вузол порівнює часову мітку першого блоку періоду з часовою міткою останнього. Інстинктивно це здається логічним, але насправді це помилка, оскільки між першим і останнім блоками періоду всього 2015 інтервалів, а не 2016», — пояснив Морель.

Якщо позначити t0 як часову мітку першого блоку, а t2015 як мітку останнього, вузол обчислює минулий час як T = t2015 — t0. Таким чином виходить 2015 інтервалів (від t0 до t1 > від t1 до t2 > … > від t2014 до t2015).

Щоб отримати 2016 інтервалів, потрібно використовувати іншу формулу: T = t2015 — t-1, де t-1 — часова мітка останнього блоку попереднього періоду.

Це називається помилка «зміщення на одиницю». Цей баг додає похибку близько 0,05% у бік дещо завищеної складності.

Втім, справжня проблема в іншому. Недолік призводить до того, що періоди коригування не перекриваються — часова мітка останнього блоку одного періоду не враховується під час розрахунку наступного.

Маніпуляція часом

Цей розрив робить можливою атаку «викривлення часу». Її принцип такий:

  1. Майнер, який контролює більшу частину обчислювальної потужності, починає встановлювати мінімально допустимі часові мітки для всіх блоків за період (окрім останнього).
  2. В останньому блоці періоду він штучно призначає максимально допустиму часову мітку.
  3. Після завершення періоду відбувається коригування складності. Через маніпуляції з мітками виміряний період виглядає довшим, ніж був насправді. У підсумку складність знижується.
  4. Зловмисник повторює аналогічну маніпуляцію в наступному періоді. Оскільки періоди не перекриваються, перший блок другого періоду атаки може мати часову мітку, що належить до далекого минулого, тоді як попередній блок має часову мітку в майбутньому. Цей розрив зростає від періоду до періоду.

Повторюючи процес кілька разів, зловмисник теоретично може знизити складність майнінгу до рівня, за якого створюється до шести блоків за секунду (замість одного кожні 10 хвилин).

«Наслідки були б жахливими: таймлоки стають марними, мережа перевантажена, кількість реорганізацій зростає, а підтвердження транзакцій втрачають цінність. Усе це дозволило б зловмиснику збирати винагороду за блок у скаженому темпі», — додав дослідник.

Атака була б неможливою, якби перший і останній блок двох послідовних періодів збігалися.

Як виправити цю помилку?

Морель зазначив, що проблему можна виправити софтфорком у межах BIP-0054.

Ініціатива передбачає, що перший блок нового періоду складності має часову мітку, яка не перевищує часову мітку останнього блоку попереднього періоду більш ніж на дві години.

Це обмеження відновлює «певну форму безперервності» між періодами, запобігає маніпуляціям часовими проміжками і робить атаку «викривлення часу» нездійсненною.

Источник: forklog.com.ua