Многие не понимают смысла понятия «блокчейн». И это нормально! Не нормально не понимать, что «биткоин» не равно «блокчейн». Биткоин (฿) основан на блокчейн-технологии, как и другие криптовалюты, но это не то же самое. Отличное объяснение блокчейна как распределенного реестра дано одним из юзеров Лепры (© sleep), которое цитирую.
Коля решил вести дневник. Для этого он завел тетрадку, и начал писать там строчки вроде.
1. Купил хлеба.
2. Позвонил Геннадию.
…
132. Дал Васе в долг 100 рублей
133. Трахал Люду
134. Поел
…
Он очень старался вести дневник честно, и если у него с кем-то возникал спор о том, что произошло раньше, он доставал его и тыкал всех носом в свои записи. Однажды Коля сильно поспорил с Васей на тему того, давал ли он Васе в долг 100 рублей или нет. В момент спора у Коли не было с собой дневника, но он обещал завтра же принести и всё показать Васе.
Вася решил не искушать судьбу, пробрался к Коле в дом, нашел дневник, долистал до строчки 132, и заменил её на «Трахал Олю». На следующий день Коля достал дневник, долго искал в нем запись про долг Васе, не нашел, и пришел извиняться.
Прошел год, Васю замучала совесть, и он признался во всем Коле. Коля простил друга, но решил на будущее использовать какую-нибудь более надежную систему записи, которую нельзя было бы так просто подделывать.
Придумал он следующее. У себя в операционной системе Линукс он нашел программу md5sum, которая брала любой текст и превращала его в хеш - 32 непонятные цифры. Как именно она это делала, Коля не понимал, и в целом казалось, что она выдавала полную белиберду. Например, если в программу ввести слово «привет», она в ответ выдает: «8b4609d7e974702ff1451220c7ededcf». А если ввести, казалось бы, почти то же самое, но с лишним пробелом, то уже «69ab827825fdb876e709abd3d783dbb6».
Почесав тыковку, Коля придумал способ усложнить будущим Васям замену записей следующим образом: после каждой записи он вставлял хеш, который получался если скормить программе текст записи и прошлый хеш. Новый дневник получался таким:
0000 (начальный хеш, ограничимся для простоты четырьмя знаками)
1. Купил хлеба.
4178 (хеш от 0000 и «Купил хлеба»)
2. Позвонил Геннадию.
4234 (хеш от 4178 и «Позвонил Геннадию»)
…
4492
132. Дал Васе в долг 100 рублей
1010
133. Трахал Люду
8204 (хеш от 1010 и «Трахал Люду»)
…
Если теперь какой-нибудь Вася захочет изменить строчку 132, изменится и хеш этой строчки (он будет не 1010, а чем-то другим). Это, в свою очередь, повлияет на хеш строчки 133. Трахал Люду (он будет не 8204, а чем-то другим), и так далее до конца дневника. По сути ради одной записи Васе придется подменить весь дневник после нее, что сложно.
Прошло время, Коля открыл банк. Он всё так же писал в дневничок записи «дал в долг» и «взял в кредит», снабжая их хешами. Банк разросся и однажды он дал в долг (уже новому) Васе миллион. Следующей ночью десять нанятых Васей за полмиллиона таджиков пробрались в комнату Коле, заменили запись «143313. Дал в долг Новому Васе 1000000» на «143313. Дал в долг Новому Васе 10», и по-быстрому пересчитали все хеши вплоть до конца дневника.
Чудом Коля обнаружил подмену и, раз такое дело, решил усложнить способ подделки дневника. Теперь, решил Коля, я буду в конце каждой записи в скобочках добавлять какое-нибудь число («нонс»), и буду подбирать его так, чтобы каждый хеш заканчивался на два нуля. Единственный способ это сделать - тупо перебирать числа, пока не получится нужный хеш:
0000 (начальный хеш, ограничимся для простоты четырьмя знаками)
1. Купил хлеба (22)
4100 (хеш от 0000 и «Купил хлеба (22)», 22 было подобрано чтобы хеш кончался на 00)
2. Позвонил Геннадию (14)
3100 (хеш от 4100 и «Позвонил Геннадию (14)»)
…
1300
132. Дал Васе в долг 100 рублей (67)
9900
133. Трахал Люду (81)
8200 (хеш от 9900 и «Трахал Люду (81)»)
…
Для создания каждой записи Коле теперь в среднем нужно будет перебрать порядка 50 чисел, что трудозатратно. Соответственно, если запись кто-то подменит, подделка ее и всех последующих будет тоже в 50 раз сложнее, а это значит, что теперь Васе даже вместе с таджиками не справиться.
Через какое-то время Коля взял себе партнера, и они стали оба вести дневничок, причем для каждой новой записи оба одновременно начинали подбирать нонс и тот, кому первому удавалось найти подходящий, вносил запись. Так как вдвоем подбирать нонсы быстрее, Коля усложнил задачу и требовал, чтобы все хеши кончались на три нуля.
Этот окончательный Колин дневничок и есть по сути блокчейн, только Колю с другом надо заменить на кучу соединенных по сети компьютеров, и вычисления хешей усложнить, чтобы даже компьютерам было тяжко. То есть, блокчейн - это не более чем дневничок записей, который можно записывать совместно, и в котором-де-факто невозможно подделать старые записи.
Имея такой клевый дневничок, можно строить разные интересные системы. Например, биткоин. Биткоин - это дневничок, где каждая запись выглядит в виде «Передать столько-то денег с кошелька Х на кошелек У». Так как дневничок нельзя подделать и в нем хранится вся история переводов, в любой момент из него можно вычислить количество денег на каждом «кошельке». Ну, а чтобы в системе вообще были какие-то деньги, Биткоин сделан так, что каждая запись в дневничке заканчивается словами «произвести Z монет и перевести мне», где «мне» - это тот пользователь, кто первым «угадает» нонс, который обеспечит хеш с нужным количеством нулей в конце.
Поверх дневничка с некоторым количеством криптографии можно строить еще некоторое количество интересных систем. Например, можно делать записи в духе «Кто решит уравнение f(x) = 14, тот получает 10 монеток». Соответственно, первая запись в дневничке, где будет предоставлено решение, может автоматически считаться получателем монеток. Вокруг этой и схожих идей строятся т.н. «контракты».
Но тем не менее стоит помнить, то блокчейн - это не более чем надежный распределенный дневничок. Никаких мировых проблем, помимо тех, которые можно решить дневничком, блокчейн не решит.
Эта запись завершает трилогию популярных ИТ-ликбезов, которую я в эту осень решил опубликовать в своем дневнике.
Предыдущие части:
10 важных моментов при выборе дешевого ноутбука Нечеткая логика