50 / 736NONCE

Nonce

Счётчик майнинга в заголовке блока

Nonce — число, которое оборудование для майнинга меняет при поиске нового блока Bitcoin. Каждое изменение даёт расчёту другие исходные данные и ещё одну попытку выполнить правила майнинга.

Майнер вычисляет хеш — числовой отпечаток заголовка блока. Чтобы получить Proof of Work (доказательство выполненной вычислительной работы), результат должен быть меньше либо равен установленной границе, называемой target. Nonce — одно из значений, которые можно менять для следующей попытки. Это не пароль и не секретный ключ: после публикации блока его может увидеть каждый.

У Анны есть устройство для майнинга, которое пытается создать новый блок транзакций. Из заголовка — краткого набора данных о блоке — оно с помощью SHA-256 вычисляет числовой отпечаток, то есть хеш. Bitcoin выполняет этот расчёт дважды, отсюда double-SHA-256. Если результат выше допустимой границы, устройство меняет, например, Nonce с 10 на 11 и пробует снова. Анна не угадывает числа вручную: оборудование автоматически делает огромное количество попыток. Большее значение Nonce не означает меньшего хеша или приближения к цели. Совершенно одинаковый заголовок всегда даёт тот же хеш, поэтому повторный расчёт не добавляет нового шанса. [1] [2]

Под Nonce выделено четыре байта, то есть 32 бита. Они вмещают целые числа от 0 до 4 294 967 295 включительно: всего 4 294 967 296 вариантов, или 2^32. Человеку это кажется огромным числом, но специализированное устройство ASIC перебирает такой диапазон очень быстро. Проверка всех значений не гарантирует успеха. Если остальные данные заголовка не меняются, возврат к началу лишь повторяет прежние результаты. Поэтому программа должна готовить и другие заголовки. [1] [5]

Один из способов — изменить Extranonce. Похожее название может запутать: это не дополнительное поле заголовка, а данные внутри coinbase-транзакции, первой транзакции блока, которая распределяет награду за майнинг. Изменение влияет на её идентификатор txid, а затем на Merkle root — общий отпечаток транзакций в заголовке. Устройство получает другие исходные данные. Можно снова использовать те же значения Nonce, но теперь вычисляются хеши других заголовков. Ещё 2^32 вариантов тоже не гарантируют нахождения блока. [2] [3]

В обозревателе у одного блока может быть маленькое Nonce, у другого — большое. Само число не говорит, насколько трудно было найти блок и лучше ли он. Full Node — программа, которая самостоятельно проверяет блоки и транзакции по правилам Bitcoin, — вычисляет хеш всего заголовка и сравнивает его с допустимым target, компактная запись которого хранится в nBits. Важно, чтобы хеш был меньше либо равен этой границе, а не каково значение Nonce. На этом проверка не заканчивается: узел также проверяет транзакции и остальные правила допустимости блока. [1] [8]

Слово nonce встречается и при обсуждении подписания транзакций. Там оно может обозначать секретное вспомогательное число, технически скаляр, которое алгоритм использует вместе с Private Key — закрытым ключом, разрешающим тратить средства. Ошибочное повторное использование этого числа для разных сообщений может раскрыть ключ. Майнинговый Nonce устроен иначе: он открыт, и одинаковое число может встречаться в разных заголовках. Публичные части подписи тоже не являются этим секретным вспомогательным числом. Требования одного применения нельзя автоматически переносить на другое. [9]

Когда много устройств работают вместе в Mining Pool, им не следует вычислять хеши одинаковых заголовков. Повторение не добавляет новых попыток. Координатор поэтому выдаёт разные данные, например для coinbase и Extranonce. Протоколы вроде Stratum передают задания; подключённые устройства для майнинга также называют workers. BIP23 описывает и необязательный параметр noncerange, задающий диапазон Nonce. Это не означает, что каждый пул обязан его использовать или может менять правила допустимости блоков. [4] [2]

Merkle Tree постепенно объединяет отпечатки транзакций в общий отпечаток — Merkle root. Идентификатор coinbase-транзакции, её txid, входит в расчёт как один из листьев дерева. Поэтому изменение Extranonce создаёт новый txid, а затем новое значение Merkle root. Майнер может сохранить остальные транзакции и ссылку на предыдущий блок, но получить другой заголовок. Это не переписывание подтверждённого блока: меняется проект нового блока, для которого ещё ищут допустимый Proof of Work. [1] [2]

Программа может создавать дополнительные варианты заголовка, меняя время nTime в допустимых пределах или разрешённые биты версии. Второй способ называют version rolling. BIP320 предлагает общее использование отдельных битов nVersion; само предложение не разрешает произвольно менять все биты. Правила сети и назначенного задания майнинга продолжают действовать. Ни один из этих способов не отменяет требование, чтобы итоговый хеш соответствовал допустимому target. Более новый BIP323 предлагает больше битов и пока имеет статус Draft, то есть проекта. [4] [5] [10]

Для чтения технической документации полезно знать и формат. Заголовок содержит 80 байтов: версию, хеш предыдущего блока, Merkle root, время, nBits и четырёхбайтовый Nonce. Nonce — беззнаковое 32-битное целое число типа uint32. Оно записывается в порядке little-endian, младшим байтом вперёд. Изменение только Nonce меняет заголовок и его double-SHA-256 хеш, а не список транзакций. Программе нужна точная запись, хотя для понимания майнинга не обязательно уметь составлять её вручную. [1]

Опытный читатель может выполнить в Bitcoin Core команду getblockheader с хешем конкретного блока. Подробный вывод по умолчанию содержит, в частности, nonce, bits и time. Значение false параметра verbose возвращает точные 80 байтов заголовка в шестнадцатеричной записи. По ним можно вычислить double-SHA-256 и сравнить числовой результат с допустимым target. Собственная реализация должна соблюдать порядок байтов Bitcoin: неправильный разворот байтов меняет сравнение. Простое чтение Nonce в обозревателе не заменяет эту проверку. [1] [6] [8]

Для полной картины прочитайте эту статью вместе с Block Header, Майнинг, Proof of Work, Mining Target, Coinbase-транзакция, Bitcoin. На эту статью также ссылаются Block Header, Coinbase-транзакция, ASIC Miner, Stratum V1.

DOC · 001Bitcoin Developer Reference — Block headersДокументация DOC · 002Bitcoin Developer Guide — MiningДокументация DOC · 003Bitcoin Developer Reference — TransactionsДокументация DOC · 004BIP 23 — getblocktemplate pooled miningСпецификация DOC · 005BIP 320 — nVersion bits for general purpose useСпецификация DOC · 006Bitcoin Core RPC — getblockheaderДокументация DOC · 007Bitcoin Core RPC — getblocktemplateДокументация DOC · 008Bitcoin Core v30.0 — Proof of Work validationПервичный источник DOC · 009BIP 340 — Schnorr SignaturesСпецификация DOC · 010BIP 323 — 24 nVersion bits for general purpose useДокументация
Обновлено: Сначала источники · Не является инвестиционной рекомендацией