■はじめに
前回のコラム「ブロックチェーンとは?事例を交えてわかりやすく解説!」ではブロックチェーンの仕組みや活用実態をご紹介いたしました。
今回の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形式でつながっています。「コマンドで登録した新案件・テスト」の内容が正しくブロックチェーンの台帳に登録されたことが確認できました。