Блокчейн все чаще используется в нашей повседневной жизни. На самом деле, помимо того, что они чрезвычайно безопасны, все введенные данные полностью прозрачны, и любой может ознакомиться с ними, будучи уверенным в их подлинности.
В этой статье мы строим доказательство концепции в настраиваемой сети разрешений (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:
- Клиент делает предложение о сделке. Это предложение подписывается сертификатом пользователя и отправляется заранее определенным поддерживающим партнерам по определенному каналу.
- Каждый Поддерживающий узел проверяет личность и авторизацию Пользователя в предложении. Если все проверки пройдены, поддерживающий узел имитирует транзакцию и подтверждает генерацию ответа с использованием своего сертификата.
- Клиент собирает и проверяет ответы Endorsing Peers.
- Клиент отправляет транзакцию, прикрепленную к утвержденным ответам на предложение, Заказчику.
- Заказчик заказывает генерацию нового блока полученных транзакций и подписывает сгенерированный блок своим сертификатом.
- Заказчик транслирует сгенерированный блок всем одноранговым узлам (как поддерживающим, так и фиксирующим одноранговым узлам) на соответствующих каналах.
- Каждый пир гарантирует, что каждая транзакция в полученном блоке была подписана соответствующими поддерживающими пирами (т. е. определяется из политики подтверждения вызванного чейнкода) и присутствует достаточное количество подтверждений. Каждый узел будет сравнивать набор данных каждой транзакции с мировым состоянием своей книги. Если проверка проходит успешно, транзакция помечается как действительная, и состояние мира каждого узла обновляется. В противном случае транзакция помечается как недействительная без обновления состояния мира. Наконец, полученный блок добавляется в локальную цепочку блоков каждого узла.
- Клиент получает любые подписанные события из службы 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, чтобы иметь возможность удалять только с высокими привилегиями (одним из решений может быть «удаление запроса», которое может быть выполнено только сетевыми администраторами).
- Сделать сеть постоянной