| | 08.09.2021

Майнинг добавляет новые блоки в цепочку блоков, что затрудняет изменение истории транзакций.

Вступление¶

Сегодня майнинг принимает две формы:

Соло-майнинг, при котором майнер пытается самостоятельно сгенерировать новые блоки, при этом доходы от вознаграждения за блок и комиссии за транзакции полностью уходят ему, что позволяет ему получать крупные платежи с более высокой дисперсией (более длительное время между платежами)

Объединенный майнинг, когда майнер объединяет ресурсы с другими майнерами, чтобы чаще находить блоки, при этом доходы распределяются между майнерами пула в грубой зависимости от количества хэширующей мощности, которую каждый из них внес, что позволяет майнеру получать небольшие платежи с более низкой дисперсией (меньшее время между платежами).

Соло Майнинг¶

Как показано ниже, соло-майнеры обычно используют биткойн для получения новых транзакций из сети. Их программное обеспечение для майнинга периодически опрашивает биткойн на предмет новых транзакций, используя RPC «getblocktemplate», который предоставляет список новых транзакций и открытый ключ, на который должна быть отправлена ​​транзакция coinbase.

Соло Биткойн Майнинг ¶

Программное обеспечение для майнинга создает блок с использованием шаблона (описанного ниже) и создает заголовок блока. Затем он отправляет 80-байтовый заголовок блока на свое оборудование для майнинга (ASIC) вместе с целевым порогом (настройка сложности). Оборудование для майнинга перебирает все возможные значения одноразового номера заголовка блока и генерирует соответствующий хэш.

Если ни один из хэшей не ниже порогового значения, оборудование для майнинга получает обновленный заголовок блока с новым корнем Меркла из программного обеспечения для майнинга; этот новый заголовок блока создается путем добавления дополнительных данных nonce в поле coinbase транзакции coinbase.

С другой стороны, если хэш оказывается ниже целевого порога, оборудование для майнинга возвращает заголовок блока с успешным значением nonce в программное обеспечение для майнинга. Программное обеспечение для майнинга объединяет заголовок с блоком и отправляет завершенный блок в биткойн для трансляции в сеть для добавления в цепочку блоков.

Майнинг в пуле¶

Майнеры пула следуют аналогичному рабочему процессу, показанному ниже, который позволяет операторам пула платить майнерам в зависимости от их доли в проделанной работе. Майнинг-пул получает новые транзакции из сети с использованием биткойнов. Используя один из методов, обсуждаемых ниже, программное обеспечение для майнинга каждого майнера подключается к пулу и запрашивает информацию, необходимую для создания заголовков блоков.

Объединенный майнинг биткойнов ¶

При объединенном майнинге пул майнинга устанавливает целевой порог на несколько порядков выше (менее сложный), чем сложность сети. Это приводит к тому, что оборудование для майнинга возвращает множество заголовков блоков, которые не хэшируются до значения, подходящего для включения в цепочку блоков, но которые имеют хэш ниже целевого значения пула, доказывая (в среднем), что майнер проверил процент возможных значений хэша. .

Затем майнер отправляет в пул копию информации, необходимой пулу для проверки того, что заголовок будет хеширован ниже цели и что блок транзакций, на который ссылается корневое поле заголовка Меркла, действителен для целей пула. (Обычно это означает, что транзакция coinbase должна оплачивать пул.)

Информация, которую майнер отправляет в пул, называется общим ресурсом, потому что это доказывает, что майнер выполнил часть работы. Случайно некоторые общие ресурсы, которые получает пул, также будут ниже целевого значения сети - пул майнинга отправляет их в сеть для добавления в цепочку блоков.

Вознаграждение за блок и комиссии за транзакции, которые поступают от майнинга этого блока, выплачиваются майнинговому пулу. Майнинг-пул выплачивает часть этих доходов отдельным майнерам в зависимости от того, сколько долей они сгенерировали. Например, если целевой порог пула майнинга в 100 раз ниже целевого порога сети, для создания успешного блока потребуется в среднем 100 долей, поэтому пул майнинга может выплатить 1/100 своей выплаты за каждую полученную долю . В разных майнинговых пулах используются разные системы распределения вознаграждений, основанные на этой базовой системе распределения.

Блокировать прототипы¶

Как при одиночном, так и при пульном майнинге программное обеспечение для майнинга должно получать информацию, необходимую для построения заголовков блоков. В этом подразделе линейно описывается, как эта информация передается и используется. Однако в реальных реализациях параллельные потоки и организация очередей используются для того, чтобы хешеры ASIC работали на максимальной мощности.

