228 / 736GBT

getblocktemplate

Как программа для майнинга запрашивает данные для блока

Пётр подключает программу для майнинга к своему узлу. Его узел работает на Bitcoin Core — программе, которая самостоятельно проверяет блоки и транзакции по правилам Bitcoin. Прежде чем начинать вычисления, нужно понять, какой блок продолжать и какие транзакции включать. Здесь помогает getblocktemplate: согласованный способ запросить у узла нужные данные и получить их в виде, удобном для программы. Ответ ещё не означает удачу в майнинге. Это похоже на получение строительного плана: он задаёт направление работы, но само получение ничего не строит.

getblocktemplate — интерфейс, через который программа получает от узла Bitcoin данные для сборки блока-кандидата. Он использует JSON-RPC: запрос и структурированный ответ между программами. Обычный режим выдаёт шаблон; отдельный режим позволяет предварительно оценить собственное предложение блока. Ни один сам не ищет доказательство работы.

В обычном режиме mode=template программа Петра получает, например, предыдущий блок, транзакции и допустимое вознаграждение. Это предлагаемое задание, а не уже найденный блок. Программе предстоит создать coinbase, особую первую транзакцию, назначающую вознаграждение, и закончить сборку блока. Заголовок кратко представляет данные блока. Затем программа ищет хеш — числовой криптографический отпечаток этого заголовка, удовлетворяющий цели майнинга и представляющий Proof of Work, доказательство вычислительной работы. Сам getblocktemplate не принимает адрес выплаты и не запускает вычисления майнингового устройства. Успешный ответ ещё не означает, что Пётр майнит. [1]

Представим, что узел присылает данные в форме, непонятной программе Петра. Поэтому запрос указывает поддерживаемые правила в поле rules. Проверяемый здесь Bitcoin Core v29.0 требует segwit, а для тестовой сети Signet — ещё и signet. SegWit, помимо прочего, меняет обработку данных для проверки транзакций. Недостаточно просто дописать правильное слово: программа должна уметь обрабатывать эти данные. capabilities сообщает о других возможностях интерфейса и не заменяет rules. Конкретные требования зависят от используемой реализации и версии. [2]

Поле data содержит полную запись транзакции, упорядоченную для передачи между программами. Такое упорядочивание называется сериализацией. Байты, базовые единицы этих данных, записаны в шестнадцатеричном виде с помощью цифр 0–9 и букв a–f. Ответ также содержит короткие идентификаторы транзакций. Согласно техническому документу BIP 145, txid вычисляется без данных witness, а hash включает их. Witness содержит, например, подписи, подтверждающие право потратить средства. Основной Merkle root, общий отпечаток транзакций в заголовке блока, использует txid, а не witness hash. Перепутать поля — не просто ошибиться в названии: можно получить неверный общий отпечаток и сделать собранный блок недействительным. [3]

Петру не нужно засыпать узел вопросами, изменилось ли что-нибудь. Long polling оставляет запрос открытым, пока сервер не захочет заменить прежние данные. Программа получает longpollid и возвращает его без изменений. По этому значению сервер определяет, какого изменения ждёт программа. Программа не должна пытаться выводить смысл из его символов. BIP 22 предусматривает длительный тайм-аут ожидания. Повторные неполные или некорректные ответы требуют пауз между попытками, а не немедленных повторов в цикле. Поэтому молчаливое ожидание само по себе не означает сбой. [4]

Даже повтор обычного запроса не гарантирует заново подобранное содержимое. Bitcoin Core v29.0 хранит подготовленный шаблон в кеше. Он пересобирает его при смене предыдущего блока либо если изменился mempool, местный набор неподтверждённых транзакций, и после подготовки прошло более пяти секунд. Время в заголовке может обновляться отдельно. Поэтому Пётр может снова получить тот же набор транзакций; это не означает, что узел завис. Такое поведение конкретной версии также не обещает уникального задания для майнинга при каждом вызове. [2]

Пётр изменил сборку блока и хочет обнаружить ошибки до затратного поиска. В режиме proposal он передаёт весь блок в шестнадцатеричном виде через data. Bitcoin Core v29.0 проверяет и Merkle root, но ещё не требует найденного действительного Proof of Work, доказательства вычислительной работы. Если предложение не продолжает последний блок цепи, которую сейчас использует узел, возвращается inconclusive-not-best-prevblk. Это означает отсутствие необходимого условия для данной проверки, а не полную оценку действительности. Предварительная проверка также не рассылает блок по сети. [2]

Когда программа находит нужное доказательство работы, она может передать весь блок через submitblock. hexdata содержит целиком сериализованный блок в шестнадцатеричном виде, а не только его заголовок или отпечаток. Документация Bitcoin Core 29 указывает null при принятии и текстовый результат по спецификации в остальных случаях. Необязательный второй параметр dummy игнорируется; он не задаёт вознаграждение. Принятие узлом не гарантирует окончательного подтверждения: дальнейшее развитие цепи может изменить то, какая ветвь останется основной. [5]

Только что запущенный узел может ещё не загрузить и не проверить нужную историю. В основной сети, mainnet, Bitcoin Core v29.0 отказывается выдавать шаблон без подключённых соседних узлов или во время начальной синхронизации IBD (initial block download). Это вопрос готовности узла работать с текущим состоянием сети, а не отклонение конкретного блока. При поиске причины различают ожидающий long poll, неготовый узел и результат проверки предложения. Все эти случаи могут выглядеть как «нет новой работы», но требуют разных действий. [2]

Для полной картины прочитайте эту статью вместе с Block Template, Майнинг, Stratum V2, Extranonce, Bitcoin, Bitcoin Core. На эту статью также ссылаются ASIC Miner, Solo Mining, Job Negotiation.

DOC · 001Bitcoin Core 29 — getblocktemplate RPCДокументация DOC · 002Bitcoin Core v29.0 — Mining RPC implementationПервичный источник DOC · 003BIP 145 — SegWit template fieldsСпецификация DOC · 004BIP 22 — Long pollingСпецификация DOC · 005Bitcoin Core 29 — submitblock RPCДокументация
Обновлено: Сначала источники · Не является инвестиционной рекомендацией