Алгоритм майнинга биткойнов с точки зрения программиста

Эта страница: Блоки сказали, что добыча на самом деле предназначена для решения математической задачи, но чтение алгоритма хеширования блоков не очень помогает. Я также пытался читать исходный код bitcoind, но чтение кода занимает гораздо больше времени, чем чтение документации:)

И я написал простой клиент json-rpc для вызова метода getwork() для получения «данных», но что мне делать дальше с этими «данными»?

Кто-нибудь может объяснить процесс майнинга с точки зрения программиста?

but what should I do next to this "data"?Вот краткая эталонная реализация. github.com/jgarzik/pyminer/blob/master/pyminer.py
Кроме того, explain the mining process in programmer's viewэто довольно широкий вопрос. Какую конкретную проблему вы пытаетесь решить?
@NickODell Спасибо за ваш код! Теперь я понимаю, как создавать новые блоки. Но действителен ли каждый отправленный блок (сеть биткойнов отправит биткойны этому человеку)? Я обнаружил, что биткойн-вики говорит, что только 6 блоков будут создаваться каждый час. Предположим, что 100 человек получают заголовок блока, используя getwork одновременно с одинаковой сложностью, я думаю, что эти люди будут создавать гораздо больше, чем 6 блоков. Я прав?
Отвечаем по порядку: Нет. Нет.
возможный дубликат Я не могу понять getwork api
@NickODell Извините за задержку, в эти дни у меня есть кое-что срочное. Если не каждая представленная работа действительна, как сеть биткойнов может определить, какое представленное решение является действительным? Спасибо

Ответы (3)

Алгоритм майнинга следующий:

  • Шаг 0 — Получить хэш предыдущего блока из сети.

  • Шаг 1. Соберите список потенциальных транзакций, известный как «блок». Этот список транзакций поступает из одноранговой сети биткойнов.

  • Шаг 2 — Рассчитайте хеш для блока потенциальных транзакций вместе со случайным числом.
  • Шаг 3 — Если хэш больше текущего установленного уровня сложности, значит, вы добыли этот блок. Если нет, начните сначала с шага 1. Любые добавления к списку транзакций с шага 1 вместе с изменением случайного числа с шага 2 означают, что есть шанс, что критерий будет выполнен при следующем проходе.

С точки зрения программиста псевдокод может выглядеть примерно так:

P := Хэш ранее добытого блока
B := блок транзакций
H := хэш-функция
D := Уровень сложности

0 Получить P
1 Построить/модифицировать B
2 ЕСЛИ H(P, B, некоторое случайное число) > D END
3 ПЕРЕЙТИ К 1

Я должен предупредить вас, что в этом описании есть несколько неточностей, но по большей части этого должно быть достаточно. И вот еще несколько полезных уточнений:

Что такое хэш?

Хэш — это функция, которая преобразует данные в число в пределах определенного диапазона. Хеш обладает тем свойством, что знание его вывода практически непредсказуемо (в заданном диапазоне). Конкретная хеш-функция, используемая для майнинга биткойнов, — это SHA256, примененный дважды.

Как работает уровень сложности?

Этот непредсказуемый характер хеш-функции означает, что ввод случайных данных (транзакция + случайное число) по существу приведет к получению случайного числа в определенном диапазоне. Дальнейшее ограничение диапазона желаемого результата влияет на вероятность его получения за один раунд. Это создает способ вероятностного определения того, как часто будет найдено решение, исходя из того, сколько раз алгоритм может быть запущен в сети. В частности, когда вы слышите термин «гигахэши» или «терахэши», это означает, сколько раз можно выполнить шаг 3. По мере роста количества хэшей в секунду по всей сети сеть автоматически повышает сложность, так что решение будет найдено в течение примерно 10 минут.

Что происходит, когда блок добывается?

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

Примечание: первоначальный майнер блока получает «комиссию майнерам», которая представляет собой вознаграждение, состоящее из любых неизрасходованных монет от транзакций в дополнение к вознаграждению «coinbase». Вознаграждение coinbase начиналось с 50 биткойнов и уменьшалось вдвое после каждых 210 000 блоков (примерно раз в 4 года). Вознаграждение coinbase в конечном итоге станет настолько маленьким, что будет ничтожным по сравнению с комиссией майнеров.

