Важные новости

Блокчейн за 200 строк кода: пример простой реализации на JavaScript

Блокчейн за 200 строк кода: пример простой реализации на JavaScript

Обложка: Блокчейн за 200 строк кода: пример простой реализации на JavaScript

Понять концепцию блокчейна (англ. block chain, цепочка блоков транзакций) довольно просто: это распределенная (т.е. размещенная не на одном компьютере, а на различных устройствах компьютерной сети) база данных, которая поддерживает постоянно растущий организованный список записей. Но также просто спутать блокчейн с задачами, которые мы пытаемся с помощью него решить — на данный момент в сознании людей термин довольно прочно связан с концепциями транзакций, умных контрактов или криптовалюты.

Только вот блокчейн — это не то же самое, что биткоин, и понять основы работы цепочки блоков намного проще, чем кажется, особенно в контексте исходного кода, на котором она строится. В этой статье предлагается построить простую модель с помощью 200 строк кода на JavaScript. Исходный код проекта, который мы назовем NaiveChain, вы можете найти на GitHub. Сразу оговорим, что этот материал создан исключительно в обучающих целях, рассматривает лишь основы построения таких цепочек и является своеобразной песочницей — здесь вообще не упоминается майнинг, например.

Мы будем использовать стандарт ECMAScript 6. Если вам нужно освежить в памяти его особенности, воспользуйтесь нашей шпаргалкой: часть 1 и часть 2.

Структура блока

Первый шаг — определить элементы, которые должен содержать блок. Для простоты включим только самое необходимое: индекс (index), временную метку (timestamp), данные (data), хеш и хеш предыдущего блока, который нужно записывать, чтобы сохранить структурную целостность цепи.

Хеш блока

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

Генерируем блок

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

Хранение блоков

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

Подтверждаем целостность блоков

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

Выбираем самую длинную цепь

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

Сообщение с другими узлами сети

Неотъемлемая часть узла — обмен данными с другими узлами. Следующие правила используются для поддержания синхронизации в сети:

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

Автоматический поиск пиров не осуществляется, все ссылки добавляются в ручную.

Контроль за узлом

Пользователь должен иметь возможность каким-то образом контролировать узел, что решается с помощью установки сервера HTTP. При взаимодействии с узлом доступны следующие функции:

  • Вывести список всех блоков;
  • Создать новый блок с пользовательским контентом;
  • Вывести списком или добавить пиры.

Самый прямой путь взаимодействия — с помощью cURL:

Архитектура

Стоит заметить, что узел обращается к двум веб серверам: к HTTP для пользовательского контроля за узлом и к Websocket HTTP для установки соединения P2P между узлами.

Готово! Мы реализовали простой небольшой блокчейн. Со всеми деталями проекта можно ознакомиться в репозитории автора на GitHub.

Принцип работы блокчейна: кто создает блоки

Кто создает блоки обложка

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

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

Вспоминаем основные понятия

  • Одноранговая сеть — сеть, в которой узлы взаимодействуют между собой без посредника.
  • Блокчейн — разновидность одноранговых сетей, цепочка блоков транзакций.
  • Блок — специальная структура для записи транзакций.
  • Транзакция — запись об изменении состояния активов.

Недоверие в блокчейне

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

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

Майнеры — участники блокчейна, которые занимаются созданием новых блоков и проверкой транзакций.

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

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

Задача византийских генералов

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

Действие происходит во время осады города византийской армией. Ночью легионы с разных сторон окружили город. Генералы каждого легиона ждут приказа главнокомандующего. Варианты приказа: «атаковать» или «отступать».

Начальные условия задачи византийских генералов

Генералы ждут приказа главнокомандующего, чтобы решить «атаковать» или «отступать»

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

Благоприятный исход. Если все генералы атакуют — Византия уничтожит противника.

Благоприятный исход задачи византийских генералов

Промежуточный исход. Если все генералы отступят — Византия сохранит свою армию.

Промежуточный исход задачи византийских генералов

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

Неблагоприятный исход задачи византийских генералов

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

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

Коммуникация византийских генералов

Один из генералов не отправил верное сообщение, поэтому другие не знают, атаковать им или отступать

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

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

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

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

Задача византийских генералов и подтверждение транзакций в блокочейне

Майнеры рассматривают все транзакции и решают подтверждать их или отклонять

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

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

Алгоритмы консенсуса

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

Алгоритм консенсуса — метод, который описывает как выбирается майнер в блокчейне и по каким правилам он создает блоки.

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

Proof of Work (PoW) — алгоритм доказательства работы. Майнером может стать любой жилец дома. Чтобы создавать новые блоки, он должен будет использовать свой компьютер для решения сложных криптографических задач.

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

Proof of Work (PoW) — алгоритм доказательства работы

Новые блоки создают те жильцы, у которых включен компьютер

Proof of Stake (PoS) — алгоритм доказательства доли владения. Майнерами становятся те, у кого больше всего активов в блокчейне. У нас это будут жильцы с самыми большими квартирами. А в блокчейне Эфириума, например, это будут пользователи, у которых на счету больше всего криптовалюты ETH. При таком алгоритме затраты на электроэнергию минимальны, так как создание блоков в блокчейне больше не требует решения сложных криптографических задач. Чем больше твоя доля в блокчейне, тем чаще ты будешь создавать новые блоки.

Верной версией блокчейна, как и в Proof of Work, будет считаться та, в которой больше всего блоков. Но Proof of Stake нельзя назвать демократичным. Больше всего блоков создадут не большинство жильцов, а самые богатые жильцы. Однако, это еще более безопасно. Если майнерам принадлежит большая часть дома, то действовать злонамеренно им будет невыгодно.

Proof of Stake (PoS) — алгоритм доказательства доли владения

Новые блоки создают жильцы с самыми большими квартирами

Proof of Authority (PoA) — алгоритм доказательства личности. Может быть так, что жильцы собрались и решили, что создавать блоки будет одна квартира. Данный алгоритм распространен в частных, закрытых блокчейнах. Например, он хорошо подходит для управления многоквартирным домом из нашего примера.

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

Proof of Authority (PoA) — алгоритм доказательства личности

Новые блоки создает тот жилец, которого выбрали заранее

Алгоритмов консенсуса очень много. Постоянно изобретаются новые, но эти три наиболее известные, проверенные временем и часто применяемые.

Заключение

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

В статье 1982 года была описана Задача Византийских Генералов. В ней впервые был описан алгоритм того, как сеть может продолжать работать, даже если некоторые из узлов отказали или действуют злонамеренно.

В блокчейне используют три разновидности алгоритмов консенсуса:

  • Proof of Work (PoW) — алгоритм доказательства работы.
  • Proof of Stake (PoS) — алгоритм доказательства доли владения.
  • Proof of Authority (PoA) — алгоритм доказательства личности.

https://tproger.ru/translations/blockchain-explained/
https://maff.io/sozdanie_bloka/

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *