実践!ブロックチェーン いろは(第2回) 誌上ハンズオン~実際にいろはを動かしてみよう!
前回では、日本発のブロックチェーンのいろはが、すでに日本のみならず世界でもいろいろな用途で使われていることなどをご紹介しました。
●パブリック型・プライバート型・コンソーシアム型のブロックチェーンの違いとは?
ブロックチェーンと言えば、ビットコインやイーサリアムなどの暗号資産(仮想通貨)での利用が有名ですが、「いろは」はプライベート型またはコンソーシアム型のブロックチェーンです。「いろは」を単独の企業、団体で利用する場合にはプライベート型ですが、複数企業や団体で利用する場合にはコンソーシアム型のブロックチェーンとなります。
これに対して、ビットコインやイーサリアムなどは、いつでも誰でも自由に参加できるブロックチェーンということでパブリック型と呼ばれています。
ここで、それぞれの形態のブロックチェーンを表にすると次のようになります。
*1 :パブリックブロックチェーンは参加者が不特定多数であり、許可が必要ないということから非許可型(permissionless)、プライベートブロックチェーンやコンソーシアムブロックチェーンは許可が必要であることから許可型(permissioned)と呼ばれることもあります。
●いろはのリポジトリーとドキュメントを探す
「いろは」はオープンソースですから、github.comですべてのソースが公開されています。このリポジトリーは、Hyperledger Projectによって管理されていますので、このProjectの下に「いろは」のリポジトリーが存在しています。
そこで、「いろは」のリリースページを見ると、「Hyperledger Iroha v1.2.1 *2」が現時点での最新バージョンであることがわかります。
*2: 2021年9月3日にv1.3.0-rc.1が公開されていますが、現時点ではRelease Candidateと言うことでリリース候補であり、安定板としてはv1.2.1が最新となっています。
また、英語版になりますが「いろは」のドキュメントが以下で公開されています。
今回のシリーズでは説明し切れていない内容などにつきましては、このドキュメントを参照していただければと思います。
いろはの新しいバージョンの公開に合わせてドキュメントページのURLなどが変更される場合があります。その場合には、トップページとなっているhttps://iroha.readthedocs.io/から辿って該当のページを参照してください。
●Docker Hubから、いろはのコンテナをゲット
さらに、作成済みのDockerコンテナがDocker Hubで公開されています。このURLは、https://hub.docker.com/r/hyperledger/iroha となっています。
Docker Hubで公開されている「いろは」のDockerコンテナを入手するには、次のようにコマンドを実行することができます。
$ docker pull hyperledger/iroha
さらに現在の最新バージョンがv1.2.1となっていますから、タグでバージョンを指定して入手することもできます。こちらの方式の方が利用したいバージョンを安全に入手することができます。
$ docker pull hyperledger/iroha:1.2.1
●いろはを起動するために事前準備をしよう!
それでは、さっそく「いろは」を動かしてみたいと思います。「いろは」を動かす場合にも、いろいろな形式が考えられると思いますが、ここでは先にみてきたDockerコンテナを利用していきたいと思います。
「いろは」は、非常にシンプルな構成となっていて、「いろは」のDockerコンテナとWSV(World State View)*3 用に利用しているPostgreSQLのDockerコンテナの2つを使います。
*3 WSV (World State View):「いろは」の現在の状態を反映するスナップショットとして位置付けられます。「いろは」のアカウントの現在の残高などが管理されています。
この2つのDockerコンテナを利用するために、docker-composeを使用することにします。
ここで、docker-compose.ymlファイルを作成しますが、例としてiroha-testという作業用のディレクトリを作ってそこに作成することにしましょう。
$ mkdir iroha-test
$ cd iroha-test
$ vi docker-compose.yml
この、docker-compose.ymlファイルは、たとえば次のような内容になります。
version: '3'
services:
node:
image: ${IROHA_PRJ}/${IROHA_IMG}
ports:
- "50051:50051"
environment:
- IROHA_HOME=/opt/iroha
- IROHA_CONF=config.docker
- IROHA_NODEKEY=node1
- CCACHE_DIR=/tmp/ccache
volumes:
- ${PWD}/config:/opt/iroha/config
- ccache-data:/tmp/ccache
working_dir: /opt/iroha/config
entrypoint: /opt/iroha/config/entrypoint.sh
depends_on:
- postgres
postgres:
image: postgres:13-alpine
environment:
- POSTGRES_USER=iroha
- POSTGRES_PASSWORD=HelloW0rld
volumes:
ccache-data:
ここで作成したdocker-compose.ymlファイルでは、${PWD}/configとしてカレントディレクトリ、つまり先ほど作成したiroha-testディレクトリの下にあるconfigディレクトリに設定ファイルを作成して、「いろは」のDockerコンテナに/opt/iroha/configディレクトリとして受け渡しています。そこで、configディレクトリも作成しておきましょう。
$ mkdir config
さらに、.envファイルでdocker-composeに環境変数を渡しています。そのため、docker-compose.ymlファイルを作成したディレクトリに.envファイルを作成します。
$ vi .env
先に見た、「いろは」v1.2.1を使うための.envファイルの内容は次のようになります。
IROHA_PRJ=hyperledger
IROHA_IMG=iroha:1.2.1
COMPOSE_PROJECT_NAME=iroha
●いろはを実行するために必要な設定ファイル
先に、docker-composeで起動する方法を書いていますが、「いろは」を実行する際には実はいくつかの設定ファイルが必要になります。
使用する設定ファイルも加えた、1台のコンピュータ上で動作している「いろは」の構造は次の図のようになります。
上記の内容は次のようになっています。
■Dockerコンテナ
・Iroha:「いろは」のDockerコンテナ
・PostgreSQL:WSVとして動作するPostgreSQLのDockerコンテナ
■設定ファイル
・config.docker:「いろは」の設定ファイル
・genesis.block:「いろは」のジェネシス・ブロック *4
*4:ジェネシス・ブロック:ブロックチェーンに書込まれるブロックの先頭ブロックのこと。先頭であるために、通常存在する先行ブロックを示すハッシュ値が存在しないなどブロックチェーンに応じた特別な内容となっています。
■鍵ペア
・node1.priv:「いろは」の動作しているノード(コンピュータ)の鍵ペア(秘密鍵)。「いろは」がP2Pネットワークで合意形成する際に、ノード間で通信するメッセージに署名するために使用される秘密鍵。
■データベース
・WSV:「いろは」の現在の状態を反映するデータベース。 PostgreSQLを利用。
■分散台帳
・block_store:「いろは」で書込まれるブロックチェーン(分散台帳)
上記から、起動時に使用されるファイルは以下の3つになります。
- config.docker
- genesis.block
- node1.priv
これまでと同様にiroha-test/configディレクトリにconfig.dockerファイルを作成します。
$ vi config.docker
ここで、config.dockerは次のような内容となっています。
{
"block_store_path" : "/tmp/block_store/",
"torii_port" : 50051,
"internal_port" : 10001,
"database" : {
"host" : "iroha_postgres_1",
"port" : 5432,
"user" : "iroha",
"password" : "HelloW0rld",
"working database" : "iroha_default",
"maintenance database" : "postgres"
},
"max_proposal_size" : 10,
"proposal_delay" : 5000,
"vote_delay" : 5000,
"mst_enable" : false,
"mst_expiration_time" : 1440,
"max_rounds_delay" : 3000,
"stale_stream_max_rounds" : 2
}
上記ではPostgreSQL用のパスワードとして、「HelloW0rld」と適当な値を設定していますが、実際に使用する際には安全なパスワードに修正して下さい *5。
*5:PostgreSQLのパスワード:config.dockerファイルに書かれていますが、同様にdocker-compose.ymlファイルにも書かれています。docker-compose.ymlファイルに書かれている内容がPostgreSQLのDockerコンテナで使用されて、config.dockerに書かれている内容が「いろは」のDockerコンテナで使われますので、両方が同じ内容である必要があります。
genesis.blockは、「いろは」のリポジトリのexampleディレクトリにあるgenesis.blockファイルをサンプルとして使用してみます。node1.privも同様に「いろは」のリポジトリのexampleディレクトリにある鍵ペアのnode0.privファイルをnode1.privとリネームして使います。さらにnode0.pubをnode1.pubとしてリネームしておきます。
最初に「いろは」をgithub.comからクローンして、v1.2.1にチェックアウトしておきます。
$ git clone https://github.com/hyperledger/iroha.git
$ cd iroha
$ git checkout 1.2.1
exampleディレクトリから必要なファイルをiroha-test/configディレクトリにコピーしておきます。ここでは、iroha-testディレクトリを作成した場所に「いろは」がクローンされているものとしています。
$ cd example
$ cp genesis.block ../../iroha-test/config
$ cp node0.priv ../../iroha-test/config/node1.priv
$ cp node0.pub ../../iroha-test/config/node1.pub
ちなみにgenesis.blockにある”peerKey”の値が、このnode0.pubの値となっています。
参考:上記のconfig.dockerの設定に関する詳細については、先の「いろは」のドキュメントページの「6. Configure」の章を参照して下さい。
●いろはの起動スクリプトの設定を修正
ここまで「いろは」の構成と各種の設定ファイルの内容を見てきました。実際に「いろは」のDockerコンテナを動かす際には、”entrypoint.sh”スクリプトから起動しています。
この”entrypoint.sh”スクリプトは、「いろは」のリポジトリのiroha/docker/releaseディレクトリにある”entrypoint.sh”スクリプトがDockerコンテナの”/“(ルートディレクトリー)にコピーされているのですが、そのままでは少し不便なので修正したものを使うことにしましょう。
この起動スクリプトもiroha-test/configディレクトリに作成します。
$ cd iroha-test/config
$ vi entrypoint.sh
その内容が次のようになります。
#!/bin/bash
cd ${IROHA_HOME}/config
IROHA_CONF=${IROHA_CONF:-iroha.conf}
IROHA_BLOCK=$(cat ${IROHA_CONF} | grep block_store_path |
sed -e 's/^.*: "//' -e 's/".*$//')
IROHA_GENESIS=${IROHA_GENESIS:-genesis.block}
IROHA_NODEKEY=${IROHA_NODEKEY:-node1}
if grep -q pg_opt ${IROHA_CONF}; then
PG_HOST=$(cat ${IROHA_CONF} | grep pg_opt | sed -e 's/^.*host=//' -e 's/ .*//')
PG_PORT=$(cat ${IROHA_CONF} | grep pg_opt | sed -e 's/^.*port=//' -e 's/ .*//')
else
PG_HOST=$(cat ${IROHA_CONF} | grep host | sed -e 's/^.*host" *: *"//' -e 's/".*//')
PG_PORT=$(cat ${IROHA_CONF} | grep "[^_]port" | sed -e 's/^.*port" *: *//' -e 's/,.*//')
fi
if [ -x ${IROHA_HOME}/bin/wait-for-it.sh ]; then
WAIT_FOR_IT="${IROHA_HOME}/bin/wait-for-it.sh"
else
WAIT_FOR_IT="/wait-for-it.sh"
fi
${WAIT_FOR_IT} -h ${PG_HOST} -p ${PG_PORT} -t 60 -- true
echo "$ irohad --config ${IROHA_CONF} --genesis_block ${IROHA_GENESIS} --keypair_name ${IROHA_NODEKEY} --drop_state"
irohad --config ${IROHA_CONF} \
--genesis_block ${IROHA_GENESIS} \
--keypair_name ${IROHA_NODEKEY} \
--drop_state
修正している点は、設定ファイルの名前を環境変数から設定している点と、PostgreSQLのホスト名、ポート番号も設定ファイルから入手している点、さらにジェネシス・ブロックとノードの鍵ペア名も環境変数から入手している点になります。
作成したentrypoint.shスクリプトにchmodコマンドで実行権を設定しておきます。
$ chmod +x entrypoint.sh
●いよいよ、いろはを起動させてみる!
準備ができましたので、早速docker-composeコマンドで起動してみましょう。
$ cd .. # iroha-testディレクトリーに戻ります
$ docker-compose up -d
初回は、「いろは」とPostgreSQLのDockerコンテナをDockerプルしてから実行しています。
正常に起動していれば、docker psコマンドで次のように表示されて2つのコンテナの状態が「Up」となっています。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0312a6302d55 hyperledger/iroha:1.2.1 "/opt/iroha/config/e…" About a minute ago Up About a minute 0.0.0.0:50051->50051/tcp, :::50051->50051/tcp iroha_node_1
6539998c6761 e43172f9204f "docker-entrypoint.s…" About a minute ago Up About a minute 5432/tcp iroha_postgres_1
●docker logs コマンドから、いろはの実行ログをチェック
ここでは、Dockerを使用していますのでdocker logsコマンドで実行状態を確認することができます。
上記のログでは、「いろは」のDockerコンテナ起動直後に”wait-for-it.sh”スクリプトを実行して、PostgreSQLの起動を待っていること。その後に、”irohad”(いろはの本体)が実行されていて、バージョンが”1.2.1”として表示されていることなどがわかります。
$ docker logs -f iroha_node_1
wait-for-it.sh: waiting 60 seconds for iroha_postgres_1:5432
wait-for-it.sh: iroha_postgres_1:5432 is available after 1 seconds
$ irohad --config config.docker --genesis_block genesis.block --keypair_name node1 --drop_state
[2021-08-11 07:53:23.737007900][I][Init]: Irohad version: 1.2.1
[2021-08-11 07:53:23.737069900][I][Init]: config initialized
[2021-08-11 07:53:23.737256800][I][Irohad]: created
[2021-08-11 07:53:23.737286700][I][Irohad]: [Init] => pending transactions storage
[2021-08-11 07:53:24.056239900][I][Irohad]: [Init] => storage
[2021-08-11 07:53:24.057089100][I][Irohad/Storage/Storage]: drop block storage
[2021-08-11 07:53:24.057517900][I][Irohad]: Recreating schema.
[2021-08-11 07:53:24.402105600][I][Irohad]: [Init] => storage
[2021-08-11 07:53:24.402129400][I][Irohad/Storage/Storage]: create mutable storage
[2021-08-11 07:53:24.438937300][I][Irohad/Storage/Storage/MutableStorageImpl]: Applying block: height 1, hash 9debdb1a70db2cede2222427b849f6bf7ab20845da7c3db1837c0df25ec1c61a
[2021-08-11 07:53:24.460787100][I][Init]: Genesis block inserted, number of transactions: 1
[2021-08-11 07:53:24.461343000][I][Irohad/Storage/Storage/PostgresSettingQuery]: Kept value for MaxDescriptionSize: 64
[2021-08-11 07:53:24.461359700][I][Irohad]: [Init] => settings
●いろはの終了手順も覚えておきましょう!
起動した直後ではありますが、「いろは」を終了するためにはdocker-composeでdownコマンドを実行します。
ここで、docker-compose.ymlファイルでDockerボリュームとして「いろは」でccache-dataを使っています。このDockerボリュームを削除するためには、docker-compose downを実行する際に「-v」オプションをつけて実行する必要があります。
$ docker-compose down -v
実際の実行例を見ても、次のようにDockerボリュームが削除されていることが確認できます。
$ docker-compose down -v
[+] Running 4/4
⠿ Container iroha_node_1 Removed 10.3s
⠿ Container iroha_postgres_1 Removed 0.5s
⠿ Volume iroha_ccache-data Removed 0.0s
⠿ Network iroha_default Removed 0.1s
本来は、ブロックチェーンとしての「いろは」を使用する例まで進みたかったのですが、少々長くなっていますので次回の内容にしたいと思います。
米津 武至(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 ブロックチェーン国際標準化日本代表委員。