Блокчейн: Какой Poc Нам Следует Построить?

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

Пришло время поработать руками! Для реализации пилотов и PoC (Proof of Concept) я предпочитаю использовать облака, потому что.

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

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

Для этого мы будем использовать облако IBM и универсальный блокчейн Hyperledger Fabric. Для начала давайте разберемся, почему Hyperledger Fabric называют универсальным блокчейном?

Блокчейн: какой PoC нам следует построить?



Hyperledger Fabric — универсальный блокчейн

Вообще говоря, универсальная информационная система – это: Набор серверов и программное ядро, выполняющее бизнес-логику; Интерфейсы взаимодействия с системой; Инструменты регистрации, аутентификации и авторизации устройств/людей; База данных, хранящая оперативные и архивные данные:

Блокчейн: какой PoC нам следует построить?

Официальную версию того, что такое Hyperledger Fabric, можно прочитать по адресу Веб-сайт Короче говоря, Hyperledger Fabric — это платформа с открытым исходным кодом, которая позволяет создавать частные блокчейны и выполнять произвольные смарт-контракты, написанные на языках программирования JS и Go. Давайте подробно рассмотрим архитектуру Hyperledger Fabric и убедимся, что это универсальная система, обладающая спецификой только хранения и записи данных.

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



Архитектура Hyperledger Fabric

На схеме показана архитектура Hyperledger Fabric:

Блокчейн: какой PoC нам следует построить?

Организации — организации содержат пиров, т.е.

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

Различные организации могут быть частью одного и того же канала.

Канал — указана логическая структура, объединяющая пиры в группы, т.е.

указан блокчейн.

Hyperledger Fabric может одновременно обрабатывать несколько блокчейнов с различной бизнес-логикой.

Поставщик членских услуг (MSP) — это CA (центр сертификации) для выдачи удостоверений и назначения ролей.

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

У пиров есть удостоверение (цифровой сертификат), выданное MSP. В отличие от сети Bitcoin или Etherium, где все узлы имеют равные права, в Hyperledger Fabric узлы играют разные роли: Возможно, сверстник одобряющий коллега (EP) и выполнять смарт-контракты.

Совершающий партнер (CP) — только сохранять данные в блокчейне и обновлять «Состояние мира».

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

В каждой организации должен быть один или несколько узловых узлов.

Используя AP, любой узел в организации может получить информацию обо всех узлах в других организациях.

Используется для синхронизации информации между точками доступа.

протокол сплетен .

Лидер — если у организации несколько пиров, то только лидер пира будет получать блоки от сервиса Ordering и передавать их остальным пирам.

Лидер может быть указан статически или выбран динамически коллегами в организации.

Протокол сплетен также используется для синхронизации информации о лидерах.

Ресурсы — сущности, которые имеют ценность и хранятся в блокчейне.

Точнее, это данные «ключ-значение» в формате JSON. Именно эти данные записываются в блокчейн.

У них есть история, которая хранится в блокчейне, и текущее состояние, которое хранится в базе данных «Мировое состояние».

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

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

Леджер — состоит из блокчейна и базы данных состояний Word, в которой хранится текущее состояние активов.

Мировое государство использует LevelDB или CouchDB. Смарт-контракт — с помощью смарт-контрактов реализуется бизнес-логика системы.

В Hyperledger Fabric смарт-контракты называются цепным кодом.

С помощью Chaincode указываются активы и транзакции над ними.

С технической точки зрения смарт-контракты — это программные модули, реализованные на языках программирования JS или Go. Политика одобрения — для каждого Chaincode можно установить политику, сколько подтверждений транзакции следует ожидать и от кого.

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

Примеры политик: Сделка должна быть одобрена любым администратором организации; Должно быть подтверждено любым членом или клиентом организации; Должно быть подтверждено любой равной организацией.

Заказ услуги — упаковывает транзакции в блоки и отправляет их пирам в канале.

Гарантирует доставку сообщений всем узлам сети.

Используется для промышленных систем Брокер сообщений Kafka , для разработки и тестирования Соло .



CallFlow



Блокчейн: какой PoC нам следует построить?

Приложение взаимодействует с Hyperledger Fabric с помощью Go, Node.js или Java SDK; Клиент создает транзакцию tx и отправляет ее подтверждающим узлам; Узел проверяет подпись клиента, завершает транзакцию и отправляет подтверждающую подпись обратно клиенту.

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

