Алгоритм PoW. Что такое Proof-of-Work. Зачем нужны майнеры?

Сегодня хочу рассказать про PoW. Если говорить про криптовалюты то большинство людей не понимают вообще как это все работает. Я и сам до конца все не понимаю.

Люди только знают, что видеокарты подорожали из-за майнеров. И они знают, что майня можно заработать деньги, но большинство совершенно не представляют ЗАЧЕМ нужен майнинг. Кстати, не понимают этого даже айтишники.

Вот прям сейчас попытайтесь ответить на несколько вопросов.

  1. Зачем вообще нужен майнинг? Можно ли организовать все вообще без майнинга?
  2. Какую задачу решают майнеры? Какого рода эта задача и как она решается что является ответом в этой задаче? Почему нужны такие огромные мощности?
  3. Что будет если вдруг резко майнеров станет в десять раз меньше? (Например, в китае сейчас соберут все асики и проедут по ним огромным катком) Что произойдет? Транзакции будут проходить в десять раз дольше? В чем будет заключаться проблема?

Если знаете ответы, то вам точно будет не интересно, можете смело не смотреть это видео. Если не знаете, то попытаюсь вам это все объяснить.

Если мы захотим разобраться и посмотрим на определение в интернете, то увидим примерно следующее

Proof-of-Work или PoW (доказательство выполнения работы) — это алгоритм достижения консенсуса в блокчейне; он используется для подтверждения транзакций и создания новых блоков. С помощью PoW майнеры конкурируют друг с другом за завершение транзакций в сети и за вознаграждение.

Обычный человек не понимает ничего. Что такое консенсус? Консенсус между кем и кем? Зачем он? Что такое подтверждение транзакций? Кто, зачем и как их подтверждает? Зачем майнерам конкурировать да и зачем вообще майнеры?

Ну ладно почитаем другую статью на хабре

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

Как это выглядит?

Предположим, Сатоши Бутерин со своего кошелька переслал 1 биткоин на кошелек Виталика Накамото. Согласно сути блокчейна, нужно зашифровать информацию, содержащую адреса кошельков Сатоши и Виталика, а также количество переведенных биткоинов. Тут в дело вступает майнинговое оборудование — ему нужно найти правильный вариант шифровки.

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

Я из этой статьи тоже ничего не понял. Что такое “ему нужно найти правильный вариант шифровки”? Для чего алгоритм предписывает шифровать информацию так чтобы в конце шифрованной строки был ноль?

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

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

Майнинг — не единственная технология создания новых блоков и обеспечения эмиссии. Альтернативами являются форжинг (минтинг) и ICO. Обычно используется только одна технология, но в некоторых криптовалютах используют комбинации из них.

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

История

Технология PoW существовала задолго до появления Bitcoin: в 1993 году в научной статье, авторами которой были Синтия Двор и Мони Наор. Они не дали название технологии, а лишь предложили концепцию: для доступа к какому-либо абстрактному ресурсу нужно решить определенную задачу. Идею подхватил Адам Блэк, запустивший в 1997 году проект Hashcash, основная задача которого заключалась в защите ресурса от спама. Через 2 года появился термин Proof of Work в научной статье Маркуса Якобсена и Ари Джуэлса.

Процесс майнинга биткойнов основан на Hashcash, системе доказательства работы, изобретенной Адамом Бэком в 1997 году для борьбы со спамом в электронной почте и атаками типа «отказ в обслуживании». Бэк, один из первых биткойнеров, отрицает, что он является создателем криптовалюты, Сатоши Накамото.

Как это работает

Давайте представим что какой-то человек хочет отправить биткоин другому человеку. Что происходит? Человек просто в своем кошельке создает транзакцию и подтверждает ее.

После этого транзакция транслируется приложением в сеть она попадает в какую-нибудь НОДУ. Это просто большое количество компьютеров подключенных к сети, Все полные ноды имеют у себя полную копию блокчейна. Например, на данный момент блокчейн биткоина полностью весит 145 гигабайт.

