「Ganache」でDapps開発用のローカルネットを構築する

木内智史之介(シャッチョー)
ミンカさんけっこんしてくださいおねがいします(ズザー SEGAさん、DIVAの筐体ください(ズザー

Dappsの開発を進めるにあたって、常にイーサリアムのメインネットにデプロイしないと開発できないんだとすると、それは非常につらい事になる事が容易に想像できますよね…!
仮に、テストネットを開発用のデプロイ先にしたとしても、あまりに影響範囲がでかすぎるし、ネットワークを無駄に消費するし、情報漏洩の可能性もあるしで、双方にとって「lose-lose」である事は間違いありません。

当たり前の欲求として、

自分だけのプライベートネットを構築したい!!!

と声を荒げたくなるはずです。
我慢しなくていいんです。当たり前の欲求ですから…!

Ganache

そんな欲求を満たしてくれるのが、「Ganache」です。
こいつも Truffle ブランドのプロダクトですね。この人達、本当に優秀…!優秀すぎて、嫉妬の炎がやばい…ッ!

インストールは、難しい事は何一つなくて、WEBサイトにアクセスして、ダウンロードして、えいっとインストールするだけで立ち上がります。

CURRENT BLOCK 0」 を見た瞬間に感動しましたね。
本当に、まっさらなイーサリアムのブロックチェーンがローカルに展開されたようです。

github上のGanacheのコードを見ると、中身はreactで書かれており、それをElectronで立ち上げているようです。

積まれているブロックの数も0みたいなのに、複数のアカウントがそれぞれ100ETH持ってるのは、そういう事もあり得るのかな?(よく分かってない)

Truflleから接続してみる

Ganacheは正常に立ち上がっているように見えるので、試しにTruffleからGanacheが立ち上げたローカルネットワークに対してデプロイしてみたいと思います。

なお、前置きになりますが、自分の環境は、先日のブログに書いたとおり、truffleがdockerコンテナ上で稼働するようになっているので、発行するコマンドや設定に少し注意が必要です。

ネットワーク設定

Truffleの接続先がロカールネットに向くように、設定を加えてみましょう。
設定する値は、Ganacheの「RPC SERVER」に表示されている値を設定してください。

truffle.js
module.exports = {
networks: {
development: {
// 自分の場合、truffleをdocker-containerとして動かしているので、container内部からホストを参照しています
// host: "127.0.0.1",
host: "host.docker.internal",
port: 7545,
network_id: "*", // Match any network id
},
},
};

コンソールが接続できれば、たぶんOK

設定したネットワーク設定で、ganacheに接続可能か確認してみます。
truffleには、console機能があるので、それで確認します。

$ docker-compose run truffle console
truffle(development)>

うん、接続できてそうですね!

コントラクトのデプロイ

HelloWorldコントラクトの作成

テストネット上にデプロイするために、簡単な HelloWorld コントラクタを作成します。

$ docker-compose run truffle create contract HelloWorld

中身は適当にそれっぽく書いておきます。

src/contracts/HelloWorld.sol
pragma solidity ^0.4.22;
contract HelloWorld {
function hello() public pure returns (string) {
return "world!!";
}
}

コンパイル

作成したコントラクトをデプロイするためにも、正常にコンパイルできるか試してみます。

$ docker-compose run truffle compile
Compiling ./contracts/HelloWorld.sol...
Writing artifacts to ./build/contracts

うん、あっさり!

マイグレーションの作成

調べてみると、デプロイするためには、まずマイグレーションの用意が必要みたいです。
言われるままに、まずは作成してみましょう。

このあたりは、がっつり本家のドキュメント を確認したほうがよさそうなので、そちらを確認しつつ進めます。

$ docker-compose run truffle create migration HelloWorld

なにも出力されないけど、作成されたんだろうか…?

$ ls -1 src/migrations/
1533839889_hello_world.js
1_initial_migration.js
$ cat src/migrations/1533839889_hello_world.js
module.exports = function(deployer) {
// Use deployer to state migration tasks.
};

うん。なんかそれっぽいファイルが作成されました。
ただ、中身が空なので、ドキュメントを参考にしつつ、下記のように編集します。

var HelloWorld = artifacts.require("HelloWorld");
module.exports = function(deployer) {
deployer.deploy(HelloWorld);
};

デプロイ

さあ、ようやくデプロイを行えます!
truffleでは、deployコマンドはmigrateコマンドのエイリアスみたいなので、truffleにおいては両者は同じ意味のようです。

$ docker-compose run truffle migrate
Using network 'development'.
Running migration: 1_initial_migration.js
Deploying Migrations...
... 0x6c8cc3ee504a173880f2272e0f7900a9028f48131ac745d454ac1a8485b4c0b3
Migrations: 0xb62b03e881647c8a48ccdbefa4e96c12297c9475
Saving successful migration to network...
... 0x40a9746b6fdc5971f74eeeda848c69a16fa81667a4971a0e6154b8eb403458cb
Saving artifacts...
Running migration: 1533839889_hello_world.js
Deploying HelloWorld...
... 0x6ef5ebe76adfc1a90447bce15d31426db2ec28bf2987f961a634492d2313ce08
HelloWorld: 0xb849aa4f9fae596c5b7d28364ef0ab4149150dc7
Saving successful migration to network...
... 0xc53542bc60f846725bbb2e8cc54adb10d28f1ca2b458535fb258a60b45eff3d5
Saving artifacts...

驚異の一発OK…!パーフェクト…!
え、こんなに簡単でいいんですか?

Ganache側でデプロイされた内容を確認してみる

正常にデプロイされていれば、Ganacheのローカルネット内のブロックチェーンに、デプロイの記録が積まれているはずです。

なんか、一つ目のアカウントの残高が減ってる…!

新規に4つのブロックが積まれてるじゃありませんか…!

トランザクションの閲覧も問題なく行えます。

すげえ。ひたすら、truffleとganacheのすごさに驚嘆しております。
ありがとう、truffle…!ありがとう、ganache…!

振り返り

いやあ、本当に簡単にローカルネットの構築から、デプロイまでが出来てしまいましたね。
最初は手探り感が否めなかったDapps開発ですが、徐々に道筋が見えてきました。

本当は、WEBフロントからデプロイしたコントラクトの呼び出しまでも行いたかったのですが、少し長くなりそうでしたので、 WEBフロントからのコントラクトアクセスに関しては、別の記事として切り出したいと思っています。

本日はここまで!