Этот алгоритм работы называется консенсусом PBFT (Practical Byzantine Fault Tolerant).

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

Сервис заказа обеспечивает последовательную запись блоков, что исключает так называемое форк реестра ( см.

раздел «Вилки» ); Пиры получают блок, еще раз проверяют политику подтверждения, записывают блок в блокчейн и меняют состояние в базе данных «Мировое состояние».

Те.

Это приводит к разделению ролей между узлами.

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

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

Заказ должен работать быстро.

Это обеспечивается тем, что Ordering лишь формирует блок и отправляет его фиксированному набору пиров-лидеров.

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

Более подробно об архитектурных решениях Hyperledger Fabric и о том, почему она работает именно так, а не иначе, можно прочитать здесь: Истоки архитектуры или здесь: Hyperledger Fabric: распределенная операционная система для разрешенных блокчейнов .

Итак, Hyperledger Fabric — это поистине универсальная система, с помощью которой вы сможете: Реализуйте произвольную бизнес-логику с помощью механизма смарт-контрактов; Записывать и получать данные из базы данных блокчейна в формате JSON; Предоставьте и подтвердите доступ к API с помощью центра сертификации.

Теперь, когда мы немного понимаем специфику Hyperledger Fabric, давайте наконец сделаем что-нибудь полезное!

Развертывание блокчейна



Постановка задачи

Задача — реализовать сеть Citcoin со следующими функциями: создать учетную запись, получить баланс, пополнить счет, перевести монеты с одного счета на другой.

Нарисуем объектную модель, которую в дальнейшем реализуем в смарт-контракте.

Итак, у нас будут счета, которые идентифицируются по именам и содержат баланс, и список счетов.

Учетные записи и список учетных записей представляют собой активы Hyperledger Fabric. Соответственно, у них есть история и современное состояние.

Попробую нарисовать это наглядно:

Блокчейн: какой PoC нам следует построить?

Верхние цифры — это текущее состояние, которое хранится в базе данных «Состояние мира».

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

Текущее состояние активов изменяется в результате транзакций.

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



IBM Облако

Создаем аккаунт в IBM-облако .

Чтобы использовать платформу блокчейна, ее необходимо обновить до Pay-As-You-Go. Этот процесс может оказаться не быстрым, потому что.

IBM запрашивает дополнительную информацию и проверяет ее вручную.

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

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

Итак, для наших целей мы создаём одну Организацию:

Блокчейн: какой PoC нам следует построить?

Создаем в нем ноды: Orderer CA, Org1 CA, Orderer Peer:

Блокчейн: какой PoC нам следует построить?

Мы создаем пользователей:

Блокчейн: какой PoC нам следует построить?

Создайте канал и назовите его citcoin:

Блокчейн: какой PoC нам следует построить?

По сути Channel — это блокчейн, поэтому он начинается с нулевого блока (блок Genesis):

Блокчейн: какой PoC нам следует построить?



Написание смарт-контракта

   

