Все новости

Блокчейн — это вот так. Коротко и быстро о технологии, которая скоро будет использоваться везде

Блокчейн пришел на смену нанотехнологиям. Это слово повсюду: в заголовках, заявках на гранты, речах политиков, шутках в курилке. Плох тот стартап, что не опирается на технологию блокчейна. Даже если это доставка пиццы. Или — особенно, если это доставка пиццы? Давайте быстро, «на пальцах», разберемся в том, что же это такое.

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

Я одолжил Ольге 200 рублей.
Я одолжил Егору 300 рублей.
Я одолжил Егору 500 рублей.
Егор вернул мне 100 рублей.

Сразу видно, что в итоге Ольга должна вам (кассе) 200 рублей, а Егор — целых 700. Некоторое время записи в безопасности, но потом любящий одалживаться Егор, впав в отчаяние, берет тряпку и стирает в последней записи «1», заменив ее на «8». Раз — и он избавился от долга, а вы потеряли 700 рублей. Как обезопасить кассу?

Сосед по общежитию, Иван, не пользуется кассой, у него и так все отлично. Зато он программист и при случае рассказывает вам про хеширование. Это процесс, при котором любой массив данных любой длины, от полного собрания сочинений Тургенева до записки «ужин на столе», можно легко преобразовать в строку фиксированной длины с уникальным набором символов. Причем изменение любого знака в оригинальных данных полностью изменит всю строку хэша. И вы, последовав его совету, берете общедоступную функцию хэширования (например, SHA256) и приписываете к каждой строке хэш-значение (выбрав любой удобный онлайн-генератор хэша, хоть вот этот, например). Получаете таблицу вида:

Я одолжил Ольге 200 рублей.
62a2b340ba84d028ad913aa4b91a5c84c3bf32d57b2bafaf6d37aa1e8535d3fb Я одолжил Егору 300 рублей. 4ce18c1d44afc35fc7c7c79a92dc9d49be7de6dd7513d007c7cfb94cbaea69bf Я одолжил Егору 500 рублей. fb5d07437fad80d3cf968d7a8802b7b3bcb5dcd4e556365b2e6c9707ea1aa899 Егор вернул мне 100 рублей. 076e8594ce137b07f3b5b3eb7e9cfa6a6015f4a15ed74cb7ba188fe5bc0264a6

Как видите, содержание «понятной» части таблицы (слева) во второй и третьей строках отличается лишь одним-единственным символом: «3» вместо «5». При этом хэш-значения в этих строках отличаются полностью, кардинально. Это очень удобно: теперь Егору, замыслившему подмену, придется стирать не только одну-единственную цифру в последней строчке, а полностью пересчитать и записать новое хэш-значение этой строки. Но Егор не лыком шит, и у него тоже есть доступ к генератору хэшей, так что вы лишь слегка усложнили ему жизнь. Можно усложнить ее еще сильнее и хэшировать не только саму запись, но и складывать ее с хэшем от предыдущей записи.

  1. Хэшируем «Я одолжил Егору 300 рублей», получаем 4ce18c1d44afc35fc7c7c79a92dc9d49be7de6dd7513d007c7cfb94cbaea69bf
  2. Берем следующую строку, «Я одолжил Егору 500 рублей», добавляем к ней хэш предыдущего шага, вычисляем общий хэш и получаем f919cfe56c68e6d715d8e55fcae59b9e3532c28a45d0db505d66240c3e2a5676
  3. …и так далее.
  4. Так вы завели связанный список. Это «чейн», цепь. Пока без «блока». Чтобы поменять в нем хоть одну цифру, придется пересчитать хэши всех записей. Если их много, это долго. И тем не менее реализуемо: Егор садится с ноутбуком на всю ночь, приглашает своих друзей с ноутбуками, они считают и переписывают хэши на доске до утра, и вот опять он вам не должен 700 рублей. Что делать?

    А вот что: при добавлении каждой записи вы можете решать связанное с ней любое сложное уникальное уравнение, на ваш выбор. Теперь Егору с друзьями придется еще хуже — на каждое уравнение по четверти часа, десятки записей, пересчет всех хэшей… Долго, очень долго. А вот проверить список легко, по-прежнему сверкой хэшей. Однако Егор не сдается — компьютеры хорошо решают задачи, и он в какой-то момент таки справится с уничтожением своего долга в 700 рублей.

    Поэтому автору блокчейна пришла в голову идея не решать уравнения, а найти такое число хэша, чтобы итоговый хэш всего списка начинался на 10 нолей. Закавыка тут в том, что эту задачу можно решить простым перебором. Но даже для гигантских вычислительных мощностей, для кластеров в тысячи серверов этот «простой» перебор займет изрядное количество времени, а вручную вы его не решите и за все время жизни Вселенной. (Если, конечно, у вас нет квантового компьютера. Но его у вас нет — пока.)

    Теперь никакой Егор вам не страшен. Вы прекрасный староста — вы только что создали домашний, практически не взламываемый блокчейн. Но теперь к вам подходят другие студенты и говорят: «Мы перестали понимать твой список. Господи, что это за миллионы безумных закорючек ты понаписал? А кто может поручиться, что Егор не прокрался ночью и не переписал его полностью? Мы ведь больше не можем тебя (то есть список) проверить».

