zema52 (zema52) wrote,
zema52
zema52

Categories:

Как работает блокчейн. Немного криптографии или что ищут майнеры.

Откуда вообще взялся этот термин "криптовалюта"? Что означает в нем приставка "крипто"? Несмотря на то, что существует несколько версий происхождения этого слова, я склоняюсь к версии, что происходит оно от слова "криптография", что является наукой о шифровании.
Предмет этот не самый простой, но, чтобы понять работу криптоденег, совсем не обязательно погружаться в дебри дискретной математики. Достаточно понять всего два приема, на которых все это держится: хэш и электронно-цифровая подпись.

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


Для надежности, в конце записываем длину фразы, а свободное место забиваем каким-то символом. Например, символом подчеркивания.

Буквы являются буквами только для нас, а для компьютера любая информация - это цифры. Представим все буквы в виде 16-ричных цифр. Тогда все будет выглядеть вот так.

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

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

Существует много различных хэш-функций. Мы возьмем SHA-256. Именно на ней работает биткойн и некоторые другие монеты.
Данные здесь перемешиваются по такой схеме:

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

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

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


Итак, если вставить нашу фразу "графиня изменившимся лицом бежит пруду", то в качестве хэша мы получим число "948D5057AD525A54203159B72BB785883C2EE4910D8746FC85A4DD3D24F7D3E8". Буквы от A до F - это тоже цифры в 16-ричной системе счисления.
Длина хэша для SHA-256 всегда равна 256 бит, т.е. 64 символа. Мы можем взять хэш от одной буквы или от полного собрания сочинений Достоевского, но длина все равно будет 64 символа. Таким образом, по хэшу мы не можем понять даже какой длины было исходное сообщение.

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

Что же нам дает это несимметричное шифрование? Зачем оно вообще нужно?
Без хэширования интернет в нынешнем виде просто не мог бы существовать. Области применения самые разнообразные. Одна из них - хранение паролей.
Когда вы регистрируетесь на каком-либо интернет-сервисе, то ваш пароль никогда не хранится в чистом виде. Всегда хранится его хэш. Когда вы входите в систему и вводите в окошко пароль, от него считается хэш и сверяется с хэшем в базе. Если какие-то злоумышленники получат доступ к серверу, то получат не список паролей, а список хэшей, который ничего не даст, т.к. из хэша узнать исходный пароль нельзя.

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

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

Такая схема называется деревом хэшей или деревом Меркла, а самый верхний хэш - корнем Меркла. Любое изменение в транзакциях блока приведет к изменению корня Меркла, т.е., мы всего одним хэшем защищаем сразу все транзакции.

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

Посмотрим, как это работает на конкретном примере.
Возьмем в bitcoin explorer самый последний блок. На данный момент это блок номер 515160


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



Version - версия блочной схемы. Определяется системой.
Previous block hash - хэш предыдущего блока. Нужен для связки блоков между собой, о чем я писал в прошлом посте.
Merkle Root - корень дерева Меркла. Тот самый хэш хэшей всех транзакций, о котором я упоминал выше.
Time stamp - время создания блока. Браузер показывает время в текущем часовом поясе, а в систему все заносится по Гринвичу. Так как мой часовой пояс GMT+2, то я вручную отнимаю два часа.
Bits - параметр, от которого зависит сложность расчета. По специальной формуле из него высчитывается максимально возможный хэш блока. Сеть принимает блок только если его хэш меньше этого значения. Bits автоматически пересчитывается системой каждые две недели, чтобы все майнеры сети паковали новый блок раз в 10 минут.

Ну и, наконец, самый интересный параметр nonce. Это именно то, что ищут все майнеры планеты, истребляя дикое количество электроэнергии.
Все параметры, указанные выше, берутся из данных, либо сразу из системы, и только параметр nonce дописывается вручную.
Параметры блока соединяются в единый текст, от которого потом дважды берется хэш по алгоритму SHA-256. Nonce должен быть таким, чтобы итоговый хэш блока начинался на определенное количество нулей. Сейчас это число равно 18. Единственный способ, которым этот правильный nonce можно получить - случайный перебор всех вариантов, пока не отыщется нужный. Тот майнер, который отыскивает это число, превращает хэш блока в "красивый" и получает награду 12,5 биткойнов плюс все комиссии блока.

Если кто-то хочет подробно узнать как это все работает, а также попробовать "смайнить" другой блок, файл с этим примером можно скачать здесь.

P.S. Как я уже писал ранее, я хочу развить свой отдельный криптовалютный проект и зарабатывать на этом, не вложив ни копейки своих средств.
В финансовом плане мой проект неожиданно сдвинулся с места. Читатель из Москвы по имени Эльхан решил задонатить мне 30 евро, за что ему большое человеческое спасибо. Когда наберется сумма на домен и хостинг, сделаю отдельный сайт.

Итого, на 26.03.2018
Сумма в фиате: 30 евро.
Сумма в криптовалюте: 0.
Tags: криптовалюты
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 65 comments