/* * Citcoin smart-contract v1.5 for Hyperledger Fabric * (c) Alexey Sushkov, 2019 */ 'use strict'; const { Contract } = require('fabric-contract-api'); const maxAccounts = 5; class CitcoinEvents extends Contract { async instantiate(ctx) { console.info('instantiate'); let emptyList = []; await ctx.stub.putState('accounts', Buffer.from(JSON.stringify(emptyList))); } // Get all accounts async GetAccounts(ctx) { // Get account list: let accounts = '{}' let accountsData = await ctx.stub.getState('accounts'); if (accountsData) { accounts = JSON.parse(accountsData.toString()); } else { throw new Error('accounts not found'); } return accountsData.toString() } // add a account object to the blockchain state identifited by their name async AddAccount(ctx, name, balance) { // this is account data: let account = { name: name, balance: Number(balance), type: 'account', }; // create account: await ctx.stub.putState(name, Buffer.from(JSON.stringify(account))); // Add account to list: let accountsData = await ctx.stub.getState('accounts'); if (accountsData) { let accounts = JSON.parse(accountsData.toString()); if (accounts.length < maxAccounts) { accounts.push(name); await ctx.stub.putState('accounts', Buffer.from(JSON.stringify(accounts))); } else { throw new Error('Max accounts number reached'); } } else { throw new Error('accounts not found'); } // return object return JSON.stringify(account); } // Sends money from Account to Account async SendFrom(ctx, fromAccount, toAccount, value) { // get Account from let fromData = await ctx.stub.getState(fromAccount); let from; if (fromData) { from = JSON.parse(fromData.toString()); if (from.type !== 'account') { throw new Error('wrong from type'); } } else { throw new Error('Accout from not found'); } // get Account to let toData = await ctx.stub.getState(toAccount); let to; if (toData) { to = JSON.parse(toData.toString()); if (to.type !== 'account') { throw new Error('wrong to type'); } } else { throw new Error('Accout to not found'); } // update the balances if ((from.balance - Number(value)) >= 0 ) { from.balance -= Number(value); to.balance += Number(value); } else { throw new Error('From Account: not enought balance'); } await ctx.stub.putState(from.name, Buffer.from(JSON.stringify(from))); await ctx.stub.putState(to.name, Buffer.from(JSON.stringify(to))); // define and set Event let Event = { type: "SendFrom", from: from.name, to: to.name, balanceFrom: from.balance, balanceTo: to.balance, value: value }; await ctx.stub.setEvent('SendFrom', Buffer.from(JSON.stringify(Event))); // return to object return JSON.stringify(from); } // get the state from key async GetState(ctx, key) { let data = await ctx.stub.getState(key); let jsonData = JSON.parse(data.toString()); return JSON.stringify(jsonData); } // GetBalance async GetBalance(ctx, accountName) { let data = await ctx.stub.getState(accountName); let jsonData = JSON.parse(data.toString()); return JSON.stringify(jsonData); } // Refill own balance async RefillBalance(ctx, toAccount, value) { // get Account to let toData = await ctx.stub.getState(toAccount); let to; if (toData) { to = JSON.parse(toData.toString()); if (to.type !== 'account') { throw new Error('wrong to type'); } } else { throw new Error('Accout to not found'); } // update the balance to.balance += Number(value); await ctx.stub.putState(to.name, Buffer.from(JSON.stringify(to))); // define and set Event let Event = { type: "RefillBalance", to: to.name, balanceTo: to.balance, value: value }; await ctx.stub.setEvent('RefillBalance', Buffer.from(JSON.stringify(Event))); // return to object return JSON.stringify(from); } } module.exports = CitcoinEvents;

Интуитивно здесь все должно быть понятно: Существует несколько функций (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance), которые демонстрационная программа будет вызывать с помощью API Hyperledger Fabric. Функции SendFrom и RefillBalance генерируют события, которые получит демонстрационная программа.

Функция создания экземпляра вызывается один раз при создании экземпляра смарт-контракта.

На самом деле он вызывается не один раз, а каждый раз, когда меняется версия смарт-контракта.

Поэтому инициализировать список пустым массивом — плохая идея, т.к.

теперь при смене версии смарт-контракта мы потеряем текущий список.

Но ничего страшного, я только учусь).

Учетные записи и список учетных записей представляют собой структуры данных JSON. JS используется для манипулирования данными.

Вы можете получить текущую стоимость актива, используя вызов функции getState, и обновить ее, используя putState. При создании Аккаунта вызывается функция AddAccount, в которой производится сравнение максимального количества аккаунтов в блокчейне (maxAccounts=5).

И тут есть косяк (заметили?), который приводит к бесконечному увеличению количества аккаунтов.

Таких ошибок следует избегать) Далее мы загружаем смарт-контракт в канал и создаем его экземпляр:

Блокчейн: какой PoC нам следует построить?

Давайте посмотрим на транзакцию по установке Смарт Контракта:

Блокчейн: какой PoC нам следует построить?

Давайте посмотрим подробнее о нашем канале:

Блокчейн: какой PoC нам следует построить?

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

Блокчейн: какой PoC нам следует построить?



Создание графического интерфейса для вызовов API Hyperledger Fabric

Hyperledger Fabric имеет API, который можно использовать для: Создать канал; Одноранговые подключения к каналу; Установка и создание экземпляров смарт-контрактов в канале; Вызов транзакций; Запросить информацию о блокчейне.



Разработка приложения

В нашей демонстрационной программе мы будем использовать API только для вызова транзакций и запроса информации, т.к.

