ブロックチェーン案件を受ける前の下調べ

[ACCESS Advent Calendar 2021](https://qiita.com/advent-calendar/2021/access)の6日目の記事は@KensukeTakaharaが担当します。

先日の会社の忘年会でぽろっと「ブロックチェーン案件を取ってきてくださいよ」と口が滑ってしまいました。本当に取ってきていただいた時に「何も知りません」ではまずいので下調べしました。ここ 2~3 日で調べたので間違っていたらすいません。

# ブロックチェーンで出来ること

取引(トランザクション)履歴の管理です。下記のようなメリットがあります。

- データの改竄が非常に困難
  - トランザクション発行の偽造やトランザクション履歴の改竄が非常に難しい。
- トランザクション履歴が残る
  - 全てのトランザクション履歴は記録として残る。トレーサビリティが高い。
- 障害に強い
  - 分散処理してる。

## ブロックチェーンで出来なさそうなこと

あくまで履歴の管理に適したデータ構造で、データベースのような大容量で複雑なデータモデルには不向きみたいです。
[参考](https://www.slideshare.net/Hyperledger_Tokyo/hyperledger-fabric)

##ユースケース

Linux Foundation が開発する [Hyperledger Fabric](https://www.hyperledger.org/use/fabric) は企業向けブロックチェーンプラットフォーム OSS です。企業向けブロックチェーンとしては標準と言っていいほど普及しています。
その　Hyperledger Fabric　のユースケースをまとめた[素晴らしい記事](https://qiita.com/tatsurou313/items/ca124beb9d9e06cceb77#hyperledger-fabric-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%93%E3%81%A8)があったので引用させていただきます。

> - [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コードをスキャンして必要な書類をダウンロードするモバイルアプリ
        - サプライチェーンの可視化と問い合わせへの回答を提供するために企業オフィスで動作するデスクトップ版

## ブロックチェーン == 暗号資産(仮想通貨)ではない？

ビットコインやイーサリアムはブロックチェーン技術を使っていて上述のメリットを持っているので通貨として流通しています。インターネットを通じてトランザクション用ノードが接続され、誰でも暗号資産を売買できるようになっています。ビットコインやイーサリアムはパブリック・パーミッションレスブロックチェーンというカテゴリに分類されます。
![public.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163276/3fcb1d9a-c425-d4c8-69f2-3d544ba30f9a.png)

企業向け受託案件としてソリューションを考えるなら、インターネットには公開せず限定されたユーザー・クライアントのみ接続できる形式のプライベート(or コンソーシアム)・パーミッションブロックチェーンである事が多そうです。次章でその一例を紹介します。

# 企業向けブロックチェーンシステムの構築例

先ほども出てきた企業向けブロックチェーンプラットフォームである Hyperledger Fabric を AWS にデプロイするワークショップである [non-profit-blockchain](https://github.com/aws-samples/non-profit-blockchain) の Part1~4 を動かして分かったことをまとめます。

## インフラ

AWS の構成は下図のようになりました。

![private.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163276/0add81b0-432c-3632-735b-258f4e6367e4.png)

- AWS Managed Blockchain
  - マネージド型のブロックチェーンサービス。時間単位の従量課金。
     - プライベートネットワークを選択すると Hyperledger Fabric が起動する。VPC を紐付けず、VPC エンドポイントだけ提供される。がっつり隠蔽されている。
     - パブリックネットワークを選択すると Ethereum パブリックネットワークに参加するノードを作成できる。
- REST API Server 兼 Fabric Client Node EC2 と ELB
  - REST API Server としてリクエストを受けて、Hyperledger Fabric にはクライアントとしてトランザクション送信・取得を行う。
- Hosting Server (兼 Cloud9) EC2
  - ここは S3 + CloudFront でも代用できます。ワークショップの構成は Cloud9 用 EC2 にホスティングさせていました。
- Web Application
  - Web Application から REST API を叩くことでブロックチェーンを動かします。

## アプリケーション

Web とブロックチェーンの連携は下記のようになっていました。Hyperledger Fabric の解説はそれだけで別の記事ができるくらいのボリュームなのでここでは割愛して、関係する部分だけ書きます。

![application.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163276/690b06b2-7981-f8a1-6e63-89754e5c1532.png)


- ユーザー登録
  - パーミッションブロックチェーンを構築するので、Webアプリケーションのユーザーをブロックチェーンに参加者として登録します。登録された参加者には証明書が発行され、REST API Server 内の KVS に保管されます。
- トランザクション取得 API
  - REST API Server はトランザクション取得 API を受けると Hyplerledger Fabric のデータストア(分散型台帳)にクエリを発行します。取得したトランザクションを Web Application に返します。
- トランザクション発行 API
  - REST API Server はトランザクション発行 API を受けると Hyplerledger Fabric にトランザクションを送信します。REST API Server は一旦、トランザクションを送信に成功した時点で Web Application にレスポンスを返します。トランザクションは Hyplerledger Fabric 内のピアノードで処理された後、成功 or 失敗すればブロックイベントで通知します。
  - トランザクション処理時間はトランザクションの処理数やピアノードのスペックに依存して増減します。
- ブロックイベント
  - トランザクション関連のイベントが発生した時、WebSocket でブロードキャストして Web Application に通知します。暗号資産の売買を行なったことがある方なら身に覚えがあるかもしれませんが、意外と時間かかりますよね。

# 終わりに

[non-profit-blockchain](https://github.com/aws-samples/non-profit-blockchain) では REST API Server に API Gateway + Lambda のサーバーレスを使う構成や、ユーザーの認証に　Cognito を使うパターンもあります。AWS 内のサービスと組み合わせれば柔軟なブロックチェーンサービスが構築できそうですね。

## 参考にした書籍

[ブロックチェーン実践入門](https://www.ohmsha.co.jp/book/9784274225376/)