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

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

Условия торгового финансирования и логистики

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

Аккредитив: аккредитив (аккредитив) — это, по сути, способ банка сказать: «Мы обещаем заплатить этому человеку за отгруженные товары, если они могут предоставить нам доказательства того, что они действительно их отгрузили». Это довольно важный документ, и банк импортера выдает его по запросу своего клиента — импортера.

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

Экспортная лицензия: Экспортная лицензия — это разрешение, выданное регулирующим органом на отгрузку определенных товаров. В этом блоге для краткости мы будем называть его E/L. Пример E/L показан на снимке экрана ниже:

Коносамент: Коносамент (B/L) — это документ, который доказывает, что перевозчик завладел грузом. Он также действует как контракт между перевозчиком и экспортером и доказывает, что экспортер владеет товаром.

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

Коносамент также указан в аккредитиве и служит доказательством отгрузки, которое автоматически инициирует оформление платежа.

Процесс рабочего процесса

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

  1. Импортер запрашивает товары у экспортера в обмен на деньги
  2. Экспортер принимает торговую сделку
  3. Импортер запрашивает у своего банка аккредитив в пользу экспортера
  4. Банк импортера выставляет аккредитив в пользу экспортера и подлежит оплате банку последнего.
  5. Банк экспортера принимает аккредитив от имени экспортера
  6. Экспортер подает заявку на E/L от регулирующего органа
  7. Регулирующий орган предоставляет E/L экспортеру
  8. Экспортер готовит посылку и передает ее перевозчику
  9. Перевозчик принимает товары после проверки E/L, а затем предоставляет B/L экспортеру.
  10. Банк экспортера требует половину платежа от банка импортера
  11. Банк импортера переводит половину суммы в банк экспортера
  12. Перевозчик отправляет товар в пункт назначения
  13. Банк импортера выплачивает оставшуюся сумму банку экспортера.

Общие активы и данные

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

Роли и возможности участников

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

  • Только импортер может подать заявку на получение аккредитива
  • Только банк импортера может предоставить аккредитив
  • Только банк экспортера может принять аккредитив.
  • Только экспортер может запросить E/L
  • Только регулирующий орган может предоставлять E/L
  • Только экспортер может подготовить груз
  • Только перевозчик может предоставить коносамент
  • Только перевозчик может обновить место отправления
  • Только банк импортера может отправлять деньги, и только банк экспортера может получать деньги

Настройка среды

Установка необходимых компонентов

Теперь у нас есть проект сети, давайте установим необходимые инструменты:

  1. Убедитесь, что у вас установлена ​​последняя версия Docker, используя https://docs.docker.com/install/ и Docker-Compose, используя: https://docs.docker.com/compose/install/.
  2. Установите программное обеспечение, необходимое для примера бизнес-сети: https://hyperledger.github.io/composer/latest/installing/ install-prereqs.
  3. Fabric реализован на языке программирования Go. Обратите внимание, что синтаксис Go похож на C++. Мы также будем использовать Go для написания нашего чейнкода. Установить Go можно по ссылке https://golang.org/.
  4. Настройте переменные окружения. GOPATH указывает на рабочую область для go исходного кода, например:
$ export GOPATH=$HOME/go

PATH необходимо включить каталог Go bin для хранения библиотек и исполняемых файлов. Это можно увидеть в следующем фрагменте:

$ export PATH=$PATH:$GOPATH/bin

6. Проверьте, нужно ли вам make установить его в вашей системе. В системе Debian/Ubuntu вы можете установить его с помощью sudo apt-get install make.

Разветвление и клонирование репозитория Trade-Finance-Logistics

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

$ cd $GOPATH/src
$ git clone https://github.com/YOUR-USERNAME/trade-finance-logistics

Теперь у нас есть локальная копия всех учебных материалов по торговле, финансам и логистике.

Подготовка сети

