Hyperledger fabric で始めるブロックチェーンアプリケーション (1/3)

この記事は WESEEK Advent Calendar 2020 2日目の記事です。

# はじめに

Hyperledger fabric ブロックチェーンアプリケーションを作ることを目標にして、基礎知識の紹介から、サンプルアプリケーションを動かすチュートリアル、開発環境の整備、CI(CDは断念)の構築、SDKを使ったアプリケーションの構築まで紹介していこうと思います。

1. 基礎知識の紹介 (この記事)
1. [サンプルアプリケーションを動かすチュートリアル](https://qiita.com/tatsurou313/items/c474555dfd50650cd0e9)
1. [開発環境の整備](https://qiita.com/tatsurou313/private/ea5b55db19531f74923c)
1. [CIの構築](https://qiita.com/tatsurou313/private/ea5b55db19531f74923c)
1. [SDKを使ったアプリケーションの構築](https://qiita.com/tatsurou313/private/ea5b55db19531f74923c)

# Hyperledger fabric とは

Hyperledger fabric とは Hyperledger プロジェクトのもとで開発されている分散台帳ソフトウェア(Distributed ledger software) の 1 つです。([参考](https://www.hyperledger.org/use/fabric))  
Hyperledger fabric の開発には IBM が主体的に関わっています。

尚、Hyperledger はエンタープライズグレードのブロックチェーンを展開するために、安定したフレームワーク、ツール、ライブラリを開発することに焦点を当てた OSS コミュニティです。The Linux Foundation がホストするプロジェクトの 1 つです。

# Hyperledger fabric と他のブロックチェーンの違い

ブロックチェーンは許可制ブロックチェーンと非許可制ブロックチェーンに分類することができます。

ブロックチェーンで有名な bitcoin 等は非許可制ブロックチェーンに分類でき、ユーザーは匿名であり、ある深さまでのブロックチェーンの状態が不変であること以外に信頼がありません。そのためブロックチェーンをマイニングする必要があります。

一方で Hyperledger fabric は許可性ブロックチェーンに分類できます。  
※ 更に細かく分類すると 1 団体のみが所属するプライベート型に対して、複数団体が所属するコンソーシアム型に分類できます。([参考](https://www.fujitsu.com/jp/solutions/industry/financial/concept/blockchain/))

コンソーシアム型のブロックチェーンではユーザーは識別され(非匿名であり)、ユーザー(団体)は一定の信頼が得られる同じコンソーシアムに許可を受けて参加します。
Hyperledger fabric はコンソーシアムに参加している、完全に信頼できない団体間の相互作用を安全にする方法を提供します。  
そのため、計算コストがかかるマイニングは不要です。([参考](https://hyperledger-fabric.readthedocs.io/en/latest/whatis.html#permissioned-vs-permissionless-blockchains))

## コンソーシアム型のブロックチェーン概要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206493/25e707df-182f-f124-6a2c-031606fded14.png)


図は、コンソーシアム型のブロックチェーンの概要です。

図に登場するそれぞれの役割についての概念は次のとおりです。
尚、「～となる範囲」は技術的に変更することは可能ですが、運用することを考えた時の筆者の考えにより記述しています。(間違いがあればご指摘ください)

- コンソーシアム
    - 組織間での相互作用が必要となる範囲
- 組織
    - ユーザーの参加・離脱を管理できる範囲
- 台帳
    - ブロックチェーンで扱うデータ

例えばコマーシャル・ペーパーを扱うコンソーシアム型のブロックチェーンが考えられ、その組織には企業と銀行が参加していることが考えられます。
そこでは台帳としてコマーシャル・ペーパー(金額、発行者、状態等が保存できる)を取り扱います。
([参考](https://hyperledger-fabric.readthedocs.io/en/latest/tutorial/commercial_paper.html))

例のように、異なる組織である企業と銀行が分散データを扱いつつ、改ざんや盗聴を防止して安全な相互作用を行える仕組みを Hyperledger fabric が提供します。

# Hyperledger fabric を使ってできること

コンソーシアム型のブロックチェーン概要で示したとおり、分散データシステム(中央集権ではない)を複数の組織で運用したい場合に使えます。

'20/11/30 現在で Hyplerledger fabric のケーススタディとして紹介されている用途をいくつか紹介します。([参考](https://www.hyperledger.org/learn/case-studies))

- [Honeywell Aerospace の例](https://www.hyperledger.org/learn/publications/honeywell-case-study)
    - GoDirect Trade : 中古航空機部品のB2Bマーケットプレイス
    - Amazon のような EC サイトでは不十分だった下の問題をクリアできた
        - 航空部品を販売するための米国連邦航空局やその他の機関からの認証が必要であり、各部品は、その所有、使用、修理の完全な履歴を文書化する必要がある
        - 部品は必ず技術文書と共に扱う必要がある
        - 多くのバイヤーはクレジットカードではなく発注書の支払いを希望していた
    - GoDirect Trade では購入者が以下のような多くの部品に関する重要なデータを見ることができるようになった
        - 部品のライフサイクル全体
        - 稼働していた時間数
        - 誰が、いつ、どこで、どんな修理をしたか
        - パーツの前の所有者全員
- [Walmart の例](https://www.hyperledger.org/learn/publications/walmart-case-study)
    - 食品トレーサビリティシステム
    - 中央集権型のデータベースでは達成できなかった問題を分散データベースにすることでクリアできた
    - 5 つの異なるサプライヤーから 25 以上の製品を追跡できるようになり、原材料を農場まで追跡できるようになった (7日かかったことが2.2秒に短縮した)
- [Circulor の例](https://www.hyperledger.org/learn/publications/tantalum-case-study)
    - 鉱物を材料とする製品トレーサビリティシステム
    - ルワンダ産のタンタル鉱石の一袋一袋が、児童労働や奴隷労働のないOECD承認の条件で採掘、輸送、加工されたことを疑う余地なく証明することができた
    - 下の2つのアプリケーションを構築した
        - IDの確認、チェックポイントでQRコードをスキャンして必要な書類をダウンロードするモバイルアプリ
        - サプライチェーンの可視化と問い合わせへの回答を提供するために企業オフィスで動作するデスクトップ版

# Hyperledger fabric のシステム概要

## Hyperledger fabric のシステム概要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206493/14d02136-1ad1-5914-738e-45b57e53da3f.png)


図は Hyperledger fabric の構成例と、その構成におけるシステム概要です。

図に登場するそれぞれの役割についての概念は次のとおりです。

- Orderer
    - トランザクションの実行要求が行われた順に実行するように制御します
- CA
    - Hyperledger fabric 内の各要素(Orderer や Peer、ユーザー等)を識別するための証明書を発行する認証局 (秘密鍵も作成される)
    - Hyperledger fabric 内の TLS 通信を行うために使う証明書を発行する役割もある
- Peer
    - chaincode をインストール・インスタンス化して実行する
    - トランザクション要求を発行する
    - そのように設定された場合は、台帳の読み書きを事前実行して検証します
- MSP
    - Hyperledger fabric 内の各エンティティ(Orderer や Peer、ユーザー等)の操作を抽象化した概念です (※筆者注:説明が難しく、筆者も理解できていない可能性はあります)
    - 筆者の理解では MSP という単体の実体はなく次の点を示す概念であると考えています
        - 秘密鍵による署名と証明書による認証の仕組みとその操作 (一般的な秘密鍵・証明書による仕組み)
        - Hyperledger fabric におけるエンティティの識別子や権限を証明書のフィールドへ設定するルールとその操作
- channel
    - 同じ台帳を読み書きできる範囲
    - channel に chaincode がインストールされる
    - 1 つの Peer が複数の channel に参加することが可能
- 台帳
    - ブロックチェーンで扱うデータです
    - 全てのトランザクション履歴が記録されたブロックチェーンデータと、それらトランザクションの結果だけが記録されたステートデータの 2 種類が保存されています
- Chaincode
    - ブロックチェーンにおけるビジネスロジックです
    - あるトランザクション(開発者が定義するもの)に対して、何かしらの処理を行い、必要に応じて台帳を読み書きする処理をするプログラムコードです

中でも次の点は Hyperledger fabric の特徴です。

- ステートDB(CouchDB, LevelDB) にトランザクションの結果が保存されている
- ポリシーによりネットワーク内の操作全てに対して制御するルールが定義できる

ステートDBがあることで、連なった各ブロックを計算する必要がなく効率的です。

尚、ステートDBの改ざん(破壊) は出来てしまいますが、トランザクションの検証時に他多数の Peer における検証結果により破棄されることになります。

ステートDB は LevelDB か CouchDB のどちらかを使うことができます。

Channel には様々なポリシーを設定することが可能です。
ポリシーではトランザクションの検証が成功する条件等を柔軟に制御することができます。

# まとめ

今回は Hyperledger fabric が分散台帳ソフトウェアであり、コンソーシアム型ブロックチェーンを構築出来ること、活用例として航空機中古パーツのオンラインマーケットや食品トレーサビリティシステム、鉱物の採掘場から加工品までのトレーサビリティシステムがあることを紹介しました。

また、Hyperledger fabric システムを構成するコンポーネントを構成例を元に紹介しました。

次は Hyperledger fabric が公式に紹介するサンプルを動かしてみた結果を紹介します。

※この記事は [WESEEK Tips wiki](https://tips.weseek.co.jp/) に 2020/11/30 に投稿された記事の転載です。
Tips wiki では、IT企業の技術的な情報やプロジェクトの情報を公開可能な範囲で公開してます。