Люди, связанные с индустрией блокчейна,
традиционно считают своё детище чем-то, существующим на границе
технологической сингулярности, и, следовательно, слишком сложным для
понимания простыми смертными. Поэтому, объясняя принципы работы,
оперируют понятными гуманитарными понятиями, такими как «доверие»,
«уверенность» и «подконтрольность», тем самым только всех запутывая и
ничего не объясняя на самом деле.
Я не разделяю этот подход. Считаю, что знание деталей технической
реализации есть залог доверия к инструменту в целом, а умение воссоздать
нечто подобное — лучший критерий глубокого понимания. Поэтому сегодня с
вами кружок «очумелые ручки» и мы будем строить свой, простейший,
концептуальный, но тем не менее полностью рабочий блокчейн. Прямо у вас
на компьютере, без начальной подготовки, буквально вручную мышкой.
Я покажу, что на самом деле всё там очень просто, и доступно даже
пятикласснику. Не верите? Просто читайте дальше. Но для этого сначала
нужно пояснить, что такое хэш. Без этого никак, увы.
Хэш
Ключевое понятие в криптографии. Оно может означать, в зависимости от
контекста, две вещи: функцию хэширования, или результат выполнения такой
функции. Если совсем просто, хэш-функция — это алгоритм, который
принимает на вход любые данные (файл, текст, картинка, двоичный код) и
генерирует из него последовательнсоть букв и цифр фиксированной длины.
Генерирует при этом так, что одинаковые файлы всегда дают в результате
одинаковый хэш, а разные — в идеале, разный (случай, когда две разных
последовательности входных данных дают одинаковые хэши, называется
коллизией криптографической функции и считается уязвимостью).
image: http://thenn.ru/uploads/images/00/00/01/2017/07/02/74b7e4.jpg
Хэш-функций существует великое множество, и для каждой из функций
существует множество реализаций. Но все они, строго говоря, делают одно и
то же: позволяют гарантировать, что несколько файлов одинаковые, не
имея на руках самих файлов.
А теперь, чтобы стало ещё понятнее, продемонстрирую на практике. Вбейте в
гугле «sha256 онлайн» (именно эту функцию мы будем использовать во всех
примерах). Поиграйте с ней, вбивая разные данные.
Сделай сам
Всё. Этих знаний уже достаточно чтобы создать простой блокчейн.
Удивительно, правда? Блокчейн — цепочка криптографически связанных
блоков.
Давайте создадим первый «блок». В нём может быть что угодно, но мы уже
придерживаемся аналогии с биткоином и транзакциями, поэтому будет тоже
записывать денежные отношения.
Открываем ваш любимый блокнот и создаём первый файл:
Маша → Ваня :: 10 рублей
Ваня → Лиза :: 20 рублей
Маша → Саша :: 50 рублей
image: http://thenn.ru/uploads/images/00/00/01/2017/07/02/b8055b.png
Хэш тут не для чего считать, поэтому всё. Сохраняем его с именем 1.txt в
специальной папочке (FYI: в блокчейне криптовалют такой блок называется
Genesis block, и да, там его тоже прописывают вручную). Сохранили? Идём
на один из прежде нагугленных сайтов (можно догадаться, что настоящие
блокчейны ни на какие сайты не ходят, а вызывают заранее
запрограмированные в них функции, но для нашего простейшего случая
сделаем всё вручную), и считаем хэш для этого файла.
У меня получилось
7f17d67621afd2a661bc0a552735745b8a2c424cff28e523b94f1d1b4615f591, у вас
может получиться другое, в зависимости от содержимого файла, кодировки,
лишних или недостающих пробелов, переносов и тому подобного. Совершенно
не важно, что у вас получилось, просто сохраните эту строку.
Теперь создайте следующий файл и назовите его 2.txt. Запишите в него несколько новых «транзакций»:
Таня → Катя :: 10 рублей
Макс → Витя :: 10 рублей
И последней строчкой добавьте результат хэширования предыдущего файла. Вот так:
Таня → Катя :: 10 рублей
Макс → Витя :: 10 рублей
7f17d67621afd2a661bc0a552735745b8a2c424cff28e523b94f1d1b4615f591
Готово? Сохраняем, и считаем хэш уже от этого, нового файла ЦЕЛИКОМ. У
меня получилось
db45d94b529fbf8c5fb1decd89f5d0ff62bbca86a02bc4f943eac42ff33dd486.
image: http://thenn.ru/uploads/images/00/00/01/2017/07/02/c0d9b2.png
По аналогии создаём третий файл:
Митя -> Тёма :: 90 рублей
Жора -> Вася :: 10 рублей
Анна -> Люда :: 60 рублей
db45d94b529fbf8c5fb1decd89f5d0ff62bbca86a02bc4f943eac42ff33dd486
И все последующие. Их может быть сколько угодно. В блокчейне биткоина по
состоянию на 27.06.17 находится 473011 блоков, в которых записана
информация о почти 250 миллионах транзакций. Это много. И снова к нашим
баранам. Можете создать все файлы самостоятельно, а можете скачать мой архив из 10 файлов и контрольного, содержащего только хэш последнего «блока» и ничего больше.
Блокчейн готов? Почти. Тело готово. Не хватает самого главного — функции
проверки целостности, которая бы сказала, всё с ним в порядке, или же
кто-то вмешивался в эти файлы. Мы можем проверить и вручную.
Элементарно. Пройдитесь подряд по всем файлам, найдите хэш каждого и
сравните с записанным в следующий по порядку файл значением. Если хотя
бы один не сходится — значит цепь повреждена. Но удобнее и надёжнее это
делать программными инструментами.
Я сделал наипримитивнейший скриптик с пояснениями, можете посмотреть его по ссылке,
а без пояснений он включён в вышеуказанных архив. Написан он на самом
популярном в терминах проникновения языке в мире — баше, а значит у
пользователей GNU/Linux, MacOS, Android (окружение Termux) — не
возникнет проблем с запуском.
Пользователям Windows можно посоветовать установить cygwin или Linux subsystem for windows, появившийся в Windows 10.
image: http://thenn.ru/uploads/images/00/00/01/2017/07/02/949578.png
Итак, после запуска скрипта должны получить что-то вроде:
10 blocks
chain is flawless
final hash = 23cbc83ca6a2cf2e75ae5ca76fb087ef11ff36fb0065c301557c8152a5bc530f
Это значит, что всё в порядке, данные представлены в исходном виде, в
цепь никто не вмешивался. Теперь попробуйте открыть в блокноте любой
файл и поменять что угодно: убрать пробел, изменить цифру, имя, добавить
что-то. Результат повторного исполнения скрипта после подобных операций
будет бескомпромиссен:
chain is corrupted
Верните всё на место и цепь будет снова проходить проверку. Магия? Магия.
Майнинг
Теперь,
чтобы два раза не вставать, покажу майнинг. Не беспокойтесь, всё так же
просто и на пальцах. С разрешения автора публикую самое простое
объяснение, которое видел в своей жизни.
Я тоже нихрена не понимаю, но в моей голове это выглядит так. Есть
монетка, она спрятана в коробочку, коробку можно открыть, если решить
пример, который написан на коробочке, но таких коробочек миллиард, а
монетка лежит только в одном. Собственно для того, чтобы найти монетку,
нам нужен миллион китайцев с калькуляторами, которые будут «майнить»
монетку.
Настя Иванова
Возьмём теперь нашу цепь и усложним её немного. Добавим в первую строку
немного случайных данных: пусть это будет число из десяти цифр. В
реализации блокчейна биткоина это поле называется Nonce. Вот так:
0000000000
Маша -> Ваня :: 10 Рублей
Ваня -> Лиза :: 20 Рублей
Маша -> Саша :: 5 Рублей
Теперь идём на наш сайт и снова считаем хэш. У меня получилось
361d413d08c614ff63290943bb184aadaaaae84171caef4bfb2344a3223cd104. Но он
не подходит. Как так? А вот так. В официальной документации биткоина
(допустим) сказано, что для первых десяти блоков принимаются только
хэши, начинающиеся с нуля, а остальные не подходят, и все, включая саму
программу bitcoin core, сочтут нас за жуликов, если мы сгенерируем такое.
Ну ладно, говорим мы, и добавляем единичку к нашему числу (мы не можем
предсказать заранее, какой хэш получится на выходе, кто сможет — получит
нобелевку, так что самый тупой выход здесь одновременно и единственно
верный). Получается 0000000001. Идём и хэшируем снова.
44364a819eca9616dd56c21f6ba9a570d8a27ca54b95f67585cd36da2e4bf9f6. Чёрт.
Это может затянуться.
image: http://thenn.ru/uploads/images/00/00/01/2017/07/02/c446f7.jpg
Отсылка к известному мысленному эксперименту
Как хорошо, что мы снова можем написать перебирающий скрипт!
В нём две главные переменные: LENGTH — количество цифр подряд с начала,
которые должны соответствовать критерию, и GOAL — чему именно эти цифры
должны быть равны. Сложность подбора при этом растёт вместе с
количеством символов экспоненционально.
Запустите скрипт: ./block_mine.sh 1.txt и он отработает довольно быстро.
Измените LENGTH на 3, и GOAL на 000, и вы заметите бегущие циферки.
Замените LENGTH на 10, и GOAL на 0000000000 — и вы результатов
выполнения на своём компьютере уже не дождётесь.
Я «намайнил» вам для примера цепь со «сложностью», соответствующей правилу «три нуля в начале каждого
хэша». Попробуйте подделать или подменить так, чтобы итоговый хэш
непременно начинался с 000, и цепь при этом проходила проверку, не
перемайнивая всю цепь от начала до конца. Отпишитесь о результатах в
комментариях. Бгг.
Именно таким примитивным действом и является майнинг. «Профессиональные»
блокчейны отличаются только количеством разных данных, которые хранятся
в блоке, алгоритмом хэширования, и набором правил, которым должен
соответствовать хэш. Всё.
В целом всё разнообразие работает на основе тех самых принципов, что я
описал. Только ещё и майнинг не во всех случаях обязателен. В
большинстве случаев не обязателен, скажем так.
При чём тут биткоин
Если
говорить в терминах понятных аналогий, идеи блокчейна — электричество,
биткоин и прочие криптовалюты — лампочка над вашей головой. Биткоин
всего лишь один из множества способов применения идей блокчейна, и даже,
на мой взгляд, не самый важный.
Гораздо интереснее его экономическая сущность, и об этом стоит сказать
подробнее. Во-первых, запомните, проанализируйте, или просто примите на
веру: на сегодня это спекулятивный экономический пузырь. Это дефицитный
товар, который покупают/добывают/приобретают преимущественно в расчёте
на быструю прибыль в краткосрочном периоде. Это не плохо и не хорошо,
это привычная ситуация для любого фондового рынка, да и в целом для
экономики. Интернет был таким же (гугл: пузырь доткомов).
image: http://thenn.ru/uploads/images/00/00/01/2017/07/02/8b95af.png
То есть воспринимать как игрушку, а не как средство накопления, быть
готовым к обвалу в 2-10 раз меньше чем за сутки (или аналогичному
взлёту, тут уж как повезёт), сглаживать риски портфелями, и так далее
(да вы всё и без меня знаете, если работаете в сфере финансов или
увлекаетесь игрой на бирже, а если не работаете и не увлекаетесь, лучший
совет: не лезть, ждать стабилизации курса). Это не пост пиара биткоина,
это ликбез по блокчейну, так что могу себе позволить сказать всё как
есть.
Зачем это нужно
Тут по порядку, иначе совсем запутаемся.
В: Зачем нужно разбивать цепь на блоки, если можно с сопоставимой степнью надёжности считать хэш прямо от всего большого файла?
О: Для того чтобы удобно было находить ошибки в цепи. Очень легко
определить, какой блок повреждён, но невозможно выяснить, где именно
закралась ошибка в огромном файле, зная только, что изменился его хэш.
В: Зачем вообще этот хэш? Разве просто передать данные недостаточно?
О: Гугл: Задача византийских генералов. Вкратце, это когда нужно
убедиться, что данные не повреждены и не изменены в условиях
скомпрометированного канала их передачи. Ещё полвека назад эта задача
считалась концептуально нерешаемой, а сейчас ЭЦП в паре с секретным
ключом — стандарт даже в консервативной сфере госуслуг. То есть эти
«хэши» давно прочно проникли в нашу жизнь, им доверяют и ими пользуются.
Если вы ещё не в курсе, что оно и как работает, это только ваша
проблема.
В: Хорошо-хорошо, а где используется блокчейн, кроме нашумевших криптовалют?
О: Распределённые базы данных, виртуальный каталог книг project
Alexandria, социальные сети, платформы для голосования (согласитесь,
приятно было бы знать, что подтасовка результатов выборов невозможна
математически), и даже эксперимент по имплементации подобия госуслуг и
государства Bitnation. Венчурные проекты появляются как грибы после
дождя.
На самом деле это тема тянет на ещё одну статью, которая может даже
появится, если мне того захочется, и если людям будет интересно. Не
знаю. Если дочитали до этого места — сообщите в комментах, интересно вам
продолжение или нет.
Большинcтво из них умрут (как уже умерла краудфандинговая платформа
Koinify, как с треском провалилась из-за найденной уязвимости
инвестиционная платформа The DAO, как умерло большинство известных на
заре интернета сайтов). Однако это перспективная отрасль, которая
сделала возможными некоторые ранее немыслимые вещи, и вполне вероятно,
блокчейн-лихорадка — новый виток прогресса, похожий на историю
упомянутого ранее, и сегодня всеми любимого World Wide Web.
В: Зачем мне это всё, я не программист?
О: Для меня этот вопрос звучит так же странно, как и «Зачем мне читать и
писать, я не писарь?». Программирование — это не профессия и не особый
талант, это всего лишь немного более гибкий и мощный способ
использования вашего компьютера — вот и всё. Его не нужно бояться или
избегать, как чего-то «сложного». И да, я считаю, что в будущем, не
таком далёком как кажется, сама идея специального человека, набирающего
код, станет такой же абсурдной, как идея специального человека,
переписывающего от руки книги. Это будут во-первых, уметь все с первого
класса школы, во-вторых появятся более эффективные инструменты для
профессиональной реализации нужных идей.
Подробнее