Как сделать свой блокчейн

Добавил пользователь Алексей Ф.
Обновлено: 04.10.2024

Содержание

Виды блокчейнов

По степени открытости выделяют три разновидности цепочек.

  1. Публичная. Например, Litecoin, Ethereum, Bitcoin. Все пользователи имеют равные права. Каждый может получить доступ к сети, просматривать историю транзакций, участвовать в достижении алгоритма консенсуса. Анонимность условная (80% клиентов сети можно вычислить). Это полностью децентрализованная цепь блоков без привилегированных узлов. Лучшая основа для новых монет.
  2. Гибридная. Например, Bitshares, R3 CEV. Пользователи имеют разные права. Вносить изменения могут только избранные узлы, которые назначены разработчиками (иногда могут выбираться путем голосования). Просмотр истории доступен всем, но могут быть и скрытые записи. Подходит для корпоративных сетей, которым важно защищать приватность клиентов.
  3. Приватная. Например, Mijin (форк NEM). Все пользователи обладают равными правами, но доступ к истории реестра получает ограниченный круг лиц. Разрешение выдается центральной организацией, которая может состоять из одного или нескольких валидаторов. Закрытая сеть отличается быстрой обработкой транзакций, т.к. нет лишней нагрузки в виде массового просмотра деталей операций. Подходит для корпоративных проектов. Упрощает приход классических финансовых организаций в мир криптотехнологий.

Как создать блокчейн открыто на смартфоне.

По алгоритму достижения консенсуса можно выделить 4 основных вида.

  1. Proof-of-Work. Принцип доказательства работы позволяет завершить блок и получить вознаграждение узлу с самым большим вкладом в вычислительную работу. Характерен высокими комиссиями и энергопотреблением, медленной скоростью обработки транзакций. Требует мощное специализированное оборудование для поддержания работы майнеров.
  2. Proof-of-stake. Согласно принципу доказательства доли, валидатором транзакции становится пользователь с самым большим количеством заблокированных средств в протоколе (срок блокировки также учитывается). Считается наиболее экологичным, т.к. не требует вычислительных мощностей в промышленных масштабах. Высокая скорость переводов, низкие комиссии, простота масштабирования.
  3. Proof-of-authority. В случае доказательства полномочий валидаторами становятся узлы с большим количеством заслуг и рейтинга. Хорошо подходит для частных блокчейнов за счет высокой степени централизации, отсутствия необходимости стейкать монеты, решать сложные задачи для подтверждения операций.
  4. Proof-of-burn. Доказательство сжигания предполагает, что право на проверку транзакции получает узел, который уничтожил большее количество монет. Сжигая валюту, пользователь демонстрирует приверженность сети, получает право на майнинг. По сути, это более экологичный и менее энергозатратный вариант алгоритма PoW.

Пошаговый план разработки

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

  1. Написать класс для обработки блоков в момент запуска узлов.
  2. Настроить локальную синхронизацию цепи.
  3. Настроить отображение блокчейна в браузере.
  4. Прописать алгоритмы генерации новых блоков и соединения их с предыдущими.
  5. Прописать требования к структуре хэша блока, если используется PoW алгоритм.
  6. Реализовать алгоритм консенсуса.

Пример алгоритма хэширования для блокчейна.

После этого можно заняться непосредственно разработкой криптовалютных решений, смарт-контрактов (технологии NEM, Ethereum, Stellar), интеграции с мобильными приложениями.

Набор команды

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

Вот их должности.

  • Программист. Навыки системного программирования, знание Java, C/C++. Ускорить и упростить разработку можно взяв за основу существующую монету, например Ethereum. Тогда для написания смарт-контрактов в EVM нужен опыт разработки на языке Solidity. Ищите таких сотрудников на GitHub, просите контакты у проектов, уже успешно реализовавших ICO/IEO.
  • Маркетолог. Должен уметь находить новых партнеров и аудитории, так как на рынке уже слишком тесно, предложение опережает спрос. Профессионально разбирается в лидогенерации, в том числе Яндекс.Директ, Google Adwords и их аналитических разделах. Обязательно знание иностранных языков (как минимум английский). Понимание конъектуры рынка, знание лидирующих проектов, их особенностей, слабых мест.
  • Баунти-менеджер. Разрабатывает партнерские, бонусные программы для всех желающих продвигать проект зарабатывая на этом. Должен привлекать лидеров мнений из социальных сетей, профессиональных журналистов, предлагать им особые партнерские условия за рекламу. Все бонусы, как правило, выплачиваются в монетах или токенах запускающегося проекта, поэтому не требует дополнительного бюджетирования.
  • Копирайтер whitepaper. Должен доходчиво описать концепцию проекта, все его технические, экономические, маркетинговые тонкости. От качества whitepaper напрямую зависит количество заинтересованных пользователей, уровень изначального доверия. Чем более детализированной и структурированной будет презентация, тем проще продать идею. Копирайтер должен вникнуть во все тонкости криптоэкономики, поэтому лучше нанимать журналиста с финансовым опытом.
  • Менеджер ICO/IEO. Любой публичный проект рано или поздно выходит на стадии первичного предложения монет. Это важный этап внешнего финансирования, от которого зависит развитие стартапа в ближайший год. Грамотно проведенное IEO не только наполнит счета компании, но и создаст крупное сообщество приверженцев проекта, которые будут его бесплатно поддерживать, продвигать. В задачи менеджера входит сопровождение на всех этапах, начиная с наброска whitepaper вплоть до листинга на биржах.
  • Рыночный аналитик. Специалист должен прогнозировать движения курсов криптовалют. Благодаря ему стартап будет корректировать свою стратегию ICO/IEO, реинвестировать полученные от инвесторов средства для получения большей прибыли в будущем. Минимальный опыт - 5 лет.

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

Какой нужен бюджет

Часовая ставка блокчейн-программиста варьируется от 2000 до 10000 руб./час. За разработку и проведение ICO (включены только блокчейн и личный кабинет инвестора) придется заплатить от 300 000 до 10 000 000 руб. При этом нужно будет выделить отдельный бюджет на маркетинг, юридическую поддержку.

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

Для начала разработки проектов с прицелом на мировой масштаб (типа WAVES) потребуется от $700 000. Если у вас слабый продукт, команда не набрана, нет успешных ранее реализованных проектов, трек-рекорда, то невозможно стать заметным игроком в криптомире с бюджетом $100 000.

Маркетинг

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

  • Создание экономической модели проекта на базе определенной бизнес-логики.
  • Разработка бизнес-плана.
  • Разработка дорожной карты со всеми технологическими особенностями.
  • Проработка вайтпейпер, документов для seed и public инвесторов.
  • Анализ потенциальных конкурентов, рыночной ситуации. Проработка целевой аудитории.
  • Подготовка финансовой модели стартапа, IEO-стратегии.
  • Создание демоверсии сайта, копирайтинг основных текстов проекта.

Тщательный анализ и проработка всех пунктов занимает от 3 до 6 месяцев работы в плотном контакте с основателями.

Привлечение разработчиков

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

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

Перспективы новых блокчейнов

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

  • Avalanche. Позволяет разработчикам выпускать публичные и закрытые блокчейны, настраивать язык программирования, удобные виртуальные машины для разработки смарт-контрактов. Обрабатывает 4500 операций в секунду, а в скором времени количество будет доведено до 20 000.
  • Fantom. Решает проблемы с масштабируемостью эфириума. Одновременно использует два алгоритма консенсуса (aBFT, PoS). Проводит 300 000 транзакций в секунду. При необходимости Fantom легко интегрируется в любые другие блокчейны в качестве модуля консенсуса. Совместим с EVM.
  • Elrond. Площадка для запуска смарт-контрактов, разработки быстрых приложений DeFi-сектора. Специальная техника шардинга позволяет повысить скорость сети до 15 000 транзакций в секунду. В будущем планируется повышение до 250 000.

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

Как создать свой блокчейн с нуля при помощи Go? Часть 1

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

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

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

В этом гайде вы узнаете:

1. Как разработать Go проект на своем компьютере без опыта работы с Golang.

2. Как создать и распределить блокчейн токены.

3. Как разработать базу данных CLI на языке Golang с нуля.

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

5. Как мало прав есть у пользователей самых популярных приложений.

Начнем с истории разработки распределенного реестра. Нашего главного героя зовут Андрей. Днем он владелец бара, а ночью - разработчик ПО. Он живет в небольшом городе на востоке Словакии под названием Ба́рдеёв.

Андрей устал:

1. Программировать старомодные PHP/Java/Javascript приложения.

2. Забывать сколько клиенты должны за неоплаченные шоты.

3. Тратить время на пересчет монет, купюр и выдачу сдачи.

4. Выдавать пластиковые монетки, по которым посетители могут играть в настольный футбол и прочие игры.

Андрей хотел бы:

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

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

Его цель - написать простую программу, которая бы следила за балансами его клиентов в виртуальной форме. Андрей пишет:

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

Это даст мне возможность генерировать прибыль для моих посетителей. Клиенты моего бара будут держать токены и иметь права акционеров. Они смогут голосовать за цену напитков, часы работы, новые фичи, дизайн бара, распределение прибыли и т.д. Я назову свои токены The Blockchain Bar (TBB).

Теперь, когда мы знаем цель Андрея, можем приступать к разбору.

Требования

Для полного понимания рекомендуется 2+ года опыта программирования на Java/PHP/Javascript или на другом языке, похожем на Golang.

Посоветуем также пройти официальный курс A Tour Of Go, чтобы ознакомиться с синтаксисом языка и основными концепциями (это займет около 20 минут).

Андрей занимался базами данных SQL в 90х. Он знает как сделать и оптимизировать продвинутое решение. Для создания базы он выбрал простой но надежный файл JSON.

1. Начало

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

Андрей генерирует 1 миллион токенов.

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

Начинается все просто - с обыкновенного genesis.json.

Андрей создает файл ./database/genesis.json , в котором определяет что на его блокчейне будет 1 миллион токенов и все они будут принадлежать ему.

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



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

2.Изменение состояния базы данных (Mutating Global DB State)

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



Для того, чтобы постоянно не пересчитывать балансы клиентов, андрей создаёт файл ./database/state.json .

База данных выглядит следующим образом:

Бонус для клиентов

Чтобы привлечь новых клиентов Андрей объявляет об акции - он предоставит 100% бонус на покупку токенов TBB в следующие 24 часа.

Маркетинговый ход сработал. Его первый клиент под ником BabaYaga купил TBB на €1000 и, чтобы отметить событие, потратил один токен на рюмку водки.

Транзакция, записанная на бумаге:



База данных выглядит следующим образом:

Андрей решил немного отдохнуть, поиграть в видеоигры и почистить свой жесткий диск от старых фотографий. К несчастью, он случайно нажал Enter, когда вводил команду удаления в терминале sudo rm -rf /

Все его файлы, в том числе Genesis.json и State.json его бара исчезли. Поскольку наш герой имеет опыт в разработке, он не растерялся. Хотя у него не было бэкапа, у него было кое-что получше - листик бумаги, на котором записаны все транзакции в его базе данных. Теперь ему нужно только заново провести все транзакции и база данных восстановится.

Он решает улучшить свою базу данных MVP архитектурой, построенной на событиях. (Event-based architecture). Каждое действие в баре, вроде единичной покупки напитка, должно быть записано в базу данных блокчейна.

Каждый клиент будет представлен в базе данных при помощи структуры Account.

Каждая транзакция будет иметь четыре характеристики: откуда, куда, размер и данные.

Генезисная база данных останется файлом JSON:

Все транзакции, ранее записанные на куске бумаги, будут хранится в локальной текстовой базе данных tx.db :

Ключевым компонентом базы данных, отвечающим за бизнес-логику будет структура State:

Структура State будет знать балансы всех пользователей, а также адресата, отправителя, и сумму транзакций. State считывает начальные балансы пользователей с файла genesis.json .

После этого изначальные балансы обновляются, заново проигрывая все события из базы данных tx.db.

Компонент State отвечает за:

  • Добавление транзакций в мемпул
  • Подтверждение транзакций
  • Сохранение транзакйий на диск
  • Подсчет балансов пользователей

Добавление транзакций в мемпул:

Подтверждение транзакций:

Сохранение транзакций на диск:

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

Подписывайтесь на ForkNews в Telegram, чтобы быть в курсе новостей из мира криптовалют


Самый быстрый способ узнать, как работает блокчейн — это создать его.

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

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

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

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

Перед тем, как начать…

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

Если вы не знаете, что такое хеш, то вот вам статьи:

На кого нацелена данная статья?

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

Исходный код статьи

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

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

Скелет блокчейна

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Понимание подтверждения работы

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

Рассмотрим простой пример, чтобы получить лучшее представление.

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

Решение здесь следующее: y = 21, так как созданный хеш заканчивается нулем:

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

Реализация базового PoW

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

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

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

Шаг 2: Блокчейн как API

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

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

Настройка Flask

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

Краткое объяснение того, что мы только что добавили:

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

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

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

index = blockchain . new_transaction ( values [ 'sender' ] , values [ 'recipient' ] , values [ 'amount' ] )

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

Конечная точка майнинга — это часть, где происходит магия, и это просто! Для этого нужно сделать три вещи:

  • Подсчитать PoW;
  • Наградить майнера (нас), добавив транзакцию, дающую нам 1 коин;
  • Слепить следующий блок, внеся его в цепь.

Обратите внимание на то, что получатель замайненого блока — это адрес нашего узла. Большая часть того, что мы здесь сделали, это просто взаимодействие с методами в нашем классе Blockchain. С этого момента, мы закончили, и можем начать взаимодействовать с нашим blockchain на Python.

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

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