Далее нода кидает вашу транзакцию в “Пул неподтвержденных транзакций”, где она будет лежать пока какой-то майнер не возьмет в работу. Само собой транзакция не сразу попадает в пул, нода должна выполнить следующие действия:

  1. Проверить правильность синтаксиса транзакции.
  2. Убедиться, что списки входов и выходов транзакции не пусты.
  3. Убедиться, что размер транзакции в байтах меньше, чем максимальный размер блока.
  4. Убедиться, что все выходы и их сумма являются допустимыми денежными значениями.
  5. Убедиться, что транзакция не является coinbase-транзакцией.
  6. Убедиться, что значение nLockTime не превышает максимальное целое число (INT_MAX), что размер транзакции составляет как минимум 100 байтов и что количество операндов подписи меньше или равно 2.
  7. Отклонить транзакцию, если алгоритм scriptSig или scriptPubKey выполняет в ней какие-либо нестандартные действия.
  8. Отклонить транзакцию, если транзакция уже есть в пуле или главной ветви блока.
  9. Отклонить транзакцию, если какой-либо из ее входов ссылается на выход другой транзакции в пуле.
  10. Найти для каждого входа транзакции в главной ветви блока или пуле транзакцию с соответствующим выходом. Если у какого-либо входа ее нет, добавить транзакцию в группу «транзакций-сирот».
  11. Для каждого входа: если транзакция с соответствующим выходом является coinbase-транзакцией, убедиться, что она имеет как минимум 100 (COINBASE_MATURITY) подтверждений, в противном случае отклонить транзакцию.
  12. Для каждого входа: если соответствующего входу выхода не существует, отклонить транзакцию.
  13. Используя транзакции с соответствующими выходами, убедиться, что каждый вход и сумма являются допустимыми денежными значениями.
  14. Если сумма входов меньше, чем сумма выходов, отклонить транзакцию.
  15. Если комиссия за транзакцию (определяемая как разность между суммой входов и суммой выходов) слишком мала для включения транзакции в пустой блок, отклонить транзакцию.
  16. Проверить правильность алгоритма scriptPubKey для каждого входа и, если какая-либо из проверок завершается неудачей, отклонить транзакцию.
  17. Добавить транзакцию в пул.
  18. Если транзакция адресована самому узлу, добавить ее в кошелек.
  19. Ретранслировать транзакцию другим узлам.
  20. Для каждой транзакции-сироты, в которой текущая транзакция используется в качестве одного из входов, рекурсивно выполнить все 20 описанных этапов.

После того как транзакция попала в пул, майнеры, которые находятся в сети замечают ее и выбирают какое-то количество транзакций из пула и собирают из них новый блок. Блок это по сути список транзакций, который умещается в 1мб.

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

Например, смотрите. Есть два майнера. И они из пула взяли одну и ту же транзакцию и включили ее в свои блоки. Прежде чем добавить транзакцию в блок майнеру надо проверить отвечает ли транзакция необходимым требованиям.

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

Для чего нужна эта задача? Зачем ее вычислять? Технически она не нужна для транзакции, она не нужна для каких-то расчетов. Практической пользы для пользователя, для блокчейна, для создания блока нет. С этой точки зрения это бессмысленная работа. Смысл этой работы в том, чтобы в сети не было спама и в том, чтобы предотвратить атаку 51 процента, про которую я расскажу в конце.

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

Так какую именно задачу решают майнеры

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

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

То есть вы можете взять любой массив данных. Например, строку с одним символом “A” или огромный массив данных, например большой файл и захэшировать. При этом и в том и в другом случае вы получите строку установленной длины.

Давайте, например, возьмем строку ‘johenews’ и захэшируем ее

from hashlib import sha256

input = 'johenews'
print(sha256(input.encode('utf-8')).hexdigest())

Мы получили

2a4c4866fab0401459078d3df9686b52fc72b767a848720c18de8e7c6bf33658

Мы можем проверить хэш и для какого-то большого файла. Например, мы можем скачать какой-нибудь арч линукс. На странице со скачиванием файла вы можете увидеть “Checksums” посмотрите на них

11

Теперь скачайте арчлинус и проверьте его хэш-сумму

22

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

В случае с арч линуксом или с другим софтом хэш позволяет вам убедиться, что софт не был подменен. Что вы скачали именно тот файл, который выложили разработчики. Ведь может быть такая ситуация, когда сервер взломали, взяли файл внедрили в него какую-то вредоносную штуку, а пользователи думают, что этот файл от разработчиков арч линукса. Разработчикам арч линукса пользователи доверяют. Но как убедиться, что файл именно от них. Вот как раз хэш и позволяет это сделать. Измени хоть один байт в файле и поменяется хэш.

