Blockchain
Hyperledger
iroha

オープンソースのブロックチェーン Hyperledger iroha をDockerで試してみた

More than 1 year has passed since last update.

ブロックチェーンのオープンソースプロジェクト "Hyperledger" で提供されているブロックチェーン基盤 "iroha" をDocker上で試してみました。
ブロックチェーンの勉強をこれから始めようと思っている人などの参考になれば幸いです。

"Hyperledgerプロジェクト" とは

https://www.hyperledger.org/

"Hyperledgerプロジェクト" とは、Linux Foundationが中心となって運営しているブロックチェーン技術/P2Pレッジャー技術の確立を目指したオープンソースプロジェクトです。世界30以上のIT企業がこのプロジェクトに参画しており、有名どころではIBMや富士通、インテル、アクセンチュアなどが名を連ねています。

"Hyperledger iroha" とは

"Hyperledger iroha(以下、iroha)"とは、このHyperledgerプロジェクトで開発されているブロックチェーン基盤の一つで、IBMが主導するFabric、Intelが主導するSawtooth Lakeに並ぶ主要なブロックチェーン基盤として扱われています。

"iroha" の特徴

シンプルな設計(Simple Constraction)

irohaは全てのモジュールが一体となって構成されているのではなく、以下のモジュールに分かれて開発が行われております。

  • Sumeragi consensus library
  • Ed25519 digital signature library
  • SHA-3 hashing library
  • Iroha transaction serialization library
  • P2P broadcast library
  • API server library
  • iOS library
  • Android library
  • JavaScript library
  • Blockchain explorer/data visualization suite

これは今後HyperLedgerプロジェクトで開発されるブロックチェーン基盤が、必須コンポーネント+周辺モジュールで構成されることを見越してことのようです。

C++によるドメイン駆動設計(modern, domain-driven C++ design)

irohaは現行のURLに似た設計でオブジェクトを管理しています。
各オブジェクト(Asset)はドメイン(Domain)以下に属し、ドメインの管理者だけがオブジェクトを自由に操作できます。

+--------------+  has  +---------+
|    Domain    |<------| Account |
+--------------+       +---------+
    |       | belong
    v       v
+------+ +------+
|Asset1| |Asset2|
+------+ +------+
    |       |
====================    
    |       |       +-----------------+
    |       └─------| smart contract2 |
    |               +-----------------+
+-----------------+
| smart contract1 |
+-----------------+

引用元: https://github.com/hyperledger/iroha/issues/99

モバイルアプリケーション開発に対応(emphasis on mobile application development)

irohaはブロックチェーン基盤となるサーバソフトウェアだけではなく、クライアント側となるモバイルアプリケーション開発SDKもセットで提案されています。現段階ではiOS・Android・JavaScriptの3つの環境についてSDKが提供されています。

新しい合意形成アルゴリズム "皇(すめらぎ)" (new, chain-based Byzantine fault tolerant consensus algorithm, called Sumeragi)

irohaでは、皇(すめらぎ)と呼んでいる新しい合意形成アルゴリズムをプロジェクト内で提案しています。

sumeragi
引用元: https://github.com/hyperledger/iroha/blob/master/docs/iroha_whitepaper.md

国産ブロックチェーンであること

上記4つはHyperledgerプロジェクトの紹介文からの引用でしたが、もう一つのメリットとしてこちらを挙げたいと思います。

irohaはソラミツ株式会社、NTTデータ、日立、Coluの四社の共同提案としてHyperledgerに提出されています。
中でもソラミツ株式会社が中心的な役割を担っており、国産ブロックチェーンと言っても差し支えない立ち位置にirohaは立っています。
日本の企業が中心となっていることもあってか、先ほど添付したissueを始めとする各種やりとりが日本語で行われており、OSSにありがちな "英語によるとっつきづらさ" は多少低いものと思われます(もちろん世界に公開されているものなので、英語が全く必要ないというわけではありません)。

OSSを利用するにも、OSSに貢献するにも言語の壁が和らいでいることは、私たち日本人にとってチャンスではないでしょうか。

irohaをDocker上で動かす

今回はDocker上でirohaを動かすため、iroha-dockerを使います。

環境構築

今回、動作環境にはAmazon EC2(Ubuntu 64bit)を使いました。
Dockerイメージ展開の際にかなりのメモリを消費するので、EC2のスペックを選択する際には注意してください(t2.mediumだと問題なく出来ました)

EC2の構築が完了したら、以下の作業を行います。
* 必要なパッケージ(build-essential、automake、autoconf)をインストールする
* Dockerをインストールする
* hyperledger/iroha-docker を任意のディレクトリにクローンする

ベース環境(iroha-dev)の展開

最初にirohaのコンテナを動かすためのベースとなる環境の展開を行います。
ベース環境の展開にはiroha-docker/iroha-devに移動し、以下のコマンドを入力します。

docker build -t hyperledger/iroha-dev .

コマンド入力後にdocker images と入力すると以下のようにUbuntuとiroha-devの二つが作成されていることが分かります。これはirohaのビルド環境がUbuntuをベースとしているからのようです。

#:/home/ubuntu/workspace/iroha-docker/iroha-dev# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
hyperledger/iroha-dev   latest              ac90f4b90760        15 seconds ago      1.178 GB
ubuntu                  latest              f49eec89601e        7 days ago          129.5 MB

irohaイメージ(iroha)の展開

iroha-devの展開が完了したら、irohaが格納されているイメージの展開を行います。
イメージの展開にはiroha-docker/irohaに移動し、以下のコマンドを入力します。

docker build -t hyperledger/iroha .

コマンド入力後にdocker images と入力すると上記の二つに加えてirohaが追加されていることが分かります。

#:/home/ubuntu/workspace/iroha-docker/iroha# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
hyperledger/iroha       latest              91583a023019        37 seconds ago      3.252 GB
hyperledger/iroha-dev   latest              ac90f4b90760        51 minutes ago      1.178 GB
ubuntu                  latest              f49eec89601e        7 days ago          129.5 MB

余談ですが、今回の手順の中でここが一番時間がかかりました。環境にもよりますが20分ぐらい要するかもしれません。

irohaコンテナの起動

irohaイメージの展開が終了したらiroha-docker/iroha上で以下のコマンドを入力します。

docker run -d --name iroha hyperledger/iroha

上記のコマンドを入力するとirohaコンテナの起動を行います。
コマンド入力後にdocker ps -aと入力すると以下のようにirohaのコンテナが立ち上がっていることが確認できます。

#:/home/ubuntu/workspace/iroha-docker/iroha# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
c31cddff76ba        hyperledger/iroha   "/bin/su - iroha -c '"   2 seconds ago       Exited (127) 2 seconds ago                       iroha

irohaの動作テスト

テスト用tarファイルの作成

上で作成したirohaのDockerコンテナから、テスト用irohaコンテナ向けのファイルをコピーします。

ファイルのコピーの前に、一度起動したDockerコンテナをdocker rm irohaでいったん削除します。
そのあと、コンテナ上のBashシェルをフォアグラウンドで動かすよう、以下のコマンドを入力します。

docker run -it --name iroha -v /var/tmp:/var/tmp hyperledger/iroha /bin/bash

コンテナのBashが起動したら、iroha側で用意されている以下のシェルスクリプトを実行します。

./mkiroha-tar.sh

スクリプトが正常終了したら、exitコマンドでホストOSに戻ります。
ホストOSに戻ったら /var/tmp 以下に iroha.tar ファイルが作成されていることを確認します。

テスト用コンフィグ情報のコピー

次にコンフィグ情報のコピーを以下のコマンドで行います。

rsync -av config /opt/iroha

テスト用irohaコンテナの起動

必要なファイルの作成・コピーが終了したら、iroha-docker/iroha上に用意されている起動スクリプトを用いて、テスト用irohaコンテナを立ち上げます。

./run-iroha.sh

上記のコマンドを実行後にdocker psと入力すると、以下のように表示されます。シェルスクリプトでは四つのノードを立ち上げていることが分かります。

# :/home/ubuntu/workspace/iroha-docker/iroha# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                                    PORTS                    NAMES
454b3ceccad0        hyperledger/iroha   "/bin/su - iroha -c '"   4 seconds ago       Restarting (127) Less than a second ago   0.0.0.0:1204->1204/tcp   iroha4
b7382f2f5d43        hyperledger/iroha   "/bin/su - iroha -c '"   5 seconds ago       Restarting (127) Less than a second ago                            iroha3
7fbb8c12a4d5        hyperledger/iroha   "/bin/su - iroha -c '"   5 seconds ago       Restarting (127) Less than a second ago                            iroha2
a8ee6737bf61        hyperledger/iroha   "/bin/su - iroha -c '"   5 seconds ago       Restarting (127) Less than a second ago                            iroha1

ログの確認

テスト用コンテナの立ち上げた後、以下のコマンドを入力することでirohaが生成するログを確認することができます。

docker logs iroha1

テスト用コンテナを起動した直後は、以下のようなログが生成されているかと思います。

