5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

くふうカンパニーAdvent Calendar 2019

Day 9

Azure Blockchain Service のチュートリアルをやってみた

Last updated at Posted at 2019-12-08

はじめに

本記事は「くふうカンパニー Advent Calendar 2019」の 9 日目です。

今回は、趣味で少し触っているブロックチェーンのクラウドサービスに関する記事を書きたいと思います。
各クラウドサービスではマネージドなブロックチェーンを構築するサービスがあります。

今回はその中でも Microsoft Azure のブロックチェーンサービス を使いたいと思います。
Microsoft Azure を選択した理由は、単純に Azure を触ったことがなかったためです。
逆にその点が、今回の記事の大きなモチベーションになりました。

Azure にはチュートリアルが用意されているので、本記事ではこちらに沿って実施しました。
クイック スタート:Azure portal を使用して Azure Blockchain Service ブロックチェーン メンバーを作成する
基本的にはチュートリアルが丁寧なので、わざわざ記事を書くまでもないと思いましたが、私が調べた内容も補足として記載させていただきました。

Azure のアカウントは作成済みとします。
今回の内容は、無料サブスクリプションの範囲内のようです。

リソースグループの作成

リソースの作成 > 「Azure Blockchain Service (プレビュー) を選択する

新規作成画面になりますので、このように入力します。
既存のパラメータは使用しないので、全て新規の値になります。

スクリーンショット 2019-12-07 17.51.39.png

プレビュー版の Azure Blockchain Service は現在、Quorum プロトコルをサポートしています。

とのことなので、 Protocol は Quorum で良さそうです。
許可型ブロックチェーンQuorumとは?

Consortium(コンソーシアム)は、今回作成するブロックチェーンネットワークの名前です。
テストなので適当な名前にします。
Member も同じです。
今回作成するネットワークに参加しているユーザーです。
特に今回のチュートリアルの中では使用しないので適当に名前とパスワードを設定します。

このあと AWS のようにタグもつけることができるのですが、そちらはお好みで良さそうです。
validation が完了すれば作成します。

通知にこのような表示が出ていれば大丈夫そうです。
約 10 分かかります。

スクリーンショット 2019-12-07 19.21.09.png

リソースに移動すると、このような画面になりました。

スクリーンショット 2019-12-07 19.09.23.png

ローカル環境構築

トランザクションのノードに接続する方法は、チュートリアル中にいくつかありますが、今回は VS Code で Azure Blockchain Development Kit for Ethereum 方法を使用します。
https://docs.microsoft.com/ja-jp/azure/blockchain/service/connect-vscode

開発マシンは Mac を使用しました。
以下が必要になります。(括弧内は今回使用したバージョン)

  • VS Code(1.40.2)
  • Node.js 10.15 以降(13.1.0)
  • Git 2.10 以降(2.21.0)
  • Python 2.7.15 以降(2.7.16)
  • Truffle 5.0.0(5.1.3)
  • Ganache CLI 6.0.0(6.7.0)
  • Azure Blockchain Development Kit for Ethereum(0.1.12)

Truffle はスマートコントラクトの開発、ビルド、デプロイなどのためのフレームワークです。
Truffle で始める Ethereum 入門 - ERC20 トークンを作ってみよう

Ganache CLI はローカル環境でブロックチェーンを構築するツールです。
Ganache CLI + web3.jsでEthereum簡易投票アプリを構築

このあたりを後日やってみようと思います。
Ethereumのフレームワーク「Truffle」とローカル開発環境「Ganache」入門ログ

Azure Blockchain Development Kit for Ethereum は、必要なツールがちゃんとインストールされているか確認してくれるので、最後にインストールすると良さそうです。
インストールが完了すると、 VS Code のサイドメニューに以下のような表示がでます。

スクリーンショット 2019-12-07 18.05.35.png

Connect to network から、リソース、コンソーシアムを選択します。
途中、ログインしていないと Microsoft アカウントにログインするよう促されます。
接続がうまくいくと、サイドメニューにコンソーシアムが表示されます。

スクリーンショット 2019-12-07 19.10.33.png

スマートコントラクトを実際に作成してみる

チュートリアル:スマート コントラクトの作成、ビルド、Azure Blockchain Service へのデプロイ

プロジェクトの初期化

VS Code のコマンドパレットから、Azure Blockchain > New Solidity Project > Create basic project を選択します。

スクリーンショット 2019-12-08 3.37.31.png

プロジェクトにファイルが作成されます。

スクリーンショット 2019-12-08 3.40.17.png

ビルドする

コンソーシアムにデプロイする前に、ビルドする必要があります。
スマートコントラクトは contracts ディレクトリに配置されています。

生成された contracts/HelloBlockchain.sol を右クリックし、 Build Contracts を選択します。
ビルドが完了すると、 build ディレクトリが生成され、結果が格納されます。

デプロイする

Truffle では、移行スクリプトを使用して、コントラクトが Ethereum ネットワークにデプロイされます。
移行は、プロジェクトの migrations ディレクトリに配置されている JavaScript ファイルです。