Свойства

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

Детерменированность. Это значит, что независимо от того сколько раз вы будете делать хэширование и не зависимо на каком устройстве вы это делаете результат должнен быть всегда одинаковым.

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

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

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

Устойчивость к коллизиям. Хэш, который у нас получается в итоге должен быть как можно более уникальным. Очень желательно чтобы два разных набора входных данных не имели одинаковый хэш. Вот, например, у биткоина время между созданием блока занимает 10 минут. Если мы будем увеличивать это время то мы замедлим транзакции и увеличим цену на них, если мы уменьшим это время, то есть риск что будет большое количество коллизий. То есть будет создано больше хэш-функций, которые неизбежно вызовут больше коллизий. Ну и будет еще одна проблема, будет большое количество брошенных блоков. То есть майнеры будут создавать большое количество новых блоков без сохранения целостности основной цепочки.

Так какую же задачу решают майнеры?

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

И майнер начинает проделывать эту работу. Как вы понимаете он не может расшифровать хэш, так как мы с вами говорили, что у хэш функции есть одно очень важное свойство - “Сложность обратного вычисления”. По сути майнеру надо заниматься перебором. Надо начать цикл и постепенно начать выполнять какие-то арифметические операции.

Давайте сами начнем писать такую программу. Расчехляйте свои пайтоны ребят.

Как вы помните, мы можем взять какую-то строку и получить из нее хэш вот так

from hashlib import sha256

input = 'johenews'
print(sha256(input.encode('utf-8')).hexdigest())

Как вы помните мы получим

2a4c4866fab0401459078d3df9686b52fc72b767a848720c18de8e7c6bf33658

Видите, хэш начинается с двойки. Что будет если мы сделаем цикл и начнем прибавлять с нашей строке какую-то цифру.

Вот хэш суммы для последовательности из десяти таких хэшей.

johenews1 e58f9dd3108096854d5e32f5a01ae67ae06a9c9b5fa4057561e447d052e3c90d
johenews2 26150280587adec501f8d43e9fbf9c85e87973159484ef68727b5551cd4d0e35
johenews3 5563ffbc9d72292ce3eae331c7e16c4b39c5931c349ab9b1a57983409799b3c4
johenews4 6b62944fea820875e5ce484b453d32af40a4b925078de19251aef6b493b454ab
johenews5 e3b4484aaefb21a3c621d5f548759bc846cafc1a31bc53b3b46f20972711ac88
johenews6 1ab85800129ffc7c38cad5af6b009dad5b945c941f207c8fe7e26593ba6c1c83
johenews7 da864c0374cddd97107364ed88a453fbc01027c63a2f157cecb0e6b7a3b2ce64
johenews8 f0d2a88ae57b2b987f19deff2a7318703bea7e25e78fceb381dd3a88905b3e14
johenews9 0ecaab8a17572756678af41296384bbd19348acd81197bff64991387ef8c37ee

Вот вся наша программа

from hashlib import sha256
from datetime import datetime
import time
start_time = datetime.now()

input = 'johenews'
tofind = '0'

i = 0
ltrfinal = ''
while ltrfinal != tofind:
    i = i + 1
    final = input + str(i)
    hashfinal = sha256(final.encode('utf-8')).hexdigest()
    ltrfinal = hashfinal[:1]
    print(final, hashfinal)

print(datetime.now() - start_time)

И ответом на эту задачу будет - 9

Если вы выполните эту программу у себя, то заметите, что она выполнилась очень быстро. У меня выполнение заняло 0.001978 секунды. Даже не смотря на то, что это пайтон.

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

Теперь ответ - 357, но ответ мы все равно находим за 0.084011с

Повышаем сложность и просим найти хэш который начинался бы с трех нулей.

Теперь ответ - 3144, но ответ мы все равно находим за 0.661325с

Повышаем сложность и просим найти хэш который начинался бы с четырех нулей.

Теперь ответ - 7994, но ответ мы все равно находим за 0.325559с

Повышаем сложность и просим найти хэш который начинался бы с пяти нулей.

Теперь ответ - 965807

И для того чтобы найти ответ мы уже потратили 36 секунд. Все равно меньше 10 минут. Повышаем сложность. Шесть нулей.

