Proof-of-Work: майнинг и подбор nonce
Proof-of-Work — это «докажи делом»: чтобы добавить блок, надо потратить реальные вычисления, которые нельзя подделать.
«Найти решение трудно, а проверить — легко. На этой асимметрии держится вся защита proof-of-work.»
Первый и самый известный консенсус — Proof-of-Work (доказательство работы, PoW). Его придумали для биткоина. Идея такая: чтобы создать новый блок, узел должен решить трудную вычислительную задачу. Решение трудно найти, но легко проверить, и оно доказывает, что узел действительно потратил ресурсы.
В чём заключается задача
Майнер берёт заголовок блока и подбирает число nonce так, чтобы хеш всего заголовка начинался с нужного количества нулей (точнее, был меньше заданной цели). Поскольку хеш непредсказуем, единственный способ — перебирать nonce: 0, 1, 2, 3... пока не повезёт. Чем больше нулей требуется, тем выше сложность и тем дольше перебор.
Как работает под капотом
Подбор nonce (proof-of-work)
данные блока + nonce=0 --> hash: 8f3a... (нет)
данные блока + nonce=1 --> hash: c01d... (нет)
данные блока + nonce=2 --> hash: a77e... (нет)
...перебираем дальше...
данные блока + nonce=8312 --> hash: 0000f9... (есть!)
Цель: хеш должен начинаться с N нулей.Реализуем настоящий майнинг: будем перебирать nonce, пока хеш не начнётся с нужного числа нулей.
Попробуй сам ▶ Запусти код прямо здесь — он работает в браузере:
import hashlib, time
def mine(data, difficulty):
prefix = '0' * difficulty
nonce = 0
start = time.time()
while True:
text = data + str(nonce)
digest = hashlib.sha256(text.encode()).hexdigest()
if digest.startswith(prefix):
took = time.time() - start
return nonce, digest, took
nonce += 1
for d in [1, 2, 3, 4]:
nonce, digest, took = mine('блок-данные', d)
print(f'сложность {d}: nonce={nonce:<7} hash={digest[:10]}... ({took:.2f}c)')
# Заметь, как растёт число попыток с каждым нулём!Каждый дополнительный ноль увеличивает работу примерно в 16 раз. Так регулируется сложность: сеть подкручивает её, чтобы блоки находились примерно с постоянной частотой, независимо от того, сколько майнеров подключилось.
Почему это защищает сеть
Чтобы переписать прошлый блок, злоумышленнику пришлось бы заново выполнить proof-of-work для него и всех последующих блоков, обгоняя при этом всю остальную сеть. Это требует колоссальных вычислительных мощностей — так называемой атаки 51%. На больших сетях это экономически невыгодно: дешевле играть честно и получать награду.
Частые заблуждения
- «Майнеры решают полезные математические задачи». Нет, задача бесполезна сама по себе — её смысл лишь в том, что она дорого стоит и легко проверяется.
- «Можно угадать nonce умом». Нельзя, из-за лавинного эффекта остаётся только перебор.
- «Награда — это только новые монеты». Майнер получает и новые монеты, и комиссии за транзакции в блоке.
Важно понимать (риски)
Главная цена proof-of-work — огромное энергопотребление: миллионы устройств круглосуточно перебирают хеши. Биткоин потребляет электричество на уровне целой страны. Это вызывает критику по поводу экологии. Кроме того, майнинг централизуется вокруг дешёвой энергии и специализированного «железа», из-за чего влияние концентрируется у крупных пулов. Именно эти проблемы подтолкнули к альтернативе — proof-of-stake, о которой следующий урок.
Разбор: что такое сложность на цифрах
Вернёмся к нашему майнеру и посмотрим на сложность внимательнее. Требование «хеш должен начинаться с N нулей» кажется безобидным, но числа растут пугающе быстро. В шестнадцатеричной записи каждый ноль — это примерно один шанс из 16. Один ноль — в среднем 16 попыток. Два нуля — около 256. Три — около 4096. Каждый дополнительный ноль умножает работу примерно на 16, и на реальных сетях нулей десятки.
Именно поэтому майнинг биткоина требует специальных устройств (ASIC), которые считают хеши триллионами в секунду, и огромного количества электроэнергии. Сеть автоматически подстраивает сложность примерно раз в две недели: если майнеров стало больше и блоки находят слишком быстро — сложность растёт; если майнеры ушли — падает. Так интервал между блоками держится около десяти минут независимо от того, сколько вычислительной мощи подключено. Эта саморегуляция — изящное инженерное решение, но её цена — те самые горы потраченной энергии.
Итоги
- Proof-of-Work требует подобрать nonce, чтобы хеш блока был меньше цели.
- Решение трудно найти, но легко проверить.
- Защита держится на том, что переписать историю дороже, чем честно майнить.
- Главные минусы — огромное энергопотребление и централизация мощностей.