Перейти к содержимому

Nonce и extraNonce: Числа, которые перебирает ваш майнер

Каждый ASIC-майнер, гудящий в вашей серверной, занимается одним и тем же: перебирает числа. Миллиарды раз в секунду он подставляет новое число в формулу, считает хеш и проверяет — подходит ли результат. Не подошёл — следующее число. И так без остановки.

Эти числа — nonce и extraNonce. Давайте разберёмся, что они собой представляют и почему одного nonce давно недостаточно.

Прежде чем говорить о nonce, нужно понять, что ваш майнер вообще хеширует. Это заголовок блока — компактная структура размером ровно 80 байт:

ПолеРазмерОписание
Версия4 байтаВерсия протокола блока
Хеш предыдущего блока32 байтаНа какой блок мы опираемся
Корень Меркла32 байтаСводка всех транзакций в блоке
Временная метка4 байтаКогда блок создаётся
Биты сложности4 байтаТекущая цель (target)
Nonce4 байтаЧисло, которое перебирает майнер

Майнер берёт эти 80 байт и прогоняет через двойной SHA-256. Если результат меньше целевого значения (target) — блок найден! Если нет — меняет nonce и пробует снова.

Nonce — это 32-битное число в заголовке блока. 32 бита означают 2^32 = 4 294 967 296 возможных значений. Чуть больше четырёх миллиардов.

Звучит как много? В 2011 году это и было много. Видеокарта того времени перебирала все 4 миллиарда значений за минуты. Но современный ASIC вроде Antminer S21 с хешрейтом 200 TH/s (200 триллионов хешей в секунду) исчерпывает весь 4-миллиардный диапазон nonce примерно за 0,02 секунды.

И что дальше? Nonce закончился, а валидный хеш так и не найден. Менять в заголовке больше нечего — все остальные поля либо фиксированы, либо не должны меняться произвольно.

Вот тут в игру вступает extraNonce.

Есть одно поле, которое майнер может свободно модифицировать: coinbase-транзакция. Это самая первая транзакция в блоке — та, которая создаёт новые BTC и отправляет их майнеру. У неё есть специальное поле для произвольных данных (помните знаменитый заголовок газеты, который Сатоши вписал в генезис-блок?).

Когда мы меняем coinbase-транзакцию, меняется её хеш. Когда меняется хеш coinbase-транзакции, меняется корень Меркла в заголовке блока. А это означает совершенно новый заголовок — и новые 4 миллиарда значений nonce для перебора.

Именно в это поле coinbase-транзакции вписываются значения extraNonce.

При подключении к пулу через протокол Stratum майнер получает два параметра:

Пул выдаёт каждому подключённому майнеру уникальный extraNonce1. Это гарантирует, что два разных майнера не будут перебирать одно и то же пространство — даже если у них одинаковые extraNonce2 и nonce, разные extraNonce1 приведут к разным coinbase-транзакциям и разным хешам.

Типичный extraNonce1 — от 2 до 8 байт. Майнер получает его один раз при подключении и не меняет.

Это поле, которое майнер итерирует самостоятельно. Пул сообщает его размер (обычно 4-8 байт). Каждый раз, когда nonce исчерпан, майнер увеличивает extraNonce2 на единицу, пересчитывает coinbase-транзакцию, корень Меркла, и получает новый заголовок для хеширования.

С 4 байтами extraNonce2 у вас ещё 4 миллиарда вариантов. Умножаем: 4 миллиарда (nonce) x 4 миллиарда (extraNonce2) = ~18 квинтиллионов комбинаций. Этого хватает даже самым мощным ASIC-фермам.

Полный цикл выглядит так:

  1. Пул отправляет задание (mining.notify): prevhash, coinbase1, coinbase2, merkle_branches и т.д.
  2. Майнер берёт coinbase1 + extraNonce1 + extraNonce2 + coinbase2 — это coinbase-транзакция
  3. Хеширует coinbase-транзакцию, вычисляет корень Меркла
  4. Собирает 80-байтный заголовок блока
  5. Перебирает все значения nonce (0 … 4 294 967 295)
  6. Не нашёл? Увеличивает extraNonce2, возвращается к шагу 2
  7. Нашёл хеш ниже порога? Отправляет mining.submit с nonce, extranonce2 и временной меткой

Version rolling: ещё один источник вариативности

Заголовок раздела «Version rolling: ещё один источник вариативности»

Современные ASIC используют дополнительный трюк — version rolling. В заголовке блока есть 4-байтное поле версии, часть битов которого не используется протоколом. Майнер может переключать эти биты (с согласия пула через mining.configure), получая ещё больше уникальных заголовков без пересчёта корня Меркла.

Это связано с оптимизацией AsicBoost, которая позволяет некоторым чипам вычислять SHA-256 быстрее, переиспользуя промежуточные состояния хеш-функции.

ПараметрКто контролируетРазмерКоличество вариантов
NonceМайнер (ASIC-чипы)4 байта~4 млрд
extraNonce2Майнер (контроллер)4-8 байт~4 млрд — ~18 квинтлн
extraNonce1Пул2-8 байтУникальный на майнер
Version bitsМайнер (с согласия пула)~13 бит~8 000

Вместе эти механизмы создают астрономически большое пространство поиска. Даже при хешрейте в сотни терахешей в секунду ваш майнер никогда не “застрянет” без работы — всегда есть следующий extraNonce2, следующий набор version bits, следующие 4 миллиарда nonce для перебора.