Azure Blockchain WorkbenchでHello Blockchain!

ブロックチェーンのマネージドサービスということで使ってみました。
Ethreum/Hyperledger Fabric/Cordaの環境が作れますが、2019年1月時点ではEthereumのみ対象となっています。
WorkbenchのVersionは1.6.0です。
現時点でプレビューなので注意が必要です。

# Azure Active Directoryセットアップ

## ゲストユーザ設定

ゲストユーザ設定をすると、ADゲストユーザのアクセス許可がADメンバーユーザのアクセス許可相当になります。影響範囲は以下の公式ページを参考にしてください。
[メンバーとゲストの既定のアクセス許可を比較する](https://docs.microsoft.com/ja-jp/azure/active-directory/fundamentals/users-default-permissions#compare-member-and-guest-default-permissions)

これが難しければ新たにディレクトリを作成する必要があります。
ただし、1つのサブスクリプションは1つのディレクトリにしか紐付けることができないため、サブスクリプションも新たに作成する必要があります。

* Azure Active Directoryを開き、[ユーザ設定]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/c8d6518b-61cc-6539-1857-5cbdb4230c83.png)

* [外部コラボレーションの設定を管理します]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/cca489a5-6ff6-dbf9-d720-c257ebedf82e.png)

* [ゲストのアクセス許可を制限する]を[いいえ]に変更して保存します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/4133008c-d228-f1a5-30aa-39a852488d75.png)

## アプリケーション設定
* Azure Active Directoryを開き、[アプリの登録]→[新しいアプリケーションの登録]の順に選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/8b853a6b-f637-4393-7772-94ffec9ef065.png)

* 以下のように入力して作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/44fa8da3-b9f0-fbc7-52f8-e4b98a551ab1.png)

* 作成したアプリケーションを選択し、[アプリケーションID]を控えておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/d9b4666b-c131-2b6c-7793-27450ca56bc0.png)

* [マニフェスト]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/3fc1e622-aa8c-00b8-a7a1-535365df85da.png)

* GUID生成ツールを使ってGUIDを生成します。ググれば生成するサイトが出てきます。
* マニフェスト内のappRolesを以下のように修正します。

```
  "appRoles": [
    {
      "allowedMemberTypes": [
        "User",
        "Application"
      ],
      "displayName": "Administrator",
      "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "isEnabled": true,
      "description": "Blockchain Workbench administrator role allows creation of applications, user to role assignments, etc.",
      "value": "Administrator"
    }
  ],
```

* マニフェスト内のoauth2AllowImplicitFlowをtrueに修正して保存します。

```
  "oauth2AllowImplicitFlow": true,
```

* アプリケーションの[設定]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/91ce06e3-52e0-4554-8c12-a97c6acc9b30.png)

* [必要なアクセス許可]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/28a76172-98fd-04ab-5450-07cb03d2e38b.png)

* [Microsoft Graph]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/1846ac46-13b2-3409-2f1b-13ee5c07ccfe.png)

* [Read all users' basic profiles]を選択し、保存します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/0fdd2c95-04f5-84af-76c9-89d26188c3a9.png)

* [必要なアクセス許可]画面で、[アクセス許可の付与]を選択します。ポップアップが出たら[はい]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/90d1b5c4-ee65-4b2c-7724-dd927ee0fb08.png)

## 管理者グループ作成

* Azure Active Directoryを開き、[グループ]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/7df2417c-061d-6a65-2d07-e9c3ae17d9bf.png)

* [新しいグループ]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/ad03e83c-2fa5-c7c1-5d85-b2da5e210667.png)

* 以下のように入力して作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/9ecd2ea5-b371-8a3f-3212-16e1287b8c9b.png)

* Azure Active Directoryを開き、[ユーザ]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/f9f38ebd-8963-3846-3d35-9b0f61f29840.png)

* 現在Portalログインしているユーザを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/8a69a585-646b-8425-7cd5-31327d447850.png)

* [グループ]→[追加]の順に選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/1bd4a355-6644-6bdf-dc9d-5cba31c5a6d6.png)

* 先程作成した[Administrator]を選んで追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/975480e7-319d-c662-1000-bebda966e292.png)

* Azure Active Directoryを開き、[エンタープライズアプリケーション]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/e8b6167c-c84d-c1f1-de94-6919af19dc7c.png)

* 前に作成したアプリケーションを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/53ac2001-3d01-9c35-71aa-74a48e052688.png)

* [ユーザとグループ]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/97018e67-2938-5857-47a8-189afd375e61.png)

* [ユーザの追加]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/f78def12-0821-1d3a-8aa5-47ee251e389c.png)

* 現在Portalログインしているユーザを選択して割り当てます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/c055ed52-8a1f-fd6b-b9e8-d562c44a074b.png)

# Azure Blockchain Workbench作成

* Azureポータルからリソースの作成を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/2b76e2d1-c663-34b4-92ba-10af50c87d97.png)

* [ブロックチェーン]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/c84b87ec-6e72-7841-671e-e91c176205d9.png)

* [Azure Blockchain Workbench]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/ec41c4c8-608c-4a6a-5745-46980f4259ea.png)

