
作ってみたブロックチェーンを活用したシステム
はじめに
前回のコラム「ブロックチェーンとは?事例を交えてわかりやすく解説!」ではブロックチェーンの仕組みや活用実態をご紹介いたしました。
今回のNTC技術コラムでは、「Hyperledger Fabric」と呼ばれるオープンソースのブロックチェーン・フレームワークを活用し、実際にブロックチェーンシステムを構築しましたので、そちらについて分かりやすく解説していきます。
- ブロックチェーンシステムの構成紹介
- ブロックチェーンシステム実行までの流れ
1 ブロックチェーンシステムの構成紹介
環境構築
今回はAWS EC2インスタンスやDockerで環境を構築し、図1のようにブロックチェーンネットワークを立ち上げ、「契約管理システム」という工事案件を電子的に発注・受注するためのブロックチェーンシステムを作成しました。

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

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

- 台帳:データの現在値を記録する「ステートDB」とデータを新規登録・更新・削除する取引を記録する「ブロックチェーン」の二部からなっています。
※Hyperledger Fabricで作られたブロックチェーンシステムは、ビットコインなど世間でよく知られたブロックチェーンシステムと異なり、ステートDBを使いデータの現在値を保存することで、データを取得する際はつながったブロックを計算することなくステートDBから効率よくデータを取得することができるというメリットがあります。今コラムでは、分かりやすく説明するため、ステートDBの役割を省略し「ブロックチェーン(台帳)」という言葉で解説していきます。 - Chaincode:ブロックチェーンシステムにおけるビジネスロジックであり、「スマートコントラクト」と呼ばれることもあります。
- Channel:同じブロックチェーン(台帳)を読み書きできる範囲です。
- Peer:ブロックチェーンネットワークの基本的な要素であり、台帳とチェーンコードをホストします。ピアをチャネルに参加させ同じチェーンコードをインストールすることで、同じブロックチェーン(台帳)を読み書きすることができます。すべてのピアはステートDB内のデータを現在値に保たれるようにします。
- Orderer:ブロックの生成順を制御する役割を持っています。
- CA:ブロックチェーンネットワーク内の各参加者(Orderer や Peer、ユーザー等)を識別するための証明書を発行する認証局です。
2 ブロックチェーンシステム実行までの流れ
次に、新しい取引をブロックとして台帳に書き込む方法や、登録した取引を参照する方法を含め、ブロックチェーンの仕組みについて説明いたします。
トランザクションとは
ブロックチェーンの仕組みの説明に入る前に、トランザクションという概念をご説明したいと思います。
トランザクションとは、ユーザーとピアとのコミュニケーションを記録する取引記録です。ユーザーがブロックチェーン(台帳)にあるデータを操作したい場合は、専用アプリケーションを通じてトランザクションを発行します。トランザクションは以下の二種類があります。
- Queryトランザクション:ブロックチェーン(台帳)からデータを取得すること。
- Invokeトランザクション:データをブロックチェーン(台帳)に新規登録・更新・削除すること。
以下では本システムの事例を用いまして、QueryトランザクションとInvokeトランザクションを発行する際のブロックチェーンシステムの動きをご説明します。
Queryトランザクション
まず、発注者としてブロックチェーンシステムを操作し、発注者専用ピアへQueryトランザクションを発行することで、ブロックチェーン(台帳)に保存されたすべての案件データを取得します。

ユーザーがブロックチェーン(台帳)からデータを取得したい場合は、専用アプリケーションを通じてQueryトランザクションを発行することで、ユーザー専用ピアへ処理を依頼します。ユーザー専用のピアはチェーンコードを発動することで、ブロックチェーン(台帳)からデータを取り出し、アプリケーションへ返します。
トランザクションを発行する前、ピアにおけるDockerログを開き、それぞれのピアにあるブロックチェーンの初期状態を確認します。

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

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

案件データの取得後ピアにおけるDockerログを確認すると、発注者専用ピアでブロックチェーン(台帳)からデータを取得する処理が実施されたことが分かりました。また、Queryトランザクションの発行により、ブロックチェーン(台帳)からデータを取得しましたが、新しいブロックの生成はありませんでした。
Invokeトランザクション
次に同じく発注者としてシステムを操作し、コマンドでInvokeトランザクションを発行することで、「コマンドで登録した案件・テスト」という内容の案件データをブロックチェーン(台帳)に新規登録します。

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

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

図10のように、受注者専用ピアでInvokeトランザクションの検証が通ったら、二つのピア両方でblock[7]を新たに生成したことが分かりました。またInvokeトランザクションの発行により、各ピアにあるブロックチェーン(台帳)が更新され、データの同期化も取れました。
では最後に、再度発注者としてシステムを操作し、コマンドでQueryトランザクションを発行することで、すべての案件データをブロックチェーン(台帳)から取得したいと思います。

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