1485597193[sumeragi] +==ーーーーーーーーー==+
1485597193[sumeragi] |+-ーーーーーーーーー-+|
1485597193[sumeragi] ||           ||
1485597193[sumeragi] || いろは合意形成機構 ||
1485597193[sumeragi] ||    すめらぎ   ||
1485597193[sumeragi] ||           ||
1485597193[sumeragi] |+-ーーーーーーーーー-+|
1485597193[sumeragi] +==ーーーーーーーーー==+
1485597193[sumeragi] - 起動/setup
1485597193[sumeragi] - 初期設定/initialize
1485597193 INFO [sumeragi] My key is 10.0.168.3
1485597193 INFO [sumeragi] Sumeragi setted
1485597193 INFO [sumeragi] set number of validatingPeer
1485597193 INFO [sumeragi] initialize numValidatingPeers :4
1485597193 INFO [sumeragi] initialize maxFaulty :1
1485597193 INFO [sumeragi] initialize proxyTailNdx :3
1485597193 INFO [sumeragi] initialize panicCount :0
1485597193 INFO [sumeragi] initialize myPublicKey :Q5PaQEBPQLALfzYmZyz9P4LmCNfgM5MdN1fOuesw3HY=
1485597193 INFO [sumeragi] initialize is sumeragi :0
1485597193 INFO [sumeragi] initialize.....  complete!
1485597193 INFO [server] initialize server!
1485597193 INFO [server] start server!

合意形成サンプルの起動

テスト用コンテナを立ち上げた後、合意形成のサンプルスクリプトを動かします。

まずホストOS上のiroha-docker/irohaディレクトリ上で、以下のスクリプトを実行します。

./tools/run-sumeragi.sh

スクリプトを実行すると合意形成の主体となるirohaコンテナに操作が移るので、以下の順番で操作を行い、合意形成サンプルスクリプトを実行します。

# su - iroha
$ cd /opt/iroha/build/my_test_bin
$ ./sumeragi_test public

このスクリプトを実行することで、残り3台のノードに対して承認要求を送り合意形成を図ることを行います。
スクリプト実行中のコンテナは他の操作を行うことができないので、いったんこのままにしておきます。

スクリプトを実行している最中に残りのノードから生成されるログを表示すると、以下のようなログが流れていることを確認することができます。
合計4台のノードのうち、3台のノードから承認が得られているので取引が成立しているということのようです。

1485599901[sumeragi] 0--------------------------0
1485599901[sumeragi] +~~~~~~~~~~~~~~~~~~~~~~~~~~+
1485599901[sumeragi] |Would you agree with this?|
1485599901[sumeragi] +~~~~~~~~~~~~~~~~~~~~~~~~~~+
1485599901[sumeragi] 0================================================================0
1485599901[sumeragi] 028583d69d04ce124339a3125f185114a8a4933a4b45cc2c52aa4e4a3496f0cdd0
1485599901[sumeragi] 0================================================================0
1485599901[sumeragi] +-ー-+
1485599901[sumeragi] |   |
1485599901[sumeragi] |-承-|
1485599901[sumeragi] |   |
1485599901[sumeragi] +-ー-+
1485599901[sumeragi] +-ー-+
1485599901[sumeragi] |   |
1485599901[sumeragi] |-承-|
1485599901[sumeragi] |   |
1485599901[sumeragi] +-ー+
1485599901[sumeragi] +-ー-+
1485599901[sumeragi] |   |
1485599901[sumeragi] |-承-|
1485599901[sumeragi] |   |
1485599901[sumeragi] +-ー+
1485599901[sumeragi] +-ー-+
1485599901[sumeragi] |   |
1485599901[sumeragi] | 否 |
1485599901[sumeragi] |   |
1485599901[sumeragi] +-ー-+
1485599901[sumeragi] ================
1485599901[sumeragi] numValidSignatures:3 faulty:3
1485599901[sumeragi] +==ーー==+
1485599901[sumeragi] |+-ーー-+|
1485599901[sumeragi] || 承認 ||
1485599901[sumeragi] |+-ーー-+|
1485599901[sumeragi] +==ーー==+
1485599901[sumeragi] commit
1485599901[sumeragi] commit count:1

まとめ

OSSのブロックチェーン基盤であるirohaをDocker上で動かして、合意形成の様子を確認するところまでをAWS上でやってみました。
慣れている人であれば1時間足らずでブロックチェーン基盤を構築することができるので、非常にお手軽と言えるのではないでしょうか。
また機会があれば、合意形成のやりとりを追ってみたり、クライアントからブロックチェーンを扱うところに挑戦してみたいです。