Хэш и хэширование.

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

хэш

Хэш лежит в основе защиты криптовалюты.

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

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

Хэширование. Представьте, что Вы решили написать другу секретную записку «привет». Но, в случае, если ее кто-то перехватит, Вы бы не хотели, чтобы ее прочли. Вы решаете ее зашифровать, написав вместо каждой буквы – последующую букву из алфавита (п-р; р-с; и-й; в-г ; е-ё ;т-у ) и получаете «рсйгёу». Теперь случайный похититель не поймет, что Вы имели ввиду. Хэширование и есть тот самый процесс шифрования исходного слова в набор символов по определенному алгоритму. В отличие от приведенного примера, алгоритм шифрования в криптовалютах намного более надежный и завязан на математических вычислениях.

Хэш – некоторая строка определенной длинны, которая однозначно получается из некоторой другой строки при хэшировании. Например, хэш SHA256 слова «привет» выглядит как:

e58f1e8c55fa105bdd3f40e5037eb0b039b5998d52c05e6cd98878dd2da5cab2.

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

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

Хэшрейт. Скорость вычисления хэшей при майнинге. То есть, это количество хэшей, которое может вычислить аппарат за единицу времени. Чем выше этот показатель, тем лучше вы можете майнить ту или иную валюту. Когда вы слышите что очередной супер ASIC может выдавать  9999GH/s, это значит, что он может вычислить 9.999.000.000.000 хэшей в секунду.

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

Что такое “уязвимость в биткоине”?

Уязвимость биткоина

Уязвимость биткоина угрожает работе бирж.

Болезнь, поразившая две из трех крупнейших бирж, потенциально лишившая пользователей биржи MtGox всех денег – не нова и давно известна (по крайней мере с 2011 года). Но никто до этого момента не осознавал, насколько опасной окажется даже не дыра, а маленькая оплошность. Место, в котором создатели биткоинов проявили непредусмотрительность привела к многомиллионым потерям.

Но это не вина одного только Сатоши Накамото. Этот баг сам по себе не опасен, но в комбинации с дырами в биллинговой системе бирж – привел к остановке двух крупнейших биткоин бирж, основном месте покупок биткоина. В чем же суть этого бага?

Уязвимость биткоина… Как это работает?

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

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

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

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

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

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

Также, иногда использовалась другая уязвимость: к сумме платежа добавлялась незначащая цифра. Например, вместо 10,53 BTC становилось 10,530 – с точки зрения математики разницы нет, а с хэш будет другой.

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

Атака на биткоин биржи

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

Что происходило? Злоумышленник зачислял биткоины на счет биржи, скажем, 10 биткоинов. Затем, просил вывод денег и биржа генерировала транзакцию с номером ID 10001 и отправляла на обработку майнерам. А злоумышленник перехватывал ее транзакцию, менял подпись или добавлял незначащую цифру: таким образом получалась транзакция с номером ID 10002, другим хэшем, но фактически идентичная первой. Поясню: обе эти транзакции не могут быть исполнены. Может быть исполнена только одна из этих транзакций, ведь все остальные данные в них идентичны; блокчейн может включить только одну из них.

Далее есть шанс, что транзакция 10002 будет исполнена первой, а транзакция 10001. Как повысить этот шанс? Очень хорошо, когда есть доступ к майнинг пулам, которые по разным причинам обработают эту транзакцию в первую очередь (эти причины перечислять не будем, думаю, можно догадаться).  Далее, злоумышленник жалуется в биржу, что не получил свои деньги. Биржа проверяет блокчейн на наличие ID транзакции и не находит его там, ведь хакер заменил транзакцию 10001 транзакцией 10002, но фактически биткоины списаны. Поскольку ПО бирже слепо доверяет блокчейну, оно “не видит” этого несоответствия. И отправляет деньги вновь.

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

Эта новая уязвимость прикончит биткоин?

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

Но будут новые уязвимости.

Криптовалюта очень молода, и привлекла внимание масс только полгода назад. И риск того, что кто-то найдет какую-то новую уязвимость достаточно велик.

Майнинг: как это работает?

Майнинг

Процесс майнинга


Многие слышали о майнинге, знают, что за майнинг дают монеты, но как это работает, представляют очень смутно. Цель данной статьи – объяснить суть майнинга, его техническую сторону, пояснить Вашу роль в майнинге. Разобравшись в этом, Вы поймете, почему оборудование, которое еще год назад приносило 300$ в день, сейчас бесполезно. Вам также станет понятно, почему система сложна для взлома, почему в ней нету огромных эмиссий и в чем же ее отличие от доллара и евро и схожесть с золотом. Описывать процесс майнинга мы будем на примере Bitcoin, так как у Bitcoin очень грамотная wiki и большую часть информации я брал из нее.

Первое впечатление

Я сам узнал о криптовалютах не так давно – пару месяцев назад. О их существовании мне рассказал друг. Информация была очень поверхностная и смутная: я узнал, что есть такая тема как Bitcoin и Litecoin, что эта тема набирает популярность. Он упомянул слова “майнинг”, “защищенность”, “невозможно взломать” и т д. Вначале я отнесся к услышанному скептически, так как решил, что это очередная пирамида. Но чем больше я прошаривался в вопросе, тем больше я менял свое отношение к нему. Мне нравилось то, какие идеи лежат в основе криптовалют и как математически изящно они были реализованы. Из полученной информации от друга, я сделал вывод, что майнинг, это процесс создания криптовалюты и обогащение за счет нее. Если привести аналог из жизни, я думал, что майнинг похож на процесс постройки дома. Ты строишь дом, это происходит долго, так как процесс сложный, но в итоге получаешь дорогую собственность, которую можешь продать за деньги. Мне казалось, что как и с постройкой дома, количество добытых монет пропорционально зависит от твоих собственных рабочих мощностей: если работать в 2 раза быстрее, то и добыча монет будет идти в 2 раза быстрее. Разобравшись в вопросе я понял, что это представление кардинально ошибочно. Более того, оно нарушает одну из концепций криптовалюты. Новую аналогию можно будет придумать после того, как мы разберемся с процессом майнинга.

Вы наверняка слышали, что существуют “блоки”, “хэши” и прочая “SHA-256”, но немногие понимают, что это такое. Поэтому начнем с определений.

Определения

Хэширование. Основная статья.

Блокчейн (blockchain – цепочка блоков) – своеобразная база данных в которой хранятся все транзакции когда либо совершенные в системе. Она состоит из блоков, в которых находятся публичные данные. При этом шифрование хэшей не мешает их чтению, а просто создает связь между ними. Особенность чейна в том, что каждый блок связан математически в цепочке, его замена или удаление нарушит логику и целостность всей цепочки. Это делает систему защищенной от вмешательств со стороны. [bg_faq_start]

Блок 

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

Поля в заголовке

 

Название поля Сокращение Описание
Bits
bits
 хэш Merkelroot
mrkl_root
 Хэш предыдущего блока
prev_block
 Хэш блока, к которому привязан данный блок.
 Время
time
 Порядковая секунда создания блока. За нулевую отметку берется дата 1970-01-01 T00:00 UTC
 Версия
ver
 Версия присоединяемого блока
 Число nonce
nonce

 

По ссылке можете посмотреть пример блока, чтобы понять какой вид имеет каждое поле. 

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

[bg_faq_end]

Майнинг

Теперь, когда мы ввели основные определения, мы можем говорить о том, что такое майнинг.

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

Один из принципов криптовалюты заключается в том, что эмиссия всегда одна и та же и в данный момент составляет 25BTC за 10 минут. Для того, чтобы это было возможным Сатоши Накомото придумал следующую задачу для подписывания:

Ваш компьютер хэширует заголовок присоединяемого блока, после этого заголовок немного меняется. Так как он меняется, при следующем хэшировании  получится другой хэш. Компьютер должен пытаться сделать как можно больше таких хэшей меняющегося заголовка. Их количество на простеньком айсике – 50 миллиардов единиц в секунду. Первый майнер, нашедший хэш среди миллиардов получающихся, который будет меньше некоторого заранее заданного “красивого” хэша, объявляется “победителем”. Полученный хэш передается его всем остальным пользователям в сети . Далее он проверяется на подлинность. Проверяют, действительно ли Вы выполняли задание, или решили всех обмануть, прислав случайный набор чисел. После проверки номер хэша присваивается блоку, чей заголовок мы хэшили и он записывается в чейн. Говорят, что хэш подписывает блок. Блок рассылается всем пользователям сети и хранится на всех компьютерах сети. Таким образом нельзя подделать какую-то общую базу данных, так как сотни тысяч копий хранятся по всему миру.

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

