Что такое этот ваш блокчейн?

7 September 2017

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

Зачем все эти сложности?

У каждой сложной проблемы есть простое, ясное и неверное решение.
Генри Луис Менкин

Вместо того, чтобы рассказывать, что такое блокчейн, начнем с того, какую проблему он решает.

Допустим, у вас есть друг Вася. И вот Вася уехал за границу путешествовать, а на пятый день звонит: «Чувак, выручай. Я поистратился, нужны деньги». Вы говорите — ок, сейчас перешлю.

Потом вы звоните в банк и говорите: «Пожалуйста, переведите тысячу долларов с моего счета на счет Васи». Ваш менеджер в банке открывает бухгалтерскую книгу, смотрит, есть ли у вас вообще эта тысяча. Здесь мы предположим, что вы богаты, и у вас этих тысяч… И ваш менеджер делает примерно такую запись: От вас к Васе — $1,000.
Вы звоните Васе и говорите: «Дружище, перевел тебе тысячу. Можешь идти в банк и снимать деньги».

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

В этом и заключается проблема текущей системы.
Чтобы поддерживать доверие между нами, мы обращаемся к третьим лицам. И мы зависим от них годами. Беда в том, что их, этих людей и компаний, ограниченное количество. А чтобы начался хаос, достаточно одной мелочи.

Что, если бухгалтерская книга со всеми записями просто сгорит?
Что, если ваш менеджер по ошибке запишет «1500 Васе» вместо «1000»?
А если не по ошибке, а специально?
Можно ли создать систему, которая позволит переводить друг другу деньги, но без участия банка? Перевод денег — это всего лишь запись в бухкниге. Может, можно самим вести учет, не поручая это кому-то?

Можно. С помощью блокчейна.

Окей, как это работает?

Блокчейн требует, чтобы было достаточно людей, которые хотят вести учет самостоятельно. Сколько? Минимум трое. Допустим, у нас есть 10 желающих делать все по-своему. И все они согласились, что у каждого есть данные счетов всех остальных участников, но при этом личные данные остаются приватными.

1. Пустая папка

Для начала у каждого есть пустая папка. Потом в папки будут добавляться странички и записи. Эти наборы страниц в итоге и составят регистр, в котором будут учитываться все транзакции.

2. При совершении транзакции

Все приготовились и сидят с ручками и листами бумаги. Каждый готов запротоколировать любую транзакцию.

Допустим, Двойка хочет отправить $10 Девятке. Она встает и говорит: «Эй, народ! Я хочу Девятке десять долларов перевести. Запишите, пожалуйста».

Все проверяют, что у Двойки есть столько денег на счету. Если есть, все скрипят ручками и записывают транзакцию на чистых страницах. После этого транзакция считается исполненной.

3. Надо больше транзакций

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

4. Откладываем заполненную страницу

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

На самом деле это называется “майнинг”, но для простоты будем называть это опечатыванием.

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

Круто! А как подписывают страницы?

Давайте сначала о том, как вообще работает печать. Есть такая штука…

Волшебная машина

Представьте, что у нас есть волшебная машина: мы в нее загружаем коробку с чем-нибудь, а на выходе получаем коробку с чем-то совершенно другим. Вообще это называется «хэш-функция», но не будем усложнять.

Допустим, загрузили в машину цифру 4, на выходе получили набор букв «dcbea». Никто не знает, как это работает. Хуже того, это необратимый процесс. По набору букв «dcbea» невозможно восстановить, что было изначально загружено в машину. Но каждый раз, когда вы даете машине четверку, она стабильно выдает один и тот же результат.

А если мы скормим машине число 26?


В этот раз получили «94c8e». Значит, на выходе могут быть не только буквы, но и числа. А вот, допустим, мы хотим на выходе получить число с тремя нулями в начале. Можно ли вычислить, что мы должны в этом случае скормить машине?

Есть способ: можно попробовать все-все-все числа. Если повезет, после пары тысяч попыток мы получим то, что надо.

Очень сложно узнать вводные данные по полученным, но в то же время очень просто проверить, совпадают ли потенциальные вводные данные с нужными полученными.

Допустим, я даю вам число 72533 и спрашиваю: получится ли на выходе набор символов, который начинается с трех нулей?

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

В общем, если у вас есть результат, вы не можете узнать вводные данные. А вот если у вас есть и результат, и исходные данные, вы можете легко проверить, корректен ли этот набор данных.

Как это используется для подписи страниц?

Наша волшебная машина генерирует подписи для страницы.

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

Тут все как в примере выше: можно найти ответ, перепробовав все числа в мире. Спустя некоторое количество попыток мы найдем число 21191, то есть сумма будет 42084, и в итоге машина выдаст нам нужную комбинацию символов с тремя начальными нулями.

В данном случае число 21191 становится печатью для числа 20893. Допустим, у нас есть страница, на которой стоит номер 20893. Чтобы подписать страницу, мы наклеим на нее ярлычок 21191, и вуаля, страница подписана.

Номер на печати

Официально он называется “доказательство выполнения работы” (Proof Of Work).

Если кто-то хочет узнать, вносили ли изменения в страницу, все, что ему нужно будет сделать — добавить к содержимому страницы номер на печати и скормить нашей волшебной машине. Если на выходе получится число с тремя нулями в начале, значит, контент никто не трогал. Если получится что-то другое, страницу можно выбросить, потому что ее контент скомпрометирован.

Этот механизм используется для всех страниц, и в итоге мы складываем их в нужные папки.

Подписываем страницу

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


Имейте в виду, что три нуля — это просто пример. В реальности последовательности гораздо сложнее.

Итак, получили номер, подписали страницу. Если кто-то попытается изменить содержимое страницы, все желающие смогут взять номер на печати и проверить, верна ли страница.

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

Все остальные, услышав, проверяют, подходит ли число. Если да, все пишут на своих страницах это число и убирают их в папки.

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

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

Число, с которым соглашается большинство, становится честным номером для подписи.

Тогда почему каждый ведет свои подсчеты? Ясно же, что кто-то другой точно посчитает и озвучит, можно откинуться на стуле и ничего не делать.

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

Так и появился биткоин — это была первая валюта в системе блокчейн. Люди развивали блокчейн и получали за это вознаграждения.

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

Осталось упомянуть только об одной мелочи.

Допустим, у меня в папке уже есть пять страниц, все подписанные. Что, если я пойду и внесу изменения во вторую страницу? Номер на печати позволит всем остальным обнаружить, что с транзакциями что-то не так. А что, если я тогда высчитаю новый номер для печати и помечу страницу им?

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

Защита от изменений в контрольных номерах

Помните, мы говорили о двух коробках: в одной число 20893, а содержимое другой вам предстоит высчитать? Так вот, на самом деле в блокчейне используется три коробки: две полные и одна, содержание которой нужно вычислить.

В первой коробке список транзакций, во второй — номер для подписи, в третьей — то, что выдала волшебная машина, когда ей скормили предыдущую страницу.


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

А если сжульничать попробует не один из десяти, а шесть из десяти?

А вот здесь начинаются проблемы. Это называется «атака 51%». Если больше половины участников сети решат быть нечестными и объединятся, чтобы обмануть остальных, система сломается. Вообще говоря, это единственное уязвимое место блокчейна, потому что основополагающий принцип системы заключается в том, что большая часть участников честна.