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, чтобы хеш блока был меньше цели.
  • Решение трудно найти, но легко проверить.
  • Защита держится на том, что переписать историю дороже, чем честно майнить.
  • Главные минусы — огромное энергопотребление и централизация мощностей.
Проверьте себя
1. Что подбирает майнер в Proof-of-Work?
AПриватный ключ
BNonce, чтобы хеш блока был меньше цели
CКорень Меркла
DАдрес получателя
2. Каков главный недостаток Proof-of-Work?
AТранзакции анонимны
BОгромное энергопотребление
CНевозможно проверить блоки
DОтсутствие наград майнерам