Bluemix上のIBM Blockchain (HyerLedger Fabric)を試してみる


#はじめに
インフラなど含めて、手軽にブロックチェーン基盤を作りたいと思い、
今回はBluemix上のIBM Blockchain上で展開されている
HyerLedger Fabricを試してみることにしました。
https://console-regional.ng.bluemix.net/catalog/services/blockchain

#HyerLedgerとは何か？
IBMや日立などが参加しているビジネス向けのブロックチェーンプロジェクトのことです。
HyerLedgerFablicがそのアプリケーションにあたり、オープンソースであるため、誰でも使うことができます。
特徴としては、ビットコインを例にすると、貨幣という機能を持たせるために、
不特定多数を対象としていましたが、Fabricはプライベートネットワークを対象にしています。
(参加者の登録、証明書の発行など権限設定を細かに行うことができます.)

#Bluemix->IBMBlockchain
IBMのクラウドサービスであるBluemix(PaaS、その中の機能としてWatsonなどがある)を使うことで、
HyerLedgerFablicのインフラなどを準備することなく使用することができます。
(IBMBlockchainのバックエンドでは、Hyperledger Fablic の v0.5(developer preview) が使われています。)
アプリの作成
![スクリーンショット 2017-06-27 16.34.17.png](https://qiita-image-store.s3.amazonaws.com/0/43766/51fbfd7e-a0fd-4ce3-0d8b-88d015f92176.png)


BlockChainを選択する
![block003.png](https://qiita-image-store.s3.amazonaws.com/0/43766/d874258f-4e40-261c-93dd-ffd9aa8c8603.png)

#体験版
今回は無料枠を使ってみました。![block005.png](https://qiita-image-store.s3.amazonaws.com/0/43766/b1a625b4-473d-a91a-280d-f3c972f065cb.png)

#サービス構成
3つのサービスから成り立っています
1.メンバーシップサービス
  アカウントの管理、権限、証明書発行など
2.ブロックチェーンサービス
  HTTP/2上に構築されたP2Pプロトコルを通じて、ブロックチェーンを管理する。
3.チェーンコードサービス
  ブロックチェーンにトランザクションの一部として保存されるアプリケーションコード。

#スマートコントラクト

サービス構成の3チェーンコードサービスは、スマートコントラクトと呼ばれています。
多くの場合、コントラクト（契約）をスマートに行えるプロトコルと説明されていて、ブロックチェーン上で実行されるアプリケーションレベルのコードを指しています。
よく使われるのが、「自動販売機」の説明で、自動販売機はお金を入れ、欲しい飲料のボタンを押下し、決済されるという取引行動の流れを、アプリケーションプログラムとして実装するようなことができます。
ブロックチェーンのスマートコントラクトを使った動きは、「ujo MUSIC」の例などにみられるように、音楽を販売する、購入する、権利関連の諸手続き、アーティストへの支払など複雑な処理を低コストでの導入を期待されているようです。



#実際にBluemixを操作してみます

##サーバー構成
![block001.png](https://qiita-image-store.s3.amazonaws.com/0/43766/14a647fc-61e5-0b8e-a41e-c89a1b29e86d.png)


1.まずページを開くとこのような画面になり
Hyeperledgerのデフォルトイメージでは
1.memberサーバー
2.peerサーバー
の2つから構成されていることがわかります。

##アカウントの確認
ネットワークの登録IDを確認するとIDと秘密事項が表示されます。
![block002.png](https://qiita-image-store.s3.amazonaws.com/0/43766/6f5296f3-4dc5-2a2b-018a-451f499922b2.png)


##手元のコンソールでAPIをCALLしてみる
実際にAからBへ送金する手順を試してみます
###1.ログインする

```
curl -X POST --header "Content-Type: application/json" --header "Accept: application/json" -d "{
  \"enrollId\": \"admin\",
  \"enrollSecret\": \"xxxxx\"
}" "https://xxxxx-vp0.us.blockchain.ibm.com:5002/registrar"

{
  "OK": "User admin is already logged in."
}
```

###2.deploy手順
AとBの残高をそれぞれ1000,2000とする

```
echo '{
  "jsonrpc": "2.0",
  "method": "deploy",
  "params": {
    "type": 1,
    "chaincodeID": {
      "path": "github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02"
    },
    "ctorMsg": {
      "function": "init",
      "args": ["a", "1000", "b", "2000"]
    },
    "secureContext": "admin"
  },
  "id": 1
}' | 
curl -X POST -H 'Content-Type: application/json' -d @- https://xxxxx-vp0.us.blockchain.ibm.com:5002/chaincode

{"jsonrpc":"2.0","result":{"status":"OK","message":"04233c6dd8364b9f0749882eb6d1b50992b942aa0a664182946f411ab46802a88574932ccd75f8c75e780036e363d52dd56ccadc2bfde95709fc39148d76f050"},"id":1}
```


###3.invoke(実行)手順
AからBに100送る

```
echo '{
  "jsonrpc": "2.0",
  "method": "invoke",
  "params": {
    "type": 1,
    "chaincodeID": {
      "name": "04233c6dd8364b9f0749882eb6d1b50992b942aa0a664182946f411ab46802a88574932ccd75f8c75e780036e363d52dd56ccadc2bfde95709fc39148d76f050"
    },
    "ctorMsg": {
      "function": "invoke",
      "args": [ "a", "b", "100" ]
    },
    "secureContext": "admin"
  },
  "id": 1
}' | 
curl -X POST -H 'Content-Type: application/json' -d @- https://xxxxx-vp0.us.blockchain.ibm.com:5002/chaincode

{"jsonrpc":"2.0","result":{"status":"OK","message":"57303de5-462a-4bde-a750-417fc7b70907"},"id":1}
```

###4.query(参照)手順
Aの残高>>900になった

```
echo '{
  "jsonrpc": "2.0",
  "method": "query",
  "params": {
    "type": 1,
    "chaincodeID": {
      "name": "04233c6dd8364b9f0749882eb6d1b50992b942aa0a664182946f411ab46802a88574932ccd75f8c75e780036e363d52dd56ccadc2bfde95709fc39148d76f050"
    },
    "ctorMsg": {
      "function": "query",
      "args": [ "a" ]
    },
    "secureContext": "admin"
  },
  "id": 1
}' | 
curl -X POST -H 'Content-Type: application/json' -d @- https://xxxxx-vp0.us.blockchain.ibm.com:5002/chaincode

{"jsonrpc":"2.0","result":{"status":"OK","message":"900"},"id":1}

```

#おしまい
今回はchaincode_example02.go ( https://github.com/hyperledger/fabric/blob/master/examples/chaincode/go/chaincode_example02/chaincode_example02.go ) という公式で説明されているコードを利用しましたが、
自分でチェーンコードを書くことで、色々なケースに対応させることができそうでした。
次回は、自分のチェーンコードを展開するところからやってみたいと思います。

#参考
チェーンコードのチュートリアル
https://github.com/IBM-Blockchain/learn-chaincode