Sashkin / Фотодом / Shutterstock
Sashkin / Фотодом / Shutterstock

Сведущий в программировании Иван на это отвечает: «Отлично, давайте хранить копию этого списка у каждого из нас». И верно — Егор, даже с друзьями, не сможет корректно переделать все списки всего курса. Есть только один неудобный момент — при любой новой записи нужно предупредить всех держателей списка об изменениях. Но если это связанные сетью компьютеры, а не сотня студентов, то это не проблема.

Теперь все участники верят только своему списку, как и положено в децентрализованной сети, и сами вносят в него изменения. Но как им понять, что присланное от соседа изменение «Егор таки уже наконец отдал 700 рублей в кассу» настоящее? Может быть, оно пришло как раз от не оставляющего надежд «сломать систему» Егора — у него ведь тоже есть своя копия списка. В блокчейне для этого используется асимметричное шифрование (механизм публичных и приватных ключей).

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

Теперь всякая транзакция подписывается приватным ключом и вместе с публичным ключом отсылается в специальное хранилище — пул неподтвержденных транзакций. Так любой участник сети может проверить, что именно вы были ее инициатором, а не кто-то еще хочет расплатиться чужими деньгами. В криптовалютных системах, собственно, ваш публичный ключ и есть номер вашего кошелька. А почему существует этот самый «пул неподтвержденных транзакций»? Ведь можно и их записывать прямо в блокчейн, прямо в этот самый общий список, и дело с концом.

Но напомню, что мы с вами находимся в децентрализованной сети, где нет единого центра доверия и проверки валидности (то есть нет банка). Допустим, сообщения о двух транзакциях вышли почти одновременно из одного узла разным адресатам, и в каждой написано «отправляю 400 рублей» с кошелька, в котором, например, всего и осталось, что 400 рублей. Какая из них будет признана первой, если вышедшая второй двигалась быстрее и достигла своего адресата раньше? Боюсь, что вторая, хотя «по понятиям» она была выдана из узла, в котором уже не осталось денег. Как с этим справиться? В обычной сети — никак. Нет решения. Это, собственно, и есть проблема двойного расходования, из-за которой без банков в сфере электронных денег не обойтись. Должен кто-то сидеть и следить, чтобы подобного не происходило.

Grindi / Фотодом / Shutterstock
Grindi / Фотодом / Shutterstock

Блоки и майнинг

И тут мы подошли к главной, пожалуй, идее создателя блокчейна Сатоши Накамото — к собственно блокам. Каждый компьютер в сети, работающий с блокчейном (и имеющий внутри себя локальную копию всего блокчейна), набирает себе любые транзакции из пула неподтвержденных транзакций. Любые, которые ему нравятся. И составляет из них примерно такой же список, кким развлекались в начале статьи наши студенты. Затем хэширует его, присоединяет к своей копии блокчейна и кричит на всю сеть: «Эй, ребята, я сделал новый блок!» Остальные должны этот блок проверить и встроить в свои блокчейны (копии списка), верно?

Не тут-то было. Не он один такой умный. Таких криков одновременно раздастся очень много, ведь в сети много компьютеров. Значит, надо максимально усложнить задачу, заставить компьютеры делать очень сложные переборы (тот же поиск нулей в начале хэша) — тогда они явно закончат не одновременно (точнее, вероятность закончить одновременно все же есть, но ничтожная).

Побеждает единственный — он и получит право внести свой блок в блокчейн. Это и есть майнинг — бесконечный перебор вариантов хэшей с большим количество нулей на конце. В биткойне сейчас вознаграждение за каждый найденный блок — 12,5 BTC. Чем дальше, тем больше вычислительной мощности требуется для новых блоков. Домашний майнинг давно потерял смысл: вам может никогда не повезти построить новый блок, всё время будет везти кому-то другому, поэтому майнеры объединяются в очень большие пулы. Рано или поздно все биткойны будут «добыты» (всего их будет не более 21 000 000), и тогда майнеры будет зарабатывать на цене обработки транзакций (те покупатели и продавцы биткойнов, которым надо побыстрее, уже сейчас готовы платить за то, чтобы их транзакции посчитали в первую очередь).

Конечно же, блокчейн можно использовать не только для криптовалют. Можете даже сами предложить другие применения: от публичной энциклопедии с пожертвованиями и медицинских карточек — до распределенного суперкомпьютера и распределенных файловых хранилищ и систем репостинга авторского контента. Однако важен вопрос майнинга: если, скажем, Министерство здравоохранения решит создать свой блокчейн, то кто его будет майнить? И зачем? Система должна быть распределенной и децентрализованной, чтобы можно было использовать ее плюсы, иначе останутся только минусы.

 Егор Быковский