Изучите блокчейн, построив его

Изучите блокчейн, построив его

BTG M


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

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

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

Для кого предназначен этот гайд? Вам необходимо хотя бы на базовом уровне освоить Python и понимать работу HTTP-запросов.

Что нам понадобится из программного обеспечения: Python 3.6, (включая pip), HTTP-клиент (например Postmanили Curl) и Flask. Ну и, само собой, без одной чудесной библиотеки никуда - Requests.

Финальный код доступен тут.

Шаг 1. Построение блокчейна

Для начала нужно создать в наиболее удобном для вас текстовом редакторе файл blockhaine.py.

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

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

Как выглядят блоки?

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

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

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

Сохранение транзакций - как это устроить?

Для начала создаем метод new_transaction()

new_transaction() при сохранении транзакции указывает индекс следующего блока. Именно в него будет помещена транзакция.

Как работает механизм создания блоков

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

Нам понадобятся методы new_block()new_transaction() и hash()

Комментарии и строки документации в приведенном выше коде выше должны помочь с его пониманием. Хотя, строго говоря, код и так “не страшный”.

Представление блокчейна почти закончено, но вам, наверняка интересен процесс майнинга.

Что такое “доказательство работы”?

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

Для примера мы возьмем максимально простую задачу.

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

Решение в данном случае: y = 21

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

Сеть при этом способна легко проверить решения.

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

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

“Найдите такое число p, хэш произведения которого и решения из предыдущего блока будет начинаться с 4 нулей”.

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

Шаг 2. Блокчейн в качестве API

Нам очень сильно поможет Python Flask Framework. Это микро-фреймворк, благодаря чему с его помощью удобно размечать конечные точки функций “питона”.

Мы зададим следующие методы:

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

Устанавливаем Flask

Запустим узел сети блокчейна

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

Запрос, отправляемый серверу пользователем, выглядит так:

Функция записи транзакций выглядит следующим образом:

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

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

  1. Вычислять PoW
  2. Вознаграждать майнера (нас)
  3. Сохранять новосозданные блоки

Вот теперь можно начинать работать со своим блокчейном.

Шаг 3. Работа с блокчейном

Работать с API удобнее всего с помощью клиента Postman.

Запуск сервера осуществляется следующей командой:

Майнинг запустится по запросу GET на http://localhost:5000/mine

Запрос GET на http://localhost:5000/transactions/new создаст новую транзакцию.

Никто. кстати, не заставляет использовать Postman, с этой задачей прекрасно справится и Curl

Давайте посмотрим всю цепочку блоков, используя http://localhost:5000/chain

Шаг 4. Консенсус

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

Создаем реестр узлов

Сперва нужно сообщить своему узлу о “коллегах” в сети.

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

  1. /nodes/register - создает список URL-адресов других узлов
  2. /nodes/resolve - гарантирует, что на узле хранится верная цепочка

Соответственно блокчейн, точнее, его конструктора, придется вновь модифицировать.

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

Приводим сеть к консенсусу

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

Valid_chain() просматривает все блоки и проверяет как их хэши, так и сохраненные доказательства.

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

Новые конечные точки нужно прописать в нашем API

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

http://localhost:5000 и http://localhost:5001

Затем я намайнил несколько блоков на втором узле, чтобы создать более длинную версию цепочки. Затем на узле 1 я обратился к GET /nodes/resolve и при помощи алгоритма консенсуса заменил цепочку на моем узле.

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

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


Для t.me/btgchat



Report Page