MacでHyperledger/Iroha-v1.1の環境構築からチュートリアルまで

公式ドキュメントではDockerコンテナ上に環境構築しますが、今回はホストのMac上に構築します。


Hyperledger/Iroha

ソラミツ株式会社が主体となって開発している日本製のブロックチェーンプラットフォーム

コンソーシアム型(管理者が複数いるタイプ)のブロックチェーンで、デジタルアセットを(比較的)高速に記録することができます。

環境

  • macOS High Sierra 10.13.3
  • (unix系ならなんでも良さそう)
  • docker 18.03.1-ce
  • docker-compose 1.12.1

docker、docker-composeのインストール

Docker for Macをインストールします。
特にバージョン指定は無さそうなので、latestバージョンを各OSのパッケージ管理ツールでインストールしても良いかと思います。

以上で前提条件はクリアです。

irohaノードを起動する

トランザクションを処理するノードを起動していきます。
コマンドは基本的にドキュメントに書いてある通りです。

dockerネットワークを構築

Irohaが動作するためには PostgreSQL データベースが必要です。
PostgresとIroha用のコンテナが同じ仮想ネットワーク上で実行され、正常に通信が行われるようにするために、dockerネットワークを使用します。
`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

このとき、ホスト側のポート5432がすでに使われている場合は適宜変更してください。僕は5433を使用しています。
-p 5433:5432

Blockstoreを作成

Dockerコンテナはデータが揮発性で一度stopさせるとデータが消えてしまいます。
そこで、ホスト側に今後ファイルやブロックチェーンを保存していくボリュームを作成します。
docker volume create blockstore

Irohaリポジトリをクローン

GitHubからIrohaリポジトリをクローンします
git clone -b develop https://github.com/hyperledger/iroha --depth=1

rohaデーモンをインストール
ここからは[別のドキュメント](https://hyperledger.github.io/iroha-api/#linux-or-macos)を参照していきます。
まずbrewでirohad,iroha-cliをインストールします

brew tap soramitsu/iroha
brew install iroha

これでMacターミナルでirohad,iroha-cliコマンドが使えるようになったかと思います。

Irohaデーモンを起動

先ほどクローンしたリポジトリ内のリソースを使ってIrohaデーモンを起動します

cd iroha/
irohad --config example/config.sample --genesis_block example/genesis.block --keypair_name example/node0

 

起動時にgenesisブロックのパースでエラーが生じる場合もありますが
genesis.blockを作り直すことでエラーを回避することができます。

 

 

echo 'localhost:10001' > peers.list
iroha-cli --genesis_block --peers_address peers.list

genesis.blockを作り直した後、再びirohadコマンドを実行して、デーモンを起動してください。

以上でIrohaノードが完成です。

Irohaネットワークを操作してみる

クライアントライブラリを使用することで、さまざまなプログラミング言語(Java、Python、Javascript、Swiftなど)でIrohaと通信するためのコードを記述できます。
あるいは、コマンドラインツールである “iroha-cli“を使うこともできます。
ドキュメント通り “iroha-cli“を使って説明していきます。
文字で読むよりも、公式ドキュメントの動画をみる方がわかりやすいかと思います。

アカウントにログイン

ここからは。デーモンを起動中のターミナルとは別に、新しくターミナルを起動して操作してください。
iroha/example内にテスト用アカウントが用意されているのでこれを使います。

cd example/
iroha-cli -account_name admin@test

 

トランザクションを作成

「iroha-cli」のインターフェースが起動しているはずです。

1. New transaction (tx)
2. New query (qry)
3. New transaction status request (st)

バージョンによってコマンドの並び順が違うこともありますが、同じものが用意されているはずです。
まずは1(もしくはtx)を入力してトランザクションを作成しましょう。

画面が変わって、大量の選択肢があるかと思います

Forming a new transactions, choose command to add:
1. Add Signatory to Account (add_sign)
2. Grant permission over your account (grant_perm)
3. Set account key/value detail (set_acc_kv)
4. Create Account (crt_acc)
5. Create Domain (crt_dmn)
6. Create Asset (crt_ast)
7. Remove Signatory (rem_sign)
8. Detach role from account (detach)
9. Set Account Quorum (set_qrm)
10. Subtract Assets Quantity from Account (sub_ast_qty)
11. Add Peer to Iroha Network (add_peer)
12. Transfer Assets (tran_ast)
13. Add new role to account (apnd_role)
14. Create new role (crt_role)
15. Add Asset Quantity (add_ast_qty)
16. Revoke permission from account (revoke_perm)
0. Back (b)

まずはアセットの作成します(ここでは6または”crt_ast”を入力)
次に、アセット名、ドメイン、精度(桁数)を入力します。

Asset name: coolcoin
Domain Id: test
Asset precision: 2

本来、ドメインは予め作成する必要がありますが、テスト用のtestが用意されています。
アセット名はなんでも良いです。今回はドキュメント通り`coolcoin`とします。

次の選択肢では、トランザクションの保存・送信・追加・新規作成ができます。
まずはトランザクションをIrohaノードに送信してみましょう。

1. Save as json file (save)
2. Send to Iroha peer (send)
3. Add one more command to the transaction (add)
4. Go back and start a new transaction (b)

2もしくはsendを入力します。
Irohaノードのアドレスとポートを聞かれるので適宜入力してください。
初期設定では以下の通りです。

Peer address (0.0.0.0): localhost
Peer port (50051): 50051

送信できたら、トランザクションのハッシュ値が帰ってくると思います。
Its hash is 1907064d7f4e8d1d65942b5af1d14144ba4d32279317d03c7a55f4ee24fcd4aa
iroha-cliの最初の選択肢が表示されていますね

Choose what to do:
1. New transaction (tx)
2. New query (qry)
3. New transaction status request (st)

無事にトランザクションが処理されたか、確認してみましょう。
3もしくはstを入力してください。

Choose action:
1. Get status of transaction (get_tx_info)
0. Back (b)

もちろん1です。すると、

Requested tx hash:

ハッシュ値の入力を求められます。先ほどトランザクションを送信したときに表示されたハッシュ値をコピペしましょう。

Tx hash is saved. Choose what to do:
1. Send to Iroha peer (send)
2. Save as json file (save)
0. Back (b)

ハッシュ値が認識されましたね。そのまま1を入力してIrohaノードに送信して問い合わせます。

Transaction was successfully committed.

無事成功していましたね。

ちなみに、アセットを作成する際にテスト用のドメインを使いましたが、無効なドメインを設定するとトランザクションが処理されません。

Transaction has not passed stateful validation.

次から送金トランザクションの説明をしますが、送金の場合も残高以上のアセット量を送信しようとすると同様にトランザクションが無効なものとして破棄されます。

送金

送金元のアカウントに残高がないと何もできないので、まずは残高を設定します。
New transactionAdd Asset Quantityを選択してください
アカウントID、アセットID、アセット量の入力が求められるので適宜入力してください。

Account Id: admin@test
Asset Id: coolcoin#test
Amount to add (integer part): 20050
Amount to add (precision): 2
20050 2

これでadmin@testアカウントに200.5coolcoinが設定されました。
次に、admin@testからtest@testに送金をしてみましょう。

New transactionTransfer Assetsを選択してください
送り元、送り先、送る量を入力します

SrcAccount Id: admin@test
DestAccount Id: test@test
Asset Id: coolcoin#test
Amount to add (integer part): 10050
Amount to add (precision): 2

これはadmin@testからtest@testcoolcoin#test100.5送信するトランザクションです。
例によって、Irohaノードへ送信してください。

 

クエリの作成

最後に、本当に送金が行われたかどうか確認します。
test@testアカウントの残高を参照するクエリを作成します。正常にトランザクションが処理されていたら、100.5coolcoinが表示されるはずです。

New queryからGet Account's Assetsを選択してください
参照するアカウントのID、アセットIDが求められます

Requested account Id: test@test
Requested asset Id: coolcoin#test

例によってIrohaノードに送信してください。
以下の応答があるはずです

[2018-05-17 19:47:08.044857000][th:6230984][info] QueryResponseHandler [Account Assets]
[2018-05-17 19:47:08.044884000][th:6230984][info] QueryResponseHandler -Account Id:- test@test
[2018-05-17 19:47:08.044892000][th:6230984][info] QueryResponseHandler -Asset Id- coolcoin#test
[2018-05-17 19:47:08.044935000][th:6230984][info] QueryResponseHandler -Balance- 100.50

無事送金されていることが確認できましたね。

以上で環境構築からチュートリアルまで終了です。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

ABOUTこの記事をかいた人

新卒で入社前にロシアに飛ばされかけたので、内定を辞退し、なんやかんやWeb系エンジニアとして就職先が決まりました。飽き性で、ずっと同じ場所に住んでいると嫌になるので、色々なところを転々して旅しながら生きるのが夢です。