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Документація
Переглянуто: Спочатку джерела · Не інвестиційна порада