Добавить в корзинуПозвонить
Найти в Дзене
Крипто Энтузиаст

Как работает Блокчейн? Как создать Блокчейн? Подробная и пошаговая инструкция

Вы здесь, потому что, как и я, в восторге от роста криптовалют. И вы хотите знать, как работают блокчейны - фундаментальная технология, стоящая за ними. Но разобраться в блокчейнах непросто — по крайней мере, не для меня. Я просматривал плотные видео, следовал пористым руководствам и испытывал сильное разочарование из-за слишком малого количества примеров. Мне нравится учиться на практике. Это заставляет меня разбираться с предметом на уровне кода, что закрепляет его. Если вы сделаете то же самое, в конце этого руководства у вас будет функционирующий блокчейн с четким пониманием того, как он работает. Прежде чем вы начнете… Помните, что блокчейн - это неизменяемая, последовательная цепочка записей, называемых блоками. На самом деле они могут содержать транзакции, файлы или любые данные, которые вам нравятся. Но важно то, что они связаны вместе с помощью хэшей. На кого рассчитано это руководство? Вам должно быть удобно читать и писать на базовом Python, а также иметь некоторое представ
Оглавление

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

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

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

Прежде чем вы начнете…

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

На кого рассчитано это руководство? Вам должно быть удобно читать и писать на базовом Python, а также иметь некоторое представление о том, как работают HTTP-запросы, поскольку мы будем обращаться к нашему блокчейну через HTTP.

Что мне нужно? Убедитесь, что установлен Python 3.6 + (вместе с pip). Вам также потребуется установить Flask и замечательную библиотеку запросов:

-2

О, вам также понадобится HTTP-клиент, такой как Postman или cURL. Но подойдет что угодно.

Где окончательный код? Исходный код доступен здесь.

Шаг 1: создание блокчейна

Откройте свой любимый текстовый редактор или IDE, лично я ❤️ PyCharm. Создайте новый файл с именем blockchain.py. Мы будем использовать только один файл, но если вы заблудитесь, вы всегда можете обратиться к исходному коду.

Представление блокчейна

Мы создадим Blockchain класс, конструктор которого создает начальный пустой список (для хранения нашей цепочки блоков), а другой - для хранения транзакций. Вот схема нашего класса:

-3

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

Как выглядит блокчейн?

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

Вот пример того, как выглядит отдельный блок:

Пример блока в нашей блокчейне
Пример блока в нашей блокчейне

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

Есть ли в этом смысл? Если нет, найдите время, чтобы осознать это — это основная идея блокчейнов.

Добавление транзакций в блок

Нам понадобится способ добавления транзакций в блок. За это отвечает наш new_transaction() метод, и он довольно прост:

-5

После new_transaction() добавления транзакции в список возвращается индекс блока, к которому будет добавлена транзакция — следующего, который будет добыт. Это будет полезно позже пользователю, отправляющему транзакцию.

Создание новых блоков

Когда наш Blockchain экземпляр будет создан, нам нужно будет заполнить его блоком genesis — блоком, у которого нет предшественников. Нам также нужно будет добавить “доказательство” к нашему блоку genesis, который является результатом майнинга (или proof of work). Подробнее о майнинге мы поговорим позже.

В дополнение к созданию блока genesis в нашем конструкторе, мы также подробно расскажем о методах для new_block(), new_transaction() и hash():

-6
-7
-8

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

Понимание Proof of Work

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

Мы рассмотрим очень простой пример, который поможет вам усвоить это.

Давайте решим, что хэш некоторого целого числа, x умноженного на другое y, должен заканчиваться на 0. Итак, hash(x * y) = ac23dc...0. И для этого упрощенного примера давайте исправим x = 5. Реализация этого на Python:

-9

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

Сеть может легко проверить их решение.

Внедрение базового доказательства работы

Давайте реализуем аналогичный алгоритм для нашей блокчейны. Наше правило будет похоже на приведенный выше пример:

Найдите число p, которое при хэшировании с решением предыдущего блока получается хэш с 4 ведущими 0-буквами.
-10
-11

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

Наш класс почти завершен, и мы готовы начать взаимодействовать с ним, используя HTTP-запросы.

Шаг 2: Наш блокчейн как API

Мы собираемся использовать фреймворк Python Flask. Это микро-фреймворк, который позволяет легко сопоставлять конечные точки с функциями Python. Это позволяет нам взаимодействовать с нашей цепочкой блоков через Интернет с помощью HTTP-запросов.

