Здравствуйте %username%!
Я объясню и покажу вам, как работает основа для заработка денег в криптовалютах — майнинг. Как сделан первый блок, новые блоки и как деньги берутся из ниоткуда.
Чтобы было проще разобраться, напишем свой импровизированный майнер для импровизированной криптовалюты HabraCoin.


Во-первых, конечно, упрощенное либретто.
Кошельки
Каждый кошелек представляет собой случайно сгенерированную пару ключей. По сути, адрес кошелька — это хэш открытого ключа. Таким образом, он может быть однозначно идентифицирован.
Транзакция
Это запись, с какого кошелька переводится сумма. Это также время и дата транзакции. Эта запись (ее хэш) подписывается закрытым ключом отправителя и отправляется всем в зоне ожидания подтверждения.
Подтверждение
Чтобы транзакция была известна и зафиксирована всеми, ее необходимо подтвердить, что достигается созданием нового блока.
Это служебные данные + список транзакций + номер кошелька майнера + магический номер.
Цепочка блоков
Последовательность, в которой каждый последующий блок содержит предыдущий идентификатор.
Начало
Итак, есть определенное количество людей, мы можем иметь одного. Назовем его Хаброша. Он решает запустить собственную криптовалютную систему HabraCoin.
Поскольку у этой валюты нет выделенных серверов, все участники равны и должны каким-то образом договариваться о действительности транзакции. Это означает, что необходим механизм, обеспечивающий:
- Безотзывность сделки.
- Проверить их достоверность может каждый.
Для этого он создает блок из существующих на данный момент непроверенных транзакций, предыдущего номера блока, номера вашего кошелька и т.д. Для первого блока у нас нет транзакций, у нас нет предыдущего номера блока, абсолютно ничего. Только адрес кошелька Хаброши и дата со временем.
Кроме того, алгоритм HabraCoin определяет следующее.
- В идеале новые блоки должны создаваться каждые 10 минут. Если через какое-то время мы посмотрим и окажется, что блоков больше, чем должно быть, то мы посчитаем новую сложность их генерации через каждые 100 блоков
- За создание правильного блока он получает вознаграждение в размере 50 ХабраКоинов + комиссия
- Победителем становится блок с наибольшим количеством сделок
Ограничение скорости
Как видите, сам факт создания блока доказывает, что его создатель получает за это вознаграждение. А чтобы это имело смысл, нужно ограничить скорость и сложность блокировки. Иначе сами понимаете, тонны блоков из ничего и бессмысленны.
Криптовалюты используют метод снижения сложности, т.е. проблему вычисления хэша заданного значения. Точнее, меньше определенного значения.
Если кто-то не знает, хэш вроде f7c9f52d1ebf8c6aef8986fb127ba7bdeec58521f7eb46f026b708df26a40912 — это какое-то число. В десятичном виде это выглядит как 1120781020043743780422848848262422804062840220424884848628408208468422468268028. То есть хеши можно сравнивать, складывать, вычитать, и все.
Так что. Чтобы все считали блок действительным, его хэш должен быть меньше максимально возможного минус значение, которое все определяют, которое называется сложностью.
Например, хеш у нас 4 байта, его максимально возможное значение FFFFFFF
16
. И сложность, скажем, 100
10
. Вычтите одно из другого, чтобы наш хэш был меньше FFFFFF9B.
16


Как мы можем этого добиться?
Если вы помните, все блоки состоят из нескольких полей. Мы берем эти поля, объединяем их и получаем из них массив байтов. Отдаем этот байтовый массив в хеш-функцию, получаем результат и проверяем: меньше ли он результата с учетом текущей сложности?
Если нет, мы модифицируем этот массив байтов, пока не получим желаемое значение. А именно:
В каждом блоке есть поле, называемое nonce. Это число в несколько байтов, которое нужно увеличить на единицу, добавить к блоку и снова прочитать из него. Поскольку хорошие хеш-функции дают более или менее равные значения вероятности, мы не знаем заранее, сколько раз нам придется повторить процесс. Может в 1-2 раза, может в миллиарды.
Тот, кому удается получить хеш, соответствующий условиям сложности, отправляет всем блок с заключенными транзакциями. В случае, если это сделали несколько человек одновременно, условием является то, что несколько блокчейнов не могут существовать вместе, и побеждает самый длинный из них. То же самое, если у нас есть две строки:
Блок1->.
Блок2->.
Блок3А
Блок1->.
Блок2->.
Блок3B
побеждает тот, для которого 4-й кирпич был найден раньше. А меньшая строка отбрасывается, а ее транзакции возвращаются в очередь для подтверждения.
Комиссия
Каждый видел в своем кошельке поле «комиссия» при совершении транзакций. Эта комиссия идет людям, ответственным за генерацию блоков. Так что в первую очередь из всех ожидающих подтверждения транзакций будут выбирать те, которые содержат комиссию. После генерации блока предполагается, что вся комиссия, заложенная в транзакциях, достается его (блоку) создателю.
Это означает, что когда комиссия за генерацию блока закончится (если это прописано в алгоритме валюты), майнерам останется только комиссия, а свободные сделки могут никогда не быть обработаны.
Давайте смоделируем ситуацию и поможем Habrosz создать блок.
Вот ломаная программа (как тест Junit), которая ради приличия генерирует 2 рандомные пары ключей, формирует некое подобие транзакции (даже подписывает ее, все честно!), а потом ищет надстройку к это то, что первые 2 байта хеша равны нулю. Это немного сложно. Он работает несколько минут, а затем действительно генерирует хэш, который можно быстро проверить, объединив байты транзакции и счетчика.
Пример блока результатов:
1824B9ADF09908222CF65069FDE226D32F165B3CF71B7AA0039FDFEF75EAA61610909EBFFBAC023480FC87FCF640C4A
009B82C4A6D25A0F4B8A732AE54EF733E792681137BA378577DFDC2732D192DAF323966EAD4ADC9635D7A12EDD50E34
9F660622D186AF3C03BF7D265F2AA7EB125056F4BF45BE519E8B22B845B28065110000006400000142E5D667CB01CEE
EDD0AC15EC4C491819A99030BD5FEF7CD2B469F2B90BA13D7981EDCD0708353D13390B8564F496C44FAC2777B0AF79D
C94CBF36D0CC0F047E807889F34C4DC5FEB724699C257391F84F3DDD70B84F841D115F4EFEAF4E58779042F35257E5C
035046037DE740718D199A8F06AD7A58E37CCCD4CC5E95295DCC2C5F3C70847BD59FA57BCC5FF4B208F93948FCFD763
EC1E5C85B61C43EB64B77A9F53B28785D7DE2335333003260A0839D53927976751A8D8967B2BB325909D86E82BC4125
2A28ECF6F0E7476BB99B29585EB0E75410000
000008ACF935A8E3E453AC538706F560155943C6B0A77E5F5FCA7939D5FFE589676A6B3CD7AC78845786C50449D1A6F
91003ЭДКА7Б5Д8Б12АК36ККА36А00844А
Вот мы и заработали несколько хабракоинов для Хаброша. Статья конечно поверхностная, так что готов к вашим вопросам.

