1. HOME
  2. ブログ
  3. 実践!ブロックチェーン いろは(第3回)いろはを使ってみよう

実践!ブロックチェーン いろは
(第3回)いろはを使ってみよう

前回までで、Dockerコンテナーとして公開されている「いろは」を動かすことができるようになりました。

今回は、その「いろは」を使ってみる、つまり実際にトランザクションを発行したり、クエリー(問合せ)を実行したりしていきたいと思います。

CLIコマンドで「いろは」のクライアントを簡単に動かす

実は「いろは」のDockerコンテナーには、「いろは」本体であるirohadと一緒にCLIコマンドであるiroha-cliも入っています。そこで、最も簡単に「いろは」のクライアントを動かすために、iroha-cliを使ってトランザクションを発行したり、クエリーを実行することができます。

:ドキュメントにも記載されているように、「iroha-cliは、すべてのコマンドとクエリーに対応しているわけではありません」ので、一部の簡易な動作確認などに使用するものとされています。

最初にクライアントの動作に必要な鍵ペアを作成します。本来であれば、独自に鍵ペアを作成して、重要な秘密鍵などを大切に管理すべきなのですが、ここでは「いろは」のリポジトリーにサンプルとして提供されている鍵ペアをコピーして使うことにします。

前回使用していたiroha-test/configディレクトリーに、irohaのリポジトリーから管理者用の鍵ペアをコピーします。

$ cd iroha/example
$ cp admin* ../../iroha-test/config

この状態で「いろは」を起動します。

$ cd iroha-test
$ docker-compose up -d

「いろは」が起動したら、Dockerコンテナーに入って、iroha-cliを動かします。

注:2021年10月1日にdocker-compose v2.0.1が公開されています。
現在までの掲載記事では1.29.2を使用した内容となっています。
そのため、最新のv2.0.1を使用する場合には”ーcompatibility”オプションを追加するようにしてください。

この場合は、次の形式でコマンドを実行します。docker compose v2.0.1の場合、dockerのCLIプラグインとして、および従来のコマンドとしての使用が可能となっています。以下の例ではdockerのCLIプラグインとして実行する場合として、”docker-compose”コマンドではなく”docker”コマンドから使うために”compose”との間が空白となっています。

$ docker compose--compatibility up -d
$ docker exec -it iroha_node_1 bash

Dockerコンテナーに入ったら、iroha-cliを起動します。この際に、先ほどコピーした管理者用の鍵ペアのアカウントを指定します。

# iroha-cli -—account_name admin@test

iroha-cliを起動するとメニューが表示されます。以降、この起動直後に表示されるメニューをトップメニューと呼んでいます。

ここでは例としてアセット(暗号資産の名称に相当するものです)を作成してみましょう。アセットの名前は「jsscoin」としてみます。また小数点以下の桁数を指定することができますから「2」としてみます。

次のようにして操作します。

メニューから「1. New transaction (tx)」を選択します。

ここで、iroha-cliではメニューの応答として、表示されている番号または括弧で囲まれた文字列のいずれかを使うことができます。つまり、この場合は”1”または”tx”を入力して<ENTER>を押下して実行することができます。

トランザクション用のメニューが沢山表示されていますので、「14. Create Asset (crt_ast)」を選択します。

ここで表示されるメニューに対しては、次のように入力して応答します。

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

続けて、この「Create Asset」を「いろは」に送信するために、メニューから「4. Send to Iroha peer (send)」を選択します。

次に表示されるメニューでは、「Peer address (127.0.0.1):」、「Peer port (50051):」に対して、そのままで良いので<ENTER>キー空打ちで応答します。

無事にトランザクションが送信されると画面にトランザクションのハッシュ値が表示されています。

Peer address (127.0.0.1): 
Peer port (50051): 
[2021-09-06 02:29:58.162913100][I][CLI/ResponseHandler/Transaction]: 
Transaction successfully sent
Congratulation, your transaction was accepted for processing.
Its hash is 
2b3c54f1573a8357b91e8cc0e51c3bb260c37581f124691e1859f382ab17f0ce

続けて、いま送信したトランザクションの状態を確認してみましょう。

トランザクションの処理を確認してみる

トップメニューから、「3. New transaction status request (st)」を選択します。
続けて、「1. Get status of transaction (get_tx_info)」を選択して、要求されるトランザクションハッシュに対して、先ほど表示されていたハッシュ値を入力します。

