EthereumでDApps開発のための開発環境を構築する(Truffle&Ganache接続まで)

前回の記事 で Ethereum の開発環境の構築を行いました。
今回はさらに Ethereum 用のフレームワークである Truffle と Ganache を使ってローカルでの開発環境を整えようと思います。
Truffleとは
Truffle は Ethereum アプリケーションの開発効率を上げるためのフレームワークです。
ボイラープレート的な仕事をしてくれるところから始まり、 ネットワーク接続の設定管理や、ネットワークのマイグレーション実行や初期化、テストフレームワークをバンドルしていたりなど、一通り開発できるように準備を整えてくれます。

Ganacheとは
Ganache はDAppsを開発時のテストをする際に使用するローカル用のプライベートネットワークを構築してくれます。自動マイニングしてくれるので、別でターミナルを立ち上げて、マイニング用のコマンドを実行する必要もありません。発生したトランザクションは順番にソートされて表示もされるので、動作確認も比較的容易にできると思います。

セットアップ
以前同様の記事を書きましたが、簡単におさらいします。
- Etehreum のインストール
brew tap ethereum/ethereum
brew install ethereum- nodenvのインストール
私の場合、ローカル環境のグローバルなnodeのバージョンを変更したくないので、 nodenv を使って切り替えています。
brew install nodenvnodenv起動のために、 ~/.zshrc に以下を追記します。
export PATH="$PATH:$HOME/.nodenv/bin:"
eval "$(nodenv init --no-rehash -)"- node(9.6.1)のインストールと設定
nodenv install 9.6.1
nodenv local 9.6.1
node -vpackage.jsonの作成
npm init
(面倒なので、以降はEnter)truffleのインストール
npm install [email protected]- solidityのコンパイラ
solcのインストール
npm install [email protected]Ganacheのインストール
Ganache のページからインストーラを取得し実行する。
設定
package.json の修正
truffle をグローバルインストールしていないので、npm run でキックできるように package.json を修正します。
package.json の scripts ブロックを修正します。
1 "scripts": {
2 "truffle": "truffle",
3 "develop": "truffle develop",
4 "truffle-ganache": "truffle migrate --compile-all --reset --network ganache",
5 "truffle-console": "truffle console --network ganache"
6 },truffleを初期化する
npm run truffle init実行が完了すると、プロジェクトディレクトリにフォルダやファイルがジェネレートされます。
tree -L 1
.
├── contracts
├── migrations
├── node_modules
├── package-lock.json
├── package.json
├── test
├── truffle-config.js
└── truffle.jscontractsディレクトリ- コントラクトプログラムを配置する場所。
truffle init時にMigrations.solが生成される
- コントラクトプログラムを配置する場所。
migrationsディレクトリ- マイグレーションスクリプトを配置する場所。
truffle init時に1_initial_migrations.jsが生成される。
- マイグレーションスクリプトを配置する場所。
testディレクトリ- 作成したコントラクトプログラムのテストスクリプトを配置する場所。デフォルトで
mochaが使える。
- 作成したコントラクトプログラムのテストスクリプトを配置する場所。デフォルトで
truffle.js- truffleの設定ファイル
truffle-config.js- truffle.jsと同じ。
PowerShellやGit-bash利用時にはこちらを編集する。
- truffle.jsと同じ。
私はMacユーザなので、truffle-config.js は消してしまいます。
rm truffle-config.jsGanacheと接続する
次にインストール済みの Ganache を起動します。
Ganache はデフォルトで10個のアカウントを作成してくれます。指定がなければ1番上に表示されているアカウントが coinbase になります。

Ganacheが表示しているネットワークの情報を基に、truffle.js を以下のように編集します。
1module.exports = {
2 // See <http://truffleframework.com/docs/advanced/configuration>
3 // to customize your Truffle configuration!
4 networks: {
5 ganache: {
6 host: "localhost",
7 port: 7545,
8 network_id: "*"
9 }
10 }
11};package.json に記載した npm scriptsのコマンドから truffle-ganache を起動し、
Ganacheのマイグレーションを行います。
npm run truffle-ganacheGanacheの画面を見てみると1番上のアドレスの balance (所有しているether) が 100 → 99.97 に減っています。

実はこれ、npm run truffle-ganache 実行により、migrations/1_initial_migrations.js が実行され、
そこから contracts/Migrations.sol がデプロイされています。
そのマイグレーションの処理自体もトランザクションが行われており、ganacheに gas をお支払いしたため少しだけ減っています。
TRANSACTIONS タブを押すと、トランザクションハッシュが生成されていることを確認できます。

また、対話形式でプログラムを書きたい場合には以下のようにコンソールを立ち上げて、
npm run truffle-console試しに以下のようなコードを実行すると
1web3.eth.sendTransaction({from: web3.eth.accounts[0], to: web3.eth.accounts[1], value:web3.toWei(5, "ether")})トランザクションのアドレスが帰ってきます。
> '0x046714fb412724c656250e5856bbb83469e2811b5d710bfa3c515606f5ff938a'Ganache の方を確認すると、ちゃんとトランザクションが反映されていることがわかりますね。

まとめ
今回は Truffle でローカル環境構築をした後、 Ganache のネットワークに接続設定をして、マイグレーションまでを行いました。
Truffle と Ganache を使うことで、素の Ethereum 単体で開発するよりも、開発環境周辺の手間が軽減されるので、これから積極的に使っていきたいと思います。
ここまでできれば、次は Solidity によるコントラクトの開発と、テストコードによる動作確認です。
