Эта страница: Блоки сказали, что добыча на самом деле предназначена для решения математической задачи, но чтение алгоритма хеширования блоков не очень помогает. Я также пытался читать исходный код bitcoind, но чтение кода занимает гораздо больше времени, чем чтение документации:)
И я написал простой клиент json-rpc для вызова метода getwork() для получения «данных», но что мне делать дальше с этими «данными»?
Кто-нибудь может объяснить процесс майнинга с точки зрения программиста?
Алгоритм майнинга следующий:
Шаг 0 — Получить хэш предыдущего блока из сети.
Шаг 1. Соберите список потенциальных транзакций, известный как «блок». Этот список транзакций поступает из одноранговой сети биткойнов.
С точки зрения программиста псевдокод может выглядеть примерно так:
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 в конечном итоге станет настолько маленьким, что будет ничтожным по сравнению с комиссией майнеров.
Любой хэш является допустимым хэшем. Вопрос в том, соответствует ли ваш гашиш нашим критериям. То, что вы хэшируете, на самом деле представляет собой пару вещей (мы вернемся к этому), которые выстроились вместе, чтобы создать строку, которая является строкой определенной длины. Затем вы хешируете всю эту строку. Думайте о полученном хэше как о числе. Мы хотим, чтобы результирующее число было меньше целевого числа. Так что это похоже на бросок кубика с гранями в миллиард и получение числа ниже целевого числа. Это целевое число считается «сложностью». По мере того, как все больше людей бросают кубик, мы снижаем это целевое число, чтобы уменьшить вероятность того, что какой-либо один бросок кубика сработает.
Очень важно, что некоторые из тех вещей, которые мы выстраиваем в строке, которую мы хешируем, являются вещами, которые нам разрешено корректировать. Хеширование — это не совсем то же самое, что бросание игральной кости, потому что если мы имеем одно и то же снова и снова, мы снова и снова получаем один и тот же результат. Однако даже незначительная корректировка того, что мы хэшируем, может сильно повлиять на то, что получится в результате. Основной элемент, которым мы можем манипулировать, называется «одноразовым номером». По сути, мы выбираем одноразовый номер для использования в строке, хешируем всю строку и смотрим, что мы получаем. Если хэш не совпал, мы модифицируем одноразовый номер и повторим попытку. Сам одноразовый номер не очень большой, поэтому существует ограниченное количество вариантов одноразового номера, которые вы можете попробовать. Следующим элементом, который мы можем изменить, является метка времени. Нам также разрешено изменять временную метку. Каждое изменение временной метки позволяет нам заново пройти через весь набор возможных значений nonce. Мы повторяем этот процесс исчерпания возможностей одноразового номера, а затем снова и снова изменяем метку времени, пока результирующий хэш не станет меньше, чем целевое число сложности.
Когда это происходит, мы объявляем всему миру, что эта временная метка плюс этот одноразовый номер работают для решения блока. Другие подтверждают, что это правда, и добавляют в цепочку блоков. Блок считается «подтвержденным», если он находится «в глубине» определенного количества блоков в цепочке блоков, что означает, что это исторический блок по сравнению с текущим блоком. Термин «валидация» здесь немного неверен, потому что дело не в том, что блок еще не известен как действительный. То, что мы проверяем, является доказательством работы, а это означает, что как только этот исторический блок будет похоронен достаточно глубоко, количество усилий, затраченных на создание этой истории, станет непреодолимым для кого-то еще, кто попытается создать другую вариацию истории. Им придется создать свою собственную версию этого блока (единственная причина — написать свою версию транзакций, т. е. украсть монеты), затем решить ее самостоятельно, затем решить следующий блок, следующий за ним и т. д. и «поймать вверх" со всеми остальными. Это означает, что им придется обойти весь мир в игре с бросанием костей. Может быть, когда-то в истории вселенной кому-то повезет с двумя или тремя блоками подряд, но со 120 блоками, которые сейчас требуются большинству майнинговых пулов и бирж? Этого никогда не случится. Может быть, когда-то в истории вселенной кому-то повезет с двумя или тремя блоками подряд, но со 120 блоками, которые сейчас требуются большинству майнинговых пулов и бирж? Этого никогда не случится. Может быть, когда-то в истории вселенной кому-то повезет с двумя или тремя блоками подряд, но со 120 блоками, которые сейчас требуются большинству майнинговых пулов и бирж? Этого никогда не случится.
Цель решения «головоломки» состоит в том, чтобы (а) отложить добычу блока в среднем на 10 минут и (б) понести реальные затраты на добычу блока (затраты мощности процессора, а значит, и энергии). Затраты на предотвращение атаки Сивиллы (задействование множества майнерских машин для проведения атаки 51%).
Задержка вводится, чтобы позволить хорошему блоку распространяться по всему земному шару среди всех других майнеров, не давая майнеру, который только что создал новый блок, преимущество в старте. Для этого время блока (10 минут) должно быть на порядок больше, чем задержка распространения (несколько секунд).
Так что тип головоломки в каком-то смысле не имеет значения, это может быть и гигантская судоку.
Ник Оделл
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
это довольно широкий вопрос. Какую конкретную проблему вы пытаетесь решить?Марк Ма
Ник Оделл
cdecker
Марк Ма