getwork RPC¶

Самым простым и ранним методом был устаревший сейчас RPC getwork Bitcoin Core, который напрямую создает заголовок для майнера. Поскольку заголовок содержит только один 4-байтовый одноразовый номер, подходящий примерно для 4 гигахешей, многим современным майнерам необходимо выполнять десятки или сотни запросов getwork в секунду. Соло-майнеры могут по-прежнему использовать getwork на v0.9.5 или ниже, но большинство пулов сегодня не одобряют или запрещают его использование.

getblocktemplate RPC¶

Улучшенный метод - это RPC «getblocktemplate» Bitcoin Core. Это предоставляет программному обеспечению для майнинга гораздо больше информации:

Информация, необходимая для создания транзакции на базе монет, оплачивающей пул или биткойн-кошелек соло-майнера.

Полный дамп транзакций bitcoind или пула майнинга предлагает включить в блок, позволяя программному обеспечению для майнинга проверять транзакции, при желании добавлять дополнительные транзакции и при необходимости удалять ненужные транзакции.

Другая информация, необходимая для создания заголовка блока для следующего блока: версия блока, хэш предыдущего блока и биты (цель).

Текущий целевой порог майнинга для приема акций. (Для соло-майнеров это цель сети.)

Используя полученные транзакции, программное обеспечение для майнинга добавляет одноразовый номер в поле дополнительного одноразового номера в coinbase, а затем преобразует все транзакции в дерево Меркла, чтобы получить корень Меркла, который он может использовать в заголовке блока. Всякий раз, когда необходимо изменить дополнительное поле nonce, программное обеспечение для интеллектуального анализа данных перестраивает необходимые части дерева Меркла и обновляет поля времени и корня Меркла в заголовке блока.

Как и все биткойн-RPC, «getblocktemplate» отправляется через HTTP. Чтобы гарантировать получение самой последней работы, большинство майнеров используют HTTP longpoll, чтобы всегда оставлять открытым запрос «getblocktemplate». Это позволяет майнинговому пулу отправлять майнеру новый «getblocktemplate», как только любой майнер в одноранговой сети публикует новый блок или пул хочет отправить больше транзакций в программное обеспечение для майнинга.

Stratum¶

Широко используемой альтернативой getblocktemplate является протокол майнинга Stratum. Stratum фокусируется на предоставлении майнерам минимальной информации, необходимой им для самостоятельного создания заголовков блоков:

Информация, необходимая для создания транзакции на базе монеты, оплачивающей пул.

Части дерева Меркла, которые необходимо повторно хешировать для создания нового корня Меркла, когда транзакция Coinbase обновляется новым дополнительным значением nonce. Другие части дерева Меркла, если таковые имеются, не отправляются, что эффективно ограничивает объем данных, которые необходимо отправить (максимум) около килобайта при текущем объеме транзакции.

Вся прочая информация, не относящаяся к корню Меркла, необходимая для построения заголовка блока для следующего блока.

Текущий целевой порог майнинга для приема акций.

Используя полученную транзакцию coinbase, программное обеспечение для майнинга добавляет одноразовый номер к полю дополнительного одноразового номера coinbase, хеширует транзакцию coinbase и добавляет хеш к полученным частям дерева Меркла. Дерево хешируется по мере необходимости для создания корня Меркла, который добавляется к полученной информации заголовка блока. Всякий раз, когда необходимо изменить дополнительное поле nonce, программное обеспечение для майнинга обновляет и повторно хеширует транзакцию coinbase, перестраивает корень Меркла и обновляет корневое поле Меркла заголовка.

В отличие от getblocktemplate, майнеры, использующие Stratum, не могут проверять или добавлять транзакции к блоку, который они в настоящее время добывают. Также, в отличие от getblocktemplate, протокол Stratum напрямую использует двусторонний TCP-сокет, поэтому майнерам не нужно использовать HTTP longpoll, чтобы гарантировать получение немедленных обновлений из пулов майнинга, когда новый блок транслируется в одноранговую сеть. сеть.

Ресурсы:ПО для майнинга BFGMiner GPLv3 и ПО для майнинга AGPLv3 Eloipool широко используются майнерами и пулами. Библиотека libblkmaker C и библиотека python-blkmaker, лицензированные MIT, могут интерпретировать GetBlockTemplate для ваших программ.