Hyperledger Iroha: как быстро настроить на iOS

Все, кто работает с blockchain-технологиями, наверняка сталкивались с проектами Hyperledger и в частности одной из библиотек Hyperledger Iroha. Эта библиотека — одна из первых, напрямую поддерживающих работу с мобильными девайсами без промежуточных «прослоек».

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

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

Ниже представлена документация, в которой детально описано, как построить клиентскую библиотеку на iOS, как настроить тестовое приложение, а также как работать с Iroha blockchain с мобильных девайсов.

Инструкция по библиотеке Hyperledger Iroha

Перед тем как приступить к работе, убедитесь, что на вашем компьютере установлено нужное ПО:

Разработанная инструкция была протестирована на следующей конфигурации:

  • MacOS Sierra 10.12.6
  • Xcode 9.2
  • carthage 0.29.0
  • cmake 3.11.0
  • iPhone 7 iOS 11.2 Simulator

Ключевые функции Iroha:

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

Как нефункциональное требование стоит отметить высокий уровень отказоустойчивости сети (Byzantine Fault Tolerant). Библиотека Iroha iOS позволяет генерировать ключи и управлять подписью транзакций и запросов, которые отправляются в сеть.

Давайте перейдем к более детальной инструкции.

1. Запустите консоль и перейдите в папку, где будет выполняться вся настройка:

cd path/to/your/folder/for/example/iroha-ios/project/

2. Склонируйте репозиторий для клиента под iOS:

git clone https://github.com/soramitsu/iroha-ios.git

3. Перейдите в папку Iroha-ios:

cd iroha-ios/

4. Обновите зависимости:

carthage update --platform iOS

5. Перейдите в папку с примером:

cd SwiftyIrohaExample

6. Обновите зависимости для примера:

carthage update --platform iOS

7. Переместитесь в папку, где находится GRPC библиотека:

cd grpc-swift/

8. Удалите ее содержимое (Warning: убедитесь, что вы находитесь внутри grpc-swift/)

# removes all files from the current directory
rm -rf ./*
#removes all hidden files too (so clean build can be done)
rm -rf ./.*

9. Скачайте релизную версию GRCP с git в текущую папку:

git clone --branch 0.3.3 https://github.com/grpc/grpc-swift.git .

10. Скомпилируйте библиотеку:

make

11. Перейдите в корень папки, где выполняется вся настройка (из первого пункта — path/to/your/folder/for/example/iroha-ios/project/):

cd ../../..

Warning: прежде чем продолжить, убедитесь что вы находитесь в path/to/your/folder/for/example/iroha-ios/project/

12. Этим шагом загружается скрипт для клиентской библиотеки, который ее соберет. Загрузим ее с git:

curl https://raw.githubusercontent.com/hyperledger/iroha/master/shared_model/packages/ios/ios-build.sh > ios-build.sh

13. Дадим права на выполнение загруженному скрипту:

chmod +x ios-build.sh

14. В конце соберем библиотеку. Доступно две опции — платформа: OS | SIMULATOR | SIMULATOR64; тип сборки: Debug | Release:

./ios-build.sh SIMULATOR64 Debug

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

# this command shows location for simulator artefacts
# use this command for device instead:
# mkdir -p iroha-ios/libs/iOS/
mkdir -p iroha-ios/libs/Simulator/

16. Скопируем артефакты:

# this command shows location for simulator artefacts
# use this command for device instead:
# cp lib/* iroha-ios/libs/iOS/
cp lib/* iroha-ios/libs/Simulator/

17. Так же скопируем заголовочные файлы:

cp -a include/. iroha-ios/headers/

18. Теперь нужно сконфигурировать проект в Xcode для примера. Откроем SwiftyIroha.xcodeproj:

19. Выберем SwiftyIrohaExample.xcodeproj и вкладку general, добавим SwiftProtobuf из папки <code>iroha-ios/SwiftProtobuf.framework:

20. Перейдем в SwiftGRPC.xcodeproj и удалим zlib-example из секции target:

21. Выберем группу Proto и удалим ее (в следующих релизах этот шаг не будет нужен):

22. Поздравляем! Все шаги выполнены. Выберем SwiftyIrohaExample и симулятор для iPhone, соберем приложение, чтобы убедиться, что нет ошибок сборки:

23. Перед тем как запустить приложение и протестировать его, нужно запустить Iroha на локальной машине.

Шаги 1-17 не нужно выполнять вручную каждый раз — для этого есть скрипт.

Скрипт для установки и настройки клиента под iOS:

iroha_preparation_script.sh 
#!/bin/bash
 
#download ios client and update dependencies
git clone https://github.com/soramitsu/iroha-ios.git
cd iroha-ios/
carthage update --platform iOS
cd SwiftyIrohaExample
carthage update --platform iOS
 
#build grpc client for sample application
cd grpc-swift/
rm -rf ./*
rm -rf ./.*
git clone --branch 0.3.3 https://github.com/grpc/grpc-swift.git .
make
 
#back to the root where script was executed
cd ../../..
 
#download and build Iroha library for iOS
curl https://raw.githubusercontent.com/hyperledger/iroha/master/shared_model/packages/ios/ios-build.sh > ios-build.sh
 
#optional step - sometimes connection timeout appears when using git: scheme instead of https url
sed -i '' 's|git://github.com/hyperledger/iroha-ed25519|https://github.com/hyperledger/iroha-ed25519.git|g' ios-build.sh
 
#build library
chmod +x ios-build.sh
./ios-build.sh SIMULATOR64 Debug
 
#place artefacts to proper sample's locations
 
# this command shows location for simulator artefacts
# use this command for device instead:
# mkdir -p iroha-ios/libs/iOS/
mkdir -p iroha-ios/libs/Simulator/
 
# this command shows location for simulator artefacts
# use this command for device instead:
# cp lib/* iroha-ios/libs/iOS/
cp lib/* iroha-ios/libs/Simulator/
cp -a include/. iroha-ios/headers/

Запуск узла Iroha

В качестве хранилища Iroha использует PostgreSQL. Для начала создадим сеть в Docker, чтобы контейнеры для Postgres и Iroha могли быть запущены в одной виртуальной сети и могли передавать данные. В качестве имени используем iroha-network, но можно указывать любое имя. В консоли запустите следующую команду:

docker network create iroha-network

Запуск контейнера PostgreSQL

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

docker run --name some-postgres \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=mysecretpassword \
-p 5432:5432 \
--network=iroha-network \
-d postgres:9.5

Note: если уже запущен Postgres и использует порт по умолчанию(5432), должен быть выбран другой порт, например, 5433: -p 5433:5432 \

Создание хранилища блоков

Прежде чем запустить Iroha, нужно создать хранилище для блоков, чтобы информация не стерлась между различными запусками сети:

docker volume create blockstore

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

Note: для простоты изложения, создадим сеть только с одним узлом.

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

git clone -b develop https://github.com/hyperledger/iroha --depth=1

Запуск контейнера Iroha

Warning: Убедитесь, что вы находитесь в папке path/to/your/folder/for/example/iroha-ios/project/

Команда docker run использует относительный путь: iroha/example

Поэтому мы должны находиться в корне, где находится папка Iroha.

Теперь мы готовы запустить контейнер. Выполним следующую команду:

docker run -it --name iroha \
-p 50051:50051 \
-v $(pwd)/iroha/example:/opt/iroha_data \
-v blockstore:/tmp/block_store \
--network=iroha-network \
--entrypoint=/bin/bash \
hyperledger/iroha-docker:develop

Давайте рассмотрим ее в деталях:

  • docker run -it —name iroha \ связывает нас с контейнером под именем iroha.
  • $(pwd)/iroha/example:/opt/iroha_data \ добавляем папку, где находится файл конфигурации в папку контейнера /opt/iroha_data.
  • -v blockstore:/tmp/block_store \ добавляем хранилище данных в контейнер.
  • —network=iroha-network \ соединяем контейнер с созданной сетью под именем iroha-network, так чтобы Iroha и Postgres видели друг друга.
  • —entrypoint=/bin/bash \ Hyperledger/iroha-docker выполняет свой скрипт после запуска. На этом этапе нам нужно переопределить точку входа, чтобы запустить Iroha демон вручную.
  • hyperledger/iroha-docker:develop \ изображение из ветки develop.

Запуск Iroha демона

Сейчас мы находимся в интерактивной консоли контейнера Iroha. Для того, чтобы окончательно запустить узел мы должны запустить irohad.

irohad --config config.docker --genesis_block genesis.block --keypair_name node0

Вот так будет выглядеть результат успешного запуска узла:

Теперь время вернуться к примеру SwiftyIrohaSample и запустить его на симуляторе. Откройте проект в Xcode и запустите его. Тестовое приложение отправит транзакцию в сеть и проверит ее наличие запросом. Успешное выполнение команд отобразится в консоли Xcode примерно следующим образом:

А так будет выглядеть результат в консоли (где запущен узел):

Отлично! Мы отправили транзакцию в блокчейн и проверили ее наличие после.

Скрипт для настройки Iroha ноды:

 iroha_preparation_script.sh
IROHA_CONTAINER='iroha'
POSTGRESS_CONTAINER='some-postgres'
IROHA_NETWORK='iroha-network'
#fresh install
docker container kill $IROHA_CONTAINER
docker container kill $POSTGRESS_CONTAINER
docker container rm $IROHA_CONTAINER
docker container rm $POSTGRESS_CONTAINER
docker network rm $IROHA_NETWORK
docker network create $IROHA_NETWORK
 
docker run --name $POSTGRESS_CONTAINER \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=mysecretpassword \
-p 5432:5432 \
--network=$IROHA_NETWORK \
-d postgres:9.5
 
docker volume create blockstore
 
docker run -it --name $IROHA_CONTAINER \
-p 50051:50051 \
-v $(pwd)/iroha/example:/opt/iroha_data \
-v blockstore:/tmp/block_store \
--network=$IROHA_NETWORK \
--entrypoint=/bin/bash \
hyperledger/iroha-docker:develop

Note: обратите внимание, что демон должен быть запущен вручную командой

irohad --config config.docker --genesis_block genesis.block --keypair_name node0

Детальная видеоинструкция

Выводы

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

Главное преимущество перед другими решениями — мобильные клиенты работают напрямую с блокчейном без промежуточного звена. Благодаря этому преимуществу и в целом отличной адаптации под мобильные устройства у Iroha есть огромный потенциал стать частью решений MBaaS (mobile backend as a service).

LinkedIn

4 комментария

Подписаться на комментарииОтписаться от комментариев Комментарии могут оставлять только пользователи с подтвержденными аккаунтами.

Пожалуйста исправте очепятки в названии и по тексту — Iroha а не Ihora :)

спасибо за внимательность! поправили.

>больше 10 шагов
>быстро

по сравнению с тем, сколько это времени занимает, то даже 20 пунктов очень быстро получается

Подписаться на комментарии