🍏

スマートコントラクト開発の始め方(ローカル編)

2021/07/24に公開

はじめに

スマコン開発を勉強し始める上で、メインネットを使わないことはなんとなく分かっていましたが(ガス代がかかるので)、ローカルで動かすのかテストネットというもので動かすのかよく分からなかったので、整理したいと思います。

ローカルで動かす方法

まずは簡単にローカルでコントラクトを動かしてみます。
試しに動かしてみるのにはローカルで動かすのがちょうど良いかと思います。

そこで登場するのが、TruffleとGanache。

僕はガナッシュチョコレートの方が好き。

Truffle

Truffleは、コントラクトのコンパイル、テスト、デプロイ、パッケージ化を比較的簡単に行うことができるフレームワークと呼ばれています。
npmパッケージとして配布されているので、インストールします。

Ganache

Ganacheは、自分専用のブロックチェーンをローカル環境に用意してくれるツール。
GUIのアプリもありますが今回はganache-cliを使用します。

セットアップ

二つをインストールして準備ができたら、早速作っていきましょう。
レポジトリを用意して、プロジェクトの初期化。

truffle init

contractsやmigrationsフォルダが生成されたら成功です。
簡単なコントラクトファイルをcontractsの中に作ります。

HelloWorld.sol
pragma solidity >=0.4.22 <0.9.0;
contract HelloWorld {
  function get() public pure returns (string memory) {
    return "Hello World";
  }
}

このコントラクトをデプロイするには、truffleのマイグレーションという機能を使う必要があります。JavaScriptで書かれたスクリプトで、そのファイルをmigrationsの中に作成します。
このスクリプトがなければHelooWorldコントラクトはデプロイされません。

2_helloworld.js
const HelloWorld = artifacts.require("HelloWorld");
module.exports = function (deployer) {
  deployer.deploy(HelloWorld);
};

最後にデプロイするネットワーク先を指定したりする設定ファイルtruffle-config.jsを編集します。networkの中にある、development部分のコメント化を解除しましょう。

truffle-config.js
development: {
      host: "127.0.0.1", // Localhost (default: none)
      port: 8545, // Standard Ethereum port (default: none)
      network_id: "*", // Any network (default: none)
    },

ここでganache-cliを動かしてみます。

ganache-cli

するとアカウントのアドレスやプライベートキー等が出てきて、一番最後にListening on 127.0.0.1:8545と出ると思います。
先ほどtruffle-config.jsで設定した、hostとportの番号が一致していますね。
ganacheはデフォルトでdevelopmentに対応しているということです。

コンパイル

ではコントラクトをデプロイするためにまずコンパイルします。

truffle compile

compiled succsessfullyが出れば、build/contractsディレクトリとその中に2つのJSONファイルが生成されたかと思います。
このJSONファイルの中のには色んなデータが含まれていますが、abiとbytecodeについて簡単に説明します。

abi(application binary interface)

これはコントラクトの関数をイベントの構造が記述されています。
※ イベント:関数にセットすることで、コントラクト上で発生した結果をログに保存したり、フロントに伝えることができるもの。
コントラクトをクライアントサイドで使用する際に、このabiデータの部分が必要になります。

bytecode

コントラクトをコンパイルした結果が含まれています。
コントラクトがクライアントから呼び出された時に、イーサリアムネットワークが実行するコードです。

デプロイ

デプロイの準備ができました。デプロイはtruffle migrateコマンドを使用します。
ここでtruffle-config.jsに記述してあるネットワーク先を選んでデプロイすることができます。
今回はローカルにデプロイするので、developmentを指定します。

truffle migrate --network development

うまくいけば、コントラクトごとにコントラクトアドレスが作られ、デプロイにかかったガス代等が見えるかと思います。
クライアントサイドからコントラクトを実行するためには、web3.jsやethers.jsを使用しますが、その際にこのコントラクトアドレスが必要になります。

まとめ

ローカル環境へのデプロイは比較的素早く簡単にできますが、一度閉じるとデプロイし直す必要があり毎回コントラクトアドレスが変わるので外部連携する際に面倒です。当然ローカルなので、開発者ごとにアドレスも変わるのでチーム開発には向いていないかと思います。
ローカルではなくテストネットにデプロイすることによって、何回もコントラクトアドレスを書き換える必要がなく、複数人で共同で開発を進めることができます。
次回はテストネットへのデプロイ方法をまとめてみたいと思います。

認識が間違っている箇所や、もっと良い方法等ありましたらコメントいただけると幸いです。

Discussion