Baseline Protocolとは

# Baseline Protocolとは
企業間の垣根を超えて業務プロセスを自動執行するための仕組みを提供するフレームワークのようなもの

- 企業間のデータ共有を低コストで実現できる
    - 低コストなのは、Low codeな[Provide](https://docs.provide.services/api/)というフレームワークを使い、かつ、既存の業務システム上に構築できるため
- 業務プロセスが正しく執行されたことをパブリックチェーンを使って検証できる
    - パブリックチェーンはEthereumを想定
    - 公開したくないデータは秘匿される（ゼロ知識証明）
- 名だたる企業が開発に参加している
    - 会計大手のEY, Blockchain大手のConcenSys, Tech大手のMicrosoft

_参考: [Baseline Protocol Welcome](https://docs.baseline-protocol.org/)_

# 手順
データを相手の企業に送信し、受信したら署名して、電子署名を生成し、ETHのコントラクトに追加する

※Baseline Protocolは[v0.1](https://docs.baseline-protocol.org/bri/bri-1)が最新であるが情報が足りていない。不足分は[POC](https://docs.baseline-protocol.org/bri/radish34)から補完する。



### グループ設定
- 入りたい企業グループ（Workgroup）に登録する or グループを新規作成
    - `OrgRegistry` というスマートコントラクトに自身を追加 or 新規作成
        - [OrgRegistry.sol](https://github.com/ethereum-oasis/baseline/blob/v0.1.0/core/contracts/contracts/OrgRegistry.sol)
- コントラクトからグループへの接続先（[messagingEndpoint](https://github.com/ethereum-oasis/baseline/blob/v0.1.0/core/contracts/contracts/OrgRegistry.sol#L19)）を取得する
- グループのエンドポイントに接続する
    - まずエンドポイントに招待を送る。次に認証情報を取得。それを使って接続

### ワークフロー設定
- データ共有に必要なルールを決める
    - フローが遷移するときのルール（zero knowledge circuitsで記述される）
- ワークフローコントラクトをデプロイ
    - Baseline Protocol RPC(`IBaselineRPC`)を実行する
        - 裏側で、[Nethermind](https://nethermind.io/)というBaseline ProtocolとEtherum RPCを実装したクラアントが実行される
        - [Interfaces](https://github.com/ethereum-oasis/baseline/tree/master/core/api#interfaces)
- ShieldやVerifierといったコントラクトをデプロイする
    - ShieldはMSA(Master Service Agreement)という契約書にあたるものや、PO(Purchase Order)という注文書にあたるものを作るコントラクト
        - [Shield.sol](https://github.com/ethereum-oasis/baseline/blob/v0.1.0/examples/radish34/contracts/contracts/Shield.sol)
        - 契約書や注文書はMerkle木状であり、本体ではなくハッシュ値ないし識別子が格納される
    - Verifierはzk-SNARK proofを検証するコントラクト
        - [Verifier.sol](https://github.com/ethereum-oasis/baseline/blob/v0.1.0/examples/radish34/contracts/contracts/Verifier.sol)

### ワークフローの実行
- ワークフローに沿ってデータの共有を開始する。フローの遷移は事前に決めたルールに基づいて行われる
    - 実際のデータ共有では[NATS](https://nats.io/)が使用される
        - P2P通信に対応したシンプルでセキュアなメッセージングミドルウェア


# アーキテクチャ
※アーキテクチャっぽくないのはそれらしい図がなかったから
![Screen Shot 2020-10-01 at 9.26.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48954/e815975e-c1e5-db06-ed1a-a6034f97b6bb.png)

- Messaging
    - 企業間のプライベートでセキュアな通信を行う
    - データベース(ERPやCRMに格納されているデータを切り出したもの？)の同期が行われる（と思う）
    - NATSとWhisper(Ethereum)の２つの方式に対応
    - [messaging](https://github.com/ethereum-oasis/baseline/tree/v0.1.0/core/messaging)
- API
    - Baseline Protocol RPCのこと
    - Provide(low codeフレームワーク)で作成した自社のマイクロサービスと通信
    - ワークフローを回すためのもで、MSA(契約書)やPO(注文書)の承認が主（と思う）
    - Ethereumと通信するためのAPIも提供
    - [api](https://github.com/ethereum-oasis/baseline/tree/v0.1.0/core/api)
- Privacy
    - zkSNARKのツールキットでZK proofを作る
    - 企業間の秘密の情報を明かすことなくMSA(契約書)やPO(注文書)がワークフロー通りに執行されたことを証明する（と思う）
    - [privacy](https://github.com/ethereum-oasis/baseline/tree/v0.1.0/core/privacy)
- Persistence
    - Off-ChainのMerkle木用データベース
    - MSA(契約書)やPO(注文書)がMerkle木状に格納されている（と思う）
    - 未実装
    - [persistence](https://github.com/ethereum-oasis/baseline/tree/v0.1.0/core/persistence)

# おまけ
参考のためPOCバージョンにおけるワークフローを紹介。
買い手が製品ABCを、売り手から購入する場合。

_参考: [Interactive Demo](https://docs.baseline-protocol.org/bri/radish34/radish34-interactive-demo#demo-workflow)_

## 契約締結
- (売り手) Baceline Protocolに対応したアプリケーションにて出店
- (買い手) Baceline Protocolに対応したアプリケーションで売り手を探す
- (買い手) ２人の売り手に決める
- (買い手) 売り手にRFQ(買いたいというリクエスト)を送る
- (売り手) RFQ(買いたいというリクエスト)を受ける
- (売り手) MSA(契約書が)を作成して送付
- (買い手) 売り手からのMSA(契約書)に署名する
- (売り手) 買い手が署名したことが通知される

## 注文執行
- (買い手) PO(注文書)を作成して２人の売り手に送付
    - 他方の売り手に対して、自身の取引は秘匿される
- (売り手) 届いたPO(注文書)を承認
- (売り手) 製品ABCを届ける
- (売り手) インボイスを買い手に送付
- (買い手) POが承認されインボイスが届く
- (買い手) インボイスに対して支払う
- (売り手) 支払いの執行が通知される