作ってみたブロックチェーンを活用したシステム

■はじめに

前回のコラム「ブロックチェーンとは?事例を交えてわかりやすく解説!」ではブロックチェーンの仕組みや活用実態をご紹介いたしました。
今回のNTC技術コラムでは、「Hyperledger Fabric」と呼ばれるオープンソースのブロックチェーン・フレームワークを活用し、実際にブロックチェーンシステムを構築しましたので、そちらについて分かりやすく解説していきます。

1.ブロックチェーンシステムの構成紹介
2.ブロックチェーンシステム実行までの流れ

■ブロックチェーンシステムの構成紹介

>環境構築

今回はAWS EC2インスタンスやDockerで環境を構築し、図1のようにブロックチェーンネットワークを立ち上げ、「契約管理システム」という工事案件を電子的に発注・受注するためのブロックチェーンシステムを作成しました。


図 1 AWS構成図

作成したブロックチェーンシステムの構成図は以下の図2になります。


図 2 ブロックチェーンシステム構成図

一般的なシステムと異なるところは、図2のようにブロックチェーンネットワークというものが存在し、その中に各ユーザーに対応する端末のようなもの(ピア)が存在する点です。今回はシステムユーザーである発注者・受注者のため、それぞれ一つのピアを用意しました。ブロックチェーン(台帳)を操作したい場合、ユーザーは専用アプリケーション経由でその専用ピアへアクセスすることができます。

>ブロックチェーンシステムの構成要素

「Hyperledger Fabric」で構築されたブロックチェーンネットワークについて、専門用語を解説します。


図 3 OSSブロックチェーンの用語説明

・台帳:データの現在値を記録する「ステートDB」とデータを新規登録・更新・削除する取引を記録する「ブロックチェーン」の二部からなっています。
※Hyperledger Fabricで作られたブロックチェーンシステムは、ビットコインなど世間でよく知られたブロックチェーンシステムと異なり、ステートDBを使いデータの現在値を保存することで、データを取得する際はつながったブロックを計算することなくステートDBから効率よくデータを取得することができるというメリットがあります。今コラムでは、分かりやすく説明するため、ステートDBの役割を省略し「ブロックチェーン(台帳)」という言葉で解説していきます。
・Chaincode:ブロックチェーンシステムにおけるビジネスロジックであり、「スマートコントラクト」と呼ばれることもあります。
・Channel:同じブロックチェーン(台帳)を読み書きできる範囲です。
・Peer:ブロックチェーンネットワークの基本的な要素であり、台帳とチェーンコードをホストします。ピアをチャネルに参加させ同じチェーンコードをインストールすることで、同じブロックチェーン(台帳)を読み書きすることができます。すべてのピアはステートDB内のデータを現在値に保たれるようにします。
・Orderer:ブロックの生成順を制御する役割を持っています。
・CA:ブロックチェーンネットワーク内の各参加者(Orderer や Peer、ユーザー等)を識別するための証明書を発行する認証局です。

■ブロックチェーンシステム実行までの流れ

次に、新しい取引をブロックとして台帳に書き込む方法や、登録した取引を参照する方法を含め、ブロックチェーンの仕組みについて説明いたします。

>トランザクションとは

ブロックチェーンの仕組みの説明に入る前に、トランザクションという概念をご説明したいと思います。
トランザクションとは、ユーザーとピアとのコミュニケーションを記録する取引記録です。ユーザーがブロックチェーン(台帳)にあるデータを操作したい場合は、専用アプリケーションを通じてトランザクションを発行します。トランザクションは以下の二種類があります。

・Queryトランザクション:ブロックチェーン(台帳)からデータを取得すること。
・Invokeトランザクション:データをブロックチェーン(台帳)に新規登録・更新・削除すること。

以下では本システムの事例を用いまして、QueryトランザクションとInvokeトランザクションを発行する際のブロックチェーンシステムの動きをご説明します。

>Queryトランザクション

まず、発注者としてブロックチェーンシステムを操作し、発注者専用ピアへQueryトランザクションを発行することで、ブロックチェーン(台帳)に保存されたすべての案件データを取得します。


図 4 Queryトランザクション発行時のピアの動作

ユーザーがブロックチェーン(台帳)からデータを取得したい場合は、専用アプリケーションを通じてQueryトランザクションを発行することで、ユーザー専用ピアへ処理を依頼します。ユーザー専用のピアはチェーンコードを発動することで、ブロックチェーン(台帳)からデータを取り出し、アプリケーションへ返します。

トランザクションを発行する前、ピアにおけるDockerログを開き、それぞれのピアにあるブロックチェーンの初期状態を確認します。


図 5 Queryトランザクション発行時のピアにおけるDockerログ

図5の通り、左側の環境で発注者専用ピアのDockerログを開き、右側の環境で受注者専用ピアのDockerログを開きます。両方とも初期状態としては同じblock[6]まで存在していることが分かりました。

ではコマンドでQueryトランザクションを発行します。


図 6 Queryトランザクションにより取得されたデータ

図6の通り「go run query.go」のコマンドで、案件OR0000から案件OR0003までのデータをブロックチェーンの台帳から取得しAWS EC2画面で出しました。


図 7 Queryトランザクション発行後のピアにおけるDockerログ

案件データの取得後ピアにおけるDockerログを確認すると、発注者専用ピアでブロックチェーン(台帳)からデータを取得する処理が実施されたことが分かりました。また、Queryトランザクションの発行により、ブロックチェーン(台帳)からデータを取得しましたが、新しいブロックの生成はありませんでした。

>Invokeトランザクション

次に同じく発注者としてシステムを操作し、コマンドでInvokeトランザクションを発行することで、「コマンドで登録した案件・テスト」という内容の案件データをブロックチェーン(台帳)に新規登録します。


図 8 Invokeトランザクション発行時のピアの動作

ユーザーがデータをブロックチェーン(台帳)に新規登録・更新・削除したい場合は、専用アプリケーションを通じてInvokeトランザクションを発行することで、検証ピアへトランザクション内容の検証を依頼します。検証が通った場合のみ、ユーザー専用のピアはチェーンコードを発動し、データをブロックチェーン(台帳)に新規登録・更新・削除します。

ではInvokeトランザクションを発行します。


図 9 Invokeトランザクション発行時のコマンド

エラー文が出なければInvokeトランザクションの処理に成功したと意味しています。ピアにおけるDockerログを確認します。


図 10 Invokeトランザクション発行後のピアにおけるDockerログ

図10のように、受注者専用ピアでInvokeトランザクションの検証が通ったら、二つのピア両方でblock[7]を新たに生成したことが分かりました。またInvokeトランザクションの発行により、各ピアにあるブロックチェーン(台帳)が更新され、データの同期化も取れました。

では最後に、再度発注者としてシステムを操作し、コマンドでQueryトランザクションを発行することで、すべての案件データをブロックチェーン(台帳)から取得したいと思います。


図 11 Invokeトランザクションにより登録されたデータ

図11の通り、先ほどのInvokeトランザクションで新たに登録された案件データは、前回のデータからJSON形式でつながっています。「コマンドで登録した新案件・テスト」の内容が正しくブロックチェーンの台帳に登録されたことが確認できました。