contracts/HelloBlockchain.sol を右クリックし、 Deploy Contracts を選択します。
デプロイ対象のコンソーシアムを選択します。
Generate mnemonic を選択し、メンバーの秘密鍵を作成し、プロジェクトルートに保存します。

このとき、コンソールで Azure Blockchain を選択するとデプロイ時の出力が確認できます。
これはビルド時も同様です。

スクリーンショット 2019-12-08 3.46.23.png

コントラクト関数を呼び出す

コントラクトにメッセージを送るスクリプトを作成します。
web3.js の API を使用するので、少し普通の JavaScript とは書き方が異なります。
Ethereum Javascript APIであるweb3.jsとは

sendrequest.js をプロジェクトルートに配置します。
今回のコードは RequestMessage 状態変数を変更するものです。

var HelloBlockchain = artifacts.require("HelloBlockchain");

module.exports = function(done) {
  console.log("Getting the deployed version of the HelloBlockchain smart contract")
  HelloBlockchain.deployed().then(function(instance) {
    console.log("Calling SendRequest function for contract ", instance.address);
    return instance.SendRequest("Hello, blockchain!");
  }).then(function(result) {
    console.log("Transaction hash: ", result.tx);
    console.log("Request complete");
    done();
  }).catch(function(e) {
    console.log(e);
    done();
  });
};

これを実行してみます。
こちらのコマンドで実行できます。

$ truffle exec sendrequest.js --network <blockchain network>

このとき、blockchain network は自分の作成したものを使用するのですが、 truffle-config.json の値を使用します。
これはファイル生成時に作成されています。
私の場合はこちらでした。
今回の場合は開発環境ではなく、本番環境なので、 abs_testblockchain_testblockchain_testblockchain になるようです。

  networks: {
    development: {
      host: "127.0.0.1",
      port: 8545,
      network_id: "*"
    },
    abs_testblockchain_testblockchain_testblockchain: {
      network_id: "*",
      gas: 0,<img width="745" alt="スクリーンショット 2019-12-08 3.53.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118817/c347e3b3-3ea2-fdd0-b0ca-7144c71a71f7.png">

      gasPrice: 0,
      provider: new HDWalletProvider(fs.readFileSync('/path/myblockchainmember.env', 'utf-8'), "https://testblockchain.blockchain.azure.com:3200/xxxx")
    }
  },
$ truffle exec sendrequest.js --network abs_testblockchain_testblockchain_testblockchain
Using network 'abs_testblockchain_testblockchain_testblockchain'.

Getting the deployed version of the HelloBlockchain smart contract
Calling SendRequest function for contract  0x5C3cdA6D8793Aa58CFa73455539BfB5A5F1F95ef
Transaction hash:  0x056ce1e8ecebd1abaa5b3ec0039660ef7cd7d460f2bc2c65657b10d9dfca9612
Request complete

実行するとこのように出力されます。
返り値はトランザクションの ID のようです。

コントラクトの状態を照会する

状態変数の状態を確認する関数を作成します。
HelloBlockchain.sol に、 getMessage 関数を追加します。

function getMessage() public view returns (string memory)
{
    if (State == StateType.Request)
        return RequestMessage;
    else
        return ResponseMessage;
}

保存したら、 Build Contrasts 、 Deploy Contracts でネットワークにデプロイします。

そして getMessage 関数を呼び出すスクリプト getmessage.js をプロジェクトルートに作成します。

var HelloBlockchain = artifacts.require("HelloBlockchain");

module.exports = function(done) {
  console.log("Getting the deployed version of the HelloBlockchain smart contract")
  HelloBlockchain.deployed().then(function(instance) {
    console.log("Calling getMessage function for contract ", instance.address);
    return instance.getMessage();
  }).then(function(result) {
    console.log("Request message value: ", result);
    console.log("Request complete");
    done();
  }).catch(function(e) {
    console.log(e);
    done();
  });
};

このスクリプトを再度実行します。

$ truffle exec getmessage.js --network abs_testblockchain_testblockchain_testblockchain
Using network 'abs_testblockchain_testblockchain_testblockchain'.

Getting the deployed version of the HelloBlockchain smart contract
Calling getMessage function for contract  0x5C3cdA6D8793Aa58CFa73455539BfB5A5F1F95ef
Request message value:  Hello world
Request complete

Request message value: Hello world なので、 sender で送信した値が取得されました。
sendrequest.js の値を変えて再度状態を変えて、 getmessage.js を実行すると、変更された値が取得されます。

さいごに

ポータルの方でもグラフで確認できるようですね。

スクリーンショット 2019-12-08 4.07.49.png

この後、 Azure Blockchain Service での開発 に進んでいきます。
ほとんど VS Code 上の作業で終わることが快適です。

ただ、やはりまだまだ知識が足りないことが実感できました。
また、 Azure の Active Directory はまだ慣れないですね。

今回は簡単ですが、これで終わります。
明日は ryoster さんの記事になります!

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?