И вот мы видим, что мы потратили 4 минуты и 37 секунд на то, чтобы найти хэш, который бы начинался с шести нулей. Ответ - 6942835. Мы проделали довольно большую работу. Перебрали 6942835 вариантов для того чтобы найти нужный. Сожгли некоторое количество электроэнергии на такие вот вычисления.

333

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

Понятное дело, что это ПРИМЕРНЫЕ расчеты. И сделаны они для конкретной строки. И время будет отличаться для нахождений хэшей от разных изначальных данных. Кроме того, время будет разным и на разном железе. Но порядок все равно будет примерно такой.

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

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

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

После того как мы нашли ответ нода начинает проверку. Если все хорошо, то ваш блок принимается.

Если в транзакции или блоке нарушены консенсусные правила, то нода отказывает в операции, даже если все другие узлы считают, что все в порядке. Более того, она на какое-то время перестает «замечать» источник, который попытался провести транзакцию, нарушающую правила. Это одна из самых важных характеристик полных нод: они делают то, что правильно, несмотря ни на что, тем самым обеспечиваю высокую безопасность всех операций.

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

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

И тут может есть потенциальная аката - она назыается атакой 51 процента.

АТАКА 51%

В 2018 году я потерял деньги на бирже Cryptopia. Эта биржа тогда подверглась атаке 51% и после этого обанкротилась и закрылась. Эта атака была совершена на монету, которая называется AurumCoin. Эта монета до сих пор торгуется почему-то.

В то время разработчики этой валюты заявили о атаке на свою сеть, тогда неизвестный пользователь вывел 15 752,26 монет ($571000 на момент публикации) с криптобиржи Cryptopia. Основатели AurumCoin при этом утверждают, что они не ответственны за случившееся, поскольку токен имеет открытый код, и переложили вину на сотрудников биржи.

Предполагается, что хакер отправил около 16 000 AU на счет, принадлежащий бирже Cryptopia, и обменял их на другую криптовалюту. После совершения транзакции злоумышленник использовал имевшиеся в его распоряжении вычислительные мощностями и отменил транзакцию.\

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

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

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

При этом если мощностей в блокчейне не много, то его можно подвергнуть атаке 51%, так взламывались валюты Monacoin, Zencash, Verge, Litecoin cash. Это приводило к большим потерям. Некоторые биржи теряли около $90 000 в Monacoin, $500 000 в ZenCash и $1,7 миллиона в Verge. В ноябре 2018 года вследствие атаки 51% на Aurum Coin с биржи Cryptopia похищено более $500 000.

Как транзакции попадают в пул

Разные алгоритмы майнинга являются разными уравнениями. Допустим, первый алгоритм M+N=R, второй M*N=R. Каждым блокам дается постоянное значение M, а ответ – число R с 2 нулями в конце. В случайном порядке перебирается число N, пока не найдется ответ. Сетью подбирается такое число нолей, чтобы блок находился в среднем за то самое значение (10 минут Биткоин или 13,2 секунд Эфириум).

Так, ферме, занимающейся майнингом Эфириума, каждые 13,2 секунды дается новая задачка. Эта самая ферма пробует выиграть в «угадайку», для создания нового блока.

Так, например, блок Биткоин находится, в среднем, за 10 минут, а у Эфириума – 13,2 секунды

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

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

Как обьясняется

В майнинг технология Proof-of-Work (доказательство работой) пришла вместе с Bitcoin и применяется для разгадывания блока (майнинга) с помощью специального оборудования.

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

Если решения совпали – за выполненную работу майнер получает вознаграждение, при этом размер вознаграждения фиксированный (например, за разгадывание блока Bitcoin майнер получит 12,5 btc).

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

HASH

Например давайте возьмем ХЭШ от johenews

from hashlib import sha256

input = 'johenews'
print(sha256(input.encode('utf-8')).hexdigest())

Давайте примерно прикинем задачу

from hashlib import sha256
from datetime import datetime
import time
start_time = datetime.now()

input = 'johenews'
tofind = '00000'

i = 0
ltrfinal = ''
while ltrfinal != tofind:
    i = i + 1
    final = input + str(i)
    hashfinal = sha256(final.encode('utf-8')).hexdigest()
    ltrfinal = hashfinal[:5]
    print(final, hashfinal)

print(datetime.now() - start_time)

Contents

comments powered by Disqus