Hyperledger Fabricでサンプルアプリを作って気づいたこと

ブロックチェーン基盤の一つ Hyperledger Fabric が、どんなものか知るためには、環境を作って、サンプルを作成してみるのが一番！と思い、ブロックチェーンの教本やGithubなどに公開されているソースコードに力を分けてもらい、色々寄せ集めながらサンプルアプリを作成してみました。

参考書籍：
[ブロックチェーン 仕組みと理論 サンプルで学ぶFinTechのコア技術](https://www.amazon.co.jp/%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3-%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A8%E7%90%86%E8%AB%96-%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AD%A6%E3%81%B6FinTech%E3%81%AE%E3%82%B3%E3%82%A2%E6%8A%80%E8%A1%93-%E8%B5%A4%E7%BE%BD%E5%96%9C%E6%B2%BB-%E7%B7%A8%E8%91%97/dp/4865940405)
[ビットコインとブロックチェーン:暗号通貨を支える技術](https://www.amazon.co.jp/%E3%83%93%E3%83%83%E3%83%88%E3%82%B3%E3%82%A4%E3%83%B3%E3%81%A8%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3-%E6%9A%97%E5%8F%B7%E9%80%9A%E8%B2%A8%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-%E3%82%A2%E3%83%B3%E3%83%89%E3%83%AC%E3%82%A2%E3%82%B9-M-%E3%82%A2%E3%83%B3%E3%83%88%E3%83%8E%E3%83%97%E3%83%AD%E3%82%B9/dp/4757103670/ref=tmm_other_meta_binding_swatch_0?_encoding=UTF8&qid=1503293039&sr=8-2)

# 作ったもの

QRコードを読み込んだら、ポイントを取得できるiOSアプリを作りました。
（一応ポイント使用もできます。）
<img src="https://qiita-image-store.s3.amazonaws.com/0/92506/abc0ccb0-3e2b-974b-0042-b1b62c8b0f45.jpeg" width=300 border="1">

ポイントの書込先はもちろんHyperledger Fabricのブロックチェーンです。

# 作るもの

サンプルアプリを作るのに作る必要があるのは、3つ。

- Hyperledger Fabricの環境
- Chaincode（Go）
- クライアントアプリ（Swift）

この3つですが、実際作ってみると、

- Hyperledger Fabricの環境　→　データベースサーバー
- Chaincode　→　バックエンド処理
- クライアントアプリ　→　JSON-RPCを実行するハリボテ

みたいな感覚でした。
厳密には違いますが、こう考えると一気にイメージしやすくなりました。

# 作って気づいたこと
作って気づいたことです。

## Key/Valueの変更値が読めない
なんで気づかなかったのということでもあるのですが。。。

ポイント取得・使用するアプリなので、その履歴を参照できるログをブロックチェーンから引っ張ってきたかったのですが、ユーザーとか数字とかが”読める”形のトランザクションになっていませんでした。

↓トランザクションの情報（http://[ホスト]/transactions/[uuid] で取得）↓
<img width="1270" alt="スクリーンショット 2017-08-21 14.43.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/92506/e1544925-16da-140e-21d2-f05247c8725e.png">


Bitcoin Coreのように下記のような形で値が取れたら、いい感じに履歴が出せたのですが、そうはならないようです。

↓Bitcoin Core環境でトランザクションを取得するコマンドを打った時の情報↓
<img width="459" alt="スクリーンショット 2017-08-21 11.48.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/92506/a26013d2-f83d-ef0e-8d89-e0e12a1a1f89.png">

このようになっているのはやはり、Hyperledger FabricではKey-Valueストアという形でデータを保持しているからなのだと思います。

このKey-Valueストアには、任意に項目を設定して自由に値（数字、文字列）を格納できます。

Bitcoin Coreでは、トランザクションに格納された値を累積して、現在所持しているビットコインの量を計算するというスタイルのようですが、このKey/Valueストアでは値を上書きしていくスタイルのようです。Hyperledger Fabricのトランザクションには、「Key/Valueストアを変えたよ」というのがハッシュ値（？）で格納されているのではないかと思います。

よく履歴を自分で調べられるというのがブロックチェーンの利点と言われますが、Hyperledger Fabricはその限りではないようですね。
（見る方法あったらディスってすみません。）

## Key-ValueストアはChaincodeに紐づく

見出しだけ見ると、「へぇーそうなんだー」って感じですが、かなり重要です。

Chaincodeは、ソースを修正してデプロイするたびに新しいIDになります。

で、Key-ValueストアはChaincodeに紐付いているので、新しいChaincodeが処理を行う対象は、新しいKey-Valueストアになります。

このことで何が起こるか端的に言うと、

Chaincodeを修正すると、Key-Valueストアが初期化されたような状態になります。

実際に初期化されているわけではありません。修正前のチェーンコードに紐付いているKey-Valueストアは残っています。

なので、Chaincodeの処理の内容を修正する必要が出て、これまで蓄えたKey-Valueストアを今後も使っていこうとする場合には、修正前のChaincodeのKey-Valueストアを読み込んでくる処理をChaincodeに加えておく必要があります。

上記内容をどんな感じか図にしてみました。

↓読込処理なし↓
<img width="1069" alt="スクリーンショット 2017-08-18 10.56.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/92506/05e1374b-14a5-a308-e31d-64eed0c3a0f0.png">

↓読み込み処理あり①↓
<img width="1042" alt="スクリーンショット 2017-08-18 10.56.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/92506/6d04ba5b-52b7-ab97-417a-cd5c582e3b3b.png">
↓読み込み処理あり②↓
<img width="1041" alt="スクリーンショット 2017-08-18 10.56.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/92506/8cf67ee8-d97d-bd13-e61a-92d247da4971.png">

# 終わりに

実際に作ってみると思ってもみなかった事実に気づくことができました。（作る前に気づけ。。）
思っていたよりも単純でなく、大丈夫なの？という感じになっていて、Hyperledger Fabricってどうなんだろという印象も正直受けました。
ブロックチェーンというデータ構造で、改竄に強いという利点は十分残っているんですけどね！

サンプルアプリのソースコードはいつかあげようかなと思います。