はじめに
私は普段、ブロックチェーンに関するリサーチや技術検証をしています。今回は備忘も兼ねてエンタープライズの領域でも多く利用されているHyperledger Fabricに初めて触れる方向けに技術概要をまとめました。Hyperledger Fabric v1.4.9、 v2.2.1までの情報を元に整理しています。
目次
- Hyperledger Fabricの概要
- Hyperledger Fabricの主な構成要素
- チェーンコード
- プライバシー保護機能 - チャネル -
1. Hyperledger Fabricの概要
Hyperledger FabricはThe Linux Foundationが運営するHyperledgerプロジェクトで開発されるオープンソースのブロックチェーン・プロダクトです。
金融業界だけでなく、非金融業界での利用事例も数多く存在します。2017年にv1.0が公開されて以降、アップデートが繰り返され、2020年10月現在、v2.2.1、 v1.4.9が最新版となります。
2. Hyperledger Fabricの主な構成要素と例
Hyperledger Fabricのネットワークは主に3つの要素で構成されます。Peer、Orderer、CA(認証局)の3つです。
下図はHyperledger Fabricのネットワーク構成例です。コンソーシアム型のブロックチェーンネットワークの場合、複数組織の参加が前提です。
- Peer:参加組織ごとに1台以上
- Orderer:ネットワークで1台以上
- CA:参加組織ごと、およびOrdereに1台以上
Peer
Peerは主にトランザクション(取引記録)の検証や実行、ブロックチェーンへの書き込みを行います。
- アプリケーションとの接続
アプリケーションから送信されたトランザクションに対して、検証し、取引を実行します。実行した記録はブロックに書き込まれ、実行結果が台帳に反映されます。 - 台帳の保有
Hyperledger Fabricの台帳はブロックチェーンとステートDBがあり、取引の履歴をブロックチェーン に書き込み、取引を実行した結果の最新の状態をステートDBへ保存しています。アプリケーションはチェーンコード経由でステートDBからデータを参照・更新することができます。 - チェーンコードの実行
チェーンコードとはビジネス上の処理や条件を記述したプログラムです。他のブロックチェーン・プロダクトではスマートコントラクトに該当します。チェーンコードはブロックチェーンネットワーク内で各Peerが同じものを管理し、どのPeer上でチェーンコードが実行されても同じ結果になるように整合性を取っています。
Orderer
Ordererは主にトランザクションの順序付けやブロックの作成、各Peerへブロックを送信します。
各Peerで管理するデータを同じ状態にする必要があるため、Hyperledger FabricでOrdererがトランザクションの実行順序を決め、ブロックに格納しています。作成したブロックは対象のPeerに配布します。Ordererの構成オプションはSolo、Kafka、Raftの3種類ありますが、Raftが推奨されています。
CA
ブロックチェーンネットワーク内のユーザとPeer等の情報の登録、証明書の発行を行います。Hyperledger Fabricで取引記録を送信するためには、CAが発行した証明書と秘密鍵を使って、取引記録に署名を行う必要があります。サードパーティのCAの利用やLDAP連携、冗長化構成のオプションも提供されています。
3. チェーンコード
Hyperledger Fabricではスマートコントラクトのことをチェーンコードと呼びます。Hyperledger Fabricではチェーンコード開発のライブラリが提供されており、Go、Java、JavaScriptの3種類の言語に対応しています。私はチェーンコードの開発ツールとしてVisual Studio Codeで提供されている開発用のアドオンを使ってインストールしています。チェーンコードのテストやデバッグ、エクスポート等、必要な機能が網羅されています。下のプログラムはJavaScriptでチェーンコードを記述した例です。
Const { Contract } = require ('fabric-contract-api'); //モジュールのインポート
Class SampleContract extends Contract = {
async createMyAsset (ctx, myAssetId, Value) { //アセットの新規作成の関数を定義
const asset = { value };
const buffer = Buffer.from (JSON.stringfy(asset));
await ctx.stub.putState (myAssetId, buffer); //putState関数でアセットをIDに紐付けて書き込み
}
async getMyAsset (ctx, myAssetId) { //アセットのデータを取得する関数を定義
...
}
}
module.exports = SampleContract
4. プライバシー保護機能 - チャネル -
チャネルはHyperledger Fabricのネットワーク上で作られる仮想ネットワークです。チャネル単位で台帳とチェーンコードを管理するため、チャネルに参加していない組織はそのチャネル内の取引に干渉できません。台帳の共有範囲をチャネル単位で分割することができるため、プライバシー保護を強化することが可能です。Hyperledger Fabricのネットワークは一つ以上のチャネルが存在します。
参考
より詳細な仕組みやチュートリアルを知りたい場合は、Hyperledger Fabricの公式ドキュメントであるread the docksをご確認ください。