Книга: Биткоин для всех. Популярно о первой распределенной одноранговой денежной системе
Назад: Блок
Дальше: Почему количество биткоинов ограничено

Майнинг

«Майнинг» – второе слово после «блокчейна», с которым у многих ассоциируется Биткоин.

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

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

Действительно, слово «майнинг» (mining) в переводе с английского означает добычу полезных ископаемых. А майнеры (miners) – это шахтеры.

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



Вернемся к денежным переводам (транзакциям), которые составляют главную задачу и цель существования сети Биткоина.



Собственно, процесс денежных переводов в типичной финансовой среде описывается серией из четырех последовательных шагов:

 

1. Submission – отправитель посылает в систему платежное сообщение (поручение) о переводе некоторой суммы денег получателю;

 

 

2. Validation – сообщение проходит процедуру проверки отправителя и целостности сообщения;

 

 

3. Conditionality – проверяется наличие достаточного баланса для перевода на счету отправителя;

 

 

4. Settlement – проведение транзакции, перевод денежных средств на счет получателя.

 

В современной экономике эти процессы обычно поддерживаются финансовыми посредниками, такими как банки.



Отправитель (клиент банка) посылает платежное сообщение или поручение (submission) в платежную систему банка. Это сообщение должно пройти процедуру подтверждения (идентификации) клиента и целостности сообщения (validation). После успешной валидации сообщения банковская система проверяет необходимые условия для платежа (conditionality), а именно – достаточность средств на балансе клиента или наличие кредита. Если все проверки пройдены, банк окончательно (безусловно и безотзывно) проводит платеж (settlement) – пополнение счета получателя и уменьшение баланса счета отправителя.



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



Криптовалюты, в частности Биткоин, являются полностью децентрализованными системами, в которых вопросы доверия решаются криптографическими методами.



Поэтому процесс денежных переводов в них происходит несколько по-другому, а именно:

 

– Submission – отправитель перевода при помощи программного приложения «биткоин-кошелек» направляет в сеть Биткоина сообщение, в котором указываются биткоин-адреса отправителя и получателя, а также сумма перевода и сумма комиссии за перевод (опционально). Это сообщение автоматически подписывается электронной цифровой подписью (ЭЦП) отправителя, которая формируется при помощи закрытого (приватного) ключа отправителя и криптографически связана с его биткоин-адресом. Подробнее см. главу «Электронная цифровая подпись: Просто и наглядно».

 

 

– Validation – это сообщение проходит проверку в сети по ЭЦП. Тем самым, происходит идентификация отправителя. Для проверки используется биткоин-адрес, поскольку он связан с приватным ключом отправителя, при помощи которого он подписал сообщение. На самом деле, личность отправителя не имеет значения, она остается анонимной. Под идентификацией отправителя понимается соответствие биткоин-адреса отправителя и сообщения (платежного поручения) криптографической подписи (ЭЦП). Тем самым подтверждается, что указанная сумма денег (монет биткоина) должна быть отправлена с конкретного биткоин-адреса.

– Conditionality – проверяется наличие достаточного баланса для перевода на счету отправителя. Для этого, согласно протоколу Биткоина, происходит подсчет всех непотраченных Выходов (т. н. UTXO – unspent transaction output) этого адреса. Подробнее см. главу «Блок».

 

 

– Если все проверки прошли, сформированная транзакция ждет добавления в блок и записи в блокчейн.

 

И вот тут, собственно, и начинается процесс, который получил название «майнинг». Что же это такое?



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

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

Во-вторых, как мы знаем, сеть Биткоина является одноранговой и децентрализованной, т.е. состоящей из многих разбросанных по всему миру постоянно работающих компьютеров (серверов), называемых узлами (node).



Следовательно, обработка поступивших в сеть платежных поручений о переводе биткоинов, может вестись одновременно на многих узлах. Каждый узел формировал бы и записывал свои блоки.

При этом могла возникнуть ситуация называемая «проблемой двойных трат», когда некий недобросовестный пользователь Биткоин-сети решил отправить со своего биткоин-адреса, баланс которого, например составляет 1 BTC, одновременно два платежа по 1 BTC на два разных биткоин-адреса.

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

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



Но какой именно узел будет это делать? Ведь сеть Биткоина одноранговая и все узлы имеют равные права. Как достичь консенсуса между равными узлами?



Автор Биткоина, некий Сатоши Накамото, предложил в протоколе использовать для определения такого узла известный ранее алгоритм, который получил название Proof of Work (PoW) – доказательство сделанной работы.

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

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



Такой криптографической задачей в протоколе Биткоина является задача по подбору параметра, называемого nonce, который, будучи добавлен к заголовку сформированного блока, изменял бы его (блока) хэш-код так, чтобы он начинался с заданного количества нулевых битов (bits), что равносильно получению хэша, менее или равного заданному большому числу (Difficulty Target или попросту Target).



Другими словами, надо добавить такую короткую строку данных (nonce) в сформированный блок, чтобы получившийся хэш-код блока начинался с определенного количества нулей (точнее – нулевых битов).

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

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



Поясню на простом примере, как это происходит. Для этого возьмем уже известный нам пример с четверостишьем А.С.Пушкина:

 

(нет заголовка)

Мой дядя самых честных правил

 

 

