- Блокчейн за семь шагов: как работает майнинг и как обрабатываются транзакции
- Майнинг, также известный как хэширование (алгоритм консенсуса «доказательство выполнения работы»/Proof of Work)
- Майнинг в блокчейн-сетях: как он работает
- Для чего нужен майнинг
- В чем состоит работа майнеров
- Майнинг — совместные усилия участников сети
Блокчейн за семь шагов: как работает майнинг и как обрабатываются транзакции
Когда-нибудь задумывались, как работает майнинг в блокчейне, или как транзакции подтверждаются и добавляются в блокчейн? И я тоже. Но из-за того, что мне так и не попалось чёткое и доступное пошаговое объяснение этого процесса, я решил написать его сам. Итак, представляю вам результат моего исследования на тему, как обрабатываются транзакции в блокчейне. И всего за семь шагов.
Шаг 1: Пользователь, намереваясь переслать кому-то другому некую сумму в криптовалюте или токен, подтверждает транзакцию в своём приложении-кошельке.
Шаг 2: Транзакция затем транслируется приложением кошелька в сеть соответствующего блокчейна. Там она попадает в «пул неподтверждённых транзакций», где и будет находится до тех пор, пока её не подберёт какой-нибудь майнер (тот, кто занимается майнингом). Такой пул представляет собой скопление неподтверждённых транзакций, ожидающих обработки. Чаще всего неподтверждённые транзакции собираются не в одном гигантском пуле, а в небольших разделённых локальных пулах.
Шаг 3: Майнеры, находящиеся в сети (иногда называемые узлами или нодами, но это не совсем то же самое, что и майнеры!), выбирают транзакции из пулов и собирают из них новый «блок». Блок, по сути, это набор транзакций (на этот момент времени всё ещё неподтверждённых транзакций), плюс дополнительные метаданные. Каждый майнер собирает свой собственный блок транзакций. Одни и те же транзакции могут быть добавлены разными майнерами в свои блоки.
Пример: Рассмотрим двух майнеров, майнера А и майнера Б. Оба этих майнера могут решить включить некую транзакцию Х в свои блоки. В каждом блокчейне установлены свои ограничения максимального размера блока. В Биткойн-блокчейне максимальный размер блока составляет 1 мегабайт (Мб) данных. Прежде чем добавить транзакцию в блок, майнеру необходимо проверить отвечает ли транзакция требованиям к исполнению, в соответствии с историей транзакций в блокчейне. Если на балансе кошелька отправителя находится достаточно средств согласно существующей истории транзакций блокчейна, транзакция считается действительной и может быть добавлена в блок. Если владелец биткойнов захочет ускорить процесс обработки своей транзакции, он может предложить более высокую награду за майнинг. В этом случае, как правило, майнеры присвоят более высокий приоритет этой транзакции по сравнению с другими, в связи с возможностью получить большее вознаграждение за процесс майнинга.
Шаг 4: Выбирая транзакции и добавляя их в свой блок, майнеры тем самым создают блок транзакций. Для того, чтобы блок в последующем мог быть добавлен в блокчейн (что означает, что все узлы в блокчейне зарегистрируют транзакции, находящиеся в этом блоке), в первую очередь блоку необходима подпись, также называемая «доказательством выполнения работы» (англ. Proof-of-work или PoW). Эта подпись создаётся путём решения очень сложной математической задачи, которая является уникальной для каждого блока транзакций. Разным блокам соответствуют разные математические задачи, так что каждый майнер будет работать над решением своей задачи, уникальной для сформированного им блока. Все задачи одинаково трудны для решения. При решении такой математической проблемы затрачиваются большие вычислительные мощности (а, соответственно, и большое количество электроэнергии). Вы можете сравнить это с выполнением вычислений на калькуляторе, только в данном случае всё гораздо сложнее и делается на персональном компьютере. Этот процесс называется майнингом. Если вы хотите узнать более подробно о том, что за математические задачи приходится решать в процессе (на самом деле, это не так сложно), тогда, пожалуйста, продолжайте читать дальше. В противном случае, если нужен материал «полегче», сразу переходите к «шагу 5».
Майнинг, также известный как хэширование (алгоритм консенсуса «доказательство выполнения работы»/Proof of Work)
Математическая задача, которую приходится решать каждому майнеру при попытке добавления блока в блокчейн, заключается в нахождении хэш-суммы (также называемой цифровой подписью) для данных в этом блоке. Причём подпись должна начинаться с определённого количества идущих подряд нулей. Выглядит весьма трудной задачей, не так ли? На самом деле всё не так сложно. Позвольте мне попытаться объяснить это в упрощённом виде.
Прежде чем мы продолжим, важно знать, что такое хэш-функция. Говоря простым языком, хэш-функция представляет из себя математическую задачу, которую очень сложно решить, но при этом полученный ответ очень просто проверить.
Хэш-функция берёт строку входных данных, состоящую из цифр и букв (любую, в прямом смысле этого слова, строку случайных букв, чисел и/или символов) и преобразовывает её в новую 32-символьную строку, состоящую из случайных букв и цифр. Эта 32-символьная строка и есть хэш-сумма. Если изменяется любая цифра или буква во входящей строке, то хэш-сумма также изменится случайным образом. Однако, одна и та же строка входных данных всегда на выходе будет иметь одну и ту же хэш-сумму.
Теперь примите во внимание, что данные внутри блока – это входные данные для хэширования (та самая строка данных). В результате обработки этих входных данных хэш-функцией мы получаем хэш-сумму (32-символьную строку). Правилами блокчейна Биткойна оговаривается, что только те блоки могут быть добавлены в блокчейн, чьи подписи (хэш-сумма) начинаются с определённого количества нулей. Однако, сгенерированная выходная строка является всегда случайной для разных строк данных на входе. А что если строка данных блока в результате обработки хэш-функцией не даёт на выходе подпись (хэш-сумму), начинающуюся с того определённого количества идущих подряд нулей? Так это и является причиной того, что майнерам приходится многократно изменять некий фрагмент данных своего блока, называемый «нонс» (англ. nonce). Каждый раз, когда майнер изменяет нонс, это влечёт за собой незначительное изменение компоновки данных блока. А когда меняется структура данных внутри блока (то есть, его входные данные), также изменяется и его подпись (или его выходные данные). Итак, каждый раз, когда меняется нонс блока, этот блок получает новую случайную подпись.
Такая процедура изменения нонса повторяется майнерами бесконечное число раз, пока в конечном итоге они случайно не наткнутся на выходную строку, удовлетворяющую требованиям к подписи блока (определённое количество нулей в самом её начале). Ниже приведён пример, иллюстрирующий этот процесс. В примере используется семь нулей, но количество нулей на самом деле зависит от сложности блока в блокчейне. Сложность блока – это несколько более продвинутая тема, поэтому предлагаю вам ознакомиться с ней позднее.
Именно таким образом майнерам приходится искать подходящую подпись для своего блока, и это также является причиной, по которой требуются так много вычислительных мощностей для решения этой математической проблемы. Перебор настолько огромного количества нонсов в попытке угадать правильный занимает много времени и больших вычислительных мощностей. Также следует учитывать то, что с ростом мощности хэширования (количества майнеров) в блокчейне увеличится и сложность математической задачи, что повлечёт за собой увеличение средних расходов на электричество, требуемого для решения блока (подробнее об этом можно прочитать здесь). Вы большие молодцы, если дочитали до этого момента! Давайте продолжим и перейдём к шагу 5.
Примечание: На самом деле этот процесс не определяется как математическая задача, но скорее является чем-то детерминированным – компьютеры выполняют предопределённые операции над числом, чтобы выяснить, является ли результат именно тем, что требуется.
Шаг 5: Майнер, первый нашедший для своего блока удовлетворяющую требованиям подпись, транслирует этот блок и его подпись всем остальным майнерам.
Шаг 6: Другие майнеры теперь проверяют легитимность подписи, беря строку данных транслируемого блока и хэшируя её, чтобы проверить, действительно ли полученная хэш-сумма в результате приводит к включённой в блок подписи с правильным количеством нулей (помните, да? – трудно решить, но легко проверить). Если подпись действительна, то все остальные майнеры подтвердят её достоверность и придут к согласию, что этот блок может быть добавлен в блокчейн (то есть они достигнут консенсуса, говоря другими словами – все согласятся друг с другом – отсюда и термин алгоритм консенсуса). Из этого же проистекает термин «доказательство выполнения работы/proof-of-work». Подпись как раз и является требуемым «доказательством», что работа была произведена (были израсходованы вычислительные мощности). Теперь блок может быть добавлен в блокчейн и разослан всем другим узлам в сети. Те, в свою очередь, примут блок и сохранят его, добавив к своим данным транзакций, при условии, что все транзакции внутри этого блока могут быть исполнены в соответствии с историей, записанной в блокчейне.
Шаг 7: После того, как блок был добавлен в цепочку, все другие блоки, которые будут добавлены после него, будут считаться «подтверждением» для этого блока. Например, если моя транзакция включена в блок 502, а длина блокчейна составляет 507 блоков, это означает, что моя транзакция имеет 5 подтверждений (507-502). Это называется подтверждением, потому что каждый раз, когда новый блок добавляется после вашего, блокчейн вновь достигает консенсуса по поводу всей истории совершённых транзакций, включая вашу транзакцию и ваш блок. Можно также сказать, что на данный момент блокчейн подтвердил вашу транзакцию 5 раз. На это же опирается и Etherscan, когда показывает вам подробные детали вашей транзакции. Чем больше подтверждений будет у вашей транзакции (другими словами – чем глубже в цепочке находится ваш блок), тем сложнее будет для злоумышленников подменить её (подробнее о том, как это работает, можно прочитать здесь). После того, как новый блок добавлен в блокчейн, всем майнерам нужно начинать заново с «шага 3» и сформировать новый блок транзакций. Майнеры не могут продолжать (на самом деле могут, но это несколько выходит за рамки темы, обсуждаемой в данной статье) майнить тот же самый блок, другими словами – решать задачу – того же самого блока, над которым они работали ранее по двум причинам:
Первая: он может содержать транзакции, которые были подтверждены последним блоком, уже добавленным в блокчейн (помните, что разные майнеры могут выбирать/включать одну и ту же транзакцию(ии) в блок, который они решают). Любые из тех транзакций в случае, если они будут запущены вновь, могут быть признаны недействительными, потому что на балансе кошелька отправителя уже может быть недостаточно средств.
И вторая: каждый блок должен добавить хэш-сумму (подпись) последнего добавленного в блокчейн блока в свои метаданные. Именно это и делает блокчейн блокчейном (цепочкой блоков). Если майнер вдруг продолжит майнить тот же самый блок, над которым он уже работал, другие майнеры заметят, что его хэш-сумма не соответствует той, что была в последнем добавленном в блокчейн блоке и, вследствие этого, отвергнут этот блок.
Источник
Майнинг в блокчейн-сетях: как он работает
В начале января правительство Китая приказало «армии биткойн-майнеров» страны, которые генерируют 3/4 всей мировой криптовалюты, прекратить работу. Одной из главных причин такого решения стало слишком высокое количество электроэнергии, которое потребляют майнинговые фермы — сейчас на обеспечение безопасности биткойн-блокчейна и добычу монет уходит порядка 0,2% всего мирового энергопотребления.
Сегодня поговорим, почему майнинг потребляет такое количество энергии, зачем он нужен и как реализуется. Мы расскажем об алгоритме хеширования (SHA-256) и о том, почему майнеры «обращаются за помощью» к пулам.
/ изображение Cindy Shebley CC
Для чего нужен майнинг
Майнинг часто считают способом создания новых биткойнов, однако это не совсем верно. Главная задача майнинга — обеспечить достижение консенсуса о том, какие транзакции считать валидными, чтобы не позволить кому-то из участников сети потратить уже использованные в другой транзакции монеты.
Для этого майнеры решают сложные математические задачи на своем оборудовании и расходуют электроэнергию, а взамен получают вознаграждение в виде биткойнов (и комиссии за обработку транзакций), что является стимулом защищать блокчейн дальше (сейчас за каждый блок сеть выдает 12,5 биткойнов).
В чем состоит работа майнеров
Майнеры занимаются тем, что подбирают значение хеша, которое бы подошло к транзакциям в блоке и позволило получить секретный ключ. Искомый хеш формируется на основании хеша предыдущего блока, случайного числа (nonce) и суммы хешей транзакций за прошедшие 10 минут. При этом он должен удовлетворять условиям системы: соответствовать заявленной сложности майнинга (Difficulty) и быть меньше целевой сложности (Target) — она определяет количество нулевых битов в начале искомого хеша.
Для вычисления сложности хеша можно использовать алгоритм с разложением в модифицированный ряд Тейлора, который приводится на страничке bitcoinwiki:
На момент написания статьи сложность блокчейн-сети составляет: 2874674234415.941, однако этот параметр пересчитывается через каждые 2016 блоков. Он увеличивается или уменьшается, чтобы поддержать среднюю скорость создания блоков (примерно 6 штук в час).
SHA-256
В качестве инструмента для хеширования в биткойн-блокчейне выбран алгоритм SHA-256. Далее, мы рассмотрим один из его раундов.
/ Раунд SHA-256 для восьми входных слов / Wikimedia / kockmeyer / CC
Предположим, что на вход алгоритму подали восемь слов, обозначим их A, B, C… H. Функция Ma выполняет побитовые операции со словами A, B и C — если большинство полученных значений нули, она также вернет ноль, иначе — единицу.
Блок Σ0 трижды сдвигает слово A: на 2, 13 и 22 бита, а сформированные значения побитно складываются операцией xor. Блок Σ1 работает аналогично — сдвиги выполняются на 6, 11 и 25 бит.
Блок Ch — это функция выбора результирующего бита на основании битов в E. Если входное значение единица, то на выход поступит соответствующий бит слова F, иначе — бит слова G.
Красные квадраты на схеме — это блоки 32-битного сложения, которые генерируют новые значения для A и E. Весь цикл повторяется 64 раза, после чего информация оказывается надежно зашифрованной.
Для иллюстрации процесса вычисления хеша, приведем код на Python, который формирует хеш слов «Bl0Ckchain» и «blockchain»:
А вот проверка созданных хешей выполняется очень быстро, даже если на их создание ушло множество ресурсов:
Результат применения функции SHA-256 считается необратимым, поэтому подбор майнерами «целевого» хеша выполняется с помощью грубого перебора.
Так как биткойн-протокол использует двойное хеширование, то задачей майнеров становится нахождение второго прообраза хеша x’ (имея первый прообраз x хеша y, где y=H(x)), который бы удовлетворял условию y=H(x’). Однако с целью упрощения задачи, майнеры ищут лишь частичный прообраз — H(x)/2^(n-k)=0. Здесь n — «размер» результата (n=256 бит для SHA256), а k — это фактор, отвечающий за количество нулей в результирующем хеше. Например, k=20 потребует проведения порядка одного миллиона попыток.
Таким образом, майнеры изменяют в заголовке блока параметр nonce и считают хеш до тех пор, пока не будут выполнены условия сложности. Когда цель достигнута, блок добавляется в цепочку.
Майнинг — совместные усилия участников сети
Сложность решения блока чрезвычайно велика. Сейчас майнеры в биткойн-сети выполняют порядка 20 млн терахешей в секунду, и эта цифра растет. Для сравнения, одна видеокарта выдает порядка 30 мегахешей в секунду. Также в своем блоге инженер Кен Ширриф (Ken Shirriff) попробовал решить блок с помощью ручки и бумаги — его достижение было еще скромнее (0,67 хешей в день).
/ Количество терахешей за секунду, по данным blockchain.info
Из-за выросшей (и постоянно растущей) сложности майнерам тяжело решать блоки в одиночку. Поэтому они объединяются в пулы, где делят работу по решению блока и награду. Пулы выдают майнерам задачи и следят за количеством выполненной работы. Чем больший вклад в решение блока внес майнер, тем большую долю награды он получит.
Чтобы оценить процент проделанной работы, пул просит майнеров присылать информацию о нахождении частичных решений. Например, если биткойн-блокчейн требует, чтобы хеш блока имел 15 нулей, пул может просить присылать ему результаты с 10 нулями в качестве доказательства работы. Это в миллионы раз проще и такое решение майнер будет получать несколько раз в час.
За организацию взаимодействия пула и майнеров отвечают специальные протоколы. Например, протокол Stratum (еще есть Getwork, Getblocktemplate и другие), который используется большинством пулов. В своем блоге Кен Ширриф приводит код, пересылаемый пулом при выдаче задания, который содержит всю необходимую информацию для начала работы над блоком.
Когда блок решен, пул формирует соответствующую транзакцию для выдачи награды, утверждает заголовок и верифицирует блок. Если блок решил майнер, который находился за пределами пула, то сервис выдает участникам новое задание. В этом случае награду за подбор хеша майнеры не получают.
По своей сути майнинг биткойнов напоминает своеобразную «гонку вооружений». В самом начале люди майнили криптовалюту с помощью CPU, затем мощности центрального процессора стало недостаточно, и индустрия перешла на GPU и специализированное оборудование ASIC.
Отметим, что повышение сложности вычислений, помимо регулирования количества выпускаемых биткойнов, выступает в качестве защиты от атак на блокчейн. Если майнинг с использованием персональных компьютеров в масштабной сети окажется выгодным, злоумышленникам будет проще найти оборудование для атаки. Необходимость вкладываться в «железо» выступает ограничивающим фактором и дополнительным защитным механизмом.
Но подобная привязка к технике и «реальному миру» имеет свои недостатки. Как уже было отмечено, майнинг — достаточно «затратная» с точки зрения потребления энергии деятельность. На сегодняшний день биткойн-блокчейн расходует 48 ТВт/час в год, причем 30–40% энергии идет на охлаждение чипов.
Однако есть мнение, что объемы потребляемой энергии начнут постепенно снижаться после 2020 года, когда произойдет следующее уменьшение награды за блок, так как майнинг станет менее выгодным. В этом случае действенным способом замотивировать майнеров продолжать защищать информацию в блокчейне остается увеличение дохода с комиссий за обработку транзакций.
А для этого важно продолжать повышать интерес общества к экосистеме блокчейн-технологий. Это позволит в будущем использовать биткойн-блокчейн в качестве своеобразного «арбитра» для permissioned-блокчейнов и сайдчейнов, что позволит создать финансовую систему нового поколения.
Предлагаем вам еще несколько материалов о работе блокчейнов из нашего блога:
Источник