225 / 736TARGET

Mining Target

Число, которое результат майнера не должен превышать

Яна знает, что майнеры повторяют вычисления, но всё ещё не понимает, чего именно они ждут. Каждая попытка создаёт хеш — результат, который можно представить очень большим числом. Подойдёт не любой результат: он должен оказаться ниже установленной границы, причём равенство тоже допускается. Эта граница называется Mining Target. Чем она ниже, тем реже успех. Остальные участники сети затем легко проверяют, действительно ли результат выполнил условие.

Mining Target — число, с которым сравнивают хеш заголовка блока, его краткого набора основных данных. Для действительного доказательства работы хеш не должен превышать правильную цель. В сети Bitcoin эта цель должна быть положительной и соответствовать правилам конкретного блока; майнер не может выбирать её произвольно.

Только для примера представим границу 20: результаты 19 и 20 подойдут, а 21 — нет. В настоящем майнинге числа гораздо больше, но соотношение то же: hash ≤ target. Знак означает «меньше или равно», а не строго «меньше». Bitcoin Core — программа, с помощью которой участники сети проверяют блоки и транзакции. Указанная здесь версия v29.0 так же сравнивает хеш всего заголовка. Nonce, значение, которое майнер меняет при поиске, — один из входных параметров. С целью сравнивают получившийся хеш. [1]

Яна видит изображение удачного хеша с длинным рядом нулей в начале. Это полезная иллюстрация: при одинаковой длине записи больше начальных нулей означает меньшее число. Но два хеша с одинаковым количеством таких нулей могут оказаться по разные стороны цели. Остальные цифры тоже важны. Поэтому нули не заменяют полного сравнения hash ≤ target. Правило требует точного числового условия, а не красивого узора символов. [1]

Бит хранит ноль или единицу; восемь битов образуют байт. Чтобы не хранить в заголовке всё длинное число, Bitcoin использует поле nBits длиной 32 бита. Оно кодирует цель в пространстве 256-битных чисел с помощью коэффициента, показателя для сдвига и знакового бита. Например, 0x04123456 декодируется в 0x12345600; префикс 0x обозначает шестнадцатеричную запись, использующую и буквы. Это пример кодирования, а не текущая цель сети. Для базового понимания достаточно различать число и его сокращённую запись. [3] [5]

В сырых данных то же число может выглядеть перевёрнутым. В заголовке длиной 80 байтов nBits занимает четыре байта, записанных как little-endian: сначала идёт младший байт. Поэтому число 0x1d00ffff в данных выглядит как ff ff 00 1d. Порядок байтов не меняет цель, а описывает хранение. Это важно при работе с сырыми данными; обычному читателю обозревателя блоков не нужно переворачивать числа на экране. [2]

Яна могла бы предложить записать число побольше, чтобы упростить поиск. Но программа проверяет не только возможность прочитать nBits. DeriveTarget в Bitcoin Core v29.0 отклоняет отрицательную цель, ноль, переполнение числового диапазона и значения выше powLimit, самой высокой разрешённой цели этой сети. Успешное декодирование лишь определяет число, представленное записью; само по себе оно не разрешает это число использовать. [1]

Даже цель в допустимом диапазоне может быть неверной для конкретного блока. Bitcoin Core сравнивает nBits с GetNextWorkRequired — расчётом на основе предыдущего блока и правил сети. Несовпадение даёт ошибку bad-diffbits. Низкий хеш под собственной облегчённой целью не оправдывает неверного значения в заголовке. Яна не получит принятый блок, просто снизив требования: другие узлы, компьютеры, проверяющие правила, отклонят такую попытку. [4]

В модели равномерно распределённых 256-битных хешей каждый возможный результат одинаково вероятен. Для допустимой цели T принимаются значения от нуля до T включительно. Отсюда p = (T + 1) / 2^256 на одну попытку, где p — вероятность успеха. Добавленная единица учитывает ноль. Это объясняет, почему более низкая цель усложняет поиск. Но не говорит, сколько попыток машина выполнит за секунду или когда именно появится следующий блок. [1]

Выполнив условие, Яна доказала нужную вычислительную работу, а не правильность всего содержимого блока. Bitcoin Core также проверяет общий отпечаток транзакций, специальную транзакцию вознаграждения coinbase, ограничения блока и действительность транзакций. Здесь coinbase — техническое название первой транзакции блока, а не биржи. Низкий хеш не исправит недействительное содержимое. Цель — важная часть правил, а не разрешение обойти остальные. [4]

Для полной картины прочитайте эту статью вместе с Share Difficulty, Proof of Work, Nonce, Block Header, Bitcoin. На эту статью также ссылаются ASIC Miner, Nonce, Mining Share, Share Difficulty.

DOC · 001Bitcoin Core v29.0 — Proof-of-work checksПервичный источник DOC · 002Bitcoin Developer Reference — Block headers and nBitsДокументация DOC · 003Bitcoin Core v29.0 — Compact arithmeticПервичный источник DOC · 004Bitcoin Core v29.0 — Contextual and block validationПервичный источник DOC · 005NIST — Binary data unitsДокументация
Обновлено: Сначала источники · Не является инвестиционной рекомендацией