c55c1d6a76b4d5e2f67b5167fd6f8ded02bf94b4a552…

Когда не в шутку занемог,

 

 

fe11dbc29864cd135eb2a7ab20f7c6012f606615d3cc…

Он уважать себя заставил

 

 

b5fa6355fe7c54bc8a25c3711fd09c82bcb682b4a880…

И лучше выдумать не мог.

 

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

 

(нет хэша)

23106

Мой дядя самых честных правил

 

 

00007cee3bff26415365c1453fe6758ad888edad3877…

27980

Когда не в шутку занемог,

 

 

000083c4f4acb2239e607921f653e9320e050f71b955…

17007

Он уважать себя заставил

 

 

50405

0000b0f1e6d8b09e8bf005c7023a3696343fcff267cc…

И лучше выдумать не мог.

 

Здесь в каждом блоке:

 

– первая строка – хэш предыдущего блока;

– вторая строка – найденный параметр nonce;

– третья строка – строчка четверостишья – полезный контент.

 

Хэш строки первого блока «Мой дядя самых честных правил,» равен:

 

c55c1d6a76b4d5e2f67b5167fd6f8ded02bf94b4a552…

 

А если мы добавим параметр 23106 к этой строке и получим «23106Мой дядя самых честных правил,», то найденный хэш-код будет начинаться с 4-х нулей:

 

00007cee3bff26415365c1453fe6758ad888edad3877…

 

Аналогично и со всеми последующими блоками. Для них были также подобраны параметры таким образом, чтобы хэш-код блока начинался с 4-х нулей.



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

А проверка найденного параметра – дело простое. Для этого надо лишь вычислить хэш-код полученных данных блока с учетом этого добавленного параметра.



Эта идея и лежит в основе Доказательства сделанной работы (Proof of Work).



Тот майнер (узел), который первым найдет параметр nonсе для своего созданного блока, и получает право записать этот блок в блокчейн. Иногда бывают случаи, когда несколько майнеров почти одновременно решают задачу по подбору параметра noncе. В этом случае все они получат право на запись своего блока в блокчейн и цепочка блоков разветвляется. Это состояние блокчейна получило название форк (от английского fork – вилка). Далее каждая ветвь прирастает своими новыми блоками, но побеждает та, где цепочка блоков будет длиннее. Все остальные ветви признаются невалидными и отсекаются от блокчейна. (Подробнее об этом читайте в главе «Понимание механизма консенсуса»).



Таким образом достигается консенсус между узлами в сети Биткоина.



Весь этот процесс по «цифроперемалыванию» – подставил новый параметр nonce, вычислил хэш, проверил результат и т. д. до получения нужного хэша с нулями в его начале – и есть пресловутый «майнинг»!



Следует добавить, что сложность решаемой криптографической задачи может изменяться (увеличиваться) в зависимости от суммарной мощности компьютеров, занятых майнингом. С ростом этой мощности количество нулевых битов в искомом хэше растет таким образом, чтобы максимальное время поиска результата (nonce) было не более 10 минут. Это автоматическое изменение сложности зашито программно в протоколе Биткоина и выполняется через каждые записанные 2016 блоков, т.е. примерно один раз в две недели.



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



Важный момент! Затраты майнеров на вычислительные ресурсы (стоимость оборудования и электроэнергии) являются надежной защитой от т.н. «атаки 51%» – состояния, когда более половины вычислительной мощности сети Биткоина контролируется одним майнером или группой майнеров. Теоретически, этот объём вычислительной мощности дает власть над сетью. Это означает, что каждая клиентская программа в сети верит в подтвержденный блок транзакций атакующей стороны, что позволяет атакующим осуществить контроль над сетью, включая следующие полномочия:

 

– создавать транзакции, конфликтующие с чужими;

– останавливать подтверждение чьей-либо транзакции;

– тратить одни и те же монеты несколько раз;

– мешать другим майнерам находить действительные блоки.

 

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



Но вернемся к собственно майнингу… А где же добытые «шахтерами» (майнерами) деньги (биткоины)?



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

Собственно, новые монеты могут попасть в сеть Биткоина только в результате майнинга. Тем самым осуществляется эмиссия биткоина.

Первоначально (в 2009 году) за каждый новый блок (т.е. каждые 10 минут) майнеры, которые добавили его в блокчейн, получали 50 монет BTC. Но, опять же, протоколом Биткоина установлено, что через каждые 210 000 блоков (примерно 4 года) вознаграждение за новый блок уменьшается в 2 раза. Поэтому сейчас (2018 год) майнеры получают за добавленный блок 12,5 BTC. А суммарное количество биткоинов (эмиссия) не может превышать 21 млн монет. Почему это так, читайте в главе «Почему количество биткоинов ограничено».



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



Подведем итоги:



Майнинг – это необходимый и важный процесс в сети Биткоина, в результате которого решаются следующие задачи:

 

– Запись нового блока транзакций в блокчейн.

 

 

– Выпуск новых монет биткоина (эмиссия).

 

 

– Сетевое вознаграждение участникам сети (майнерам) за обработку транзакций и формирование нового блока.

 

 

– Защита от т.н. «атаки 51%», делающая экономически нецелесообразными попытки взлома и контроля денежной сети.

 

 

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

 

Назад: Блок
Дальше: Почему количество биткоинов ограничено