Мы создадим три метода:

  • /transactions/new как создать новую транзакцию в блоке
  • /mine чтобы сообщить нашему серверу о майнинге нового блока.
  • /chain чтобы вернуть полный блокчейн.

Настройка Flask

Наш “сервер” сформирует единый узел в нашей сети блокчейнов. Давайте создадим некоторый шаблонный код.:

-12
-13

Краткое объяснение того что добавили выше

  • Строка 15: Создает экземпляр нашего узла.
  • Строка 18: Создайте случайное имя для нашего узла.
  • Строка 21: Создайте экземпляр нашего Blockchain класса.
  • Строка 24-26: Создайте /mine конечную точку, которая является GET запросом.
  • Строка 28-30: Создайте /transactions/new конечную точку, которая является POST запросом, поскольку мы будем отправлять на нее данные.
  • Строка 32-38: Создайте /chain конечную точку, которая возвращает полную цепочку блоков.
  • Строка 40-41: Сервер запускается на порту 5000.

Конечная точка транзакций

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

-14

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

Метод создания транзакций
Метод создания транзакций

Конечная точка майнинга

Наша конечная точка майнинга - это то место, где происходит волшебство, и это просто. Она должна выполнять три действия:

  1. Рассчитайте доказательство работы
  2. Вознаградите майнера (США), добавив транзакцию, дающую нам 1 монету
  3. Создайте новый блок, добавив его в цепочку
-16

-17

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

Шаг 3: Взаимодействие с нашим блокчейном

Вы можете использовать старый добрый cURL или Postman для взаимодействия с нашим API по сети.

Запустите сервер:

-18

Давайте попробуем майнить блок, отправив GET запрос в http://localhost:5000/mine:

Использование Postman для отправки запроса GET
Использование Postman для отправки запроса GET

Давайте создадим новую транзакцию, отправив POST запрос к http://localhost:5000/transactions/new с телом, содержащим нашу структуру транзакции:

Использование Postman для отправки запроса POST
Использование Postman для отправки запроса POST

Если вы не используете Postman, вы можете отправить эквивалентный запрос с помощью c URL:

-21

Я перезапустил свой сервер и добыл два блока, чтобы получить в общей сложности 3. Давайте проверим всю цепочку, запросив http://localhost:5000/chain:

-22

Шаг 4: консенсус

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

Регистрация новых узлов

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

  1. /nodes/register принимать список новых узлов в виде URL-адресов.
  2. /nodes/resolve для реализации нашего алгоритма консенсуса, который разрешает любые конфликты, — для обеспечения того, чтобы узел имел правильную цепочку.

Нам нужно будет модифицировать конструктор нашего блокчейна и предоставить метод для регистрации узлов:

Метод добавления соседних узлов в нашу сеть
Метод добавления соседних узлов в нашу сеть

Обратите внимание, что мы использовали set() для хранения списка узлов. Это дешевый способ гарантировать, что добавление новых узлов является идемпотентным — это означает, что независимо от того, сколько раз мы добавляем конкретный узел, он появляется ровно один раз.

Реализация алгоритма консенсуса

Как упоминалось, конфликт возникает, когда один узел имеет цепочку, отличную от другой. Чтобы разрешить это, мы установим правило, согласно которому самая длинная допустимая цепочка является авторитетной. Другими словами, самая длинная цепочка в сети - это цепочка де-факто. Используя этот алгоритм, мы достигаем консенсуса между узлами нашей сети.

-24
-25
-26

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

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

Давайте зарегистрируем две конечные точки в нашем API, одну для добавления соседних узлов, а другую для разрешения конфликтов:

-27

На этом этапе вы можете использовать другую машину, если хотите, и подключать разные узлы в своей сети. Или запускать процессы, используя разные порты на одной машине. Я развернул другой узел на своей машине, на другом порту, и зарегистрировал его на своем текущем узле. Таким образом, у меня есть два узла: http://localhost:5000 и http://localhost:5001.

Регистрация нового узла
Регистрация нового узла

Затем я добыл несколько новых блоков на узле 2, чтобы убедиться, что цепочка была длиннее. После этого я вызвал GET /nodes/resolve на узле 1, где цепочка была заменена алгоритмом консенсуса:

Алгоритм консенсуса в действии
Алгоритм консенсуса в действии

И это все..

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

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