Создаем Blockchain с нуля на Python

Создаем Blockchain с нуля на Python

Если вы не пользуетесь Postman, тогда вы можете создать аналогичный запрос при помощи cURL:

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

Пока всё идет очень здорово. У нас есть базовый blockchain, который принимает транзакции и дает возможность майнить новые блоки. Но вся суть блокчейна в том, что они должны быть децентрализованными. А если они децентрализованы, каким образом мы можем гарантировать, все они отображают одну цепочку?

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

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

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

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

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

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

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

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

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

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

Создаем Blockchain с нуля на Python

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

Создаем Blockchain с нуля на Python

И это была обертка… Найдите друзей и вместе попробуйте протестировать ваш блокчейн!

Подведем итоги

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


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


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

Общая структура нашего блокчейна

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

  • номер блока [index] ;
  • метка времени [timestamp] ;
  • содержание транзакции [transaction] ;
  • значение так называемого доказательства работы [proof] (о том, что это такое, чуть ниже);
  • значение хеш-суммы предыдущего блока [previous hash] ;
  • значение хеш-суммы текущего блока [hash] .

В содержание транзакции мы включим отправителя денежных средств [sender] , имя получателя этих средств [recipient] и количество переданных денежных средств [amount] . Для простоты в блок будем включать сведения только об одной транзакции.

Общая структура блока, таким образом, будет выглядеть вот так:

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

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

Общая схема нашего блокчейна

Общая схема нашего блокчейна

Функция подсчета хеш-суммы

Саму функцию объявим так:

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

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

Далее считаем хеш:

Поскольку выход функции тоже должен быть в виде строки, а рассчитанное значение хеша представлено в виде байтового массива, нам необходимо сделать соответствующее преобразование. Сделаем это следующим образом ( HASH_SIZE — длина хеш-суммы, 512 или 256 бит, выберем 256):

Функция по расчету хешей у нас готова, можно писать дальше.

Файл block.h

В этом файле опишем класс CBlock, в который войдет все, что нам нужно для создания блока (как очередного, так и genesis-блока). Однако прежде чем описывать сам класс, определим структуру, которая будет описывать транзакцию. Как мы уже решили, транзакция будет включать в себя три поля — отправитель, получатель и сумма транзакции:

Теперь можно приступить к описанию нашего класса CBlock. В него входит public-секция, включающая два конструктора (тот, который без параметров, служит для инициализации genesis-блока, а тот, который с параметрами, — для инициализации очередных блоков); метод, создающий genesis-блок; метод, с помощью которого будет майниться очередной блок; метод, записывающий значение хеша предыдущего блока в нужное место текущего блока; метод получения значения хеша блока из соответствующего поля и private-секция со всеми необходимыми полями (номер блока, имя блока, метка времени и так далее) и одним методом подсчета хеш-суммы:

Теперь можно написать реализацию всех указанных методов. Все это мы поместим в файл block.cpp .

Продолжение доступно только участникам

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

Что такое хэш и какова его роль

Блокчейн технологии

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

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

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

Подготовка к созданию своего блокчейн

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

Блокчейн своими руками

Если блок является контейнером для информации, то какие данные в нём хранятся? В каждом содержатся:

  • индекс хранилища;
  • временная метка;
  • сами данные;
  • хэш предыдущего контейнера.

Класс, описывающий блок

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

Блокчейн своими руками

Цепочка блоков и проверка целостности

Выше были описаны объекты самого первого (genesisblock) и последующих объектов, но для создания блокчейн этого недостаточно. Требуется функция, которая будет генерировать блоки. В качестве параметра она будет принимать созданный ранее предыдущий объект, модифицировать значение его индекса (для простоты – увеличивать значение на единицу), добавлять произвольные данные и хэш предыдущего блока. Результатом её выполнения будет новый объект класса Block с изменёнными параметрами на входе.

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

Генерация блокчейн

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

Первым делом в коде функции должна содержаться строка, отвечающая за создание первого (genesis) блока. Затем следует указать переменную, которая хранит общее число объектов. Данная переменная определяет число итераций цикла, в котором будут создаваться блоки. В теле цикла за каждую итерацию вызывается конструктор класса Block, создающий новый объект, который впоследствии добавляется в массив. Для наглядности, средствами языка можно выводить данные о появлении нового блока в блокчейн, созданного своими руками.

Функционирование реального блокчейн

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

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

Преимущества блокчейн состоят в следующем:

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

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

Блокчейн своими руками

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

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

Читайте также: