Hyperledger Iroha: как быстро настроить на iOS
Все, кто работает с blockchain-технологиями, наверняка сталкивались с проектами Hyperledger и в частности одной из библиотек Hyperledger Iroha. Эта библиотека — одна из первых, напрямую поддерживающих работу с мобильными девайсами без промежуточных «прослоек».
Работая над одним из проектов SoftServe, мы начали исследовать Hyperledger Iroha, но столкнулись с определенными вызовами при установке на iOS. Прежде всего, учитывая, что библиотека только недавно стала доступной и еще находилась на стадии доработки, нам не хватало детальной документации и инструкций по ее установке. Кроме того, мы выявили большое количество ошибок при сборке, а коммуникация напрямую с авторами платформы была достаточно сложной и затянутой. В результате команда потратила полтора дня на то, чтобы осуществить это самостоятельно.
Пройдя этот непростой путь, мы решили поделиться опытом, чтобы уменьшить боль и страдание других разработчиков при настройке библиотеки. Мы создали детальную пошаговую инструкцию, которая помогает скачать решение, установить, правильно настроить и запустить. И вам уже не нужно будет тратить день или два, все это вы сможете сделать за
Ниже представлена документация, в которой детально описано, как построить клиентскую библиотеку на 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 на локальной машине.
Шаги
Скрипт для установки и настройки клиента под 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).