Для того, чтобы система существовала и люди были заинтересованы, майнеру, нашедшему нужный хэш, дают 25BTC. Эта плата и запутывает людей. Многие считают, что главная цель майнинга – генерация и получение монет. На самом же деле главная цель – присоединение блоков, а получение монет – плата за предоставление Вами мощностей для этого процесса, а также средство привлечения новых людей .

Чтобы понять зачем эта странная задача, и что за “красивый” хэш, расскажу подробнее про поле Bits из заголовка блока:

[bg_faq_start]

Bits

Bits отвечает за, так называемый, “красивый” хэш, с которым Вы сравниваете, генерируемые Вами хэши. Красивым он называется из-за того, что определенное количество первых символов в хэше – нули. Также “красивый” хэш имеет математическую особенность: в среднем около 10 минут тратятся для того, чтобы хотя бы 1 человек в мире при данной скорости майнинга, сгенерировал хэш меньше “красивого” (математика это гарантирует!).

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

Один раз в 2016 подписей (примерно раз в 2 недели) отрабатывает, так называемая, “текущая сложность майнинга”. Для того, чтобы скорость эмиссии не зависела от увеличения/уменьшения мировой скорости майнинга, раз в две недели система анализирует относительное изменение скорости майнинга и соответственно изменяет сложность “красивого” хэша. Поэтому меняется поле bits. Если Вы закупили новое оборудование,  увеличится лично Ваш доход, а у кого-то в системе он уменьшится. Скорость появления самих коинов остается практически постоянным.

[bg_faq_end]

С эмиссией разобрались, но как же система защищается от подмены и внесения фэйковых транзакций? Для этого рассмотрим поле Merkel Root.

[bg_faq_start]

Хэш Merkel Root

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

Представьте, что Вася заплатил Пете 100 рублей. При проведении транзакции в обычном банке, система фиксирует о ней какие-то ключевые данные: номер счета получателя, номер счета отправителя, время транзакции, сумма и т д. По этим данным мы можем найти наш платеж в будущем. Но так как эта информация (некоторые данные), например

Вася; Петя; 20.01.2014; 01:02:03; 100руб

То по этим данным можно создать хэш

c3c142ec7468269e817b1da960257cdcef0fc9f339eda91d0fda19213ac05352

По другой транзакции

Петя; Вася; 20.01.2014; 02:03:04; 200руб

также можно создать хэш

07c32c1b7d82a4de40e34eaffc73d680c0bee9a7dcfcb3f1ea42dd5c9bb62ad4

Но два хэша, это тоже некоторые данные, по которым мы можем создать хэш.

Хэшируя

c3c142ec7468269e817b1da960257cdcef0fc9f339eda91d0fda19213ac05352; 07c32c1b7d82a4de40e34eaffc73d680c0bee9a7dcfcb3f1ea42dd5c9bb62ad4

получаем

65ec781ddccc94a7fb4edb4ba4e0d90a4ce931868f5ba4a60fb4db9b755b44c1.

Что же мы сделали? Мы взяли каждую из транзакции, создали по ней хэш и затем по получившимся хэшам создали еще один хэш. Это и есть Merkel Root.

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

[bg_faq_end]

Следующее поле отвечает за то, чтобы в блокчейн не внесли блок задним числом:

[bg_faq_start]

Хэш предыдущего блока

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

Время

Время попытки подбора хэша.

Версия

Самый нехитрый из всех полей блока. Простое число, отображающее версию блока. В данный момент это число – 2.

 

Nonce

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

[bg_faq_end]

Каждые 4 года вознаграждение за присоединение блока к цепочке уменьшается в 2 раза. Следующее уменьшение будет в сентябре 2015 года. Таким образом конечное количество Bitcoin стремится к 21.000.000 единицам.

И в заключение

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

Если Вам непонятны какие-то моменты статьи – спрашивайте в комментариях.

В следующих постах мы расскажем, что такое майнинг в общем пуле. Оставайтесь с нами! :)

 

За то, что Вы осилили эту статью держите порцию счастья: