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

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

Сеть блокчейна Fabric:

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

./network.sh up createChannel -ca -s couchdb 

Диаграмма сети:

Главная книга:

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

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

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

Цепной код:

Чейнкод (также называемый «умным контрактом») инициализирует и управляет состоянием реестра посредством транзакций, отправленных приложениями. Chaincode работает в защищенном контейнере Docker, изолированном от поддерживающего однорангового процесса.

Заказчик:

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

Канал:

Канал — это частная «подсеть» связи между двумя или более конкретными членами сети с целью проведения частных и конфиденциальных транзакций.

Couchdb:

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

Центр сертификации:

Центр сертификации (CA) предоставляет ряд услуг сертификации пользователям блокчейна. В частности, эти услуги относятся к регистрации пользователей, транзакциям, инициируемым в блокчейне, и защищенным TLS соединениям между пользователями или компонентами блокчейна.

CA и Couchdb должны быть определены при запуске сети:

Путь транзакции:

Путь транзакции приложения отправителя/получателя:

Консенсус в Hyperledger Fabric:

  1. Клиент делает предложение о сделке. Это предложение подписывается сертификатом пользователя и отправляется заранее определенным поддерживающим партнерам по определенному каналу.
  2. Каждый Поддерживающий узел проверяет личность и авторизацию Пользователя в предложении. Если все проверки пройдены, поддерживающий узел имитирует транзакцию и подтверждает генерацию ответа с использованием своего сертификата.
  3. Клиент собирает и проверяет ответы Endorsing Peers.
  4. Клиент отправляет транзакцию, прикрепленную к утвержденным ответам на предложение, Заказчику.
  5. Заказчик заказывает генерацию нового блока полученных транзакций и подписывает сгенерированный блок своим сертификатом.
  6. Заказчик транслирует сгенерированный блок всем одноранговым узлам (как поддерживающим, так и фиксирующим одноранговым узлам) на соответствующих каналах.
  7. Каждый пир гарантирует, что каждая транзакция в полученном блоке была подписана соответствующими поддерживающими пирами (т. е. определяется из политики подтверждения вызванного чейнкода) и присутствует достаточное количество подтверждений. Каждый узел будет сравнивать набор данных каждой транзакции с мировым состоянием своей книги. Если проверка проходит успешно, транзакция помечается как действительная, и состояние мира каждого узла обновляется. В противном случае транзакция помечается как недействительная без обновления состояния мира. Наконец, полученный блок добавляется в локальную цепочку блоков каждого узла.
  8. Клиент получает любые подписанные события из службы EventHub.

Кодирование смарт-контракта

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

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

Вы можете найти код смарт-контракта ниже:



Смарт-контракт определяется 7 функциями транзакций и одной основной функцией. Смарт-контракт также определяет структуру актива, который будет использоваться при переходе, который представляет собой строку JSON ({ID, Car, Brand, ProductionData, ProductionLocation, Description}).

Во время развертывания смарт-контракта вызывается основная функция для создания нового чейнкода для каждого пира.

После создания чейнкода он будет включать в себя все функции 7 транзакций:

InitLedger – добавляет базовый набор данных в сеть.

CreateAsset -> create добавляет новые активы в сеть.

ReadAsset – возвращает информацию об определенном ресурсе, хранящемся в сети.

UpdateAsset – обновляет существующий актив в сети.

DeleteAsset -› удалить определенный актив из сети

Примечание.DeleteAsset на самом деле не удаляет объект. Блокчейн неизменен, и никакие данные в блокчейне никогда не будут удалены. Удаление — это просто еще одна транзакция, говорящая об удалении определенных данных, чтобы база данных состояния мира могла удалить эти данные.

AssetExist – возвращает логическое значение в зависимости от существующего идентификатора.

GetAllAssets – возвращает все активы в сети.

Четыре функции отправляют транзакцию в сеть: InitLedger, Create Asset, UpdateAsset, DeleteAsset.

Три функции оценивают транзакцию в сети: ReadAsset, AssetExist, GetAllAsset.

JavaScript-приложение:

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

Вы можете найти код смарт-контракта ниже:



Для взаимодействия с сетью в репозитории есть несколько приложений, разделенных на 3 разные папки:

Папка Console_test_APP содержит приложение (APP.js), в котором вы можете динамически выбирать между всеми 7 функциями/транзакциями смарт-контракта.

Папка Sender_Reiceiver_APP содержит четыре приложения, два из которых предназначены для создания пользователей (получатель, отправитель) и два приложения, которые могут использоваться отдельными пользователями. Пользователь «Получатель» может оценивать только в сети (readAsset, queryAllAsset, existsAsset). Пользователь «Создать» может только отправить в сеть (createAsset, updateAsset, deleteAsset).

Папка Single_function_APP содержит приложение, которое вызывает только одну конкретную функцию смарт-контракта. Это означает, что каждый файл .js выполняет только один тип транзакции.

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

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

Приложение можно запрограммировать на ограничение доступа пользователей к нему. В случае sender.js только пользователь-отправитель может подключаться к сети и выполнять транзакции приложений:

Пользователю-отправителю будет разрешено только отправлять транзакцию в сеть (Create Asset, UpdateAsset, DeleteAsset):

Пользователю-получателю будет разрешено отправлять в сеть оценочную транзакцию (ReadAsset, AssetExist, GetAllAsset):

Демонстрация сети:

Запуск сценария startFabric.sh запустит сеть и создаст реестр с каналом, ЦС (центром сертификации) и Couchdb. Затем он реализует смарт-контракт и инициализирует реестр:

./network.sh up createChannel -ca -s couchdb
./network.sh deployCC -ccn carcert -ccv 1 -cci initLedger -ccl ${CC_SRC_LANGUAGE} -ccp ${CC_SRC_PATH}

Создание и развертывание каждого контейнера:

Организация 1 и 2 приняли реализацию нашего смарт-контракта:

Демонстрация приложения:

Создайте пользователя-администратора:

Пользователь admin необходим для создания всех остальных пользователей в сети.

Приложение_отправителя_получателя:

Создайте пользователя «Получатель»:

Создайте пользователя «Отправитель»:

Тестирование приложения sender.js:

Тестирование приложения receiver.js:

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

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

Примечание. Приложение в папках Console_test_APP и Single_function_APP имеет тот же код, что и приложение в Sender_Reiceiver_APP

Идти дальше ? Возможные будущие улучшения:

  • Удалите жестко закодированные аргументы в транзакции, чтобы разрешить динамический ввод.
  • Создайте простой пользовательский интерфейс (приложение с графическим интерфейсом нашего веб-приложения)
  • Измените функцию DeleteAsset, чтобы иметь возможность удалять только с высокими привилегиями (одним из решений может быть «удаление запроса», которое может быть выполнено только сетевыми администраторами).
  • Сделать сеть постоянной

Приложение: