• Bitcoin $ 11,324.17 (4.9025%)
  • Ethereum $ 313.17 (2.03734%)
 22.06.2019 в 10:20   dev_coin

Запуск блокчейна Hyperledger Fabric на нескольких серверах

Hyperledger Fabric — это блокчейн-проект для бизнеса, поддерживаемый Linux Foundation.

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

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

Как это работает на одном хосте

Hyperledger Fabric использует архитектуру на основе docker и все компоненты вашей сети Hyperledger работают в отдельных контейнерах без видимости соседних. Чтобы заставить их взаимодействовать друг с другом, они создают сеть и каждый контейнер присоединяется к ней самостоятельно. Вы можете найти его в docker-compose-cli.yml в разделе «First Network» в репозитории Fabric -samples. Вы обнаружите, что при запуске файла docker-compse-cli.yml создается сеть 'byfn', а затем все контейнеры присоединяются к только что созданной сети.

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

Как это будет работать для нескольких хостах

Но когда мы работаем на нескольких хостах, контейнеры не могут взаимодействовать друг с другом. Короче говоря, нам нужно найти способ разделить эту сеть которой подключены все контейнеры) между несколькими хостами (ПК). Было предположение, что этого может реализовать с помощью Docker Swarm.:

overlay Сетевой драйвер создает распределенную сеть между несколькими узлами docker. Эта сеть расположена поверх (overlay) хост-специфические сети и позволяет подключенным к ней контейнерам (включая сервисные контейнеры Swarm) безопасно взаимодействовать. Docker прозрачно обрабатывает маршрутизацию каждого пакета к правильному хосту Docker и правильному контейнеру назначения.

и тогда я обратился на stackoverflow.com

Я начал объединять части, с некоторыми пробами и ошибками я смог осуществить их. Чтобы сделать то же самое, вам нужно

  1. Сначала инициализируйте режим Docker Swarm (скажем, на ПК 1)
  2. Cделайте так, чтобы все остальные хосты присоединились к swarm как manager (скажем, ПК 2, ПК3..)
  3. Создайте overlay сеть, чтобы ее можно было использовать на всех других хостах.  (Причина, по которой другие хосты видят сеть, в том, что они являются частью swarm)

Поскольку это распределенная система, вам потребуется более одного хоста нашем случае два компьютера) для проверки распределенного характера технологии. Допустим, у вас есть два ПК, то есть ПК1 и ПК2

Это руководство будет работать только на Linux … почему?

В настоящее время вы не можете использовать Docker для Mac или Docker для Windows для тестирования multi-node swarm.

Топология сети

Таким образом, сеть, которую мы собираемся построить, будет иметь следующие компоненты. Для этого примера мы используем два ПК, скажем ( ПК1 и ПК2 ):

  1. Центр сертификации (ЦС)  — ПК1
  2. Заказчик -  ПК1
  3. 1 PEER (peer0) вкл -  ПК1 (Узел)
  4. 1 PEER (peer1) вкл -  ПК2
  5. CLI вкл -  ПК2

Прежде чем начать

  • Инициализация swarm: (docker swarm документации для получения дополнительной информации)
$ docker swarm init
  • Присоединитесь к swarm с другого хоста в качестве администратора ( ПК1 создаст swarm, а ПК2 присоединится к нему)

PC1:

$ docker swarm manager-token manager

Это выведет что-то      вроде этого

docker swarm join — token SWMTKN-1–3as8cvf3yxk8e7zj98954jhjza3w75mngmxh543llgpo0c8k7z-61zyibtaqjjimkqj8p6t9lwgu 172.16.0.153:2377

Копируем его (тот, что на вашем терминале, а не тот, что указан выше) и запустим на терминале ПК2, чтобы он присоединился к ПК1.

Используйте команду вывода предыдущего значения на ПК2

  • Создать сеть ( «my-net» in my case)  — PC1
$ docker network create --attachable --driver overlay my-net
  • Клонируйте это на обоих ПК, т.е. на ПК1 и ПК2.
$ git clone https://github.com/wahabjawed/Build-Multi-Host-Network-Hyperledger.git
  • Создание Network Artifacts (Crypto Material) — ПК1
$ cd Build-Multi-Host-Network-Hyperledger /
$. /bmhn.sh

Это создаст для вас сетевые артефакты в папках «crypto-config» и «channel-artifacts». Вы должны скопировать эти папки на ПК2, чтобы оба проекта имели один и тот же крипто материал. Важно, чтобы оба ПК имели одинаковый крипто материал, иначе сеть не будет обмениваться данными.

Настройка сети

На ПК1:

Следующие скрипты будут работать на ПК1. Выполните каждую команду в отдельном терминале .

Также убедитесь, что вы находитесь в папке «Build-Multi-Host-Network-Hyperledger /» перед выполнением любого сценария. Скрипты используют файлы в папке  «Build-Multi-Host-Network-Hyperledger» и выдают ошибку, если не могут найти их.

1. CA Server:

Вы выполните эту команду на ПК1. прежде чем сделать это, замените {введите имя секретного ключа} на имя секретного ключа. Вы можете найти его в /crypto-config/peerOrganizations/org1.example.com/ca/ .

docker run --rm -it --network =  «my-net» --name ca.example.com -p 7054: 7054 -e FABRIC_CA_HOME = / etc / hyperledger / fabric-ca-server -e FABRIC_CA_SERVER_CA_NAME = ca.example. com -e FABRIC_CA_SERVER_CA_CERTFILE = / etc / hyperledger / fabric-ca-server-config / ca.org1.example.com-cert.pem -e FABRIC_CA_SERVER_CA_KEYFILE = / etc / hyperledger / fabric-ca-server-config / {поставить имя секретного ключа} -v $  (pwd) /crypto-config/peerOrganizations/org1.example.com/ca /: / etc / hyperledger / fabric-ca-server-config -e CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE = hyp-net hyperledger / fabric- ca sh -c 'фабрика-ca-сервер запускается -b admin: adminpw -d'

2. Orderer

Выполните эту команду, чтобы вызвать orderer на ПК1

docker run --rm -it --network=  «my-net» --name orderer.example.com -p 7050:7050 -e ORDERER_GENERAL_LOGLEVEL=debug -e ORDERER_GENERAL_LISTENADDRESS=0.0.0.0 -e ORDERER_GENERAL_LISTENPORT=7050 -e ORDERER_GENERAL_GENESISMETHOD=file -e ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block -e ORDERER_GENERAL_LOCALMSPID=OrdererMSP -e ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp -e ORDERER_GENERAL_TLS_ENABLED=false -e CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=my-net -v $  (pwd)/channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block -v $  (pwd)/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp -w /opt/gopath/src/github.com/hyperledger/fabric hyperledger/fabric-orderer orderer

3. CouchDB 0 — to Peer 0

Эта команда создаст экземпляр couchDB, который будет использоваться peer0 для хранения главной книги peer.

зdocker run --rm -it --network=  «my-net» --name couchdb0 -p 5984:5984 -e COUCHDB_USER= -e COUCHDB_PASSWORD= -e CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=my-net hyperledger/fabric-couchdb

4. Peer 0

Теперь мы выполняем эту команду, чтобы вызвать peer0

docker run --rm -it --link orderer.example.com:orderer.example.com --network=  «my-net» --name peer0.org1.example.com -p 8051:7051 -p 8053:7053 -e CORE_LEDGER_STATE_STATEDATABASE=CouchDB -e CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0:5984 -e CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME= -e CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD= -e CORE_PEER_ADDRESSAUTODETECT=true -e CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock -e CORE_LOGGING_LEVEL=DEBUG -e CORE_PEER_NETWORKID=peer0.org1.example.com -e CORE_NEXT=true -e CORE_PEER_ENDORSER_ENABLED=true -e < CORE_PEER_ID=peer0.org1.example.com -e CORE_PEER_PROFILE_ENABLED=true -e CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer.example.com:7050 -e CORE_PEER_GOSSIP_IGNORESECURITY=true -e CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=my-net -e CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051 -e CORE_PEER_TLS_ENABLED=false -e CORE_PEER_GOSSIP_USELEADERELECTION=false -e CORE_PEER_GOSSIP_ORGLEADER=true -e CORE_PEER_LOCALMSPID=Org1MSP -v /var/run/:/host/var/run/ -v $  (pwd)/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/fabric/msp -w /opt/gopath/src/github.com/hyperledger/fabric/peer hyperledger/fabric-peer peer node start

На ПК2:

Следующая команда ниже будет выполнена на ПК2.

Убедитесь, что вы находитесь в папке «Build-Multi-Host-Network-Hyperledger», прежде чем выполнять какой-либо сценарий. Скрипты используют файлы в папке  «Build-Multi-Host-Network-Hyperledger» и выдают ошибку, если не могут найти ее.