Requested tx hash: 
2b3c54f1573a8357b91e8cc0e51c3bb260c37581f124691e1859f382ab17f0ce

ここで、「1. Send to Iroha peer (send)」を選択して、「Peer address(127.0.0.1):」と「Peer port (50051):」に対して、先ほどと同様に <ENTER> 空打ちで応答します。

トランザクションの処理に成功していれば、その旨のメッセージが表示されます。

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

ここでは、無事にトランザクションの処理に成功してコミットされていることが表示されています。

つまりブロックチェーンとしては合意形成ができて、コミットされたメッセージが分散台帳に書き込まれていることになります。

次にテストのために先ほど作成した「jsscoin」の残高を増やしてみましょう。「いろは」は、プライベート型またはコンソーシアム型のブロックチェーンですから、ビットコインなどのようにマイニングをする必要はありません、残高を増やすにはAPIで用意されている「AddAssetQuantity」を使うことができます。

iroha-cliでは、次のようにして操作します。

トップメニューの「1. New transaction (tx)」から、「16. Add Asset Quantity (add_ast_qty)」を選択します。

Add Asest Quantityのメニューでは、次のように入力します。

Asset Id: jsscoin#test
Amount to add, e.g 123.456: 1000.00

先ほどと同様にして、「いろは」にトランザクションを送信します。

「4. Send to Iroha peer (send)」を選択して、「Peer address (127.0.0.1)」、「Peer port (50051)」には <ENTER> 空打ちで応答します。

[2021-09-06 02:50:08.158962600][I][CLI/ResponseHandler/Transaction]: 
Transaction successfully sent
Congratulation, your transaction was accepted for processing.
Its hash is
94e2467aeeb84de2448abafb52579a4eba112cc05797119cba08c2a900eca88b

やはり、先ほどと同様にして状態を確認してみます。

iroha-cliのトップメニューから、「4. New transaction status request (st)」を選択して、「1. Get status of transaction (get_tx_info)」を選択します。

「Requested tx hash」には、先ほど表示されていたトランザクションのハッシュ値を入力しておきます。

「1. Send to Iroha peerr (send)」から、「Peer address (127.0.0.1)」と「Peer port (50051)」には<ENTER>空打ちで応答します。

Transaction was successfully committed.

無事にトランザクションが、「いろは」に送信されてコミットされていることが表示されています。

クエリーで「いろは」の状態を調べよう

それでは続けてクエリーで状態を確認してみましょう。ここでは、admin@testの所持するアセットjsscoin#testの残高を1000.00にしてみましたから、その内容を確認してみましょう。

今度は、iroha-cliのトップメニューから、「2. New query (qry)」を選択します。表示されるクエリー用のメニューから、「8. Get Account’s Assets (get_acc_ast)」を選択します。

「Requested account Id」は”admin@test”、「Requested asset Id」は”jsscoin#test”と入力します。クエリーを「いろは」に送信します。

「1. Send to Iroha peer (send)」を選択して、「Peer address (127.0.0.1)」、「Peer port (50051)」に <ENTER> 空打ちで応答します。

[2021-09-06 03:04:36.516257300][I][CLI/ResponseHandler/Query]: [Account Assets]
[2021-09-06 03:04:36.516285500][I][CLI/ResponseHandler/Query]: -Account Id:- admin@test
[2021-09-06 03:04:36.516287800][I][CLI/ResponseHandler/Query]: -Asset Id- jsscoin#test
[2021-09-06 03:04:36.516288900][I][CLI/ResponseHandler/Query]: -Balance- 1000.00

アカウントadmin@testの所持するアセットjsscoin#testの残高が1000.00になっていることが表示されました。

iroha-cliを使っている際には、各メニューからは「0. Back (b)」と表示されていますので、”0”または”b”に続けて <ENTER> キーを押下することで、前のメニューに戻ることができます。

そして、トップメニューからCRTL+D(コントロールキーに続けて”d”を押下)で、iroha-cliを終了することができます。

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

iroha-pythonを使用して「いろは」を操作

「いろは」を使用するクライアントのためのクライアントライブラリー(SDK)としては、Java、JavaScript、Python、iOS用のSwiftなどが用意されています。

ここでは、iroha-pythonを利用して、Pythonで「いろは」を操作していきたいと思います。

