Как работает алгоритм регулировки сложности Ethereum
В этой статье объясняется алгоритм регулировки сложности, используемый в Ethereum с момента выпуска Homestead 14 марта 2016 года. Подробно рассматривается достижение среднего времени решения блока 15 секунд.
Обзор
Перед выпуском Homestead у Ethereum была проблема с таргетингом на блоки: он полагался на среднюю цель в 13 секунд, но среднее значение дрейфовало все выше и выше.
Почему?
Майнеры обнаружили, что они могут добывать блоки с отметкой времени ровно на одну секунду выше, чем у предыдущего блока (родительского блока), в результате чего достигается более высокая сложность, чем у других блоков, которые могут быть решены, что дает их решению приоритет над другими форками.
Таким образом, использование этого метода расшифровки блоков было в экономических интересах майнеров, даже если это означало, что в среднем время на расшифровку блоков увеличивалось.
Для борьбы с этим в рамках EIP 2 был предложен совершенно другой алгоритм регулировки сложности.
Предложения по улучшению Ethereum (EIP)
Предложения по улучшению Ethereum, или EIP, являются эквивалентом запросов на комментарии (RFC) в Ethereum: они представляют собой предлагаемые стандарты для функций и улучшений экосистемы Ethereum.
Официальный сайт EIP содержит список всех EIP и их текущее состояние.
EIP 2 содержал четыре отдельных раздела, каждый из которых касался проблемы с Ethereum. Четвертый раздел (упоминаемый здесь как EIP2 / 4) - это основная тема статьи: изменение алгоритма регулировки сложности Ethereum.
Новый алгоритм: окно в 10–20 секунд
block_diff = parent_diff + parent_diff // 2048 *
max(1 - (block_timestamp - parent_timestamp) // 10, -99) +
int(2**((block.number // 100000) - 2))
Примечание: оператор //
относится к простому делению (например, 6 // 2 == 3
)
Приведенная выше формула может показаться сложной, но логику можно разбить следующим образом:
- Если блок решен менее чем за 10 секунд, увеличьте сложность.
- Если блок решается более чем за 20 секунд, уменьшите сложность.
- Если блок решается где-то между 10 и 20 секундами, ничего не делайте.
Это усреднение 10–20-секундного окна за длительные периоды, которое приводит к 15-секундной цели.
Само временное окно находится в этой части кода:
max(1 - (block_timestamp - parent_timestamp) // 10, -99)
Написано где d
- «разница», формула в повседневной математике будет выглядеть так: max(1 - (d/10), -99)
. В формуле предполагается, что результат деления d/10
является целым числом, а не десятичным, поэтому в случае девяти секунд 9/10 оценивается как 0, а не 0,9.
Оценка различных входов для block_timestamp - parent_timestamp
показывает возможный диапазон:
- 0–9 секунд оценивается как
max(1 - 0, -99)
🠂max(1, -99)
🠂1
- 10–20 секунд оценивается как
max(1 - 1, -99)
🠂max(0, -99)
🠂0
- 20+ секунд падает все ниже и ниже до минимальной границы
-99
Визуализация окон корректировки сложности
Глядя на тенденцию ступенчатого движения вверху, читатель может заметить, что предел сложности равен 1 для увеличения сложности, но уменьшение сложности чрезвычайно велико: Ethereum способствует быстрому уменьшению сложности в случае длительного времени решения.
Собственно, в этом суть алгоритма. Даже если множитель умножить на 2048 для увеличения сложности этого блока: вот и все. Но уменьшение сложности масштабируется намного быстрее.
А как насчет бомбы?
Часть формулы, которую мы до сих пор не приводили, такова:
int(2**((block.number // 100000) - 2))
Это «бомба сложности», которая увеличивает сложность решения блоков каждые 100 000 блоков.
Опять же, поскольку это целочисленная математика, если номер блока равен 302 000, тогда формула оценивается как 2 ^ (3–2), 2¹ или 1.
Таким образом, число здесь будет изменяться только с шагом в 100 000 блоков, обеспечивая возрастающую сложность, увеличивающуюся с течением времени, независимо от разницы во времени между майнингом блоков.
При времени решения задачи 15 секунд бомба средней сложности поражает каждые ~ 17,36 дня.
Резюме
Новый алгоритм сложности EIP 2/4 успешно нацелен на время решения блока Ethereum в среднем до 15 секунд или меньше. На момент написания фактическое среднее время решения блока составляло 14,05 секунды.
15-секундная цель достигается установкой окна 10–20, в котором не происходит никаких изменений сложности. (10 + 20) / 2 = 15.
Сложность в Ethereum может быстро уменьшиться, но в краткосрочной перспективе она увеличивается медленно. Повышение в долгосрочной перспективе гарантировано самой природой «бомбы сложности».