5. CouchDB 1 — для Peer 1

Эта команда создаст экземпляр couchDB, который будет использоваться peer1 для хранения одноранговой книги. Мы выполним это в отдельном терминале на ПК2

docker run --rm -it --network=  «my-net» --name couchdb1 -p 6984:5984 -e COUCHDB_USER= -e COUCHDB_PASSWORD= -e CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=my-net hyperledger/fabric-couchdb

6. Peer 1

Мы выполним это в отдельном терминале на ПК2, чтобы вызвать peer1.

docker run --rm -it --network=  «my-net» --link orderer.example.com:orderer.example.com --link peer0.org1.example.com:peer0.org1.example.com --name peer1.org1.example.com -p 9051:7051 -p 9053:7053 -e CORE_LEDGER_STATE_STATEDATABASE=CouchDB -e CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb1:5984 -e CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME= -e CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD= -e CORE_PEER_ADDRESSAUTODETECT=true -e CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock -e CORE_LOGGING_LEVEL=DEBUG -e CORE_PEER_NETWORKID=peer1.org1.example.com -e CORE_NEXT=true -e CORE_PEER_ENDORSER_ENABLED=true -e CORE_PEER_ID=peer1.org1.example.com -e CORE_PEER_PROFILE_ENABLED=true -e CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer.example.com:7050 -e CORE_PEER_GOSSIP_ORGLEADER=true -e CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:7051 -e CORE_PEER_GOSSIP_IGNORESECURITY=true -e CORE_PEER_LOCALMSPID=Org1MSP -e CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=my-net -e CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org1.example.com:7051 -e CORE_PEER_GOSSIP_USELEADERELECTION=false -e CORE_PEER_TLS_ENABLED=false -v /var/run/:/host/var/run/ -v $  (pwd)/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp:/etc/hyperledger/fabric/msp -w /opt/gopath/src/github.com/hyperledger/fabric/peer hyperledger/fabric-peer peer node start

7. CLI

Выполните приведенный ниже скрипт в другом терминале на ПК2, чтобы вызвать CLI.

docker run --rm -it --network =  «my-net» — имя cli --link orderer.example.com:orderer.example.com --link peer0.org1.example.com:peer0.org1.example. com --link peer1.org1.example.com:peer1.org1.example.com -p 12051: 7051 -p 12053: 7053 -e GOPATH = / opt / gopath -e CORE_PEER_LOCALMSPID = Org1MSP -e CORE_PEER_TLS_ENABLED = false -e CORE_VM_ENDPOINT = unix: ///host/var/run/docker.sock -e CORE_LOGGING_LEVEL = ОТЛАДКА -e CORE_PEER_ID = cli -e CORE_PEER_ADDRESS = peer0.org1.example.com: 7051 -e CORE_PEER_NETWORKID_ oe_PeP_PEG = cli-pepe /gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp -e CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE = my-net -v / var / run /: / host / var / run / -v $  (pwd) / chaincode /: / opt / gopath / src / github.com / hyperledger / fabric / examples / chaincode / go -v $  (pwd) /crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ -v $  (pwd) /scripts:/opt/gopath/src/github.com/hyperledger/ fabric / peer / scripts / -v $  (pwd) /channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts -w /opt/gopath/src/github.com/ hyperledger / fabric / peer hyperledger / fabric-tools / bin / bash -c './scripts/script.sh'

Если вы видите это, это означает, что скрипт был выполнен

Это установит контейнер CLI и выполнит скрипт:

'./Scripts/script.sh'

Скрипт будет:

  • Создать канал ; mychannel в нашем случае
  • Заставлять peer0 и peer1 присоединиться к каналу.
  • При успешном присоединении к каналу скрипт обновит одноранговый узел (peer0 в нашем случае).
  • Установит chaincode на обоих узлах

Теперь наша сеть работает, давайте проверим ее. Теперь мы будем вызывать и запрашивать chaincode на обоих узлах с ПК2.

Тестирование сети

Шаг 1. Bin / Bash CLI — PC2

Мы снова создадим контейнер cli на PC2, но на этот раз мы выполним его

