Майнінговий Nonce — відкритий параметр пошуку типу uint32, а не секрет чи nonce підпису. За незмінних інших полів заголовка він дає 2^32 значень, які сучасний ASIC швидко перебирає. Тому програма оновлює простір пошуку зміною Extranonce у coinbase-транзакції та відповідно Merkle root або зміною nTime і дозволених бітів version.
Заголовок Bitcoin має 80 байтів: version, хеш попереднього блока, Merkle root, time, nBits та чотирибайтовий Nonce. Nonce — беззнакове 32-бітне ціле число, серіалізоване в порядку little-endian. Зміна цього поля змінює серіалізований заголовок і його double-SHA-256 хеш, сама по собі не змінюючи список транзакцій. [Bitcoin Developer Reference — Block headers]
Малі зміни входу SHA-256 не дають корисного напрямку до успіху. Збільшення Nonce на одиницю створює практично не пов’язаний 256-бітний хеш, тому різні заголовки можна моделювати як незалежні ймовірнісні спроби. Повторення точно того самого заголовка завжди повертає той самий хеш; корисного градієнта до виграшного значення немає. [Bitcoin Developer Reference — Block headers] [Bitcoin Developer Guide — Mining]
Чотирибайтовий Nonce дає рівно 4 294 967 296 значень, тобто 2^32, якщо інші поля заголовка незмінні. Сучасний ASIC може перебрати цей діапазон багато разів за секунду, тому одного поля Nonce недостатньо. Вичерпання діапазону не гарантує знаходження чинного Proof of Work. [Bitcoin Developer Reference — Block headers] [BIP 320 — nVersion bits for general purpose use]
Mining Pool і програми майнінгу використовують Extranonce всередині coinbase-транзакції. Попри подібну назву, це не додаткове поле заголовка. Зміна Extranonce змінює coinbase txid, а потім Merkle root заголовка, відкриваючи новий простір 2^32 значень Nonce. [Bitcoin Developer Guide — Mining] [Bitcoin Developer Reference — Transactions]
Coinbase-транзакція утворює лист Merkle-дерева. Під час перерахунку дерева зміна її txid відображається в Merkle root заголовка. Майнер отримує новий заголовок із тим самим хешем попереднього блока й майже тим самим вмістом; інші транзакції змінювати не потрібно. [Bitcoin Developer Reference — Block headers] [Bitcoin Developer Guide — Mining]
Додатковий простір отримують зміною nTime в дозволених межах або дозволених бітів version, що називається version rolling. BIP320 пропонує загальне використання вибраних бітів nVersion; сама пропозиція не дозволяє довільно змінювати всі біти. Правила консенсусу й майнінгового завдання залишаються чинними, а хеш має відповідати target. [BIP 23 — getblocktemplate pooled mining] [BIP 320 — nVersion bits for general purpose use]
При спільному майнінгу Mining Pool або координатор завдань виділяє worker-пристроям різні coinbase/Extranonce чи інші параметри, щоб не витрачати роботу на однакові заголовки. BIP23 також описує необов’язковий параметр noncerange. Протоколи Stratum розподіляють простір пошуку між багатьма ASIC. [BIP 23 — getblocktemplate pooled mining] [Bitcoin Developer Guide — Mining]
Число Nonce саме по собі не є добрим чи поганим. Full Node хешує весь конкретний заголовок і порівнює результат із чинним target, отриманим із nBits. Малий Nonce нічого не доводить: потрібен хеш цілого заголовка, менший або рівний target. Ця умова не замінює перевірку решти правил чинності блока. [Bitcoin Developer Reference — Block headers] [Bitcoin Core v30.0 — Proof of Work validation]
Nonce також використовується в криптографічних підписах. Помилкове повторне використання секретного скаляра підпису для різних повідомлень може розкрити Private Key. Майнінговий Nonce є відкритим полем заголовка й не потребує таємності. Відкриті дані підпису не слід плутати з його секретним скаляром або лічильником майнінгу. [BIP 340 — Schnorr Signatures]
Bitcoin Core через getblockheader за замовчуванням повертає докладні nonce, bits, time та інші поля. Параметр verbose зі значенням false повертає серіалізований заголовок у шістнадцятковому вигляді. Для незалежної перевірки точно склади чи декодуй його 80 байтів, обчисли double-SHA-256 і порівняй числовий хеш із чинним target з урахуванням порядку байтів Bitcoin. [Bitcoin Developer Reference — Block headers] [Bitcoin Core RPC — getblockheader] [Bitcoin Core v30.0 — Proof of Work validation]
Для повної картини прочитайте також Заголовок блока, Майнінг, Proof of Work, Mining Target, Coinbase-транзакція, Bitcoin. На цю статтю також посилаються Заголовок блока, Coinbase-транзакція, ASIC Miner, Mining Target.