🍏

スマートコントラクト開発の始め方(テストネット編)

2021/07/25に公開

はじめに

Solidityで書いたコントラクトをテストネットにデプロイする方法を紹介します。
前回の記事でローカルへのデプロイ方法をまとめていますので、そちらからご覧いただければ今回のテストネット編の理解も深まるかと思います。
コントラクトは前回ローカルへデプロイしたのものを使用します。

テストネットで動かす方法

全体的な構造をイメージするにはこちらの図が良いと思います。
前回の記事では図の一番下のローカルへデプロイを行いました。今回は真ん中のテストネットについてです。

ソースはこちらの記事です。
https://medium.com/coinmonks/5-minute-guide-to-deploying-smart-contracts-with-truffle-and-ropsten-b3e30d5ee1e

テストネットとメインネット

そもそもテストネットとは、文字通りブロックチェーンを使った開発をする際にテストで使用するネットワークです。一方メインネットは本番環境のようなもので、コントラクトをメインネットにデプロイしたり書き込んだりしようとするとガス代が発生して実際に現実世界のお金(ETH)が必要になります。
テストネットでは、無料でテストネット用の通貨をもらうことができるので、気軽にデプロイしたり書き込んだりすることができます。
テストネットで開発しているコードが実際に動くかどうか無料で検証した後に、メインネットに移行するという流れですね。

テストネットの種類

テストネットはいくつかあって、それぞれコンセンサスアルゴリズムなどが違うようです。
・Ropsten
・Kovan
・Rinkeby
・Goerli
など、今回はRopstenを使用します。

セットアップ

テストネットを使用する際は、前述した通りテストネット用のイーサリアムをもらう必要があります。イーサリアムをもらうためにはアドレスが必要なので、Chromeの拡張機能でMetamaskというものをインストールしてください。
https://coincheck.com/ja/article/472
インストールが済んだら、Ropstenテストネットワークのそのアドレスにテスト用イーサリアムを入れます。
https://qiita.com/biga816/items/ac762faf5d9334aeeabd
無事Metamaskにイーサリアムが入ったことを確認できれば準備完了です。

Infura

ローカルへデプロイした際は、Ganacheを立ち上げていましたが今回はInfuraというEthereumのノードをホスティングしたり、JSON-RPCを提供してくれているサービスを使用します。
Truffleの開発をしているconsensysが提供しているサービスです。
https://infura.io/
こちらからアカウントを登録してprojectを一つ作りましょう。
プロジェクトを作るとPROJECT IDというものが作られるのでそのIDを使用します。

truffle-hdwallet-provider

簡単に説明すると、truffle-hdwallet-providerはニーモニックという12個のワードからwalletに接続してそのアカウントを使用してトランザクションを行えるようにしてます。
yarnもしくはnpmでtruffle-hdwallet-providerをインストールしましょう。

truffle-config.js

一通りデプロイに必要なものは準備できたので、デプロイの設定ファイルを編集します。
実はRopstenの設定はnetworkの中のdevelopmentの少し下の行にコメントアウトされて書かれていますので解除しましょう。

truffle-config.js
ropsten: {
    provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/${infuraKey}`),
    network_id: 3,       // Ropsten's id
    gas: 5500000,        // Ropsten has a lower block limit than mainnet
    confirmations: 2,    // # of confs to wait between deployments. (default: 0)
    timeoutBlocks: 200,  // # of blocks before a deployment times out  (minimum/default: 50)
    skipDryRun: true     // Skip dry run before migrations? (default: false for public nets )
    },

HDWalletProvider、mnemonic、infuraのPROJECTIDが必要なのでそれぞれ書いてあげます。

truffle-config.js
const HDWalletProvider = require("truffle-hdwallet-provider");
const infuraKey = "YOUR_PROJECTID";
const mnemonic = "YOUR_MNEMONIC";

これでRopstenにデプロイする準備ができました。

デプロイ

truffle migrate --network ropsten

ローカルへデプロイするよりも少し時間がかかると思います。
成功すればコントラクトごとにcontract addressが作成され、デプロイにかかったガス代が表示されます。もちろんMetamaskの残高が減っていることで確認することもできます。

Remix

Infuraの設定からデプロイまで手順を踏んできましたが、実はremixという、Solidityソースコードのエディット、コンパイル、デプロイ、デバッグを全部行うことができるサービスもあります。
Metamaskのアドレスを登録すればコントラクトをすぐにテストネットにおデプロイすることができるので、一度試してみるのも良いかと思います。
https://remix.ethereum.org/

まとめ

今回はコントラクトをテストネットにデプロイする方法の一例をまとめてみました。
テストネットへデプロイすることによって、クライアントサイドでコントラクトを呼び出す際、ローカルへのデプロイのようにコントラクトアドレスを書き換える必要もありませんし、共同で開発することができます。
次回はWeb3.jsやethers.jsを使用してデプロイしたコントラクトを実際にクライアントサイドで呼び出す方法をまとめてみたいと思います。

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

Discussion