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


まえおき

前回の記事では、Azure Blockchain Serviceを使ってブロックチェーンを構築するところまで行いました。
今回の記事では、構築したブロックチェーンに対して、コントラクト(今回はERC20のトークンコントラクト)のデプロイを行います。

トランザクションノードとの通信

まずは構築したブロックチェーンと通信するところから始めます。
Azure Blockchain Serviceではチェーンとのやりとりは、トランザクションノードが提供するエンドポイントを経由して行います。
メニューから「Settings > Transaction nodes」を開き、トランザクションノードを選択、さらに「Setting > Connection strings」を開くと、エンドポイントが表示されます。

※ 黒塗りの部分がアクセスキーになります。

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

$ 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のトークンコントラクトを使います。
デプロイはEthereumの開発ツールのTruffleを使って行います。Azure Blockchain Serviceで使われているQuorumブロックチェーンが、Ethereumのエコシステムをそのまま利用出来るという点は、大きなメリットです。
デプロイの流れは基本的にEthereumにコントラクトをデプロイする時と同様ですので、詳細はここでは割愛します

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

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}

デプロイ

$ 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のバージョンが古いですね

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

コントラクトのメソッド呼出し

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

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);

実行

$ node get_symbol.js
ALIS

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

おわりに

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

さて、次回の記事ではAzure Blockchain Serviceのメトリクス周りや、ブロックチェーンのエクスプローラーについて説明していきます