Difficulty adjustment в Bitcoin: пересчёт сложности каждые 2016 блоков

Difficulty adjustment — это механизм в сетях с Proof-of-Work, который автоматически подстраивает сложность майнинга так, чтобы средний интервал между блоками оставался близким к целевому значению (в Bitcoin — около 10 минут).

Если суммарная вычислительная мощность сети (хешрейт) растёт, сложность увеличивается; если падает — уменьшается. Это позволяет поддерживать стабильный темп выпуска блоков независимо от того, сколько майнеров сейчас участвует в сети.

Difficulty adjustment в Bitcoin: пересчёт сложности каждые 2016 блоков

Базовые моменты

  • Цель — стабильный темп блоков.

Пересчёт сложности компенсирует изменения хешрейта и стремится удерживать среднюю скорость выпуска блоков возле целевого значения.

  • Окна пересчёта.

В Bitcoin сложность пересчитывается каждые 2016 блоков (≈ две недели при нормальном темпе). Внутри окна сложность фиксирована.

  • «Сложность» vs «таргет».

Технически пересчитывается не «сложность», а целевой хеш (target) — верхняя граница допустимого значения хеша блока. «Difficulty» — относительная величина:

difficulty = target_1 / target,

где target_1 — эталонное значение цели на старте сети.

  • Ограничение шага.

В Bitcoin итоговое изменение за одно окно ограничено: не более чем в 4 раза вверх или вниз. Это защищает от слишком резких скачков сложности.

  • Последствия окна.

Резкие изменения хешрейта внутри окна приводят к временному ускорению или замедлению выпуска блоков до следующего пересчёта.

Как это работает: формулы и пример

Обозначим:

  • T = 600 секунд — целевой интервал блока (10 минут);
  • N = 2016 блоков — размер окна пересчёта;
  • TargetSpan = N × T — целевое время добычи окна.

Базовая формула через target:

new_target = old_target × (actual_timespan / TargetSpan)

Где actual_timespan — фактическое время добычи последних N блоков. Затем new_target ограничивают в диапазоне [old_target / 4 ; old_target × 4] и переводят в новую сложность.

Эквивалентная запись через difficulty:

new_difficulty = old_difficulty × (TargetSpan / actual_timespan)

Если блоки добывались слишком быстро (actual_timespan < TargetSpan), new_difficulty растёт; если слишком медленно — падает.

Пример.

Пусть хешрейт сети примерно удвоился, и последние 2016 блоков были добыты за время ≈ TargetSpan / 2. Тогда:

new_difficulty ≈ old_difficulty × 2

После пересчёта средний интервал между блоками снова стремится к целевым 10 минутам. До момента пересчёта блоки выходят чаще (~5 минут), что влияет на состояние мемпула, комиссии и скорость подтверждений.

Плюсы и ограничения механизма

Аспект Плюсы Минусы / ограничения
Стабильность выпуска блоков Держит средний темп блоков рядом с целевым значением, несмотря на колебания хешрейта. Внутри окна возможны заметные отклонения при резких изменениях мощности.
Устойчивость сети Снижает чувствительность к приходам/уходам майнеров, поддерживает безопасность. При массовом уходе майнеров до пересчёта блоки могут идти очень медленно.
Защита от манипуляций Ограничения по шагу и правила по времени блоков снижают эффект злоупотреблений таймстемпами. В небольших сетях с низким хешрейтом возможны атаки на метки времени и «осцилляции» сложности.
Простота реализации Прозрачная и легко проверяемая механика, описанная в протоколе. Фиксированное окно создаёт лаг реакции; альтернативные алгоритмы сложнее, но реагируют быстрее.

Практика: что важно пользователям, сервисам и майнерам

  • Для пользователей.

Если сеть внезапно замедлилась (блоки выходят редко), подтверждения будут идти дольше, а комиссии могут вырасти. Для крупных переводов разумно увеличить требуемое число подтверждений.

  • Для сервисов.

Используйте динамическую политику подтверждений: ориентируйтесь не только на «N блоков», но и на фактический интервал между блоками в текущем окне. Мониторьте темп блоков и состояние мемпула.

  • Для майнеров.

До пересчёта ускорение блока повышает выработку, но после пересчёта сложность «догоняет» новый уровень хешрейта. Доходность стоит оценивать на горизонте окна пересчёта, с учётом волатильности цены и комиссий (см. майнинг и сложность майнинга).

  • По безопасности.

В периоды замедления сети временно падает пропускная способность. Это влияет на риск двойной траты при работе с непотверждёнными («zero-conf») платежами — особенно важно для сервисов, принимающих быстрые оплаты.

  • Альтернативные алгоритмы.

В некоторых сетях используют «быстрые» схемы пересчёта (LWMA, DGW и др.), которые корректируют сложность практически после каждого блока, сглаживая осцилляции. Это отдельные реализации с собственными компромиссами.

Частые вопросы (FAQ)

Связан ли пересчёт сложности с халвингом? Напрямую — нет. Халвинг меняет награду за блок, а difficulty adjustment реагирует на хешрейт и темп добычи. Косвенно после халвинга часть майнеров может отключиться из-за падения доходности, что приведёт к снижению хешрейта и, в следующем окне, к уменьшению сложности.

Почему блоки иногда выходят быстрее или медленнее 10 минут? Потому что хешрейт постоянно меняется, а сложность фиксирована в пределах текущих 2016 блоков. Пока не наступит момент пересчёта, скорость блоков может отличаться от целевой.

Можно ли «накрутить» время блоков за счёт таймстемпов? Протокол ограничивает манёвр через правила допустимых меток времени и «median time past». Массовая манипуляция затруднена распределённостью сети, но в слабых или неправильно настроенных сетях возможны сценарии «time-warp» атак.

Влияет ли количество транзакций в блоке на сложность? Нет. Сложность зависит от хешрейта и фактического времени добычи, а не от заполненности блока. Число транзакций влияет на комиссии и размер мемпула, но не на расчёт difficulty.

Есть ли аналог difficulty adjustment в PoS-сетях? Классического PoW-параметра там нет. В Proof-of-Stake устойчивость интервалов блоков обеспечивается другими механизмами выбора валидаторов и финализации; иногда применяют «бомбы сложности» или другие параметры, но это другая экономическая модель.

См. также

Task Runner