【ブロックチェーン】ゼロ知識の人がSAP Cloud Platform上のブロックチェーンサービスを体験する方法

# はじめに
[SAP Advent Calendar 2019](https://adventar.org/calendars/3908) の12月4日の記事として投稿しています。

**対象**
・SAP界隈の人（SAP Cloud Platformを触ったことがあると良い）
・経験や知識は無いけど、取り敢えずブロックチェーンに触れてみたい人

**この記事で書かれていること**
今回は「ブロックチェーンとは？」「Hyperledger Fabricって何？」についてはほとんど触れていません。

正直、ブロックチェーンは手を付けるまでのハードルが非常に高いと思います。
仕組みを理解するにも、その仕組のメリットを理解するにも時間が掛かるからです。
そして取り敢えず触ってみようにも、必ずと言って良いほど環境構築の過程で一度は躓いてしまいます。

本記事ではまず、「SAP Cloud Platform」のブロックチェーンサービス（BaaS）を利用することで、本来は自力で行わなければならない環境構築をすっ飛ばし、兎にも角にもまず「ブロックチェーンに触れてみよう」というところにフォーカスしています。

最終的には以下のようなアプリケーションを動作させ、アプリケーションから登録されたブロックチェーン上のデータをGUIから確認するところまでを解説していこうと思います。
アプリケーションは既にサンプルとして用意されているので、ノンコーディングでブロックチェーンを体感することができます。
<img width="1365" alt="スクリーンショット 2019-12-04 22.17.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/a7248527-5858-f96b-07be-7f9b9ded7806.png">
<img width="856" alt="スクリーンショット 2019-12-04 22.19.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/7e6538f9-285f-a725-1cba-56c6e1e82d0d.png">

ブロックチェーン基盤は正直何でも良いのですが、今回は国内でも良く耳にする「Hyperledger Fabric（以下、HLF）」を取り上げてみたいと思います。

HLFについて詳しく学びたい方は、以下のサイトがおすすめです。
・Hyperledger Fabric 入門, 第 1 回「基本的な構成」
https://www.ibm.com/developerworks/jp/cloud/library/cl-hyperledger-fabric-basic-1/

少し長くなりますが、興味ある方は是非読んでみて下さい。

# SAP Cloud Platform上のブロックチェーンサービスを試してみる
#### １．トライアル環境からHLFサービスプランを確認する
まずはSAP Cloud Platform（CF版）のトライアル環境を準備しましょう。
今回使うHLFサービスは、現状AWSでのみ使えるということで、リージョンはアメリカ東海岸(VA)を選択しました。

最初にクォータから2つのHLFサービスプランを確認します。
<img width="772" alt="スクリーンショット 2019-12-04 20.30.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/b173198b-bc44-207a-3ac0-2d6fc67904ee.png">
大まかなサービスプランの概要は以下になります。
**・dev：ノード、チャネル※の作成などが可能**
**・channel：チャネルに所属するノードに対して、チェーンコードのデプロイ・管理などが可能**
※チャネルとは、ノード（参加者）をまとめるグループのようなもの。同じチャネルに所属するノードには同じルール（チェーンコード）が適用されます。

#### ２．領域を作成する
「dev」「channel」それぞれのサービスプランに対して領域を作成します。
###### (1)devサービスプラン用の領域を作成する
ここでは「nodes」という領域名を付けています。
この領域でノードとチャネルを作成します。
ノードとはブロックチェーンネットワークの１構成要素のことで、「参加者」くらいに考えておけば良いでしょう。
###### (2)channelサービスプラン用の領域を作成する
ここでは「hlf-apps」という領域名を付けています。
この領域で、該当チャネルの各ノードに対してチェーンコード※をデプロイします。
アプリケーションのデプロイも行うことができます。
※スマートコントラクトと大体同じ意味。ブロックチェーンネットワーク内のルールのこと。平たく言うとビジネスロジック。

このように作成できました。
<img width="848" alt="スクリーンショット 2019-12-04 21.11.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/57c6cb01-779f-038e-efd5-cc461349e9b1.png">

#### ３．ノードを作成する
先程作成した「nodes」領域に入ります。
ノードを作成するために、まずはHLFのDevサービスインスタンスを作成しましょう。
サービスマーケットプレイスから「Hyperledger Fabric」を検索して選択します。
<img width="1432" alt="スクリーンショット 2019-12-04 21.03.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/a413be5f-ecd3-1713-871a-5c0a06a65796.png">
「インスタンス」メニューから「新規インスタンス」を押下し、サービスプランでは「dev」を選択します。
オプションのパラメータ指定、アプリケーション割当は何も設定せずに、ノード名を適当につければ作成完了です。
<img width="1423" alt="スクリーンショット 2019-12-04 21.19.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/0068a99a-e778-2b2c-175f-1814f71d0809.png">
インスタンスの中を覗いて、ダッシュボードを開いてみましょう。
<img width="856" alt="スクリーンショット 2019-12-04 21.23.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/50d1901d-e6be-5b3e-b9a6-c7627e52cbe5.png">
それっぽい画面が表示されたと思います。
componentに表示されている「Orderer」「Peer」「CouchDB」などのワードは、聞いたことがある人もいるでしょう。

これで１つノードを作成することができました。
今回はチェーンコードを動かすことが目的なので、ノードは１つで十分でしょう。

#### ４．チャネルを作成する
ダッシュボードの「Channels」メニューから作成できます。
当然、ノードを1つしか作成してないので、Channelに含めるPeerの数も1つしか表示されません。
<img width="1406" alt="スクリーンショット 2019-12-04 21.37.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/1993a135-ee00-a65b-1d04-9d60ee4f04f9.png">
チャネルが作成できたら、チャネルにアクセスするためのサービスキーを生成します。
<img width="849" alt="スクリーンショット 2019-12-04 21.44.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/0a45af58-e518-06f6-3be4-798b7ec62f3c.png">
<img width="829" alt="スクリーンショット 2019-12-04 21.44.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/8bf5ef50-7f44-b14d-4bc4-493e3de89213.png">

これでサービスキーの生成は完了です。
サービスキーは、次のステップで作成する「channel」サービスインスタンスと、先ほど作成したチャネルを紐付けるために使用します。

#### ５．channelサービスインスタンスを作成する
今度はchannelサービスプラン用の領域「hlf-apps」に入ります。
さっきと同じ要領でサービスマーケットプレイスからHLFサービスを選択し、インスタンスを作成します。
※今度は「channel」プランを選択することに注意して下さい。
<img width="1042" alt="スクリーンショット 2019-12-04 21.51.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/dcac8a98-ad57-dc11-7b1c-a6eb2b0115ae.png">
パラメータ指定で先程生成したチャネルのサービスキーを貼り付けて下さい。
<img width="1019" alt="サービスキー入れるやつ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/fcf28ebc-6367-b41d-0c52-8517f1549cad.png">
インスタンスの作成が終わりました。
<img width="1422" alt="スクリーンショット 2019-12-04 21.54.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/c69d0392-1888-47be-6faf-a39e8f535885.png">
先程と同じようにインスタンスを選択して、ダッシュボードにアクセスします。
先程サービスキーを指定したチャネルに紐付いてることが確認できます。
<img width="853" alt="スクリーンショット 2019-12-04 21.58.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/28a212ce-1ff2-e9ef-12e1-63a94b234a12.png">

#### ６．サンプルチェーンコードを動かしてみる
ここまで来れば、後少しです。
ダッシュボード「Chaincode」メニュー > 「Example Chaincodes」
<img width="1143" alt="スクリーンショット 2019-12-04 22.00.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/dda9cf68-744e-4c8b-000a-272d32f5f5c8.png">
「Hello World」を選択します。
<img width="1021" alt="スクリーンショット 2019-12-04 22.01.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/0597155f-e508-4cf7-e2ad-2414d23aadb0.png">
「Deploy Chaincode」で確定。

これでサービスで既に用意されているサンプルのチェーンコードを試せるようになりました。
早速、チェーンコードを動かしてみましょう。
<img width="875" alt="スクリーンショット 2019-12-04 22.04.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/d8084c9a-fa48-6ea7-f937-12f2b648c1d3.png">

<img width="1428" alt="スクリーンショット 2019-12-04 22.05.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/2ce7673b-379f-3023-2508-10758847f565.png">
はい。ここまで来れば、後はAPIを叩くだけですね。
サンプルチェーンコードの中身は2つのメソッド（登録・取得）です。
それをデプロイすることでREST APIとして使用することができるようになったということです。

POST：IDをキーにメッセージを登録する
GET：IDをもとにメッセージを取得する

<img width="1415" alt="スクリーンショット 2019-12-04 22.07.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/5c86fb4f-103b-14d9-df20-992a661c0b24.png">
登録しました。
<img width="710" alt="スクリーンショット 2019-12-04 22.08.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/02d003ca-724a-f227-93d5-b700b28164ba.png">
取得できました。
ここで、ダッシュボードの「Explore」メニューを見てみましょう。
<img width="821" alt="スクリーンショット 2019-12-04 22.10.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/0c7fdfb5-bdb8-783b-b856-30aade90062d.png">
ブロックチェーンっぽさが少し滲み出ていませんか。
チェーンコードにより登録されたメッセージの履歴は「ブロック」として繋がれて行き、過去の分まで遡ることができます。
そして、このブロックはPOSTで登録処理を行うたびにどんどん増えていきます。（通常、１トランザクションで１Blockということはあまり無いように思いますが。）

#### ７．サンプルアプリケーションを動かしてみる
いよいよ最後です。
ダッシュボード「Chaincode」メニュー > 「Example Application」
サンプルとして車の走行距離をブロックチェーン上で読み書きするアプリケーションが用意されているようです。
<img width="1425" alt="スクリーンショット 2019-12-04 22.11.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/70a419fd-3413-c962-e5c0-7bdd447bb944.png">
デプロイ後、URLが表示されるのでアクセスします。
<img width="794" alt="スクリーンショット 2019-12-04 22.14.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/a910bc6c-3eb5-24a4-9640-f188d49d748f.png">
はい。後は先程と同じですね。
<img width="1365" alt="スクリーンショット 2019-12-04 22.17.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/a7248527-5858-f96b-07be-7f9b9ded7806.png">
ブロックももちろん追加されていきます。
<img width="1176" alt="スクリーンショット 2019-12-04 22.16.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322636/0dd6f287-85b4-ba31-b835-d317b02cd5bd.png">

これでSAP Cloud Platform上のブロックチェーンサービスの体験は終了です。
ここではサンプルアプリケーションを使用しましたが、もちろん自前のチェーンコードをデプロイすることも可能です。
Go言語とチェーンコードのお作法（Init,Invoke関数など）をある程度抑えていれば、意外とスムーズに開発ができるはずなので、興味ある方は試してみてはいかがでしょうか。

# おわりに
もはや幻滅期に入ったブロックチェーン。
一向に実用化が進まない現実を見て、しばらく興味が離れていた人も多いのではないでしょうか。

しかし、きっと数年後（もっと先かも知れません）ブロックチェーンが当たり前に使われる場面は出てくると思っています。
ブロックチェーンの本質は「技術」ではない。
既存業務の置き換え検討や、RDBとの比較など、いくらやっても大して意味を成さないと思います。

ブロックチェーンに関して、こんな言葉を聞いたことがあります。
> ブロックチェーンは、新しい星を見つけてそこに自分たちだけの国をつくる、そんなイメージを具現化する手段だ。

もしこれが本当だとしたら、ワクワクしますよね。

それでは。