* 基本設定項目を入力していきます。ここは任意の値です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/72765888-2577-53e4-5322-39f3f3e5ae44.png)

* 次に詳細設定項目を入力していきます。
* [Azure ActiveDirectory Settings]は[Add Now]を選択し、以下のように入力してください。
    * Domain name： AADドメイン名（xxxxxx.onmicrosoft.com）
    * Application ID： 事前に控えたアプリケーションID
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/ec3e741b-1b44-b4ab-09f3-28ca75d3deac.png)

* ここまで入力したら作成してください。デプロイ完了するまで約30分程掛かります。

# 応答URL設定

* デプロイ完了したら、リソースグループを見てください。-apiが付いていないApp Serviceを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/b6f7dd16-3a11-de64-a628-f5b6883ba2cd.png)

* URLをコピーします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/9c4e97ca-8322-4061-676e-a2a9660db134.png)

* AADに登録したアプリケーションに戻って、[設定]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/d3757068-6065-421d-9696-89d915cdd822.png)

* [応答URL]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/380d29c7-b475-227f-d2bc-dd64b91b42ad.png)

* 値を先程コピーしたURLに変更して保存します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/d9599b69-5235-c751-81ba-6bf72dff4a9c.png)

* ブラウザで先程コピーしたURLにアクセス、AADユーザでログインできればOKです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/a15aa9ab-a0d2-216e-c759-e9243f67a7b5.png)

# スマートコントラクト作成

リクエストとレスポンスを返し合うだけのサンプルプログラムを実装したいと思います。

* 公式のサンプルプログラムをダウンロードします。
    * HelloBlockchain.json
    * HelloBlockchain.sol

[Azure-Samples/blockchain](https://github.com/Azure-Samples/blockchain/tree/master/blockchain-workbench/application-and-smart-contract-samples/hello-blockchain)

* Web画面に戻り、[New]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/2b3103b7-aa50-b0fb-12bd-1b1d16438753.png)

* Step1で先程ダウンロードしたjsonファイルを、Step2でsolidityファイルを選択し、デプロイします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/dbb3878a-f6d3-7465-51c7-82c50f475fa9.png)

* デプロイできたら、[Add a member]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/551ce1bb-93fb-77a0-2c1e-d3c460013db2.png)

* [Add a member]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/3f1e5ce3-1210-da87-327d-f67d642dce25.png)

* まずはリクエスター（最初にメッセージを送る人）を選びます。ボックスに文字を入力すると、Azure ADから名前を引いてくるので、自分のIDを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/fb8d7670-0c06-a19a-fde6-716fa052032e.png)

* Roleは[Requestor]を選択して、[Add]します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/296ddedb-67ee-cc8a-e6d9-bb407ed6f193.png)

* 追加されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/49c80f93-f5dc-a62f-8f2b-4d227ab6d02e.png)

* 同じ手順で[Responder]も追加します。今回は同一ユーザでよいです。これで準備が整いました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/de057d99-53fd-f4e4-52c4-1b003c6bbdfe.png)

# テスト

* アプリケーションを選択すると、以下のような画面になります。まだコントラクトは作られてません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/1346e034-5c90-2b6f-1181-4cae066ea919.png)

* [New]を選択して、コントラクトを作っていきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/a7d5366d-b604-b7f6-008e-2e4448645dae.png)

* 何か適当にメッセージを入れて、[Create]してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/65b5975d-d653-5b38-562d-813fad49cb7e.png)

* コントラクトが作られました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/da55da6e-6df1-3fe4-941b-892cbf29283e.png)

* コントラクトを選択してみると、詳細情報が刻まれていることが分かります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/e1d873e8-f2da-7aa9-dd3d-f0d7658702e0.png)

* 次のアクションを待っている状態なので、[Take action]を選択します。今回は自分自身でリクエストとレスポンスを送り合っていますが、リエクストを異なるIDにすると、その人にしかActionできない仕組みになっています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/aac210c8-762f-5bb2-2292-a55afd94243f.png)

* このサンプルアプリケーションでは、レスポンス側はアクションに[Response]しか選べないようになっています。作り次第で複数選択させることも可能です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/795c2045-f700-94d5-3624-4aeaabf407e4.png)

* [Response]を選んで、[Take action]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/e51991ca-ace2-a6eb-874d-b48a1aaa19a7.png)

* 適当にメッセージを入れて、[Take action]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/781d60f4-45d5-2484-9cdb-f1e75cef851f.png)

* アクションが実行されて、処理が再度リクエスターに返ってきました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/d0e79491-0b7d-b6f5-a9ed-cf224c71fa72.png)

# まとめ
簡単にブロックチェーン環境を構築することができました。
Azure Active Directoryと連携していることで、ロールを意識したワークフローの仕組みが強力だと思います。
Version1.6.0から、Web画面上でアプリケーションのバージョン管理ができるようになったので、アプリケーション変更時も簡単に切り替えることが可能になりました。

Blockchain Workbenchを作った直後のリソースグループには、ServiceBus/Event Grid/SQL Databaseといったリソースも作られています。
こういったAzureリソースの組み合わせこそBlockchain Workbenchの醍醐味だと思うので、このあたりは別の記事でまとめようと思います。