Для сборки Fabric и Fabric-CA может потребоваться сначала установить некоторые зависимости, например библиотеки gcc, libtool и ltdl. (В системах Ubuntu вы можете установить все необходимые компоненты, запустив sudo apt install libltdl-dev, а на Mac — запустив brew install libtool). Нам необходимо выполнить следующие шаги перед созданием сетевого криптографического материала:

  1. Клонируйте репозиторий исходного кода Fabric (https://github.com/hyperledger/fabric/tree/release-1.1), добавив параметр -b release-1.1. Убедитесь, что клонированная папка структуры либо присутствует, либо символически связана в $GOPATH/src/github.com/hyperledger/. Это нужно для того, чтобы при попытке собрать Fabric он искал нужные библиотеки по этому пути.
  2. Запустите make dockerbuild образы Docker для одноранговых узлов и заказчиков.
  3. Запустите make configtxgen cryptogen, чтобы сгенерировать необходимые инструменты для запуска команд создания сети, описанных в этом разделе.
  4. Клонируйте Fabric-CA с https://github.com/hyperledger/fabric-ca/tree/release-1.1. Убедитесь, что клонированная папка fabric-ca либо присутствует, либо символически связана в $GOPATH/src/github.com/hyperledger/. Это нужно для того, чтобы при попытке собрать Fabric-CA он искал нужные библиотеки по этому пути.
  5. Запустите make docker, чтобы создать образы Docker для поставщиков управляемых услуг (MSP).

Создание сетевого криптографического материала

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

Этот параметр должен быть идентифицирован в crypto-config.yaml в сетевой папке нашей кодовой базы. Например, взгляните на определение организации импортера в файле как таковое:

PeerOrgs:
- Name: ImporterOrg
  Domain: importerorg.trade.com
  EnableNodeOUs: true
  Template:
    Count: 1
  Users:
    Count: 2

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

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

cryptogen generate --config=./crypto-config.yaml

Результат сохраняется в папке crypto-config.

Создание артефактов канала

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

  • Генезисный блок содержит специфичные для организации сертификаты, которые инициализируют блокчейн Fabric.
  • Информация о конфигурации канала
  • Конфигурации одноранговых узлов для каждой организации обеспечивают надлежащее обслуживание блокчейна.

Файл crypto-config.yaml содержит свойства канала, а файл configtx.yaml, расположенный в сетевой папке, определяет высокоуровневую структуру нашей торговой сети, как показано в разделе Profiles:

Как мы видим, канал, который мы собираемся создать, называется FourOrgsTradeChannel,, который определен в профиле. 4 организации, участвующие в этом канале, помечены ExporterOrg, ImporterOrg, CarrierOrg и RegulatorOrg, каждая из которых относится к подразделу, определенному в Organisationsразделе. Заказчик принадлежит собственной организации под названием TradeOrdererOrg.

Каждая организация, указанная ниже, содержит информацию о своем MSP (идентификатор, а также расположение криптографических материалов, таких как ключи и сертификаты), а также информацию об имени хоста и порте для своих одноранговых узлов. Например, раздел ExporterOrg содержит следующее:

- &ExporterOrg
  Name: ExporterOrgMSP
  ID: ExporterOrgMSP
  MSPDir: crypto-config/peerOrganizations/exporterorg.trade.com/msp
  AnchorPeers:
    - Host: peer0.exporterorg.trade.com 
    Port: 7051

Как видите, MSPDirvariable (представляющая папку) в этой спецификации ссылается на криптографический материал, который мы создали ранее с помощью инструмента cryptogentool.

Инструмент configtxgen используется для создания артефактов канала. Чтобы сгенерировать блок генезиса, выполните следующую команду из папки network:

configtxgen -profile FourOrgsTradeOrdererGenesis -outputBlock ./channel-artifacts/genesis.block

Ключевое слово FourOrgsTradeOrdererGenesis соответствует имени профиля в разделе Profiles. Блок генезиса будет сохранен в файле genesis.block в папке channel-artifacts. Чтобы сгенерировать конфигурацию канала, запустите следующий код:

configtxgen -profile FourOrgsTradeChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID tradechannel

Канал, который мы создадим, называется tradechannel, а его конфигурация хранится в channel-artifacts/channel.tx. Чтобы сгенерировать конфигурацию равноправного узла привязки для организации-экспортера, выполните:

configtxgen -profile FourOrgsTradeChannel -outputAnchorPeersUpdate ./channel-artifacts/ExporterOrgMSPanchors.tx -channelID tra

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

Вам нужно установить переменную среды FABRIC_CFG_PATH в папку, в которой находится файл configtx.yaml, чтобы инструмент configtxgen работал. В файле сценария trade.sh есть строка, которая обеспечивает загрузку файла YAML из папки, в которой выполняется команда: export FABRIC_CFG_PATH=${PWD}

Создание конфигурации за одну операцию

Сценарий trade.sh настроен на создание артефактов канала и криптографических материалов с помощью команд и файлов конфигурации, описанных ранее. Для этого просто запустите следующую команду из папки network:

./trade.sh generate -c tradechannel

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

ПеременнойGOPATHприсвоено значение/opt/gopathв контейнере, который запускает одноранговый узел.

Составьте пример торговой сети

Предыдущая команда также создает файл конфигурации сети docker-compose-e2e.yaml, который можно использовать для запуска сети в виде набора контейнеров Docker с помощью инструмента docker-compose. Этот файл основан на статически сконфигурированных файлах base/peer-base.yaml и base/docker-compose-base.yaml.

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

  • Четыре экземпляра Fabric однорангового узла, по одному в каждой организации
  • Заказан один экземпляр Fabric
  • Пять экземпляров Fabric CA, соответствующих MSP каждой организации.

Образы Docker для каждого компонента можно найти в проекте Hyperledger на Docker Hub (https://hub.docker.com/u/hyperledger/). Образы hyperledger/fabric-peer, hyperledger/fabric-orderer, hyperledger/fabric-ca для одноранговых узлов, заказчиков и центров сертификации (ЦС) соответственно.

Базовая конфигурация пира может быть следующей (см. base/peer-base.yaml):

Здесь вы можете настроить параметры структуры, но если вы используете предварительно созданный образ Docker для fabric-peer, значений по умолчанию обычно достаточно для запуска одноранговой службы. Команда для запуска одноранговой службы обычно указывается в последней строке конфигурации как peer node start. Кроме того, убедитесь, что вы настроили уровень ведения журнала, используя переменную CORE_LOGGING_LEVEL.

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

Переменная _71 имеет значение «последнее» в файле .env в папке network, но вы можете установить определенный тег, если хотите извлекать более старые изображения.

Очень важно, чтобы мы настроили имена хостов и порты для каждого узла и синхронизировали сгенерированный криптографический материал (используя cryptogen) с файловой системой контейнера. Пир в организации-экспортере настраивается в base/docker-compose-base.yaml следующим образом:

Как указано в параметре extends, эта конфигурация наследуется от базовой конфигурации. Обратите внимание, что идентификатор (CORE_PEER_ID) соответствует идентификатору пира, указанному в configtx.yaml. Это удостоверение будет использоваться в качестве имени хоста для однорангового узла, работающего в организации экспортера, и будет упоминаться в коде промежуточного программного обеспечения далее в этой статье.

Раздел Volumes устанавливает протокол для копирования криптографического материала, созданного в папке crypto-config, в контейнер. Сама одноранговая служба прослушивает порт 7051, а порт, который клиенты могут использовать для подписки на события, обозначается как 7053.

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

Конфигурация службы заказа аналогична следующему фрагменту из base/docker-compose-base.yamlindicates:

orderer.trade.com:
  container_name: orderer.trade.com
  image: hyperledger/fabric-orderer:$IMAGE_TAG 
  environment:
    - ORDERER_GENERAL_LOGLEVEL=INFO 
  ……
  command: orderer 
  ……

Как видно из кода, команда для запуска ордера — это просто orderer. Уровень ведения журнала можно настроить с помощью переменной ORDERER_GENERAL_LOGLEVEL, и в нашей конфигурации установлено значение INFO.

Конфигурация сети, которую мы будем использовать, основана на файле с именем docker-compose-e2e.yaml. Этот файл не находится в репозитории, а создается командой ./trade.sh generate -c tradechannel, которую мы запускали ранее для создания канала и криптографического материала. Этот файл использует base/docker-compose-base.yaml (и косвенно base/peer-base.yaml), как вы можете видеть, изучив содержимое файла.

Он создается из файла шаблона YAML с именем docker-compose-e2e-template.yaml, который можно найти в сетевой папке. Файл шаблона содержит переменные, которые заменяются фактическими именами файлов в папке crypto-config при создании docker-compose-e2e.yaml.

Например, рассмотрим раздел exporter-ca в docker-compose-e2e-template.yaml:

exporter-ca:
 image: hyperledger/fabric-ca:$IMAGE_TAG 
 environment:
   ……
   - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/EXPORTER_CA_PRIVATE_KEY 
 ……
 command: sh -c ‘fabric-ca-server start — ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.exporterorg.trade.com-cert.pem

Теперь посмотрим на тот же раздел в сгенерированном файле docker-compose-e2e.yaml:

exporter-ca:
 image: hyperledger/fabric-ca:$IMAGE_TAG 
 environment:
   ……
   - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/ cc58284b6af2c33812cfaef9e40b8c911dbbefb83ca2e7564 
 ……
 command: sh -c ‘fabric-ca-server start — ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.exporterorg.trade.com-cert.pem

Как видите, переменная EXPORTER_CA_PRIVATE_KEY была заменена на cc58284b6af2c33812cfaef9e40b8c911dbbefb83ca2e7564e8fbf5e7039c22e_sk как в env, так и в команде. Если вы сейчас изучите содержимое папки crypto-config, то заметите, что в папке crypto- config/peerOrganizations/exporterorg.trade.com/ca/ есть файл с именем cc58284b6af2c33812cfaef9e40b8c911dbbefb83ca2e7564e8fbf5e7039c22e_sk. Этот файл содержит закрытый (секретный) ключ подписи MSP организации-экспортера.

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

Теперь более подробно рассмотрим конфигурацию MSP на примере MSP организации-экспортера, как указано в docker-compose-e2e.yaml:

Служба, которая будет работать в MSP, — это fabric-ca-server, прослушивающая порт 7054, загружаемая с сертификатами и ключами, созданными с помощью cryptogen, и с использованием логина и пароля по умолчанию (admin и adminpw соответственно), настроенных в образе Fabric-CA. Команда для запуска экземпляра сервера Fabric CAfabric-ca-server start, как видно из предыдущего кода.

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

Также, как можно заметить, изучив docker-compose-e2e.yaml, мы не создаем Fabric CA сервер (и контейнер) для организации заказчика. Для упражнения, которое мы будем выполнять в этой книге, достаточно статически созданных пользователей-администраторов и учетных данных для заказчика; мы не будем динамически регистрировать новых пользователей организации-заказчика, поэтому сервер Fabric CA не нужен.

Файлы конфигурации сетевых компонентов

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

Для однорангового узла файл core.yaml содержит все важные параметры времени выполнения, включая, помимо прочего, адреса, номера портов, безопасность и конфиденциальность, а также протокол сплетен. Вы можете создать свой собственный файл и синхронизировать его с контейнером, используя собственный файл Dockerfile вместо того, который используется hyperledger/fabric-peerimage по умолчанию. Если вы войдете в запущенный одноранговый контейнер (давайте возьмем одноранговый контейнер организации-экспортера из сети, которую мы только что запустили):

docker exec -it f86e50e6fc76 bash

Затем вы найдете файл core.yaml в папке/etc/hyperledger/fabric/.

Точно так же конфигурация заказчика по умолчанию находится в orderer.yaml, которая также синхронизируется с /etc/hyperledger/fabric/ в контейнере, на котором запущен образ hyperledger/fabric-orderer. Имейте в виду, что файлы core.yaml и orderer.yaml синхронизируются с контейнерами однорангового узла и ордера, поэтому, если вы хотите создать собственные файлы, вам потребуется синхронизировать эти файлы YAML с обоими контейнерами.

Сервер Fabric CA также имеет файл конфигурации с именем fabric-ca-server-config.yaml, который синхронизируется с /etc/hyperledger/fabric-ca-server/ в контейнере, на котором запущен образ hyperledger/fabric-ca. Вы можете создавать и синхронизировать пользовательские конфигурации так же, как для однорангового узла или заказчика.

Запуск торговой сети-образца

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

docker-compose -f docker-compose-e2e.yaml up

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

В некоторых конфигурациях ОС настройка Fabric может быть сложной. Если у вас возникнут проблемы, обратитесь к документации. Подробное описание установки сети Fabric и примеры приведены по адресу https://hyperledger-fabric.readthedocs.io/en/release-1.1/samples.html.

Сеть можно запустить и в фоновом режиме с помощью нашего скрипта trade.sh. Просто запустите следующее:

./trade.sh up

Если вы запустите docker ps -a из другого окна терминала, вы увидите следующее:

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

Чтобы просмотреть журналы работы данного контейнера, запишите идентификатор контейнера (первый столбец в предыдущем списке) и просто запустите:

docker logs <container-ID>

Чтобы отключить сеть, вы можете использовать либо команду docker-compose:docker-compose -f docker-compose-e2e.yaml down, либо наш скрипт trade.sh:./trade.sh down.

Сводка

В этой статье мы представили бизнес-вариант использования. Мы также развернули нашу первую сеть Hyperledger Fabric и теперь перешли от теории к практике. Отличная работа!