Azure Blockchain Serviceを試してみる2（コントラクトデプロイ編）

# まえおき
[前回の記事](https://qiita.com/hayago/items/60f6e71b6cba1def9006)では、Azure Blockchain Serviceを使ってブロックチェーンを構築するところまで行いました。
今回の記事では、構築したブロックチェーンに対して、コントラクト（今回はERC20のトークンコントラクト）のデプロイを行います。

# トランザクションノードとの通信
まずは構築したブロックチェーンと通信するところから始めます。
Azure Blockchain Serviceではチェーンとのやりとりは、トランザクションノードが提供するエンドポイントを経由して行います。
メニューから「Settings > Transaction nodes」を開き、トランザクションノードを選択、さらに「Setting > Connection strings」を開くと、エンドポイントが表示されます。
<img width="697" alt="スクリーンショット 2019-09-02 14.27.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16354/9e437d86-32ab-9730-8732-3141065df670.png">
※ 黒塗りの部分がアクセスキーになります。

それでは、ターミナルからJSON RPCのリクエストを送信してみます。

```bash
$ curl -X POST -H 'Content-Type:application/json' --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' 'https://member12345.blockchain.azure.com:3200/アクセスキー'
{"jsonrpc":"2.0","id":1,"result":"0xc059"}
```
正常に結果が返ってきたことが確認出来ます。

### トランザクションノードのセキュリティ設定
トランザクションノードに対する接続の許可設定として、IAMによるアクセスコントロール、またはFirewall rulesによるIPアドレス範囲の制限が可能です。

# コントラクトのデプロイ
今回デプロイするコントラクトには、オープンソースとして公開されている[ALISのトークンコントラクト](https://github.com/AlisProject/private-chain-contracts)を使います。
デプロイはEthereumの開発ツールのTruffleを使って行います。Azure Blockchain Serviceで使われているQuorumブロックチェーンが、Ethereumのエコシステムをそのまま利用出来るという点は、大きなメリットです。
デプロイの流れは基本的にEthereumにコントラクトをデプロイする時と同様ですので、詳細はここでは割愛します:pray:

デプロイにあたり、`truffle-config.js`を編集します。

```javascript:truffle-config.js
var Web3 = require("web3");
module.exports = {
  networks: {
    development: {
      provider: new Web3.providers.HttpProvider("https://member12345.blockchain.azure.com:3200/アクセスキー"),
      network_id: "*",
      gas: 5000000,
      gasPrice: 0,
    }
  }
};
```
### メンバーアカウントのアンロック
コントラクトをデプロイする前に、メンバーアカウントをアンロックする必要があります。アンロックは以下のJSON RPCリクエストで行えます。

```
$ curl -X POST -H "Content-Type:application/json" --data '{"jsonrpc":"2.0","method":"personal_unlockAccount","params":["メンバーアカウントのアドレス", "メンバーアカウントに設定したパスワード", アンロックする秒数],"id":1}' "https://member12345.blockchain.azure.com:3200/アクセスキー"
{"jsonrpc":"2.0","id":1,"result":true}
```

### デプロイ

```bash
$ truffle deploy
Using network 'development'.

Running migration: 1_initial_migration.js
  Deploying Migrations...
  ... 0x86fd31820ca0e43c79a72ef6b3d2a686461b42142e611de7e1b060084152de64
  Migrations: 0x132364b78fb0a7108fd2868dd362a67a9e6a48a8
Saving successful migration to network...
  ... 0xdcd24af063d07a4be577ddd69cfb563980d5fae8e1afec7d0ed35fa15860860d
Saving artifacts...
Running migration: 2_deploy_contracts.js
  Deploying AlisToken...
  ... 0xcaf88f603e8ac96188484e33b3f1f8d3fc5e47d05cf74b3d455f0b0c137777ca
  AlisToken: 0xdbf7355b30598f24107c05076eed0aa69f028048
Saving successful migration to network...
  ... 0x2e77575f898c78938d32a3b57bf5b8d23226a1ad184c0313276e6925cad41055
Saving artifacts...
✨  Done in 25.06s.
```
（使っているTruffleのバージョンが古いですね:sweat_smile:）

かなり割愛してしまいましたが、以上でコントラクトのデプロイが完了です。

# コントラクトのメソッド呼出し
デプロイしたコントラクトに対して、web3.jsを使ってやりとりを行います。試しに、トークンのシンボルを取得してみます。

```javascript:get_symbol.js
const Web3 = require("web3");
const provider = new Web3.providers.HttpProvider("https://member12345.blockchain.azure.com:3200/アクセスキー");
const web3 = new Web3(provider);
const jsonInterface = [{
  "constant": true,
  "inputs": [],
  "name": "symbol",
  "outputs": [{
    "name": "",
    "type": "string"
  }],
  "payable": false,
  "stateMutability": "view",
  "type": "function"
}];
const tokenContract = new web3.eth.Contract(jsonInterface, "0xdbf7355b30598f24107c05076eed0aa69f028048");
tokenContract.methods.symbol().call().then(console.log);
```

### 実行

```bash
$ node get_symbol.js
ALIS
```
以上、簡単にですがweb3.js経由でコントラクトとやりとり出来ることが確認出来ました。

# おわりに
Azure Blockchain Serviceで構築したブロックチェーンに対して、Truffleを使ってコントラクトをデプロイし、web3.js経由でコントラクトとやりとりを行いました。
QuorumブロックチェーンがEthereumベースで、Ethereumのエコシステムをそのまま利用出来るため、Ethereumでの開発経験あれば学習コストはほぼ掛からないかと思います。

さて、[次回の記事](https://qiita.com/hayago/items/211f62ffbe7be5196bf1)ではAzure Blockchain Serviceのメトリクス周りや、ブロックチェーンのエクスプローラーについて説明していきます:wave: