Узнайте, как использовать Python для генерации хэшей блоков и подачи заявок на майнинг биткойнов.

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



Целевой хэш

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

В используемом нами API он извлекается в формате, описанном здесь. Чтобы преобразовать его в формат, с которым нам легко работать, мы делаем следующее преобразование.

Коинбейс транзакция

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

Мы используем генератор случайного текста, чтобы создать случайное предложение для Coinbase. Следуйте вики Биткойн для создания PubKey и построения транзакции Coinbase. Мы также используем пакет base58 для преобразования биткойн-адреса в формат HASH 160. Более того, как отмечено в документации, хэши транзакций и другие значения представлены в шестнадцатеричном формате с прямым порядком байтов, поэтому мы используем то же самое для построения Coinbase.

Затем вычисляется двойной хэш SHA 256 транзакции Coinbase, в сочетании с которым Coinbase может быть вставлен в список транзакций.

Меркл Рут

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

Заголовок блока

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

Блокировать хэш

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

Если результат сравнения не True, не волнуйтесь, нам просто нужно попробовать разные значения для nonce, пока мы не найдем то, которое работает. Часто именно здесь люди начинают включать свои машины для майнинга монстров — чтобы попробовать как можно больше nonce и как можно быстрее, раньше всех.

Отправка

Если хэш блока действительно меньше целевого хэша, мы выигрываем! С успешно добытым блоком мы можем создать строку отправки в соответствии с документацией.

Затем мы отправляем вызов RPC с помощью метода submitblock, чтобы отправить наш добытый блок и дождаться вознаграждения. (Внизу есть дублирование кода с вызовом RPC get template, и на практике его следует исключить.)

Заключение

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