HyperLedger-fabricネットワークの構成と構築手順

## はじめに
Hyperledger-fabric(以下HLF)の基盤部分の理解があいまいだったので、まとめてみました。


【本記事で触れないこと】

- Blockchainとは
- Hyperledger-fabricとは
- HLFネットワーク構築時の具体的なコマンド

## HyperLedger-fabricネットワークの全体像
構築を始める前に、HLFネットワークの全体像を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/d9b0e068-639e-45bc-f0e5-e8e8391fa839.png)

|  要素  |  役割  |
| ---- | ---- |
|  R*  |  HLFネットワークに参加する組織  |
|  C1  |  チャネル。 参加者が相互に通信するまとまり。参加者は複数のチャネルに所属することができる。(チャネルごとに、台帳やStateDBを保持する。)|
|  CC1  |  HLFネットワークの構成情報やチャネルに参加する際のポリシー等をまとめたもの。(組織はこのポリシーに合意したうえでHLFネットワークに参加する。)  |
|  P*  |  HLFネットワークを構成する。台帳とスマートコントラクトを保持する。  |
|  L*  |  台帳(Ledger)。トランザクションの履歴や結果、ネットワーク内の状態を保持する。  |
|  S*  |  スマートコントラクト。 台帳に対して参照や更新などを行うロジック。 |
|  O  | トランザクションからブロックを作成し、各Peerに配布する。 |
|  A*  | クライアントアプリケーション。SDKを用いて、Peerに対してトランザクションを発行する※ |
|  CA*  |  認証局(Certificate Authority)。参加者に対して証明書の発行や失効を行う。(ここで発行された証明書を用いることで、各要素はトランザクションの発行や署名などが行える。)  |

※クライアントアプリケーションから発行されたトランザクションがどのようにHLFネットワーク内を伝播するかは下記参照ください。
https://qiita.com/Annoske/items/7e997461e4fd4c417aa6


補足：
あまり触れませんが、チャネルが複数ある場合は下記のような構成になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/99b20d1f-c256-c066-bed6-533e26f7486e.png)


## HyperLedger-fabricネットワークの構築手順

下記手順でHLFネットワークを構築します。

1. ネットワークを作成する
1. 認証局を設定する
1. チャネルを作成し、参加者を所属させる
1. チェーンコードを各Peerにインストールする
1. クライアントアプリケーションをチャネルに接続する

### ネットワークを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/0530e8cb-e5a6-0480-a925-fb1013952349.png)

まず、これから作成するHLFネットワークの構成情報やポリシーをまとめたChannel Configuration(CC1)を作成します。
CC1の中に、参加する組織(R*)を記載して、R1,R2,R0がHLFネットワークに参加することを明示します。

例)

```
- &Org1
    # DefaultOrg defines the organization which is used in the sampleconfig
    # of the fabric.git development environment
    Name: Org1MSP

    # ID to load the MSP definition as
    ID: Org1MSP

    MSPDir: ../organizations/peerOrganizations/org1.example.com/msp

    # Policies defines the set of policies at this level of the config tree
    # For organization policies, their canonical path is usually
    #   /Channel/<Application|Orderer>/<OrgName>/<PolicyName>
    Policies:
        Readers:
            Type: Signature
            Rule: "OR('Org1MSP.admin', 'Org1MSP.peer', 'Org1MSP.client')"
        Writers:
            Type: Signature
            Rule: "OR('Org1MSP.admin', 'Org1MSP.client')"
        Admins:
            Type: Signature
            Rule: "OR('Org1MSP.admin')"
        Endorsement:
            Type: Signature
            Rule: "OR('Org1MSP.peer')"

    # OrdererEndpoints is a list of all orderers this org runs which clients
    # and peers may to connect to to push transactions and receive blocks respectively.
    OrdererEndpoints:
        - "orderer.example.com:7050"
```

上記設定ファイル(configtx.yaml)の詳細は下記から確認できます。

https://hyperledger-fabric.readthedocs.io/en/latest/create_channel/create_channel_config.html#organizations


### 認証局を設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/71b8e362-b8c3-14b6-1587-605e1f7cf413.png)

次に、各組織にトランザクション実行可能なユーザを作成するために、認証局(CA*)を設定します。(組織ごと)

CA自体は、hyperledgerが公開しているリポジトリをもとに作成することができます。
https://hyperledger-fabric-ca.readthedocs.io/en/latest/users-guide.html#install

### チャネルを作成し、参加者を所属させる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/8c3ccc4f-b0db-6089-890e-95be7ce2cdea.png)

Peer・Ordererを作成し、チャネルに所属させます。

Peer・Ordererは下記からインストールできるDockerイメージをもとに作成できます。
https://hyperledger-fabric.readthedocs.io/en/release-1.4/install.html

チャネルの作成方法
https://hyperledger-fabric.readthedocs.io/en/latest/create_channel/create_channel_participation.html


### チェーンコードを各Peerにインストールする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/072486bc-1dc4-67f3-c386-44a525bf53ea.png)

HLFネットワークに所属するすべてのPeerにチェーンコードをインストールします。


### クライアントアプリケーションをチャネルに接続する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/3046877b-8e98-cf15-2526-354c1d9b31df.png)

チェーンコードがPeerにインストールされ、チャネルに定義されると、クライアントアプリケーションはそのチェーンコードを参照することができます。

実際にクライアントアプリケーションがチェーンコードを実行する際、クライアントアプリケーションはPeerに対して「transaction proposal」を送信して、チェーンコードの実行を依頼します。


## おわりに
今回は構築手順のイメージだけまとめてみました。
じゃあ実際にどんなライブラリ使ってどんなコマンド打って...みたいなのは別途まとめようと思います。

間違いあればご指摘ください！🙏

## 参考
https://hyperledger-fabric.readthedocs.io/en/latest/network/network.html
https://hyperledger-fabric.readthedocs.io/en/release-1.4/build_network.html#install-prerequisites