Сегодня я расскажу о том, как работает майнинг и, в отличие от сотен других статей схожей тематики, я покажу сам процесс майнинга. Что же конкретно выполняет оборудование для майнинга? Что это за задача такая? Но не будем торопиться, прямо сейчас начинаем с теории, потом плавно перемещаемся в практическую часть.
Тема майнинга не может обойти тему хэширования, поэтому буквально немного материала про хэш-функции хэширования. Хэширование - это процесс математического преобразования данных. Я нахожусь в онлайн генераторе хэш-функции, который называется «Cryptii» (https://cryptii.com/), ссылку оставляю, можете все это попробовать проделать самостоятельно.
Итак, у меня есть в левой области сообщение “Всем добра” и его хэш, вот так он выглядит, сообщение может быть абсолютно любой длины, то есть вот мы можем его увеличить, вот так
и как видите сообщение увеличивается в объеме, а хэш всегда остается фиксированной длины, то есть 256 бит, а потому что выбрана хэш-функция SHA-2 длиной 256 бит. В данном случае значение, которое у меня здесь представлено, это шестнадцатеричная система счисления, я могу поменять на двоичное
вот мы видим двести пятьдесят шесть нулей и единиц. Все просто, есть некое сообщение, которое пропускается через хэш-функцию и результат хэш-функции - это хэш этого сообщения. Два важнейших свойства хэш-функций первое это детерминированность, то есть одно и то же сообщение всегда будет давать один и тот же хэш. Другими словами этот хэш является цифровым отпечатком пальца этих данных. Второе важнейшее свойство это непредсказуемость то есть мы не можем заранее на берегу предугадать какой будет хэш у какого сообщения, единственная возможность узнать это - пропустить данное сообщение через алгоритм хэширования - это математическая мясорубка, то есть у нас есть некий кусок мяса который мы пропускаем через мясорубку и мы получаем фарш никто и никогда не сможет предсказать а какой и именно будет фарш, какой формы, единственный способ узнать это это пропустить этот кусок мяса через мясорубку. Ну и так же можно сказать про третье свойство - это необратимость, то есть мы не можем взять этот фарш и далее заново его как-то обратно пустить через мясорубку и получить тот же самый кусок мяса. Про хэш и хэш-функций можно рассказывать очень и очень долго, однако нам будет достаточно для понимания майнинга этих двух свойств первое это детерминированность, то есть одно и то же сообщение всегда нам дает один и тот же соответствующий ему хэш и второе это непредсказуемость мы не можем узнать какой будет хэш у какого сообщения, единственный способ это пропустить данное сообщение через алгоритм и получить хеш. И здесь ключевая мысль, задумайтесь, если хэширование непредсказуемо, если мы не знаем какой будет результат, то это идеальный способ для генерации некой случайности.
Ну что ж, начнём майнить, давайте только начнем вручную. Блок биткоина как правило состоит из системных данных например высота блока там 900 000, дата сегодня, например 25.12.2021 года, ну и другие данные, а вторая часть это сами транзакции, например Вася отправил Пете 2btc, а Миша отправил Алёне 30btc (он у нас богатый чувак), а Петя отправил Оле 1 btc и так далее, этих транзакций может быть очень и очень много. Чтобы данный блок стал частью блокчейна, чтобы его приняла сеть, мне как майнеру необходимо решить математическую задачу, которая звучит примерно так: «подберите пожалуйста хэш данного блока, чтобы он начинался с нуля». И здесь мы сталкиваемся с проблемой так как у нас уже есть hash и чтобы он менялся нам также нужно что то менять в блоке, то есть блоки должны быть как эта динамическая информация и нам подойдет такой параметр как на NOUNCE.
Параметр NOUNCE мы и будем перебирать, а начнем с 1.
Нет, хеш начинается с 7, а нам надо, чтобы он начинался с нуля. Далее “2”, смотрим на хэш, нуля нет, далее 3 - нет, 4 - нет, 5 - нет, 6 - нет, 7 - нет, 8 - нет, 9 - нет, 10 - нет, 11 - нет, 12 - нет, 13 - нет, 14 - нет, 15 - нет, 16 - нет, 17 - нет, 18 - нет, 19 - нет, 20 - есть ноль в начале.
20-я попытка дала хэш с нулем, я решил эту задачу и в CoinBase отправляю транзакцию, я себе отправляю 6.25 btc, ура! Так как хэширование непредсказуемо, то единственным способом подобрать хэш с нулем впереди будет перебор поэтому все майнеры всей сети находятся в одинаковых условиях, им ничего не остается кроме того как просто перебирать хэш.
Для серьезного майнинга я написал небольшую программу на языке Python (питон), которая будет имитировать то, как работает майнинг. Итак представим, что мне нужно подобрать хэш с тремя нулями, поехали.
За секунду я нашел хэш с тремя нулями и моей машине потребовалось 931 попытка. Давайте теперь попробуем найти хэш с 40 нулями впереди, поехали. Чуть чуть дольше, но вот он хэш с четырьмя нулями и мне потребовалось 50 тысяч попыток для этого.
Давайте теперь 5 нулей и теперь моя машина уже перебирает хэши достаточно долго, несколько секунд, но все таки она нашла хэш с пятью нулями. Когда я нахожу хэш с пятью нулями это гарантирует то, что я выполнил определенные вычисления, то есть выполнил работу, потратил энергию, потратил ресурсы, отсюда и название консенсуса proof-of-work, то есть доказательства выполнения работы.
Данный хэш, который я предоставил - это доказательство выполнения работы, потому что иным способом получить я его не могу, кроме как просто перебирая его и давайте попробуем шесть нулей. Моя машина начинает орать как пылесос, хотя у меня не самый слабый ноутбук здесь и 9 процессор с 8 ядрами, именно поэтому майнеры охотятся за оборудованием, то есть за видеокартами и за «асиками», специальными устройствами, которые предназначены лишь для одной единственной задачи -перебирать хэши, они в сотни и тысячи раз эффективнее процессоров и кстати мой хеш нашелся, мне повезло на самом деле, шесть нулей. Три миллиона триста семьдесят тысяч попыток потребовалось, это доказательство работы, данный хэш, он ценен, он представляет некую ценность, потому что он образовался не просто так, он образовался после того как я выполнил определенные вычисления, так как майнинг непредсказуем, то мне может повезти я найду шесть нулей за секунду, а может не повезти и я буду искать этот блок 10, 20, 30 минут или целый час, именно поэтому если мы посмотрим на блоки биткоина, то мы увидим что вот например последний блок добывался за четыре минуты, а здесь за 10 минут, а здесь 12 минут, а здесь за три минуты. Иногда бывает, что блок находится за пять секунд, а бывает что блок находится за час, то есть это непредсказуемый процесс это подбрасывание монетки
кому-то может повезти, а может вообще никому не будет везти целый час ну и как вы видите на экране заголовок блока является его хешем, то есть его цифровым отпечатком.
Посмотрите сколько нулей нужно добыть текущим манерам, давайте посмотрим какую задачу выполнял тот же Сатоши Накамото, когда только-только был рожден bitcoin и мы видим, что здесь всего-навсего восемь нулей, то есть, если я шесть нулей подобрал за пять минут, то в целом вот такой вот хэш я мог подбирать на своем компьютере за час, за два, за три, я мог на майнить много блоков.
Небольшое уточнение, сама задача, которую распределяет протокол подобрать, например 8 нулей или там 6 нулей называется «Target hash», то есть это целевой хэш, который следует подобрать майнеру. Однако задача состоит не том, чтобы набрать конкретное количество нулей, а подобрать тот хэш (a хеш - это у нас на самом деле число), то есть такое число, которое будет равно либо меньше «Target hash», то есть целевого числа. Давайте я покажу на примере:
мы зайдем в текущие блоки,
скопируем этот хэш и я переведу данный хэш в десятичную систему счисления,
вот, поставлю сюда. Далее мы найдем какой-нибудь хэш с пятью нулями,
подставим его вот сюда и найдем хэш с одним нулем,
поставим сюда. Давайте запустим этот скрипт, как мы видим хэш с одним нулем это просто число.
Вот оно здесь написано с разрядностью 76, то есть вот число состоит из 76 цифр здесь. Второй хэш с пятью нулями, это число меньше, его разрядность равна 71
а число которое подбирается сейчас майнерами это
вот оно, то есть это 10 в 54 степни и задача манеров подобрать число меньше либо равно этому. То есть если мы подберем число еще меньше, например 1 миллион или два миллиона, то это тоже будет решением задачи, у такого числа впереди будет
много много много нулей.
Протокол у биткойна написан таким образом, чтобы блоки добывались каждые десять минут, то есть мы видим здесь 11 минут, там 10 минут, 2 минуты, 6 минут и так далее.
но если мы сложим и рассчитаем среднее время поиска блока, то оно будет равно примерно 10 минутам. Если майнеров становится больше, соответственно увеличивается хэшрейт сети (количество хэшей которое перебирается в секунду), то время нахождения блоков будет уменьшаться. Если же майнеров будет становиться меньше, соответственно хэшрейт сети будет уменьшаться, а время поиска блоков будет увеличиваться. И каждые 2016 блоков, то есть каждые две недели регулируется сложность, если майнеров много, то задача усложняется и добавляется нолик впереди, то есть нужно найти число еще меньше. Если манеров становится мало, то задачу следует облегчить и убрать нолик, таким образом привести ее к соответствию «нахождения блока течение 10 минут».
С ростом сложности задачи в биткойне, в эфире и других монетах proof-of-work, соло майнинг сошел на «нет» и поэтому участники начали объединяться в майнинг-пулы. И вот что они делают, например у нас есть 5 майнеров манер 1, манер 2, майнер 3, майнер 4, майнер 5. Они договариваются, один из них говорит, у меня нормальное количество мощности, давайте я буду перебирать значения параметра NOUNCE от 0 до 500 000. Второй майнер говорит: «о'кей, слушай у меня чуть меньше мощностей, давай я буду перебирать от 500 001 до миллиона». Третий майнер говорит: «слушайте ребята, у меня вообще очень много мощностей, я готов перебирать NOUNCE от миллиона до 10 миллионов». Четвертый майнер говорит: «а у меня совсем все плохо давайте я буду подбирать от 10 миллионов до 10 000 100 и так далее.
То есть майнеры объединяются в группу, они договариваются и распределяют сложную задачу на кусочки, каждому манеру достается свой кусочек, который необходимо решить и таким образом эффективность и вероятность нахождения блока увеличивается многократно, а вознаграждение может распределяться пропорционально предоставленному хэшрейту каждого участника.
Надеюсь я закрыл основные вопросы по майнингу, которые вообще возможно было закрыть за какие-то там 15 минут. Благодарю за внимание!