Nonce и extraNonce: Числа, которые перебирает ваш майнер
Каждый ASIC-майнер, гудящий в вашей серверной, занимается одним и тем же: перебирает числа. Миллиарды раз в секунду он подставляет новое число в формулу, считает хеш и проверяет — подходит ли результат. Не подошёл — следующее число. И так без остановки.
Эти числа — nonce и extraNonce. Давайте разберёмся, что они собой представляют и почему одного nonce давно недостаточно.
Заголовок блока: что именно хешируется
Заголовок раздела «Заголовок блока: что именно хешируется»Прежде чем говорить о nonce, нужно понять, что ваш майнер вообще хеширует. Это заголовок блока — компактная структура размером ровно 80 байт:
| Поле | Размер | Описание |
|---|---|---|
| Версия | 4 байта | Версия протокола блока |
| Хеш предыдущего блока | 32 байта | На какой блок мы опираемся |
| Корень Меркла | 32 байта | Сводка всех транзакций в блоке |
| Временная метка | 4 байта | Когда блок создаётся |
| Биты сложности | 4 байта | Текущая цель (target) |
| Nonce | 4 байта | Число, которое перебирает майнер |
Майнер берёт эти 80 байт и прогоняет через двойной SHA-256. Если результат меньше целевого значения (target) — блок найден! Если нет — меняет nonce и пробует снова.
Nonce: 4 байта, 4 миллиарда попыток
Заголовок раздела «Nonce: 4 байта, 4 миллиарда попыток»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-транзакцией
Заголовок раздела «Трюк с coinbase-транзакцией»Есть одно поле, которое майнер может свободно модифицировать: coinbase-транзакция. Это самая первая транзакция в блоке — та, которая создаёт новые BTC и отправляет их майнеру. У неё есть специальное поле для произвольных данных (помните знаменитый заголовок газеты, который Сатоши вписал в генезис-блок?).
Когда мы меняем coinbase-транзакцию, меняется её хеш. Когда меняется хеш coinbase-транзакции, меняется корень Меркла в заголовке блока. А это означает совершенно новый заголовок — и новые 4 миллиарда значений nonce для перебора.
Именно в это поле coinbase-транзакции вписываются значения extraNonce.
extraNonce1 и extraNonce2
Заголовок раздела «extraNonce1 и extraNonce2»При подключении к пулу через протокол Stratum майнер получает два параметра:
extraNonce1 (назначается пулом)
Заголовок раздела «extraNonce1 (назначается пулом)»Пул выдаёт каждому подключённому майнеру уникальный extraNonce1. Это гарантирует, что два разных майнера не будут перебирать одно и то же пространство — даже если у них одинаковые extraNonce2 и nonce, разные extraNonce1 приведут к разным coinbase-транзакциям и разным хешам.
Типичный extraNonce1 — от 2 до 8 байт. Майнер получает его один раз при подключении и не меняет.
extraNonce2 (перебирается майнером)
Заголовок раздела «extraNonce2 (перебирается майнером)»Это поле, которое майнер итерирует самостоятельно. Пул сообщает его размер (обычно 4-8 байт). Каждый раз, когда nonce исчерпан, майнер увеличивает extraNonce2 на единицу, пересчитывает coinbase-транзакцию, корень Меркла, и получает новый заголовок для хеширования.
С 4 байтами extraNonce2 у вас ещё 4 миллиарда вариантов. Умножаем: 4 миллиарда (nonce) x 4 миллиарда (extraNonce2) = ~18 квинтиллионов комбинаций. Этого хватает даже самым мощным ASIC-фермам.
Как всё работает вместе
Заголовок раздела «Как всё работает вместе»Полный цикл выглядит так:
- Пул отправляет задание (
mining.notify): prevhash, coinbase1, coinbase2, merkle_branches и т.д. - Майнер берёт
coinbase1 + extraNonce1 + extraNonce2 + coinbase2— это coinbase-транзакция - Хеширует coinbase-транзакцию, вычисляет корень Меркла
- Собирает 80-байтный заголовок блока
- Перебирает все значения nonce (0 … 4 294 967 295)
- Не нашёл? Увеличивает extraNonce2, возвращается к шагу 2
- Нашёл хеш ниже порога? Отправляет
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 для перебора.