Extranonce — дополнительные изменяемые данные, которые программа для майнинга обычно помещает в coinbase, особую первую транзакцию блока, начисляющую награду за майнинг. Их изменение меняет общий отпечаток транзакций в заголовке блока и даёт новые входные данные для поиска. Отдельное поле nonce в заголовке при этом не увеличивается.
Заголовок кратко описывает данные блока. Бит хранит ноль или единицу; восемь битов образуют байт. В частности, заголовок содержит поле nonce длиной 32 бита, дающее 2^32 значений при неизменной остальной части. Повторная проверка того же заголовка с тем же nonce даст тот же хеш, а значит, тот же результат. Extranonce не удлиняет это поле: он меняет другие данные, из которых готовится новый заголовок. Алена может представить новое задание, для которого можно снова перебрать счётчик. На практике в рамках правил могут меняться и другие части заголовка. [1] [5]
Coinbase здесь означает первую транзакцию каждого блока, а не биржу. Когда программа меняет её extranonce, меняются закодированные данные транзакции и TXID — вычисленный по ним идентификатор. Через дерево последовательно объединяемых отпечатков он связан с Merkle root, общим отпечатком транзакций в заголовке. Программа должна пересчитать затронутую ветвь. Остальные транзакции могут остаться прежними, но просто сохранить старый корень нельзя. Эта цепочка вычислений даёт новому заголовку другие входные данные для майнинга. [1]
В простой модели оставим остальное неизменным и разрешим два полностью свободных байта extranonce. Они дают 2^16 вариантов; вместе с 32-битным nonce получается 2^48 комбинаций входных данных. Это возможные попытки, а не число найденных блоков. Алена не получает ни более лёгкого условия, ни уверенности в успехе среди этих вариантов. Польза практическая: есть где искать дальше. Добавление свободного пространства само по себе также не ускоряет устройство, которому предстоит выполнить вычисления. [1]
Место для extranonce — не пустой бланк без правил. BIP 34, конкретное правило Bitcoin, требует правильно закодированной высоты блока, то есть его позиции в цепочке, в начале поля данных входа coinbase под названием scriptSig. Ограничение 100 байт относится ко всему coinbase scriptSig, а не только к extranonce. Программа должна оставить место для обязательных данных и сохранить допустимый формат. Если бы Алена их перезаписала, дальнейшие вычисления искали бы решение для недействительного блока. [3] [4]
При совместном майнинге в пуле разным устройствам полезно проверять разные варианты. Stratum V2, протокол передачи заданий для майнинга, использует для этого и распределение extranonce. Вышестоящий сервер, upstream, назначает фиксированный extranonce_prefix — начальную часть этих данных. Местный посредник может зарезервировать другую часть для своих клиентов, а остаток передать дальше, downstream. Эти направления относятся к конкретному соединению. Выданный префикс не становится автоматически областью, которую конечный майнер вправе менять: его постоянство помогает разделить работу участников. [2]
В расширенном канале Stratum V2 сообщение SubmitSharesExtended передаёт изменённые байты вместе с результатом. Coinbase собирается в порядке coinbase_tx_prefix, extranonce_prefix, extranonce и coinbase_tx_suffix. Эти названия обозначают части данных, которыми обмениваются программы для майнинга. Поле extranonce должно иметь согласованную длину. Даже если более короткая запись выглядит как то же число, другая последовательность байтов может дать другую транзакцию. Компьютеры сравнивают точные данные, а не приблизительное человеческое толкование. [2]
Standard Job в Stratum V2 — задание с фиксированным Merkle root. Конечное устройство может менять лишь разрешённые части version, nonce и nTime: версию, счётчик и время заголовка. Поэтому оно не отправляет собственный extranonce так, как это происходит в расширенном канале. Вышестоящая программа может подготовить новую coinbase и корень, а затем выдать другое задание. Алена может не найти настройки extranonce на своём устройстве, хотя механизм используется в системе в целом. [2]
Представим, что новый префикс пришёл во время обработки результата прежней работы. SetExtranoncePrefix в Stratum V2 применяется к заданиям, отправленным после него в данном канале, то есть соответствующем сеансе майнинга. Результат должен сохранять связь с правильным job_id, идентификатором задания, и выделенным ему пространством. Подстановка новейшего префикса повсюду могла бы изменить данные, на которых основан старый результат. Extranonce нужен для создания разных попыток и учёта их связи с заданиями, а не для переписывания этих заданий задним числом. [2]
Для полной картины прочитайте эту статью вместе с Nonce, Merkle Tree, Mining Share, Block Template, Bitcoin. На эту статью также ссылаются ASIC Miner, Stratum V1, Stratum V2, Block Template.