AY2020前期の最後に行なったHyperledger/Irohaを使った際の指示をまとめ、チュートリアルとして再掲しました。

1. 前提

公式Dockerチュートリアル Part2 が完了していることを前提に説明しています。

2. 参考資料

注: iroha 1.1.3のドキュメントを参照していましたが、リンク切れなどにより最新のドキュメントにリンクを張り直しています。整合性の取れない記述が残っているかもしれませんので注意してください。

3. DockerによるIrohaチュートリアル

ゼミ室10のThinkPad上の端末に直接、リモートログインして作業を進めます。

3.1. 準備作業

コマンドをまとめた Makefile を準備しているので、適当な作業用ディレクトリを作成してから、ダウンロードします。

$ mkdir docker-iroha
$ cd docker-iroha
$ wget https://web-int.u-aizu.ac.jp/%7eyasu-abe/ja/sccp/manual/tutorial-iroha-cli/Makefile
$ ls
Makefile

Makefileがダウンロードできたら次に進みます。

3.2. irohad(サーバー)の起動

参考資料の資料3: Hyperledger/Iroha Quick Start Guideの内容を実行していきます。

Makefile5つのタスクを実行します。

$ make setup-network
docker network create iroha-network

$ make run-pg
docker run -it --rm --name some-postgres \
        -e POSTGRES_USER=postgres \
        -e POSTGRES_PASSWORD=mysecretpassword \
        -p 5432:5432 \
        --network=iroha-network \
        -d postgres:9.5 \
        -c 'max_prepared_transactions=100'
ee093027c911eacd56989ab6c0d79cf6a42b16b59fc39e952695ae785c96fa60

$ make setup-blockstore
docker volume create bolockstore

$ make git-clone
git clone -b master https://github.com/hyperledger/iroha --depth=1

$ make run-iroha
docker -D run --name iroha \
-d -it --rm \
-p 50051:50051 \
-v `pwd`/iroha/example:/opt/iroha_data \
-v blockstore:/tmp/block_store \
--network=iroha-network \
-e KEY='node0' \
--entrypoint=/bin/bash \
hyperledger/iroha:1.1.3
25db645deed4cc36d8fe4bef6b25c682497927c628aea12f6b2c96a0d387a306

ここまで進んで、正常に処理が進んだことは、`docker ps`コマンドで確認します。

$ docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED              STATUS              PORTS                      NAMES
25db645deed4        hyperledger/iroha:1.1.3   "/bin/bash"              43 seconds ago       Up 41 seconds       0.0.0.0:50051->50051/tcp   iroha
ee093027c911        postgres:9.5              "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:5432->5432/tcp     some-postgres

NAMEがirohaとsome-postgresの2つのコンテナが起動していれば正常に処理されています。

最後にirohadプロセスを起動します。 起動すると、画面にログが繰り返し表示されます。

$ make exec-iroha
docker exec -it iroha irohad --config config.docker --genesis_block genesis.block --keypair_name node0
...
[2020-08-07 01:45:27.135139795][I][Irohad/Synchronizer]: processing consensus outcome
[2020-08-07 01:45:27.135144165][I][Irohad/Synchronizer]: at handleDifferent
[2020-08-07 01:45:27.135161913][I][Irohad]: ~~~~~~~~~| EMPTY (-_-)zzz |~~~~~~~~~
...
[2020-08-07 01:46:52.476578330][I][Irohad/Synchronizer]: processing consensus outcome
[2020-08-07 01:46:52.476581340][I][Irohad/Synchronizer]: at handleDifferent
[2020-08-07 01:46:52.476591963][I][Irohad]: ~~~~~~~~~| EMPTY (-_-)zzz |~~~~~~~~~
...

ここまでで、Irohaサーバーの起動は終りました。このプロセスは、C-cやC-zなどで終了・停止はしないでください。 この端末はここまま放っておいて別の端末を開き、次の作業を進めます。

3.3. iroha-cliの起動

新しく端末ウィンドウを開き、別のSHELLで作業を進めます。 先ほど作成してMakefileをダウンロードしたディレクトリに移動して作業を進めます。

Irohaサーバーが動いている状態で、iroha-cliコマンドを実行します。

$ cd docker-iroha
$ ls
iroha/ Makefile
$ make exec-bash
docker exec -it iroha bash

root@25db645deed4:/opt/iroha_data# iroha-cli -account_name admin@test
Welcome to Iroha-Cli.
Choose what to do:
1. New transaction (tx)
2. New query (qry)
3. New transaction status request (st)
> :

最後の`> : `が表示されれば、iroha-cliの起動は完了しました。 まずはこの中で、資産であるcoolcoinコインを作成し、適当な枚数を発行します。

3.4. coolcoinコインの登録とコインの発行

サーバーが起動しただけでは何も準備されていないので、iroha-cliのメニューを操作し、コインの登録と発行を行ないます。 参考資料の資料3: Hyperledger/Iroha Quick Start Guideにあるようにメニューの選択は、数字(e.g. 1)がコマンド(e.g. tx)で指定します。

