Difficulty adjustment — механизм в сетях с Proof-of-Work для автоматической подстройки сложности майнинга так, чтобы средний интервал между блоками оставался целевым (например, ~10 минут в Bitcoin). Если суммарная вычислительная мощность (хешрейт) растёт — сложность повышается; если падает — снижается.
Базовые моменты
- Цель — стабильный темп блоков. Перенастройка компенсирует колебания хешрейта и удерживает среднюю скорость выпуска блоков.
- Окна пересчёта. В Bitcoin сложность пересчитывается каждые 2016 блоков (≈ две недели при нормальном темпе). Внутри окна сложность фиксирована.
- «Сложность» vs «таргет». Технически пересчитывается целевой хеш (target). «Сложность» — это относительная мера: 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] и переводят в новую сложность.
Эквивалентно через сложность:
new_difficulty = old_difficulty × (TargetSpan / actual_timespan)
Пример. Если хешрейт сети удвоился, то actual_timespan ≈ TargetSpan/2. Тогда:
new_difficulty ≈ old_difficulty × 2
После пересчёта средний интервал снова стремится к целевым 10 минутам.
Важно: до момента пересчёта блоки выходят чаще (~5 минут), комиссии/мемпул и подтверждения временно ведут себя иначе.
Плюсы и ограничения
| Аспект | Плюсы | Минусы/ограничения |
|---|---|---|
| Стабильность выпуска | Держит средний темп блоков вблизи целевого. | Внутри окна возможны отклонения при резких сдвигах хешрейта. |
| Устойчивость сети | Снижает чувствительность к приходам/уходам майнеров. | При массовом уходе майнеров до пересчёта блоки могут идти очень медленно. |
| Противодействие манипуляциям | Ограничение шага и правила времени снижают эффект злоупотреблений. | Возможны атаки на таймстемпы и «осцилляции» в слабых сетях. |
| Простота | Прозрачная механика, легко проверять. | Фиксированное окно создаёт лаг реакции; альтернативные алгоритмы сложнее. |
Практика / чек-лист
- Для пользователей. Если сеть внезапно замедлилась (редкие блоки), ожидайте более долгие подтверждения и потенциальный рост комиссий. Для крупных переводов увеличьте число подтверждений.
- Для сервисов. Используйте динамическую политику подтверждений: ориентируйтесь на фактический интервал блоков в текущем окне. Мониторьте состояние мемпула и темп блоков.
- Для майнеров. До пересчёта ускорение блоков повышает выработку, но после пересчёта сложность «догонит» хешрейт. Планируйте доходность на горизонте окна, учитывайте волатильность цен/комиссий.
- По безопасности. В периоды замедления сети временно падает пропускная способность; следите за актуальностью клиентов и сигналами сети, избегайте неподтверждённых («zero-conf») расчётов (см. двойная трата).
- Альтернативные алгоритмы. Некоторые сети используют «быстрые» схемы (LWMA, DGW и др.), которые пересчитывают сложность почти каждый блок для сглаживания осцилляций — это отдельные реализации с собственными допущениями.
Частые вопросы (FAQ)
Связан ли пересчёт сложности с халвингом? Напрямую — нет. Халвинг меняет награду за блок; сложность реагирует на хешрейт. Косвенно, падение доходности может снизить хешрейт → сложность уменьшится в следующий пересчёт.
Почему блоки иногда идут быстрее/медленнее 10 минут? Потому что хешрейт плавает, а сложность фиксирована на всё окно N. Коррекция произойдёт на следующем пересчёте.
Можно ли «накрутить» время блоков таймстемпами? Протокол ограничивает манёвр (правила допустимых меток времени и «median time past»). Массовая манипуляция затруднена распределённостью сети, но исторически известны «time-warp» сценарии в уязвимых настройках.
Зависит ли сложность от числа транзакций в блоке? Нет. Сложность зависит от хешрейта и времени добычи, а не от заполненности блока. Количество транзакций влияет на комиссии и размер мемпула, но не на поиск хеша.
В PoS есть difficulty adjustment? Классического PoW-параметра — нет. В PoS устойчивость времени блоков обеспечивают иные механизмы выбора/финальности; иногда используют «бомбы сложности»/параметры, но это иная экономика.