Как работает алгоритм регулировки сложности 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 может быстро уменьшиться, но в краткосрочной перспективе она увеличивается медленно. Повышение в долгосрочной перспективе гарантировано самой природой «бомбы сложности».