Azure Blockchain WorkbenchのメッセージングAPIを使ってコントラクトアクションを実行する

# 概要

Blockchain WorkbenchメッセージングAPIを使って、コントラクトに対してアクションを実行します。
コントラクトは既に作られている前提です。

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

## 関連記事
[Azure Blockchain WorkbenchでHello Blockchain!](https://qiita.com/shingo_kawahara/items/6acceac42ec2701bf336)
[Azure Blockchain WorkbenchのメッセージングAPIを使ってコントラクトを作成する](https://qiita.com/shingo_kawahara/items/e6080e5a08ae4d7e072d)

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

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

# ストアドプロシージャ作成
[Azure Blockchain WorkbenchのメッセージングAPIを使ってコントラクトを作成する](https://qiita.com/shingo_kawahara/items/e6080e5a08ae4d7e072d) を参考に、ストアドプロシージャを作成してください。

# Logic Apps作成

* [Azure Blockchain WorkbenchのメッセージングAPIを使ってコントラクトを作成する](https://qiita.com/shingo_kawahara/items/e6080e5a08ae4d7e072d) を参考に、以下の状態まで作成する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/dec1893f-e72d-f622-1dbe-ba30d1ac23c6.png)

* 次のステップで、[SQL Server]→[SQLクエリを実行する]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/703a8ad6-b12b-5e87-fd77-0a5b3a0f3e6c.png)

* 以下のように入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/16131325-be53-9b4c-2372-48978386955d.png)

```
SELECT TOP 1 ContractLedgerIdentifier
  FROM [dbo].[vwContractProperty]
  WHERE ApplicationName = 'HelloBlockchain'
    AND WorkflowPropertyValue = N'こんにちわ'
  ORDER BY Version DESC
```

ここはアプリケーションによってだいぶ変わります。要はコントラクトを一意に識別する「ContractLedgerIdentifier」を取り出す必要があります。
今回はWorkflowPropertyValueに、コントラクトを作成したときに指定したリクエストメッセージを直書きしています。
複数バージョンがあることを想定し、Version列を降順で並び替えて一番最初の行を持ってくることで最新バージョンに特定しています。

* 次のステップで、[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では、ストアドプロシージャの動的コンテンツとSQLクエリの動的コンテンツを選択してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/aacea48e-1c29-64e7-a051-250e2d287527.png)

* そうすると以下のようにFor-Each文に2重で入ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/e5f9f9d0-d857-3dfa-4cba-24409b7f5bad.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/c00ac3de-6d0b-5398-7c17-6655d9e278a0.png)

```
{
  "requestId":"@{variables('requestId')}",
  "userChainIdentifier":"@{items('For_each_2')?['ChainIdentifier']}",
  "contractLedgerIdentifier":"@{items('For_each')?['ContractLedgerIdentifier']}",
  "workflowFunctionName":"SendResponse",
  "parameters": [
    {
      "name":"responseMessage",
      "value":"れすぽんす"
    }
  ],
  "connectionId":1,
  "messageSchemaVersion":"1.0.0",
  "messageName":"CreateContractActionRequest"
}
```

* ワークフローを保存して実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/a78f1d5a-9a42-825d-2e6a-67c10596cd80.png)

* HelloBlockchainアプリケーションのコントラクトで、レスポンスアクションが実行されればOKです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/6ede1488-6a2d-889c-8f8e-0baec0807e02.png)