остальные шаги мы уже выполнили с использованием блокчейн-платформы IBM. Мы пишем GUI, используя стандартный стек технологий: Express.js + Vue.js + Node.js. О том, как начать создавать современные веб-приложения, можно написать отдельную статью.

Здесь я оставлю ссылку на цикл лекций, который мне понравился больше всего: Полнофункциональное веб-приложение с использованием Vue.js и Express.js .

В результате получилось клиент-серверное приложение со знакомым графическим интерфейсом в стиле Material Design от Google. REST API между клиентом и сервером состоит из нескольких вызовов: HyperledgerDemo/v1/init — инициализировать блокчейн; HyperledgerDemo/v1/accounts/list — получить список всех аккаунтов; HyperledgerDemo/v1/accountЭname=Bob&balance=100 — создать учетную запись Боба; HyperledgerDemo/v1/infoЭaccount=Bob — получить информацию об аккаунте Боба; HyperledgerDemo/v1/transactionЭfrom=Bob&to=Alice&volume=2 — передать две монеты от Боба Алисе; HyperledgerDemo/v1/disconnect — закрыть соединение с блокчейном.

Описание API с примерами включено в Сайт почтальона — известная программа для тестирования HTTP API.

Демо-приложение в облаке Amazon

Я загрузил приложение на Amazon, потому что.

IBM до сих пор не смогла обновить мою учетную запись и позволить мне создавать виртуальные серверы.

Как добавить вишню в домен: www.citcoin.info .

Сервер подержу какое-то время, потом выключу, потому что.

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

Демо-приложение может: Инициализировать блокчейн; Создать Учетную запись (но теперь вы не можете создать новую Учетную запись, поскольку в блокчейне достигнуто максимальное количество учетных записей, указанное в смарт-контракте); Получить список Аккаунтов; Передавайте монеты циткойнов между Алисой, Бобом и Алексом; Получать события (но теперь нет возможности показывать события, поэтому для простоты в интерфейсе написано, что события не поддерживаются); Записывать действия.

Сначала мы инициализируем блокчейн:

Блокчейн: какой PoC нам следует построить?

Далее создаем свой аккаунт, не теряйте время с балансом:

Блокчейн: какой PoC нам следует построить?

Получаем список всех доступных аккаунтов:

Блокчейн: какой PoC нам следует построить?

Выбираем отправителя и получателя и получаем их балансы.

Если отправитель и получатель совпадают, то его счет будет пополнен:

Блокчейн: какой PoC нам следует построить?

В журнале следим за выполнением транзакций:

Блокчейн: какой PoC нам следует построить?

Собственно, на этом с демо-программой все.

Ниже вы можете увидеть нашу транзакцию в блокчейне:

Блокчейн: какой PoC нам следует построить?

И общий список транзакций:

Блокчейн: какой PoC нам следует построить?

На этом мы успешно завершили реализацию PoC для создания сети Citcoin. Что еще нужно сделать, чтобы Citcoin стал полноценной сетью для перевода монет? Очень мало:
На этапе создания аккаунта реализуйте генерацию закрытого/открытого ключа.

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

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

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



Заключение

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

Итак, чего нам стоило создание PoC? Вам необходимо изучить блокчейн в целом и Hyperledger Fabric в частности; Научитесь использовать облака IBM или Amazon; Изучите язык программирования JS и некоторые веб-фреймворки; Если какие-то данные нужно хранить не в блокчейне, а в отдельной базе данных, то научитесь интегрироваться, например, с PostgreSQL; И последнее, но не менее важное — без знания Linux в современном мире жить невозможно!) Конечно, это не ракетостроение, но потрудиться придется!

Исходники на GitHub

Источники помещены GitHub .

Краткое описание репозитория: Каталог " сервер " — сервер Node.js Каталог " клиент " — клиент Node.js Каталог " блокчейн (значения параметров и ключи, естественно, нерабочие и приведены только для примера): контракт — исходный код смарт-контракта кошелек — пользовательские ключи для использования API Hyperledger Fabric. *.

cds — скомпилированные версии смарт-контрактов.

Файлы *.

json — примеры файлов конфигурации для использования API Hyperledger Fabric. Все только начинается! Теги: #блокчейн #Децентрализованные сети #Криптовалюты #Анализ и проектирование систем #Распределенные системы #aws #Amazon Web Services #blockchain #блокчейн-технологии #ibm cloud #hyperledger Fabric #smartcontract #citcoin

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.