> : tx

## ここからメニューの表示は省略します。
> : crt_ast
Asset name: coolcoin
Domain Id: test
Asset precision: 2

## sendに続く、Peer address / Peer port はデフォルトのまま、何も入力せずにエンターキーを押す
> : send
Peer address (0.0.0.0):
Peer port (50051):
[2020-08-06 09:26:25.386520566][I][CLI/ResponseHandler/Transaction]: Transaction successfully sent
Congratulation, your transaction was accepted for processing.
Its hash is 3c83e26616a676cebce8c7634c82e7dbe0851d7a7e811601552655bb97f0e56a

ここで最後に表示されたHash値(3c83e26616a676cebce8c7634c82e7dbe0851d7a7e811601552655bb97f0e56a)は変化します。 トランザクションが正常に処理されたかどうかは、この出力からは分からないので、"st"コマンドで確認します。

> : st

1. Get status of transaction (get_tx_info)
0. Back (b)
> : get_tx_info
Requested tx hash (get_tx_info): 3c83e26616a676cebce8c7634c82e7dbe0851d7a7e811601552655bb97f0e56a

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

Peer address (0.0.0.0):
Peer port (50051):
Transaction was successfully committed.

これでcoolcoinコインが登録されたので、適当な枚数を発行します。

> : tx
> : add_ast_qty
Asset Id: coolcoin#test
Amount to add, e.g 123.456: 20050

> : send
余裕があれば、"send"コマンドを発行した時のハッシュ値を利用して、"st"コマンドでトランザクションが成功しているかどうか調べてください。

"qry"コマンドを利用して、追加されたコインの量(枚数)を確認します。

> : qry

> : get_acc_ast
Requested account Id: admin@test
Requested asset Id: coolcoin#test

> : send
[2020-08-07 03:39:23.408706379][I][CLI/ResponseHandler/Query]: [Account Assets]
[2020-08-07 03:39:23.408742071][I][CLI/ResponseHandler/Query]: -Account Id:- admin@test
[2020-08-07 03:39:23.408748160][I][CLI/ResponseHandler/Query]: -Asset Id- coolcoin#test
[2020-08-07 03:39:23.408763710][I][CLI/ResponseHandler/Query]: -Balance- 20050

ここまでで、iroha-cliを実行した*admin@test*ユーザーが、20050枚のcoolcoinコインを所有している状態になりました。

3.5. "test@test"ユーザーへのコインの配布

あらかじめ"test@test"ユーザーがコインを持っていない事を確認しておきます。

> : qry
> : get_acc_ast
Requested account Id: test@test
Requested asset Id: coolcoin#test

> : send
[2020-08-07 03:48:30.173374890][I][CLI/ResponseHandler/Query]: [Account Assets]
[2020-08-07 03:48:30.173420408][I][CLI/ResponseHandler/Query]: -Account Id:- test@test
[2020-08-07 03:48:30.173426484][I][CLI/ResponseHandler/Query]: -Asset Id- coolcoin#test
[2020-08-07 03:48:30.173429441][I][CLI/ResponseHandler/Query]: -Balance- 0

"Balance"が0であることが分かります。 既に他の誰かがこのチュートアルを実行している場合には、Balanceが0でない可能性もあります。

次に"admin@test"ユーザーからコインを配布します。

> : tx
> : tran_ast
SrcAccount Id: admin@test
DestAccount Id: test@test
Asset Id: coolcoin#test
Amount to transfer, e.g 123.456: 1024.25

> : send
Peer address (0.0.0.0):
Peer port (50051):
[2020-08-07 04:07:26.109666237][I][CLI/ResponseHandler/Transaction]: Transaction successfully sent
Congratulation, your transaction was accepted for processing.
Its hash is 33c2fe46bb158c679d6219b196bda9746f7eaca199daab81403515937a79f8a9

先ほどの手順で"test@test"ユーザーのBalanceを確認してください。

> : qry
> : get_acc_ast
Requested account Id: test@test
Requested asset Id: coolcoin#test
> : send
Peer address (0.0.0.0):
Peer port (50051):
[2020-08-07 04:24:54.451692088][I][CLI/ResponseHandler/Query]: [Account Assets]
[2020-08-07 04:24:54.451771296][I][CLI/ResponseHandler/Query]: -Account Id:- test@test
[2020-08-07 04:24:54.451775090][I][CLI/ResponseHandler/Query]: -Asset Id- coolcoin#test
[2020-08-07 04:24:54.451776755][I][CLI/ResponseHandler/Query]: -Balance- 1024.25

3.6. "test@test"ユーザーから"admin@test"ユーザーへの配布

"test@test"ユーザーから、"admin@test"に送金する場合には、"test@test"ユーザーで、iroha-cliを起動する必要があります。

## C-d (Control+dキー)を押下して、iroha-cliを終了し、bashに戻ります。
> : C-d
root@25db645deed4:/opt/iroha_data#
root@25db645deed4:/opt/iroha_data# iroha-cli -account_name test@test
> : tx
> : tran_ast
SrcAccount Id: test@test
DestAccount Id: admin@test
Asset Id: coolcoin#test
Amount to transfer, e.g 123.456: 10.3
> : send

ここまでで、"10.3"枚分のコインを、"admin@test"に戻したので、先程の1024.25からちゃんと減っているか、現在の量を確認します。

> : qry
> : get_acc_ast
Requested account Id: test@test
Requested asset Id: coolcoin#test
> : send
Peer address (0.0.0.0):
Peer port (50051):
[2020-08-07 04:28:38.514944178][I][CLI/ResponseHandler/Query]: [Account Assets]
[2020-08-07 04:28:38.515002313][I][CLI/ResponseHandler/Query]: -Account Id:- test@test
[2020-08-07 04:28:38.515009905][I][CLI/ResponseHandler/Query]: -Asset Id- coolcoin#test
[2020-08-07 04:28:38.515013480][I][CLI/ResponseHandler/Query]: -Balance- 1013.95

3.7. 新しいユーザーの追加

あらかじめ準備されているユーザーは、git cloneでダウンロードした、iroha/example/ディレクトリに準備されているファイルを利用していました。 新しくユーザーを追加してみます。

ユーザー"yasu-abe@test"を追加しますが、この"yasu-abe"の部分は任意のID名(e.g. s12xxxxx)に変更してください。 ## ここでは"yasu-abe"を使用しますが、ハイフンを含むIDは作成しようとしないでください。

## 一旦、C-dでiroha-cliを終了し、bashに戻ります。
> : C-d
root@25db645deed4:/opt/iroha_data# iroha-cli -new_account -account_name yasu-abe@test -pass_phrase user
[2020-08-07 04:41:51.149492885][I][CLI/Main]: Public and private key has been generated in current directory

## 秘密鍵と公開鍵のペアが作成された事を確認します。
root@25db645deed4:/opt/iroha_data# ls
...
yasu-abe@test.priv
yasu-abe@test.pub
...

この公開鍵の情報はまだIrohaサーバーに登録されていないので、"admin@test"ユーザーから登録します。 iroha-cliコマンドを実行する前に、"yasu-abe@test.pub"ファイルの内容をコピーしておきます。

root@25db645deed4:/opt/iroha_data# echo $(cat yasu-abe@test.pub)
13a4b3e7a344c9c121f75e85791abd6b72a6773ebe96c7307b4dc409ab651a7a

root@25db645deed4:/opt/iroha_data# iroha-cli -account_name admin@test
> : tx
> : crt_acc
Account Name: yasu-abe
Domain Id: test
Public Key: 13a4b3e7a344c9c121f75e85791abd6b72a6773ebe96c7307b4dc409ab651a7a

> : send
Peer address (0.0.0.0):
Peer port (50051):
[2020-08-07 04:48:24.820683468][I][CLI/ResponseHandler/Transaction]: Transaction successfully sent
Congratulation, your transaction was accepted for processing.
Its hash is cf366a59b0edef96aea3251ba13852f1ff844b6a1acf9a4698a0963c6369dd57

登録されたか"st"でハッシュ値を確認しても良いですが、"get_acc"コマンドで、確認します。

余裕があれば、"st"コマンドにハッシュ値を与えて、ユーザー登録のトランザクションが正常に終了したか確認してください。
> : qry
> : get_acc
Requested account Id: yasu-abe@test
> : send

[2020-08-07 04:55:33.283732049][I][CLI/ResponseHandler/Query]: [Account]:
[2020-08-07 04:55:33.283763856][I][CLI/ResponseHandler/Query]: -Account Id:- yasu-abe@test
[2020-08-07 04:55:33.283767667][I][CLI/ResponseHandler/Query]: -Domain- yasu-abe
[2020-08-07 04:55:33.283769892][I][CLI/ResponseHandler/Query]: -Roles-:
[2020-08-07 04:55:33.283772097][I][CLI/ResponseHandler/Query]:  user
[2020-08-07 04:55:33.283773829][I][CLI/ResponseHandler/Query]: -Data-: {}

実際に"yasu-abe@test"を作成しようとすると、この処理は正常に終了せず、ここでようやくIDにハイフンを持つIDは登録できない事が分かります。 いずれにしても、ID名にハイフンを含んでいない場合は、このように表示され、無事に終了するはずです。

ここまでで、iroha-cliを利用して、資産(コイン)の登録・発行と、ユーザー間での配布が行なえる事を確認しました。

4. 停止処理

作業が終ったら次の手順で、Dockerコンテナ(Irohaサーバー、PostgreSQL)を停止します。

$ ls
iroha/ Makefile

$ docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED              STATUS              PORTS                      NAMES
25db645deed4        hyperledger/iroha:1.1.3   "/bin/bash"              43 seconds ago       Up 41 seconds       0.0.0.0:50051->50051/tcp   iroha
ee093027c911        postgres:9.5              "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:5432->5432/tcp     some-postgres

$ docker stop iroha

$ docker stop some-postgresql

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES