Easy talk или объясняем блокчейн на пальцах
@chainmediaМатериал подготовлен командой @chainmedia на основе статьи WTF is The Blockchain?
Каждый, кто время от времени следит за новостями, уже не раз слышал о биткоине и блокчейне. Эти темы постоянно фигурируют в СМИ и уже плотно вошли в нашу жизнь. Даже люди, которые никогда не занимались майнингом криптовалют и не до конца осознают, как работает данная технология, активно ее обсуждают. Основной задачей этого материала является описание блокчейна таким образом, чтобы каждый пользователь сети интернет понял, что же это за зверь и зачем он нужен.
Блокчейн, почему нам необходимо что-то настолько сложное?
Прежде чем ответить на вопрос о том, что такое блокчейн, давайте сконцентрируемся на проблемах, которые он призван решать.
Представьте, что Никита – ваш лучший друг. Он уехал путешествовать за границу, и на пятый день путешествия звонит вам и говорит: “Привет, можешь прислать мне немного денег? У меня совсем закончились”.
Вы быстро отвечаете, что сейчас без проблем все переведете, и вешаете трубку.
После вы звоните в банк и говорите сотруднику, чтобы он перевел $1000 на счет Никиты.
Менеджер по работе с клиентами открывает реестр (базу данных), проверяет баланс вашего счета, чтобы увидеть, имеете ли вы достаточный остаток для перевода в $1000. Представим, что вы богатый человек и денег у вас много; таким образом, он делает запись в реестре следующим образом:
На заметку: в рамках статьи технической стороне вопроса будет уделено минимум внимания, чтобы упростить его понимание.
После разговора с менеджером вы звоните Никите и сообщаете радостные новости: “Деньги переведены! Во время следующего похода в банк ты можешь преспокойно снять $1000, которую я отправил”.
Что, собственно, произошло? Вы и Никита доверили банку управление вашими средствами. По сути, никакого реального движения денег не происходило. Все, что было необходимо, – это запись в реестр. А если точнее, запись в реестр, которым ни вы, ни Никита не владеете и не управляете.
И это проблема нынешней системы.
В течение многих лет мы зависели от посредников. Однако возникает вопрос: чем же так плоха подобная зависимость?
Проблема в том, что банки не являются частью какой-либо глобальной сети. Вся информация хранится исключительно в рамках одного банка. Если обществом овладеет хаос, то вся система может покачнуться из-за отказа или отсутствия возможности у одного человека или организации играть по правилам.
• Что, если база данных, в которой зарегистрирована сделка, сгорела в пожаре?
• Что, если ваш менеджер по ошибке написал $1500 вместо $1000?
• Что, если он сделал это нарочно?
Но существует ли надежная система, где операции по переводу денег осуществлялись бы без участия банка?
Чтобы ответить на этот вопрос, необходимо копнуть глубже и задать вопрос посложнее (в конце концов, только сложные вопросы приводят к решениям, способным изменить мир).
Задумайтесь на секунду, что стоит за переводом денежных средств? Просто запись в реестре. Тогда возникает вопрос —
есть ли способ ведения реестра между собой без участия третьей стороны?
Как вы уже догадались, ответ на этот вопрос — технология блокчейн.
Это метод, который позволяет поддерживать данный реестр самостоятельно, без участия посредников. Теперь, ответив на вопрос «зачем?», давайте узнаем, как работает механизм распределенного реестра.
Да, но объясните, как это работает?
Для того чтобы механизм работал, необходимо создать сообщество людей, которое готово отказаться от посредников при совершении денежных операций. Только после этого группа может вести реестр самостоятельно.
Но сколько людей необходимо привлечь, чтобы система заработала? По крайней мере три. Для нашего примера мы предположим, что десять человек хотят отказаться от банков или любого другого посредника. По взаимному согласию у них есть реквизиты счетов друг друга, при этом они не знают ничего о личности друг друга.
1. Создаем пустую папку
Сначала каждый участник сети владеет пустой папкой. С течением времени все участники будут добавлять страницы в пока пустые папки. И эта коллекция страниц сформирует реестр, в котором будут отслеживаться транзакции.
2. Фиксируем первую сделку
Каждый участник сети видит чистый лист, в который готов вписать любую операцию, происходящую в системе.
Допустим, участник #2 хочет отправить $10 участнику #9.
Чтобы совершить сделку, участник #2 объявляет всем в сети: “я хочу перевести $10 на счет участника #9. Так что, пожалуйста, запишите эту операцию на ваших листах.”
Все проверяют, достаточен ли остаток на счету участника #2, чтобы перевести $10 на счет участника#9. Если на счету есть необходимые $10, то все участники делают отметку о транзакции в своих листах.
После этого сделка считается завершенной.
3. Фиксируем последующие транзакции
По истечении времени количество транзакций начинает возрастать. Всякий раз, когда участники хотят совершить сделку, им необходимо объявить об этом остальным пользователям сети. Как только участник видит объявление, он/она регистрирует его на своей странице. Объявления регистрируются до тех пор, пока не закончится место на текущей странице.
Предположим, что на странице можно зафиксировать не более десяти сделок. Как только десятая транзакция завершена, все участники автоматически переходят на следующую страницу.
Пришло время перенести заполненную страницу в папку и повторить пункт №2.
4. Переносим заполненную страницу в папку
Прежде чем убрать заполненную страницу в папку, необходимо запечатать ее, используя уникальный код, который одобряется всеми участниками сети. Создавая печать, участники сети подтверждают, что никто не внесет изменения на страницу после того, как она будет убрана в папку. Другими словами, она навсегда останется там в запечатанном виде. Более того, если каждый участник принимает используемый метод создания печати, это значит, что все доверяют содержимому этой страницы. Таким образом, простановка печати на странице является одним из ключевых элементов данного механизма.
[Минутка технослэнга] Процесс создания печати, которая используется перед переносом страницы в папку, на практике называется майнингом. В данной статье мы продолжим именовать его печатью для простоты понимания.
Интересно! Как мы запечатываем страницы?
В качестве предварительного условия для понимания механизма проставления печати, давайте познакомимся с
...волшебной машиной!
Представьте себе машину с двумя отверстиями – справа и слева, окруженную толстыми стенками. Если вы отправите коробку с одним содержимым с левой стороны машины, она выдаст эту же коробку справа, но уже с другим содержимым.
[Минутка технослэнга] Эта машина именуется «хэш-функцией», но на данный момент продолжим называть ее волшебной.
Предположим, что в машину была отправлена коробка с цифрой 4 с левой стороны, с правой появилась та же коробка со следующим содержимым: ‘dcbea.’
Каким образом «4» конвертировалось в этот набор букв? Никто не знает. Более того, это необратимый процесс. Рассматривая ‘dcbea’, невозможно сказать, что находилось в коробке, поданной слева. При этом каждый раз при введении 4 с левой стороны, машина выдаст тот же самый набор букв, ‘dcbea’, справа.
Давайте попробуем отправить внутрь машины другое число. Как насчет 26?
Машина выдала справа 94c8e. Интересно! Получается, что значения, появляющиеся справа, тоже могут содержать цифры.
Давайте попробуем ответить на следующий вопрос:
Что нужно отправить с левой стороны машины, чтобы на выходе получилось слово, которое начинается с трех нулей? Например, 000ab или 00098 или 000fa?
Как было сказано выше, особенность машины заключается в том, что невозможно рассчитать вводимые значения слева после того, как мы ознакомились с полученными значениями справа. Принимая это во внимание, как же ответить на поставленный вопрос?
Есть один способ. Почему бы не попробовать вводить числа одно за другим до тех пор, пока не получится значение, начинающееся с трех нулей?
При оптимистичном раскладе после нескольких тысяч попыток искомое значение будет найдено и требуемый результат буден получен справа.
Рассчитать входные значения слева с учетом выходных справа чрезвычайно трудно. Но в то же время невероятно легко убедиться, что одни и те же вводные слева дают один и тот же результат справа.
Сложно ли, по вашему мнению, предугадать ответ на следующий вопрос: при введении числа, например, 72533, в машину слева, увидите ли вы значение, начинающееся с трех нулей?
Все, что необходимо сделать, это ввести 72533 в машину и посмотреть, что появилось с правой стороны. Конец.
Наиболее важное свойство таких машин заключается в том, что знание выходного значения справа не позволит вам рассчитать вводимое значение слева. Однако, обладая и входным, и выходным значениями, вы легко сможете проверить, ведет ли вводимое значение слева к полученному справа результату.
Как использовать хэш-функции для создания печати на странице?
Для создания печатей на страницах воспользуемся волшебной машиной.
Представьте себе, что у вас две коробки. Первая коробка содержит номер 20893. Позвольте задать вопрос: “Можете ли вы выявить число, которое при сложении с числом в первой коробке, вводится в машину и в результате выдает нам значение, которое начинается с трех нулей?”
Так же, как и в предыдущем примере, единственным способом для расчета такого значения является перебор каждого натурального числа.
После нескольких тысяч попыток, допустим, было выведено значение, 21191, которое при добавлении к 20893 (т. е. 21191 + 20893 = 42084) подается в машину и в результате дает нам слово, удовлетворяющее нашим требованиям.
В таком случае число 21191 становится печатью для числа 20893. Предположим, есть страница, которая содержит число 20893, написанное на ней. Чтобы запечатать эту страницу, при этом защитив данные на ней от внесения изменений, необходимо поставить печать с номером ‘21191’ на странице. Как только номер (т. е. 21191) проставлен, страница считается запечатанной.
[Минутка технослэнга] Номером печати на практике называется «Proof Of Work», что означает, что этот номер является доказательством того, что усилия были предприняты для его вычисления. Для наших целей мы продолжим называть его номером печати.
Если кто-то хочет проверить, менялось ли содержимое страницы, все, что участнику необходимо сделать, — добавить к содержимому страницы (20893) номер печати (21191) и ввести полученное значение в волшебную машину. Если машина выдает значение с тремя нулями, содержание осталось нетронутыми. Если значение, которое появляется справа, не соответствуют нашим требованиям, данные страницы можно считать скомпрометированными, так как ее содержание было изменено.
Для того, чтобы запечатать оставшиеся страницы и, впоследствии, разместить их в соответствующие папки. используется аналогичный механизм.
Наконец, запечатывая страницу...
Чтобы запечатать страницу, содержащую 10 транзакций сети, необходимо выявить число, которое при добавлении в список транзакций и попадании в машину выдаст нам значение, начинающееся с трех нулей справа.
На заметку: фраза «значение, начинающееся с трех нулей» здесь используется только в качестве примера. Он показывает, как функции хэширования работают на практике. Реальные задачи гораздо сложнее чем та, используемая в материале.
После того, как время и электричество было потрачено машинами для расчёта номера печати, его используют, чтобы запечатать страницу. Если когда-нибудь кто-то попытается изменить содержание страницы, данный номер печати позволит проверить целостность страницы и данные о транзакциях.
После рассмотрения механизма запечатывания страницы, давайте вернемся к моменту, когда участники закончили внесение десятой транзакции, и место для записи последующих транзакций на странице закончилось.
Как только все участники заполнят страницы транзакциями, они запускают процесс вычисления номера печати, которая защитит страницу от последующих изменений. По завершении процесса страница будет убрана в папку. Каждый участник сети участвует в расчетах. Тот, кто первым вычислит номер печати, сообщает об этом всем остальным участникам сети.
Услышав номер печати, все участники проверяют, выдает ли заявленный номер печати требуемый результат. Если это происходит, каждый участник указывает данный номер на странице сверху и переносит страницу в папку.
Но что происходит, если кто-то, например, участник #7, не подтверждает, что данный номер ведет к необходимому выходному результату? Такие случаи не редкость. Возможными причинами могут быть:
• Участник неправильно расслышал транзакцию, объявленную в сети
• Участник неправильно зафиксировал транзакцию, объявленную в сети
• Участник пытался обмануть других, когда фиксировал транзакцию (либо для своей выгоды, либо в пользу кого-то еще в сети).
Вне зависимости от причины, у участника #7 есть только один выбор — отказаться от своей страницы и скопировать ее у кого-то другого так, чтобы он тоже мог положить ее в папку. Если участник не перенесет свою страницу в папку, он не сможет продолжать записывать дальнейшие операции, другими словами, быть частью сети.
Тот номер, на который соглашается большинство участников, становится легитимным номером печати.
Почему участники тратят ресурсы на довольно-таки сложный расчет, когда они осведомлены, что кто-то другой будет также рассчитывать данный номер и, впоследствии, сообщит им? Почему бы не сидеть сложа руки и не ждать анонса?
Здесь вступает в силу система вознаграждений. Каждый участник блокчейна имеет право на вознаграждение. Вознаграждение используется для расчета номера печати; участник получает деньги за свою работу (т. е. затраченные мощности процессора и электричество).
Просто представьте: если участник #5 вычисляет номер печати для страницы, он получает в награду деньги, скажем, $1. Другими словами, сальдо счета участника #5 увеличивается на $1 без снижения баланса счета кого-либо другого.
Вот как биткоин начал свое существование. Это была первая валюта для транзакций в системе блокчейн (т. е. системе распределенного реестра).
Когда достаточное количество людей обладает биткоином, он растет в стоимости, мотивируя большее количество людей к присоединению к системе; это ведет к дальнейшему росту стоимости криптовалюты, что, в свою очередь, еще больше мотивирует людей к активному участию в блокчейне и так далее.
Как только все участники убирают заполненную страницу в свои папки, они начинают ведение транзакций на новой странице, и весь процесс повторяется снова и снова.
[Минутка технослэнга] Каждая страница является Блоком (block), а каждая папка является частью цепи (сhain), отсюда рождается название системы блокчейн (blockchain).
Именно так и устроен блокчейн. Осталось прояснить только одну маленькую деталь.
Представьте себе, что в папке уже пять страниц — все запечатаны участниками сети. Что если кто-то вернется на вторую страницу и изменит сделки в свою пользу? Номера печати позволят другим пользователям сети моментально идентифицировать изменения, верно? Но что если злоумышленник пойдет дальше и вычислит новые номера печати для измененных страниц? Чтобы предотвратить похожую проблему, существует небольшой нюанс, используемый при расчете номера печати.
Защищая номера печати от модификаций
В рамках используемого примера существуют две коробки — одна, содержащая номер 20893, другая пустая, предназначенная для расчета? В реальности, чтобы посчитать номер печати в блокчейн, необходимы не две коробки, а три — две, заполненные предварительно, и одна, предназначенная для расчёта.
Когда содержимое всех трех коробок суммируется и подается в машину, ответ, который выходит с правой стороны, должен удовлетворять требуемым условиям.
Как отмечалось, в одной коробке содержится перечень транзакций, а вторая будет содержать номер печати. Что же в третьей коробке? Третья коробка содержит выходные данные, полученные для предыдущей страницы.
Благодаря этому небольшому трюку, чтобы внести изменения в заполненные страницы, участнику придется изменить содержание и номер печати всех страниц после той, которую изменили, чтобы сохранить логику цепи, так как каждая страница зависит от предыдущей.
В условиях нашего примера, если один из десяти участников попытается обмануть и изменить содержимое в блокчейне (папке, содержащей страницы со списками транзакций), ему придется корректировать несколько страниц, а также рассчитать новые номера печати для каждой из них, что, невероятно, трудно. Таким образом, один нечестный участник в сети не сможет победить девять честных.
После, начиная от страницы, где были внесены изменения, будет создана другая цепь в сети, однако эта цепь никогда не сможет сравниться с цепью, в которой участвуют честные участники цепи – просто потому, что усилий одного человека недостаточно, чтобы превзойти совместные усилия и скорость девятерых. Следовательно, это гарантирует, что самая длинная цепь в сети является самой честной цепью.
Чем длиннее цепь, тем меньше вероятность того, что она создается нечестными игроками.
Но что, если вместо одного шесть участников поведут себя нечестно?
В этом случае протокол можно признать провальным. Такое явление называется “51% атаки”. Если большинство людей в сети решит играть не по правилам и обманывать остальных участников, цель протокола не будет достигнута.
И это на данном этапе Ахиллесова пята блокчейна, из-за которой он в теории может рухнуть. Это вряд ли произойдет, но необходимо знать и понимать уязвимые точки системы. Блокчейн построен на предположении, что большинство людей предпочтут вести себя честно.
Вот и все, что нужно знать о блокчейне. Если вы когда-нибудь встретите кого-то, кто до сих пор задается вопросом: “Что за зверь такой - блокчейн?” - вы знаете, куда их отправить.
Подписывайтесь на канал @chainmedia, чтобы получать больше таких материалов