Hyperledger-fabricのトランザクションフローについて

## はじめに
Hyperledger-fabricにおいて、トランザクションが発行されたときに、Blockchain内部でどのような処理があるのか気になったのでまとめてみました。

(BlockchainやHyperledger-fabricそのものについては扱いません)

## 構成要素
トランザクションフローを見ていく前に、Hyperledger-fabric(以下HLF)ネットワークにどんな構成要素があってどんな役割を持っているのか予習します。

ざっくり全体の構成はこんな感じになってます。↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/ddb616ea-febd-87f9-e209-442d7871f838.png)


### クライアントアプリケーション
HLFのSDKを用いてトランザクションを発生させる。
(正確にはHLFネットワーク内にいないです。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/03862c99-3b57-ca72-ce7a-f4083b4194ec.png)

### Organization
HLFネットワークに参加する1組織

### Peer(Endorsement)
「Endorser」とも呼ばれる。
受け取ったトランザクションの検証を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/2b309a89-8771-fe3f-4174-ea178616552d.png)
(検証するからチェックマークのイメージ)

### Peer(Commiting) 
「Commiter」とも呼ばれる。
受け取ったブロックをチェーンに追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/3bc5376d-1376-cc6d-6da7-4b99560a2e77.png)
(ブロックをチェーンに書き込むから鉛筆マークのイメージ)

### Orderer
トランザクションの結果を保持するブロックを作成し、各Peer(Commiting) にブロックを送信する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/4a6d0056-6e74-f6f1-42b1-4cf5f73fa224.png)
(ブロックを作成するからプラスマークのイメージ)

### 台帳
HLFネットワーク内の状態遷移(トランザクション実行など)を記録したもの。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/370301d2-18ff-71d3-9454-a8996810a407.png)

### Chaincode
台帳やstateDBに対して、参照や更新を行うロジック(スマートコントラクト)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/07f27247-db9f-14e8-806d-7d6eb3796fc4.png)

### stateDB
HLFネットワーク内で参照するデータベース。
(各Organizationごとに同一の値を保持する)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/5d97411c-7e7a-7744-67b6-abb4c5a39edc.png)

### CA
(トランザクションフローとはかかわりが少ない要素になります。こんなのがいるよって紹介だけ。)
HLFネットワーク内の認証局
Chaincodeの実行権限等を含んだ証明書を発行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/9c23c582-6eba-f4a1-374e-3aa42b9c9efa.png)
(認証局だから鍵マークのイメージ)


## トランザクションフローとコンセンサスの流れ
クライアントアプリケーションからトランザクションが発行されると、HLFは下記の3つのフェーズを経てトランザクション結果を台帳に反映させます。

1. Endorsementフェーズ
1. Orderingフェーズ
1. Validationフェーズ

### Endorsementフェーズ
1. Proposal：クライアントアプリケーションがPeer(Endorsement)に対して、SDKを用いてトランザクションを送付する
1. Proposal Response：Peer(Endorsement)がそのトランザクションを仮実行し、自身の署名(Endorsement)を加えてクライアントに返却する。クライアントはEndorsementPolicy※が満たされていることを確認する
1. Transaction Submit：EndorsementPolicyを満たす署名が集まったら、Ordererに対して署名とともにトランザクションを送信する。

>※Endorsement Policy: あるChaincodeで台帳の更新を行う場合、どのようなEndosementを集めてこなければならないかを定める条件です。Chaincode×チャネル単位で設定できます。ここでEndorsementはPeer単位ではなく、組織を表すOrganization（Org）単位でカウントされることに注意してください。Org A,B,Cで構成されるコンソーシアムネットワークでそれぞれがふたつのPeerを持っている場合、Endorsement Policyは例えば「3つのOrgのうち、任意の2つのOrg配下のPeerからEndorsmentの取得」といったような条件になります。
このEndorsement Policyがすなわち「どうしたらコンセンサスが取れたことにして台帳に追記できるか」の条件になります。上記のような単純なOrg数（1～n）による条件から、スコアリングでの重みづけ評決など、かなり柔軟に条件を設定することができます。詳細は公式ドキュメントを参照しましょう。
https://gakumura.hatenablog.com/entry/2018/11/25/011810

【Proposal】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/96a3ebf7-6534-0f21-28d5-3a6f1b9e88ca.png)

【Proposal Response】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/0ed20cd0-46dd-39f6-8b4f-acdf834b1c74.png)

【Transaction Submit】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/27cc1826-1801-bd44-7f62-3575199172e3.png)

### Orderingフェーズ
1. Ordererはクライアントアプリケーションから受け取ったトランザクションをもとに、ブロックを作成する
1. 作成したブロックをPeer(Commiting)に送付する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/ebdb595b-15a7-0fe3-8858-510eee31a690.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/50e69345-1641-6d9d-3e05-27d1cbe7d752.png)


### Validationフェーズ
1. Transaction Validation：ブロックを受け取ったPeer(Commiting)は、ブロック内のトランザクションがEndorsementPolicyを満たしているか、Chaincode実行時からstateDBの値が変わっていないかをチェックする
1. Commit：Vallidationが問題なければ、ブロックを台帳に書き込み、stateDBへの書き込みをコミットする。(ここでChaincodeを再実行しているわけではなく、Write-Set※を書き込んでいる)

※EndorsementフェーズのChaincode実行時に作成される、台帳に書き込む予定の値セット

【Transaction Validation】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/7b929be2-5cf0-95e8-09fc-cc6457cae93d.png)

【Commit】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502798/a9839a8a-31f8-5103-2a7c-47b144761467.png)

## おわりに
以上が、トランザクションが発行されてからのHLF内の処理になります。
本記事では掘り下げてませんが、チャネルだったりEndorsementPolicyはコンセンサスに大きく関わってくるので、あわせて確認することをお勧めします。

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

## 参考
https://gakumura.hatenablog.com/entry/2018/11/18/020843
https://hyperledger-fabric.readthedocs.io/en/latest/txflow.html