Ethereumの企業向けprivate chainであるQuorumについてまとめたよ

## Quorumとは
Quorumは、JPモルガン主導で開発が行われている、トランザクションとコントラクトに秘匿性を持たせることができるEthereumをベースにした分散台帳プロトコルで、パブリックブロックチェーンであるEthereumとは異なるコンセンサスアルゴリズム(後述)に基づいています。

![logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264708/ed3b1226-8543-7345-2282-2ae8fa5a4cbd.png)

Quorumは、[go-ethereum](https://github.com/ethereum/go-ethereum)をフォークしたプロジェクトで、次のような特徴があります。

- **Privacy**
    - トランザクションやコントラクトの秘匿化が可能になっており、Peer同士での暗号化されたメッセージの交換なども行うことができます。
- **Consensus Mechanisms**
    コンソーシアムブロックチェーン(プライベートブロックチェーン)として利用できるコンセンサスアルゴリズムを選択することができます。
    - Raftベースコンセンサス -
    ブロック生成速度が速く、ファイナリティを得ることができ、トランザクションが発生するごとにブロックを生成する設定にもできる。
    - Istanbul BFT
    
- **Peer Permission**
  コントラクトによって、node/peerの参加を許可することができる
- **Higher Performance**
  パブリックブロックチェーンのgethよりも、格段に速くトランザクションを処理することができます。

## Quorumの構成
- **Quorum Node** - 
Quorumノードは次の点がgethと異なります。
    - コンセンサスがPoWに代わってRAFTまたはIstanbul BFT
    - P2Pレイヤーが、許可されたノード間でのみ同期するように変更
    - ブロック生成および検証ロジックに、`global state root`ではなく`global public state root`が使用
    - `State Patricia trie`が、`Public state Patricia trie`と`Private state Patricia trie`に分割
    - ブロック検証ロジックが`Private Transactions`を扱えるように変更
    - トランザクション生成の過程で、dataの中身を暗号化されたhash値でも可能なように変更
    - Gasの排除
- **Privacy Manager(Tessera)**
    - **Transaction Manager**
        - 暗号化されたトランザクションデータのへのアクセス権を持つ。秘密鍵は保持しない。
        - Enclaveとのやり取りを行う。
        - 他参加者のTransaction Managerとの通信
    - **Enclave**
        - 秘密鍵を保持する。
        - (安全面を意識して)Tesseraと別プロセスで動かすことも可能。
![Quorum Design.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264708/22225b2b-0732-a305-f736-27cb8b580e13.png)

## Quorumの仕組み
Quorumは、二つの状態(state)を持つ。

- **Public state**(全てのnodeからのアクセスが可能)
- **Private State**(許可をもらっているnodeのみがアクセス可能)

トランザクションの暗号化を行うかどうかで、保有する状態が違う。public stateは全てのノードが保有しているが、private stateは、そのトランザクションに関係があるノードのみがローカルで保有する。コントラクトの変更に関しては、private コントラクトから public コントラクトのvalueを変更することはできず、READ onlyになる。private トランザクションに関しては、全てのノードの間で共有している訳ではないので、private stateにおいてコンセンサスを取ることはできない。その点を克服するために、RPC method `eth_storageRoot(address[, blockNumber]) -> hash`が準備されており、任意のブロック高でのアドレスのstorageRootを返す関数が用意されており、Transaction関係者は確認することができる。

## コンセンサス比較


| |Raft |Istanbul BFT|
|-----------------|------------------|------------------|
| ブロック生成時間|50msec| 1~10sec|
| proposer選出アルゴリズム| Leaderが落ちるまで交代しない| ラウンドロビン|
| nodeの追加|できない| できる|
| ビザンチン耐性|crash recovery|BFT|
| ブロック生成手順|未承認Txがあれば生成|未承認Txがなくても生成し続ける |
| 最大許容故障数Fに対する最適ノード数|2F + 1 |3F + 1|

信用できる参加者のみで運営する場合は、Raftコンセンサスを選択し、利害が対立する参加者同士で運営する場合は、Istanbul BFTを選ぶのが良い。

## その他
### ツール
* [Quorum Blockchain Explorer](https://github.com/blk-io/epirus-free) - private トランザクションの可視化を可能にするブロックチェーンエクスプローラー
* [Quorum Maker](https://github.com/synechron-finlabs/quorum-maker/) - quorumネットワークと周辺の設定をいっぺんにできるツール。
* [quorum-cloud](https://github.com/jpmorganchase/quorum-cloud) - ネットワークのawsへのdeployをサポートする
* [Cakeshop](https://github.com/jpmorganchase/cakeshop) - 総合開発環境SDK
* [quorum.js](https://github.com/jpmorganchase/quorum.js) - web3のquorum版

### tutorial
docker-composeかvirtual machineでローカル環境に７つのノードを立てて、private/public transactionの送受信を確認できる。
https://github.com/jpmorganchase/quorum-examples

### quorum関連参考資料
https://docs.goquorum.com/en/latest/
https://qiita.com/hayago/items/60f6e71b6cba1def9006
https://github.com/jpmorganchase/quorum/blob/master/docs/Quorum%20Whitepaper%20v0.2.pdf
https://azuremarketplace.microsoft.com/en/marketplace/apps/enterprise-ethereum-alliance.quorum-demo?tab=Overview
https://docs.google.com/presentation/d/1GH_1B-3A-FSdiE8A8dfsWy2qs8nwUqjOPC5regI6Tds/edit#slide=id.g61a5d76747_0_555
https://scrapbox.io/layerx/Quorum