iroha-pythonは、他のクライアントライブラリーと同様にGitHub(https://github.com/hyperledger/iroha-python)で公開されています。

このiroha-pythonは、上記リポジトリーのREADMEにも記載されているように「Python3」が必須となります。つまりPython2では動作しない点に注意して下さい。

実際にiroha-pythonを使う場合には、上記のリポジトリーを使うこともできますが、ライブラリーをpipコマンドでインストールすることができます。

$ pip install iroha

ここでは、必要なirohaのライブラリーをインストールしたDockerコンテナーを作成することにしましょう。この場合のDockerfileは、次のような内容になります。

FROM ubuntu:20.04

RUN apt update && apt upgrade -y \
 && apt install -y --no-install-recommends \
      build-essential ca-certificates \
      python3 python3-pip python3-setuptools python3-dev

RUN pip3 install wheel \
 && pip3 install iroha

CMD bash

以下では、例としてpython-testディレクトリーを作成して、そのディレクトリーに上記のDockerfileを作成します。

まずは、Dockerコンテナーを作りましょう。ここではコンテナー名をiroha-pythonとしてビルドしてみます。

$ docker build -t iroha-python .

ビルドした結果、次のようなDockerイメージが作成されました。

REPOSITORY      TAG        IMAGE ID       CREATED         SIZE
iroha-python    latest     1c1048b18ba8    2minutes    ago    433MB

できあがったDockerコンテナーを実行してみましょう。次のように実行しますが、ここではpython-testディレクトリーに、run.shというスクリプトを作成して実行することにします。

run.shスクリプトの内容

#!/bin/bash

docker run -it --rm --name iroha-python \ 
  -v $(pwd)/example:/root/iroha-python/example \
  --workdir /root/iroha-python/example iroha-python

exit 0

つまり、カレントディレクトリーであるpython-testディレクトリーに、exampleディレクトリーを作成して、iroha-pythonという名前で実行するDockerコンテナーにマウントしています。このexampleディレクトリーに必要なPythonスクリプトを作成して実行していく予定です。

それでは、実際に実行してみましょう。

$ bash run.sh
root@26c6f9f6b38b:~/iroha-python/example#

Dockerコンテナーが起動して、プロンプトが表示されています。これは会話型で実行できるようにコンテナーを起動する際に”-it”オプションをつけていたからです。また起動時のディレクトリーが、”~/iroha-python/example”として表示されています。ホスト側のpython-test/exampleディレクトリが、Dockerコンテナーに~/iroha-python/exampleとしてマウントされている状態になっています。

それでは例として「いろは」用の鍵ペアを作成してみましょう。次のようなPythonスクリプトをexampleディレクトリーにiroha-key.pyと言う名前で作成します。

from iroha import IrohaCrypto

# these first two lines are enough to create the keys
private_key = IrohaCrypto.private_key()
public_key = IrohaCrypto.derive_public_key(private_key)

# the rest of the code writes them into the file
with open('keypair.priv', 'wb') as f:
    f.write(private_key)

with open('keypair.pub', 'wb') as f:
    f.write(public_key)

前後してしまいますが、作成したDockerコンテナーにはvimをインストールしていませんので、上記のスクリプトを事前にexampleディレクトリーに作成しておいてから、先のrun.shスクリプトを実行します。または、別のターミナル画面を開いて、そちらからexampleディレクトリーにPythonスクリプトを作成します。

それでは実行してみましょう。

root@14baaf9b3e32:~/iroha-python/example# python3 iroha-key.py
root@14baaf9b3e32:~/iroha-python/example# ls -al
total 20
drwxrwxr-x 2 1000 1000 4096 Sep  6 06:27 .
drwxr-xr-x 3 root root 4096 Sep  6 06:27 ..
-rw-rw-r-- 1 1000 1000  356 Sep  6 05:48 iroha-key.py
-rw-r--r-- 1 root root   64 Sep  6 06:27 keypair.priv
-rw-r--r-- 1 root root   64 Sep  6 06:27 keypair.pub

Python3でスクリプトを実行した後で、lsコマンドでリスト表示してみると、keypair.priv、keypair.pubという2つのファイルが作成されていることが分かります。

これが「いろは」で使われているedd25519 SHA-3形式で作成された鍵ペアで、拡張子”priv”が秘密鍵、”pub”が公開鍵となっています。

実際に使う際には、必要な名前にリネームして「いろは」のピア用、またはアカウント用の鍵ペアとして使うことができます。

iroha-pythonでのトランザクション実行

続けて、iroha-pythonを利用してトランザクションを発行してみましょう。ここでは、アセットを送るために用意されているAPIとしてTransferAssetを使います。

注:以降のiroha-pythonでのトランザクション実行、およびiroha-pythonでのクエリー実行では、
これまで実行してきましたiroha-cliでの操作を実行済みの状態で行っています。
つまり、事前にアセットjsscoin#testが作成されてadmin@testにjsscoin#testの残高が
1000.00ある状態で実行して下さい。

「いろは」では、このTransferAssetのように、あらかじめ必要な機能がAPIとして提供されています。そのため、複雑なスマートコントラクト(★注1)を用意しなくても、事前に用意されているAPIを利用することで安全かつ迅速にブロックチェーンを使用することができます。

★注1:スマートコントラクト:契約とその履行条件をあらかじめプログラミングしておき、契約条件が満たされた際に自動取引が行われる仕組みのこと。 概念自体は、仮想通貨ビットコインやブロックチェーン技術が生まれるより以前の1994年に提唱されている。

それでは、実際に実行してみましょう。まず、先ほど用意したiroha-python/exampleディレクトリーに、次の内容のファイルをtransfer.pyという名前で作成します。

     1	from iroha import Iroha, IrohaCrypto, IrohaGrpc
     2	
     3	iroha = Iroha('admin@test')
     4	net = IrohaGrpc('192.168.0.2:50051')
     5	
     6	admin_key = 'f101537e319568c765b2cc89698325604991dca57b9716b58016b253506cab70'
     7	
     8	admin_tx = iroha.transaction(
     9	    [iroha.command(
    10	        'TransferAsset', 
    11	        src_account_id='admin@test', 
    12	        dest_account_id='test@test', 
    13	        asset_id='jsscoin#test',
    14	        description='test',
    15	        amount='10'
    16	    )]
    17	)
    18	
    19	IrohaCrypto.sign_transaction(admin_tx, admin_key)
    20	
    21	net.send_tx(admin_tx)
    22	
    23	for status in net.tx_status_stream(admin_tx):
    24	    print(status)

1行目で使用するiroha-pythonのライブラリーをインポートしています。
4行目で通信先の「いろは」のIPアドレスを設定していますが、実際に使用しているアドレスに合わせて修正して下さい。
8~16行目で、「いろは」のAPIであるTransferAssetと、その引数を設定しています。ここでは、アカウントadimin@testから、アカウントtest@testにアセットjsscoin#testを10送信するトランザクションを作成しています。
19行目で、トランザクションに署名をしています。
21行目で、実際に「いろは」にトランザクションを送信しています。この際に、4行目でも実行しているようにgRPCを使ってポート番号50051/tcpに送信しています。
23, 24行目で送信後のステータスを表示しています。

これを実行すると、次のような内容が表示されます。

# python3 transfer.py 
('ENOUGH_SIGNATURES_COLLECTED', 9, 0)
('STATEFUL_VALIDATION_SUCCESS', 3, 0)
('COMMITTED', 5, 0)

最初の行では、ブロックチェーンの合意形成が実行されて十分な署名が集まったことが表示されています。次の行では、アセットの残高チェックなどが確認されて検証済みであることが表示されて、最後の行でブロックがコミットされて分散台帳に書き込まれていることが示されています。

クエリ―用のAPIを使用して実際に残高を確認!

ここまでで「いろは」を起動して、トランザクション処理を実行してきました。そこで、ブロックチェーンの合意形成も実行されて分散台帳に書き込まれているはずなのですが、その状態を見ることができていません。

そこで、トランザクション処理と同様に「いろは」に用意されているクエリー用のAPIを使用して実際に残高を確認してみましょう。

これまでと同様にiroha-python/exampleディレクトリーに、次の内容のファイルをquery.pyとして作成します。

     1	#!/usr/bin/env python3
     2	
     3	import os
     4	from iroha import Iroha, IrohaCrypto, IrohaGrpc
     5	import sys
     6	
     7	if sys.version_info[0] < 3:
     8	    raise Exception('Python 3 or a more recent version is required.')
     9	
    10	iroha = Iroha('admin@test')
    11	net = IrohaGrpc('192.168.0.2:50051')
    12	
    13	admin_key = 'f101537e319568c765b2cc89698325604991dca57b9716b58016b253506cab70'
    14	
    15	def get_account_assets(account_id, asset_id):
    16	    query = iroha.query('GetAccountAssets', account_id=account_id)
    17	
    18	    IrohaCrypto.sign_query(query, admin_key)
    19	
    20	    response = net.send_query(query)
    21	
    22	    data = response.account_assets_response.account_assets
    23	
    24	    for asset in data:
    25	        print('Account id = {}, Asset id = {}, balance = {}'.format(
    26	            asset.account_id, asset.asset_id, asset.balance))
    27	
    28	get_account_assets('test@test', 'jsscoin#test')
    29	get_account_assets('admin@test', 'jsscoin#test')

11行目で通信先の「いろは」のIPアドレスを設定していますが、実際に使用しているアドレスに修正して下さい。
16行目で、クエリー用のGetAccoutAssetsを組み立てています、この際に引数としてアカウントID、アセットIDを使っています。
18行目で、クエリーに署名をして、20行目で「いろは」に送信しています。
22行目で、「いろは」からの応答を受信して、24~26行目で簡単に編集してアカウントとアセットを表示しています。
上記の内容を関数として設定していますので、28行、29行目でそれぞれアカウントtest@testとadmin@testの所持しているアセットjsscoin#testの残高を表示しています。

先ほどのtransfer.pyを実行した直後の状態で、上記のクエリーを実行すると次のように表示されています。

# python3 query.py 
Account id = test@test, Asset id = jsscoin#test, balance = 10
Account id = admin@test, Asset id = jsscoin#test, balance = 990.00

このように、最初にiroha-cliを実行してadmin@testにjsscoin#testが1000.00ある状態から、TransferAssetを実行してadmin@testからtest@testにjsscoin#testを10.00送信した結果、その残高が990.00と正しく表示されています。これで、先に実行したTransferAsestも正常に実行されていることが確認できました。

その他の「いろは」のクライアントライブラリー

今回は、まずCLIコマンドであるiroha-cliを使い、続けて「いろは」のクライアントライブラリーの1つであるiroha-pythonを使って、実際にブロックチェーンの「いろは」でのトランザクション処理やクエリー処理を実行してきました。

非常に簡単な例ではありますが、「いろは」の場合には事前に用意されているAPIを利用することで、安全かつ迅速にブロックチェーンのシステムを構築していけることを感じていただけたのではないでしょうか。

このようにして事前に用意されているクライアントライブラリーとして、Python用だけではなく次のようなものが用意されています。

・Java  https://github.com/hyperledger/iroha-java
・JavaScript https://github.com/hyperledger/iroha-javascript
・Python https://github.com/hyperledger/iroha-python
・ iOS https://github.com/hyperledger/iroha-ios

「いろは」の場合には、モバイルやPCを利用したクライアントアプリケーションを容易に開発できるように各種のライブラリーが提供されています。

「いろは」の特徴

今回も長くなりましたが、実際に「いろは」を動かしてトランザクション処理やクエリー処理を実行する方法を見てきました。
次回は、「いろは」の特徴でもあるデータモデルと、今回も出てきましたAPIについて見ていきたいと思います。

米津 武至(Takeshi Yonezu)
ソラミツ株式会社 ブロックチェーンアーキテクト
中央大学研究開発機構 客員研究員
前職では、金融決済系としてSWIFTネット、日銀ネット、AMLなどのシステム基盤を担当。2016年より、ソラミツ株式会社のブロックチェーン・アーキテクトとして主にHyperledger Irohaの教育・研修、および技術的なコンサルタントとサポートを行なっている。
https://soramitsu.co.jp/ja
https://tkyonezu.com/

◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇

執筆書籍のご紹介

絵で見てわかるブロックチェーンの仕組み 翔泳社
著者:米津武至(よねづ たけし)

ISBN-13 978-479158860

関連書籍のご紹介

ソラミツ 世界初の中銀デジタル通貨「バコン」を実現したスタートアップ 日経BP ――日本初のブロックチェーンで世界を変える ISBN-13 978-4822289102
著者:宮沢和正(みやざわ・かずまさ)
ソラミツ代表取締役社長。東京工業大学大学院修了。1980年ソニー入社。日本での電子マネーの草分けであるEdyの立ち上げに参画。運営会社のビットワレットの常務執行役員、楽天Edy執行役員を経てソラミツ入社。東京工業大学経営システム工学講師、ISO/TC307 ブロックチェーン国際標準化日本代表委員。

関連記事