Ви знаєте, як часто трапляються помилки в програмуванні? 🤔 Але коли це відбувається в алгоритмі майнингу біткоїна, то це вже зовсім серйозна справа! 🚀 Сьогодні ми поговоримо про одну таку помилку, яку виявив дослідник Лоік Морель.
Отже, проблема полягає в тому, що кожні 2016 блоків (або приблизно раз на дві тижні) вузли переобчислюють цілісний показник, щоб блоки з’являлися кожні 10 хвилин, незалежно від обчислювальної потужності майнерів 📊 Для цього вузли вимірюють тривалість останнього періоду, порівнюють з цілісним значенням (2016 х 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% в бік дещо завищеної складності 📈
Але справжня проблема полягає в іншому: недолік призводить до того, що періоди корекції не перекриваються — тимчасова метка останнього блоку одного періоду не враховується при розрахуванні наступного ⚡.
Ця проблема робить можливою атаку «искривлення часу» 🕰️ Її принцип полягає в тому, що майнер, який контролював більшу частину обчислювальної потужності, встановлював мінімально допустимі тимчасові метки для всіх блоків за період (крім останнього) 📊.
У останньому блоці періоду він штучно призначав максимально допустиму тимчасову метку 🕰️
Після завершення періоду коригувалася складність Через маніпуляції злоумышленника з метками, виміряний період тривав довше, ніж насправді
В результаті складність знижувалася 📉.
Атакувальник повторював аналогічну маніпуляцію в наступному періоді 🔄 Поскольку періоди не перекриваються, перший блок другого періоду атаки міг мати тимчасову метку, що відноситься до далекого минулого, в той час як попередній блок мав тимчасову метку в майбутньому 🕰️
Цей розрив збільшувався від періоду до періоду.
Повторюючи процес кілька разів, злоумышленник теоретично міг знизити складність майнингу до рівня, при якому створювалося до шести блоків в секунду (замість одного кожні 10 хвилин) 🚀!
«Наслідки були б жахливими: тимчасові блокування стають безглуздими, мережа перегружена, кількість реорганізацій збільшується, а підтвердження транзакцій втрачають цінність 📉 Все це дозволило б злоумышленнику збирати винагороду за блокування в бешеному темпі», — додав дослідник 🤑.
Атака була б неможливою, jika перший і останній блок двох послідовних періодів співпадали 📊.
Як виправити цю помилку? 🤔 Морель зазначив, що виправити проблему можна з допомогою софтфорка 🔄.
Ініціатива передбачає, що перший блок нового періоду складності має тимчасову метку, яка не перевищує тимчасову метку останнього блоку попереднього періоду більше ніж на два години 🕰️.
Це обмеження відновлює «дещо форму неперервності» між періодами, запобігає маніпулюванню тимчасовими проміжками і робить невиконимою атаку «искривлення часу» 🚫.
За матеріалами ForkLog