Azure Blockchain WorkbenchのメッセージングAPIを使ってコントラクトを作成する

[Azure Blockchain WorkbenchでHello Blockchain!](https://qiita.com/shingo_kawahara/items/6acceac42ec2701bf336) というサンプルアプリケーションを動作させるまでの記事を書きました。
GUI上でポチポチコントラクトを作りましたが、今回はService Busを介したメッセージングAPIを利用したコントラクトの作成方法を書いていきます。

これができると何が嬉しいかというと、例えばIoTデバイスから随時送られるデータを、Service Busを介してブロックチェーン上に記録するといったことも可能になります。

利用するService Busは、Blockchain Workbench作成時に一緒に作られています。

Workbenchのバージョンは1.6.0です。

# 構成
メッセージングAPIにメッセージを送信するために、ストアドプロシージャを実行したり、加工が必要だったりするので、Logic Appsを使っています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/aec72e3f-0577-9056-3871-7e536397b329.png)

# ストアドプロシージャ作成

* コントラクトの作成に最適なサンプルストアドプロシージャが提供されてましたのでダウンロードしておきます。
[LogicAppStoredProcedures.sql](https://github.com/Azure-Samples/blockchain/blob/master/blockchain-workbench/messaging-integration-samples/SQL/LogicAppStoredProcedures.sql)

* Blockchain Workbench作成時に一緒に作られたSQL Databaseを開き、[クエリエディター]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/c204e849-99a1-5f14-b38d-94176d467f2d.png)

* ログインユーザに[dbadmin]を指定します。パスワードはBlockchain Workbench作成時に指定したものを入力してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/8015b5c7-e589-c240-51a8-43345f1b0bcd.png)

* [クエリを開く]を選択し、先程ダウンロードしたsqlファイルを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/ab29ad07-aa75-7bca-3429-11b0c68dabb5.png)

* [実行]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/5b0219e2-3e20-3082-afd7-69e650a487b9.png)

# Logic Apps作成

* Logic Appsを作成します。
* トリガーは今回は「HTTP要求の受信時」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/21215446-c896-7f74-9e47-779b10392c6b.png)

* 次のステップで、[変数]→[変数を初期化する]アクションを選びます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/6c186654-038d-2df5-9b81-41d72cc5fa9b.png)

* 以下のように入力します。値は動的コンテンツの式に[guid()]と入力してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/d8e6aff5-288e-1b2d-db21-fa3882cea30b.png)

* 次のステップで、[SQL Server]→[ストアドプロシージャの実行]アクションを選びます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/f0067905-650a-5b68-82ea-54bce99ee8b4.png)

* 接続名は適当に、SQL DatabaseはBlockchain Workbench作成時に作られたもの、データベースはmasterじゃないほうを選んでください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/74124ba8-8b5b-1f80-3e71-eb9bb0b1f117.png)

* [dbo].[LogicAppGetUserChainIdentifierFromEmailAddress]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/dddd1f5e-45d0-51d0-cd85-d520b854af0e.png)

* 現在ログインしているユーザのアドレスを入力します。(xxx@yyy.onmicrosoft.com)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/b80f578b-9708-2376-faa8-c5a406d718d2.png)

* 次のステップで、[Service Bus]→[メッセージの送信]アクションを選びます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/0e096e80-523e-9e9d-84da-d3cf6815b0ff.png)

* 接続名は適当に、Service BusはBlockchain Workbench作成時に作られたものを選びます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/6c2f3d58-3eea-490f-e682-985a2865cb46.png)

* Service Busポリシーは[ReadWriteSharedAccessKey]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/6e210dd9-0229-a34b-3b6d-55407fd0b4ca.png)

* キューは[ingressqueue]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/acf0bb84-c037-217a-5cfc-ede02652df76.png)

* セッションIDでは、最初にストアドプロシージャの動的コンテンツを選択してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/aacea48e-1c29-64e7-a051-250e2d287527.png)

* そうすると、For-Each文の中に入ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/bab059ec-6820-5800-f5d1-931712f373c4.png)

* この状態でセッションIDに動的コンテンツ[requestId]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/5e94709b-55c7-d86c-0a15-1161535faac0.png)

* メッセージの内容は以下のJSONを書きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/bc8a40b5-7c3f-bd91-246f-9257228886d4.png)

```
{
  "requestId":"@{variables('requestId')}",
  "userChainIdentifier":"@{items('For_each')?['ChainIdentifier']}",
  "applicationName":"HelloBlockchain",
  "workflowName":"HelloBlockchain",
  "parameters": [
    {
      "name":"message",
      "value":"こんにちわ"
    }
  ],
  "connectionId":1,
  "messageSchemaVersion":"1.0.0",
  "messageName":"CreateContractRequest",
  "version": "1.0"
}
```

applicationName、workflowNameといった値は、HelloBlockchain.jsonで定義されているので確認してみてください。
parametersはHelloBlockchain.jsonのConstructorで定義されています。

* 最終的にはこんなフローになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/61aceb0c-5c79-3eba-e8f8-61c1ed32470a.png)

* ワークフローを保存して実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/2ceabeca-cb86-968c-6dad-e0b180d7b847.png)

* HelloBlockchainアプリケーションに新規コントラクトが作成されればOKです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/35e69dba-a4fe-9d83-f550-1b9eadd84ba5.png)