Как работает блокчейн
В основе любой криптовалюты лежит блокчейн. Он представляет собой цепочку блоков, которые хранятся у каждого пользователя. С помощью специальных алгоритмов, эту цепочку защищают настолько сильно, что ни один человек не сможет её подделать. Цепочку блоков также называют блокчейном. В этом уроке разберёмся с блокчейном, а в следующем посмотрим на работу биткойна.
Виды систем управления
Перед тем, как идти дальше, нужно разобраться с видами систем управления. Всего существует три основных системы, которые можно встретить в мире. Каждая из них отличается наличием или отсутствием центра.
Центральная система
Централизованная система
Самой простой в реализации является центральная система. Устанавливая единый центр, вы подключаете к нему всех остальных пользователей. Если клиент А хочет перевести деньги клиенту Б, то эта заявка сначала отправляется в центральный узел, где она обрабатывается и выполнятся. Также за принятие решений в такой системе отвечает центр. С одной стороны это ускоряет процесс принятия решений, так как не нужно ни с кем договариваться, но с другой – решения центра могут не устраивать клиентов. Кроме того, непрозрачность главного узла ведёт к повышению бюрократии и коррупции.
Другой недостаток подобных систем – низкая отказоустойчивость. Если вы говорим по компьютерную систему, то злоумышленнику достаточно взломать один компьютер, чтобы получить контроль над всей системой.
Децентрализованная система
Вопреки распространённому мнению децентрализованные системы имеют центры. Ключевое отличие: здесь несколько узлов, к которым подключены различные клиенты. Также один клиент может подключаться к разным центрам.
Подобные системы обладают большей прозрачностью, а у центра есть более чётка картина о его клиентах. Но всё равно простые пользователи зависят от решений центрального узла. Другой плюс – высокая отказоустойчивость. Недостаточно взломать один узел, чтобы контролировать всю систему.
Главный минус – неэффективное решение задач. Два центра могут одновременно заниматься решением одинаковых задач. В таком случае ресурсы будут расходоваться неэффективно.
Распределённые системы
Последний тип систем обеспечивает наибольшую стабильность работы. В распределённых системах все пользователи имеют одинаковые права. За счёт горизонтальной иерархии клиенты могут принимать эффективные для себя и других решения. Кроме того, если злоумышленник попробует взломать такую сеть, то ему понадобится захватить контроль над 50% всех клиентов, чтобы контролировать систему.
Единственный существенный минус: мало примеров функционирующих распределённых систем. Возможности по созданию распределённой системы стали появляться совсем недавно, поэтому мало исследований, которые бы позволяли эффективнее построить нечто подобное.
Ярким примером такой системы является блокчейн.
В - децентрализованная система, С - распределённая система
Как работает блокчейн
Разберёмся с тем, как устроен блокчейн на простом примере. Мы пошагово создадим свою криптовалюту.
Шаг 1. Цифровые подписи
Как работает цифровая подпись
Рассматривать идею блокчейна начнём с трёх друзей: А, Б и В, которые ежедневно пересылают друг другу деньги. Друзья записывают все переводы в один блокнот. Предположим, это будет текстовый документ, который хранится на сайте, доступном для А, Б и В. На данный момент в блокноте есть следующие записи:
- А перевёл Б 100 р.
- Б перевёл А 50 р.
- В перевёл А 50 р.
Такая система может спокойно функционировать, если друзья полностью доверяют друг другу. Но, что если В решит подделать третью строку? Тогда наш блокнот будет выглядеть следующим образом:
- А перевёл Б 100 р.
- Б перевёл А 100 р.
- А занял у В 50 р.
Естественно, такая ситуация не понравиться А. Чтобы обезопасить себя от таких ситуаций, можно подписывать каждые записи своей подписью. Например, А занимает деньги у В, подписывает эту запись и заносит в блокнот. Только для защиты мы будем использовать криптографическую подпись. В отличие от реальной подписи, она будет уникальной на каждом документе, и состоять из 256 бит. Такую подпись практически невозможно взломать, так как всего существует 2^256 вариантов подписей. Это очень большое число.
Как же нам сгенерировать эту длинную подпись? Для этого каждому из наших подопытных выдадим по приватному и публичному ключу. Под ключом здесь имеется в виду набор битов, вроде 01101011. Приватный ключ хранится у пользователя, а публичный известен всем остальным.
Теперь мы можем зашифровать сообщение «А перевёл Б 100 р.» с помощью закрытого ключа А. Если Б захочет проверить действительно ли А переводил ему деньги, то он попросит А расшифровать подпись открытым ключом А. Если это удастся сделать, то значит А действительно переводил деньги Б.
Математическим языком это можно представить следующим образом:
Sing(сообщение, приватный ключ)=подпись – это функция от двух переменных, которая принимает сообщение и публичный ключ, а на выходе выдаёт 256-битную подпись. Если кто-то захочет изменить сообщение, то и подпись измениться.
Verify(сообщение, подпись, публичный ключ)=да или нет – это функция, принимающая сообщение, полученную ранее подпись и приватный ключ. На выходе выдаёт действительно ли сообщение было подписано приватным ключом.
Подробнее описывать механизмы работы цифровой подписи мы не будем, так как это потянет на отдельный учебник.
Теперь наши записи принимают вид: А перевёл В 100 р. 101010…1, где последнее число это подпись. Осталось только одна проблема. Что если В начнёт копировать записи. То есть наш блокнот будет выглядеть следующим образом:
- А перевёл В 100 р. 101010…1
- А перевёл В 100 р. 101010…1
- А перевёл В 100 р. 101010…1
Конечно, в реальности ничего подобного не было. А переводил деньги всего один раз. От этого защититься очень просто. Нужно каждой транзакции присвоить порядковый номер:
- А перевёл В 100 р. 101010…1
- А перевёл В 100 р. 101110…1
Шаг 2. Хеш-функция
Хеш-функция
Осталась ещё одна проблема: Б может постоянно тратить деньги в таком количестве, что в итоге не сможет расплатиться. Для этого нужно хранить баланс каждого из друзей в нашем блокноте, но тогда мы создадим централизованную систему, от которой всё это время хотели уйти. Поэтому заставим всех друзей хранить у себя файл-блокнот с транзакциями и остатком на счёте каждого из друзей. То есть мы создали три копии одного файла.
Если сейчас А захочет перевести деньги Б, то он оповещает всех участников сети. Б и В должны будут записать это в свои блокноты. На первый взгляд, такая система абсурдна, так как любой из друзей может записывать в свой блокнот что угодно. Кроме того, сигнал от А может просто не дойти до В, поэтому он не будет знать о совершённой транзакции.
Для решения этой проблемы Сатоши Накамото предложил механизм, который существенно усложнял поддержку неправильной записи. То есть, если А решит подделать запись в своём блокноте, ему понадобятся огромные вычислительные мощности.
Для этого была использована хеш-функция. Для примера рассмотрим работу алгоритма SHA256 – самой популярной реализации хеш-функции. На вход она получает любое сообщение, а на выходе выдаёт 256 бит. Математическим языком мы можем записать её следующим образом:
SHA256(1. А перевёл В 100 р. 101010…1)=10…1
В этом примере мы передаём в функцию наши записи в блокноте, а на выходе получаем набор из 256 бит. При этом если мы изменим хоть один символ в сообщении, например, вместо «100 р.» будет «101 р.», то выходное значение изменится полностью. Если мы и дальше будем изменять наше сообщение, то никогда не получим одинаковый выход хеш-функции. В то же время SHA256 будет выдавать одинаковый набор бит для одинаковых сообщений.
Главное преимущество алгоритма SHA256 в том, что вычислить по набору бит исходное сообщение невозможно. По крайней мере, не существует математических доказательств, которые бы это позволяли. Единственный способ вычислить входные данные – это тупой перебор возможных вариантов, а их 2^256. За разумное время такое сделать невозможно.
Хеш-функции – это очень полезный криптографический алгоритм, который используется везде, не только в криптовалютах. Например, безопасность соединения с youtube обеспечивается благодаря SHA256.
Чтобы использовать SHA256 для работы, мы введём понятие «число-доказательство». В качестве доказательства мы будем приписывать к каждой записи транзакции некое число. Затем всю эту запись мы будем пропускать через алгоритм SHA256 и смотреть на результат. Если набор из 256 бит будет начинаться, например с 32 нулей, то запись будет считаться правильной, а доказательство – истинным, иначе, нам придётся подобрать другое число.
Подбор такого числа – достаточно долгое занятье. Если вы хотим увидеть результат хеш-функции, который будет начинаться с 32 нулей, то нам потребуется перебрать около 1 млрд. чисел. Кроме того, если кто-то решит изменить запись, то ему потребуется искать новое число.
Шаг 3. Объединяем записи в блоки
Теперь вернёмся к схеме с тремя друзьями. Каждый из них хранит у себя блокнот с записями транзакций. Допустим, в конце каждой недели они будут вычислять доказательство работы, а затем, заводить новый блокнот, к которому также через неделю рассчитают доказательство.
Вот у нас уже вырисовывается цепочка блокнотов (блоков), как и должно быть в блокчейне. Однако блоки не связаны между собой, поэтому ещё есть большой риск, что кто-то сможет подделать отдельный блок, вычислив хеш-функцию, которая будет начинаться с 32 нулей. Чтобы это исправить, в начале каждого блока будем писать число-доказательство предыдущего блока. Мы как бы пишем на первой странице блокнота число, которое вычислили в конце предыдущей недели. Визуально система выглядит так:
Рисунок 1 Блокчейн
Что это нам даёт? Если А захочет исправить в одном из блокнотов запись, то ему придётся вычислять новое число-доказательство. Затем, новое число нужно будет записывать на первую страницу следующего блокнота, и вычислять новое доказательство уже для него. И так далее. Изменяя даже одну цифру в блокноте, А придётся изменять и все последующие записи, что требует больших ресурсов.
На этом разработка нашего блокчейна закончилась.
Как обмануть блокчейн?
Допустим, А пытается обмануть Б, записав в блок соответствующую запись и не сказав ничего В. Б полностью доверяет А и заносит его блок в свою цепочку. Однако, Б получает от В и других майнеров блоки с другими данными, в которых нет этой записи. Чтобы решить проблему, Б дублирует цепочку. В одну он записывает только то, что приходит от А, а во вторую то, что приходит от других участников системы.
В блокчейне существует такое правило: правильная цепочка – самая длинная. Поэтому А должен генерировать новые блоки быстрее всех остальных майнеров. Только в таком случае цепочка с его блоками будет самой длинной. Но, чем больше в системе майнеров, тем сложнее будет А обогнать их и, когда цепочка от майнеров будет на один блок больше А, Б просто отбросит неправильную цепочку.
Роль майнеров в блокчейне
Майнеры
Майнинг – важная часть любой криптовалюты. Майнеры – это обычные участники блокчейна, с тем отличием, что именно они создают новые блоки. Майнер слушает все транзакции, записывает их в блок, затем рассчитывает число-доказательство, а затем отправляет блок остальным участникам сети.
За работу майнеру предусмотрено вознаграждение. Например, у биткойна оно составляет 6.25 BTC. При этом эти деньги не снимаются с чьего-то счёта, а генерируются из воздуха. Майнер просто записывает в блоке, для которого он рассчитал число-доказательство фразу «Майнер 1 получил 6.25 BTC». Это можно сравнить с печатью новых денег Центральным банком. Раз в несколько лет вознаграждение уменьшается, но об этом мы поговорим позднее.
Таким образом, майнеры поддерживают криптовалюту живой. Если никто не будет заниматься майнингом, то блокчейн просто остановиться. Также доступное в обращении количество криптовалюты постоянно увеличивается, пока не достигнет максимального значения. Например, максимально возможное количество биткойнов 21 млн, на апрель 2022 года было добыто 19 млн, и каждый день майнеры добывают по 900 BTC.
Однако последний биткойн будет добыт лишь через 142 года, так как сложность вычислений постоянно растёт, а вознаграждение уменьшается.