docker run --rm -it --network=  «my-net» --name cli --link orderer.example.com:orderer.example.com --link peer0.org1.example.com:peer0.org1.example.com --link peer1.org1.example.com:peer1.org1.example.com -p 12051:7051 -p 12053:7053 -e GOPATH=/opt/gopath -e CORE_PEER_LOCALMSPID=Org1MSP -e CORE_PEER_TLS_ENABLED=false -e CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock -e CORE_LOGGING_LEVEL=DEBUG -e CORE_PEER_ID=cli -e CORE_PEER_ADDRESS=peer0.org1.example.com:7051 -e CORE_PEER_NETWORKID=cli -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp -e CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=my-net -v /var/run/:/host/var/run/ -v $  (pwd)/chaincode/:/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go -v $  (pwd)/crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ -v $  (pwd)/scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/ -v $  (pwd)/channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts -w /opt/gopath/src/github.com/hyperledger/fabric/peer hyperledger/fabric-tools /bin/bash

Вы должны увидеть это после выполнения команды.

root@a14d67c2dbb5:/opt/gopath/src/github.com/hyperledger/fabric/peer#

Теперь, когда вы вошли в контейнер CLI, мы выполним команды для создания экземпляра, вызова и запроса кода цепи в этом контейнере.

Шаг 2. Создание chaincode на Peer0

Чтобы создать chaincode на peer0, нам нужно сначала установить несколько переменных окружения. Вставьте нижнюю строку в Cli-терминал.

# Environment variables for PEER0

CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
CORE_PEER_LOCALMSPID=  «Org1MSP»
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
CORE_PEER_ADDRESS=peer0.org1.example.com:7051

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

$ peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n mycc -v 1.0 -c '{  «Args»:[  «init»,»a»,»100»,»b»,»200»]}' -P  «OR  ('Org1MSP.member','Org2MSP.member')»

Это создаст экземпляр chiancode и заполнит его a = 100 и b = 200.

На этом этапе, когда ваш регистр заполнен, вы можете просмотреть транзакции в  (откройте его в браузере на ПК1)

Peer0 (ПК 1): http: // localhost: 5984 / _utils / # / database / mychannel / _all_docs

Peer1 (ПК 2): http: // localhost: 6984 / _utils / # / database / mychannel / _all_docs

Выше приведены конечные точки веб-интерфейсов couchDB. Поскольку данные сохраняются в двоичном формате, вы не найдете точных значений (вместо этого вы найдете хеш-коды), но увидите записи, имеющие ключ, содержащий «myacc».

ИЛИ ЖЕ

Давайте сделаем запрос и посмотрим результаты. Мы будем запрашивать его на peer1

Шаг 3. Запрос Chaincode на Peer1

Чтобы запросить код цепочки на peer1, нам нужно сначала установить несколько переменных окружения. Вставьте следующую строку в Cli-терминал на ПК2

# Environment variables for PEER11
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
CORE_PEER_LOCALMSPID=  «Org1MSP»
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
CORE_PEER_ADDRESS=peer1.org1.example.com:7051

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

$ peer chaincode query -C mychannel -n mycc -c '{  «Args»:[  «query»,»a»]}'

это принесет

Query Result: 100

Шаг 4. Вызвать Chaincode на Peer0

Чтобы вызвать chaincode на peer0, нам нужно сначала установить несколько переменных окружения. Вставьте следующую строку в Cli-терминал для ПК2

# Environment variables for PEER0
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
CORE_PEER_LOCALMSPID=  «Org1MSP»
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
CORE_PEER_ADDRESS=peer0.org1.example.com:7051

Теперь давайте перейдем 10 от a к b. Эта транзакция обрежет новый блок и обновит couchDB. Синтаксис для вызова следующий: (выполнить в терминале Cli на ПК2)

$ peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n mycc -c '{  «Args»:[  «invoke»,»a»,»b»,»10»]}'

Шаг 5. Запрос chaincode

Давайте подтвердим, что наш предыдущий вызов выполнен правильно. Мы инициализировали ключ a значением 100 и просто удалили его 10 при предыдущем вызове. Поэтому запрос против a должен раскрыть 90. Синтаксис запроса следующий.  (мы запрашиваем peer0, поэтому нет необходимости изменять переменные окружения)

# be sure to set the -C and -n flags appropriately
peer chaincode query -C mychannel -n mycc -c '{  «Args»:[  «query»,»a»]}'

Мы должны увидеть следующее:

Query Result: 90

Не стесняйтесь начинать сначала и манипулировать значениями и последующими вызовами.

Комментарии: