Читатель TJ объясняет, что такое блокчейн, как он работает и что можно построить на основе этих идей.
Люди, связанные с индустрией блокчейна, традиционно считают своё детище чем-то, существующим на границе технологической сингулярности, и, следовательно, слишком сложным для понимания простыми смертными. Поэтому, объясняя принципы работы, оперируют понятными гуманитарными понятиями, такими как «доверие», «уверенность» и «подконтрольность», тем самым только всех запутывая и ничего не объясняя на самом деле.
Я не разделяю этот подход. Считаю, что знание деталей технической реализации есть залог доверия к инструменту в целом, а умение воссоздать нечто подобное — лучший критерий глубокого понимания. Поэтому сегодня с вами кружок «очумелые ручки» и мы будем строить свой, простейший, концептуальный, но тем не менее полностью рабочий блокчейн. Прямо у вас на компьютере, без начальной подготовки, буквально вручную мышкой.
Я покажу, что на самом деле всё там очень просто, и доступно даже пятикласснику. Не верите? Просто читайте дальше. Но для этого сначала нужно пояснить, что такое хэш. Без этого никак, увы.
Хэш
Ключевое понятие в криптографии. Оно может означать, в зависимости от контекста, две вещи: функцию хэширования, или результат выполнения такой функции. Если совсем просто, хэш-функция — это алгоритм, который принимает на вход любые данные (файл, текст, картинка, двоичный код) и генерирует из него последовательнсоть букв и цифр фиксированной длины.
Генерирует при этом так, что одинаковые файлы всегда дают в результате одинаковый хэш, а разные — в идеале, разный (случай, когда две разных последовательности входных данных дают одинаковые хэши, называется коллизией криптографической функции и считается уязвимостью).
Хэш-функций существует великое множество, и для каждой из функций существует множество реализаций. Но все они, строго говоря, делают одно и то же: позволяют гарантировать, что несколько файлов одинаковые, не имея на руках самих файлов.
А теперь, чтобы стало ещё понятнее, продемонстрирую на практике. Вбейте в гугле «sha256 онлайн» (именно эту функцию мы будем использовать во всех примерах). Поиграйте с ней, вбивая разные данные.
Например, хэш от слова TJournal:
7db3a63e07638d7c795ee95210497048a7cc976f98f11ca8d5e2fc10b4dc374f
А вот от tjournal:
c3ea30a9f5a650ee53db452cf17209412abbcee72b264ebfb1c7fa49b57fd8c9
Вбейте данные сами в любом онлайн-калькуляторе, и вы получите ровно те же результаты, что и я: одинаковые для одинаковых строк, и разные — для разных.
Сделай сам
Всё. Этих знаний уже достаточно чтобы создать простой блокчейн. Удивительно, правда? Блокчейн — цепочка криптографически связанных блоков.
Давайте создадим первый «блок». В нём может быть что угодно, но мы уже придерживаемся аналогии с биткоином и транзакциями, поэтому будет тоже записывать денежные отношения.
Открываем ваш любимый блокнот и создаём первый файл:
Маша → Ваня :: 10 рублей
Ваня → Лиза :: 20 рублей
Маша → Саша :: 50 рублей
Хэш тут не для чего считать, поэтому всё. Сохраняем его с именем 1.txt в специальной папочке (FYI: в блокчейне криптовалют такой блок называется Genesis block, и да, там его тоже прописывают вручную). Сохранили? Идём на один из прежде нагугленных сайтов (можно догадаться, что настоящие блокчейны ни на какие сайты не ходят, а вызывают заранее запрограмированные в них функции, но для нашего простейшего случая сделаем всё вручную), и считаем хэш для этого файла.
У меня получилось 7f17d67621afd2a661bc0a552735745b8a2c424cff28e523b94f1d1b4615f591, у вас может получиться другое, в зависимости от содержимого файла, кодировки, лишних или недостающих пробелов, переносов и тому подобного. Совершенно не важно, что у вас получилось, просто сохраните эту строку.
Теперь создайте следующий файл и назовите его 2.txt. Запишите в него несколько новых «транзакций»:
Таня → Катя :: 10 рублей
Макс → Витя :: 10 рублей
И последней строчкой добавьте результат хэширования предыдущего файла. Вот так:
Таня → Катя :: 10 рублей
Макс → Витя :: 10 рублей
7f17d67621afd2a661bc0a552735745b8a2c424cff28e523b94f1d1b4615f591
Готово? Сохраняем, и считаем хэш уже от этого, нового файла ЦЕЛИКОМ. У меня получилось db45d94b529fbf8c5fb1decd89f5d0ff62bbca86a02bc4f943eac42ff33dd486.
По аналогии создаём третий файл:
Митя -> Тёма :: 90 рублей
Жора -> Вася :: 10 рублей
Анна -> Люда :: 60 рублей
db45d94b529fbf8c5fb1decd89f5d0ff62bbca86a02bc4f943eac42ff33dd486
И все последующие. Их может быть сколько угодно. В блокчейне биткоина по состоянию на 27.06.17 находится 473011 блоков, в которых записана информация о почти 250 миллионах транзакций. Это много. В 250 раз больше, чем комментов на TJ с момента его основания.
На правах «знаете ли вы, что?»: цепочка биткоина действительно большая, и там не всё так радужно и гладко, как некоторым хотелось бы представлять. Например, даже в середине цепи есть прописанные и подтверждённые вручную блоки. Это не то чтобы компрометирует инструмент, но и скрывать сам факт было бы неправильно. Такие дела.
И снова к нашим баранам. Можете создать все файлы самостоятельно, а можете скачать мой архив из 10 файлов и контрольного, содержащего только хэш последнего «блока» и ничего больше.
Блокчейн готов? Почти. Тело готово. Не хватает самого главного — функции проверки целостности, которая бы сказала, всё с ним в порядке, или же кто-то вмешивался в эти файлы. Мы можем проверить и вручную. Элементарно. Пройдитесь подряд по всем файлам, найдите хэш каждого и сравните с записанным в следующий по порядку файл значением. Если хотя бы один не сходится — значит цепь повреждена. Но удобнее и надёжнее это делать программными инструментами.
Я сделал наипримитивнейший скриптик с пояснениями, можете посмотреть его по ссылке, а без пояснений он включён в вышеуказанных архив. Написан он на самом популярном в терминах проникновения языке в мире — баше, а значит у пользователей GNU/Linux, MacOS, Android (окружение Termux) — не возникнет проблем с запуском.
Пользователям Windows можно посоветовать установить cygwin или Linux subsystem for windows, появившийся в Windows 10.
Итак, после запуска скрипта должны получить что-то вроде:
10 blocks
chain is flawless
final hash = 23cbc83ca6a2cf2e75ae5ca76fb087ef11ff36fb0065c301557c8152a5bc530f
Это значит, что всё в порядке, данные представлены в исходном виде, в цепь никто не вмешивался. Теперь попробуйте открыть в блокноте любой файл и поменять что угодно: убрать пробел, изменить цифру, имя, добавить что-то. Результат повторного исполнения скрипта после подобных операций будет бескомпромиссен:
chain is corrupted
Верните всё на место и цепь будет снова проходить проверку. Магия? Магия.
Майнинг
Теперь, чтобы два раза не вставать, покажу майнинг. Не беспокойтесь, всё так же просто и на пальцах. С разрешения автора публикую самое простое объяснение, которое видел в своей жизни.
Я тоже нихрена не понимаю, но в моей голове это выглядит так. Есть монетка, она спрятана в коробочку, коробку можно открыть, если решить пример, который написан на коробочке, но таких коробочек миллиард, а монетка лежит только в одном. Собственно для того, чтобы найти монетку, нам нужен миллион китайцев с калькуляторами, которые будут «майнить» монетку.
Настя Иванова
Возьмём теперь нашу цепь и усложним её немного. Добавим в первую строку немного случайных данных: пусть это будет число из десяти цифр. В реализации блокчейна биткоина это поле называется Nonce. Вот так:
0000000000
Маша -> Ваня :: 10 Рублей
Ваня -> Лиза :: 20 Рублей
Маша -> Саша :: 5 Рублей
Теперь идём на наш сайт и снова считаем хэш. У меня получилось 361d413d08c614ff63290943bb184aadaaaae84171caef4bfb2344a3223cd104. Но он не подходит. Как так? А вот так. В официальной документации биткоина (допустим) сказано, что для первых десяти блоков принимаются только хэши, начинающиеся с нуля, а остальные не подходят, и все, включая саму программу bitcoin core, сочтут нас за жуликов, если мы сгенерируем такое.
Ну ладно, говорим мы, и добавляем единичку к нашему числу (мы не можем предсказать заранее, какой хэш получится на выходе, кто сможет — получит нобелевку, так что самый тупой выход здесь одновременно и единственно верный). Получается 0000000001. Идём и хэшируем снова. 44364a819eca9616dd56c21f6ba9a570d8a27ca54b95f67585cd36da2e4bf9f6. Чёрт. Это может затянуться.
Как хорошо, что мы снова можем написать перебирающий скрипт! В нём две главные переменные: LENGTH — количество цифр подряд с начала, которые должны соответствовать критерию, и GOAL — чему именно эти цифры должны быть равны. Сложность подбора при этом растёт вместе с количеством символов экспоненционально.
Запустите скрипт: ./block_mine.sh 1.txt и он отработает довольно быстро. Измените LENGTH на 3, и GOAL на 000, и вы заметите бегущие циферки. Замените LENGTH на 10, и GOAL на 0000000000 — и вы результатов выполнения на своём компьютере уже не дождётесь.
Я «намайнил» вам для примера цепь со «сложностью», соответствующей правилу «три нуля в начале каждого хэша». Попробуйте подделать или подменить так, чтобы итоговый хэш непременно начинался с 000, и цепь при этом проходила проверку, не перемайнивая всю цепь от начала до конца. Отпишитесь о результатах в комментариях. Бгг.
Именно таким примитивным действом и является майнинг. «Профессиональные» блокчейны отличаются только количеством разных данных, которые хранятся в блоке, алгоритмом хэширования, и набором правил, которым должен соответствовать хэш. Всё.
В целом всё разнообразие работает на основе тех самых принципов, что я описал. Только ещё и майнинг не во всех случаях обязателен. В большинстве случаев не обязателен, скажем так.
Значит, это легко подделать
Да, достаточно перемайнить всю цепь от начала до конца быстрее остальных, и если у вас в распоряжении станет больше блоков, соответствующих условиям, чем у ведущих майнеров, сеть примет ваш вариант, и вы станете королём биткоина. Перемайнивайте. Удачи.
При чём тут биткоин
Если говорить в терминах понятных аналогий, идеи блокчейна — электричество, биткоин и прочие криптовалюты — лампочка над вашей головой. Биткоин всего лишь один из множества способов применения идей блокчейна, и даже, на мой взгляд, не самый важный.
Гораздо интереснее его экономическая сущность, и об этом стоит сказать подробнее. Во-первых, запомните, проанализируйте, или просто примите на веру: на сегодня это спекулятивный экономический пузырь. Это дефицитный товар, который покупают/добывают/приобретают преимущественно в расчёте на быструю прибыль в краткосрочном периоде. Это не плохо и не хорошо, это привычная ситуация для любого фондового рынка, да и в целом для экономики. Интернет был таким же (гугл: пузырь доткомов).
То есть воспринимать как игрушку, а не как средство накопления, быть готовым к обвалу в 2-10 раз меньше чем за сутки (или аналогичному взлёту, тут уж как повезёт), сглаживать риски портфелями, и так далее (да вы всё и без меня знаете, если работаете в сфере финансов или увлекаетесь игрой на бирже, а если не работаете и не увлекаетесь, лучший совет: не лезть, ждать стабилизации курса). Это не пост пиара биткоина, это ликбез по блокчейну, так что могу себе позволить сказать всё как есть, лол.
Зачем это нужно
Тут по порядку, иначе совсем запутаемся.
В: Зачем нужно разбивать цепь на блоки, если можно с сопоставимой степнью надёжности считать хэш прямо от всего большого файла?
О: Для того чтобы удобно было находить ошибки в цепи. Очень легко определить, какой блок повреждён, но невозможно выяснить, где именно закралась ошибка в огромном файле, зная только, что изменился его хэш.
В: Зачем вообще этот хэш? Разве просто передать данные недостаточно?
О: Гугл: Задача византийских генералов. Вкратце, это когда нужно убедиться, что данные не повреждены и не изменены в условиях скомпрометированного канала их передачи. Ещё полвека назад эта задача считалась концептуально нерешаемой, а сейчас ЭЦП в паре с секретным ключом — стандарт даже в консервативной сфере госуслуг. То есть эти «хэши» давно прочно проникли в нашу жизнь, им доверяют и ими пользуются. Если вы ещё не в курсе, что оно и как работает, это только ваша проблема.
В: Хорошо-хорошо, а где используется блокчейн, кроме нашумевших криптовалют?
О: Распределённые базы данных, виртуальный каталог книг project Alexandria, социальные сети, платформы для голосования (согласитесь, приятно было бы знать, что подтасовка результатов выборов невозможна математически), и даже эксперимент по имплементации подобия госуслуг и государства Bitnation. Венчурные проекты появляются как грибы после дождя.
На самом деле это тема тянет на ещё одну статью, которая может даже появится, если мне того захочется, и если людям будет интересно. Не знаю. Если дочитали до этого места — сообщите в комментах, интересно вам продолжение или нет.
Большинcтво из них умрут (как уже умерла краудфандинговая платформа Koinify, как с треском провалилась из-за найденной уязвимости инвестиционная платформа The DAO, как умерло большинство известных на заре интернета сайтов). Однако это перспективная отрасль, которая сделала возможными некоторые ранее немыслимые вещи, и вполне вероятно, блокчейн-лихорадка — новый виток прогресса, похожий на историю упомянутого ранее, и сегодня всеми любимого World Wide Web.
В: Зачем мне это всё, я не программист?
О: Для меня этот вопрос звучит так же странно, как и «Зачем мне читать и писать, я не писарь?». Программирование — это не профессия и не особый талант, это всего лишь немного более гибкий и мощный способ использования вашего компьютера — вот и всё. Его не нужно бояться или избегать, как чего-то «сложного». И да, я считаю, что в будущем, не таком далёком как кажется, сама идея специального человека, набирающего код, станет такой же абсурдной, как идея специального человека, переписывающего от руки книги. Это будут во-первых, уметь все с первого класса школы, во-вторых появятся более эффективные инструменты для профессиональной реализации нужных идей.
В: Зачем было всё это писать?
О: Затем.
Послесловие
Как и в прошлый раз, тема не раскрыта полностью по причине tl;dr, моей лени, обширности самой темы, да и всего в общем сразу. Что заинтересовало, что не понятно, заметили ошибку — пишите в комментариях. Я, как обычно, отвечаю на все вопросы, и признаю/исправляю ошибки. Все мы люди, все имеем на них право.
P.S: Спасибо за моральную и информационную поддержку Alex Kotenko, спасибо за проверку текста на понятность обывателю Musalav Alibekov. Без этих ребят всё было бы намного хуже.