Награда уменьшается вдвое каждые 210 000 блоков. -> Только что увидел это сейчас и думаю, что это здорово: bitcoinclock.com
Да, и сложность корректируется каждые 2016 блоков, предполагая, что сеть будет продолжать работать со средней скоростью хеширования указанных последних 2016 блоков, и устанавливая новую сложность так, чтобы эта скорость хэширования приводила к примерно 10-минутному циклу блока.
Я могу ошибаться, но я считаю, что блок также содержит хэш из последнего блока. Именно так блоки соединяются в обратную цепочку, что приводит к термину «блокчейн».
@Murch, сложность фактически корректируется для каждого блока в зависимости от того, сколько времени ушло на поиск предыдущего блока, и на данный момент сложность может только возрастать. Каждые 2016 блоков сложность корректируется по отношению к последним 2016 блокам, и она может увеличиваться или уменьшаться. Это помогает защититься от внезапных падений вычислительной мощности, что в противном случае привело бы к увеличению времени поиска блока до более чем 10 минут.
@ Тарандип-Гилл, верно! Хэш предыдущего блока хешируется вместе со списком транзакций. На самом деле это заставляет меня думать, что мое объяснение хеширования немного неполное. Конкретная хеш-функция не SHA256 применяется дважды, как указано, а скорее эта функция применяется к различным частям блока (включая транзакции и хэш предыдущего блока) по-разному. Это одна из тех «неточностей», о которых я вас предупреждал. Интересно, сможешь ли ты найти остальных...
Мы говорим о сетевой сложности или о какой-то другой сложности? Поскольку сложность сети не меняется каждый блок, она меняется исключительно каждые 2016 блоков. См., например: en.bitcoin.it/wiki/…
Я думаю, что исключение хэша предыдущего блока из объяснения — плохая идея, даже если это облегчает чтение ответа. Люди могут сказать «Ага», вот откуда происходит название блокчейна, когда они читают этот ответ, предложенный @TarandeepGill.
@AntonA., я думаю, важно не смешивать ответы, которые не обязательно имеют какое-либо отношение друг к другу. Хотя я согласен с тем, что эта информация полезна, термин «блокчейн» конкретно не упоминается ни в вопросе, ни в моем ответе. Эта информация может быть более полезной здесь: ethereum.stackexchange.com/questions/459/…

Любой хэш является допустимым хэшем. Вопрос в том, соответствует ли ваш гашиш нашим критериям. То, что вы хэшируете, на самом деле представляет собой пару вещей (мы вернемся к этому), которые выстроились вместе, чтобы создать строку, которая является строкой определенной длины. Затем вы хешируете всю эту строку. Думайте о полученном хэше как о числе. Мы хотим, чтобы результирующее число было меньше целевого числа. Так что это похоже на бросок кубика с гранями в миллиард и получение числа ниже целевого числа. Это целевое число считается «сложностью». По мере того, как все больше людей бросают кубик, мы снижаем это целевое число, чтобы уменьшить вероятность того, что какой-либо один бросок кубика сработает.

Очень важно, что некоторые из тех вещей, которые мы выстраиваем в строке, которую мы хешируем, являются вещами, которые нам разрешено корректировать. Хеширование — это не совсем то же самое, что бросание игральной кости, потому что если мы имеем одно и то же снова и снова, мы снова и снова получаем один и тот же результат. Однако даже незначительная корректировка того, что мы хэшируем, может сильно повлиять на то, что получится в результате. Основной элемент, которым мы можем манипулировать, называется «одноразовым номером». По сути, мы выбираем одноразовый номер для использования в строке, хешируем всю строку и смотрим, что мы получаем. Если хэш не совпал, мы модифицируем одноразовый номер и повторим попытку. Сам одноразовый номер не очень большой, поэтому существует ограниченное количество вариантов одноразового номера, которые вы можете попробовать. Следующим элементом, который мы можем изменить, является метка времени. Нам также разрешено изменять временную метку. Каждое изменение временной метки позволяет нам заново пройти через весь набор возможных значений nonce. Мы повторяем этот процесс исчерпания возможностей одноразового номера, а затем снова и снова изменяем метку времени, пока результирующий хэш не станет меньше, чем целевое число сложности.

Когда это происходит, мы объявляем всему миру, что эта временная метка плюс этот одноразовый номер работают для решения блока. Другие подтверждают, что это правда, и добавляют в цепочку блоков. Блок считается «подтвержденным», если он находится «в глубине» определенного количества блоков в цепочке блоков, что означает, что это исторический блок по сравнению с текущим блоком. Термин «валидация» здесь немного неверен, потому что дело не в том, что блок еще не известен как действительный. То, что мы проверяем, является доказательством работы, а это означает, что как только этот исторический блок будет похоронен достаточно глубоко, количество усилий, затраченных на создание этой истории, станет непреодолимым для кого-то еще, кто попытается создать другую вариацию истории. Им придется создать свою собственную версию этого блока (единственная причина — написать свою версию транзакций, т. е. украсть монеты), затем решить ее самостоятельно, затем решить следующий блок, следующий за ним и т. д. и «поймать вверх" со всеми остальными. Это означает, что им придется обойти весь мир в игре с бросанием костей. Может быть, когда-то в истории вселенной кому-то повезет с двумя или тремя блоками подряд, но со 120 блоками, которые сейчас требуются большинству майнинговых пулов и бирж? Этого никогда не случится. Может быть, когда-то в истории вселенной кому-то повезет с двумя или тремя блоками подряд, но со 120 блоками, которые сейчас требуются большинству майнинговых пулов и бирж? Этого никогда не случится. Может быть, когда-то в истории вселенной кому-то повезет с двумя или тремя блоками подряд, но со 120 блоками, которые сейчас требуются большинству майнинговых пулов и бирж? Этого никогда не случится.

Цель решения «головоломки» состоит в том, чтобы (а) отложить добычу блока в среднем на 10 минут и (б) понести реальные затраты на добычу блока (затраты мощности процессора, а значит, и энергии). Затраты на предотвращение атаки Сивиллы (задействование множества майнерских машин для проведения атаки 51%).

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

Так что тип головоломки в каком-то смысле не имеет значения, это может быть и гигантская судоку.