Mainnet Forkingの作り方
PolygonでフルオンチェーンジェネラティブのNFTを開発中です。
テストネットのPolygon-mumbaiで想定通りの動作を確認できたので、いざ、Polygon-mainnetへデプロイ...しましたが、何故かエラーになって動作しません。。。
原因を探るため、ローカルPCにPolygon-mainnet環境を構築してデバックします。
これをMainnet Forkingと言うそうです。
この記事ではMainnet Forkingの方法を紹介していきます。この記事を参考にしました。
つまりどういうこと?
ちょっと解説します。
Ethereum系の独自コントラクトを作成する場合、(開発者によって多少異なると思いますが)概ね以下の手順になります。
- Solidityでコントラクトのプログラムを書く
- テスト用のプログラムを書く
- ローカルPCやテストネット環境でテスト用プログラムを実行し、バグを潰す
- テストで問題なければ本番ネットへデプロイする
今回開発しているNFTは、Polygonで発行したかったため、PolygonのテストネットであるMumbaiでテストを実行しました。
通常であれば、テストネットでうまくいけば本番のメインネットでもうまくいくため、手順通りにテストネットでテストした後で本番へデプロイしましたが、なぜかエラーになっちゃって、原因がわかりません。
コントラクトにデバッグ用のコードを追加したりしながら原因を探っていきたいのですが、これをメインネットでやると、Polygonとはいえ不要なガス代がかかりますし、不要なプログラムを宇宙ゴミのようにブロックチェーンに刻み込むことになってしまいます。
これを解決するために、本番のメインネットのコピーを簡易的にローカルPCに構築するしくみ(Mainnet Forking)が用意されています。
手順
Mainnet Forkingは以下の手順で実施します。
- フォークするネットワーク(EthereumやPolygonなど)への接続情報を確認
- hardhat環境ファイルに接続情報を定義
- 接続情報を使用して、ローカルPCでブロックチェーンノードを実行
- 3のブロックチェーンノードにコントラクトをデプロイしてテスト
順に見ていきます。
1. フォークするネットワークの接続情報を確認
ネットワークへの接続は、infuraまたはAlchemyというブロックチェーンへのインターフェースを提供するサービスを利用します。
今回はinfuraを使用しました。(事前にAPIキーを取得済です)
Polygon-mainnetのURLは、 https://polygon-mainnet.infura.io/v3/ です。
2. hardhat環境ファイルに接続情報を定義
hardhatの接続環境ファイルは、 hardhat.config.ts です。これはhardhatをインストールすると自動で作成されるファイルです。
この中に1で調べたpolygon-mainnetの接続定義を記載します。
networks: {
hardhat: {
forking: {
url: `https://polygon-mainnet.infura.io/v3/${process.env.INFURA_PROJECT_ID}`,
blockNumber: 45011648
}
}
}
${process.env.INFURA_PROJECT_ID}にはinfuraのAPIキーを指定してください。
blockNumberは、とりあえず最新のブロック番号を指定します。
3. ローカルPCでブロックチェーンノードを実行
ターミナルから以下のコマンドを実行します。
npx hardhat node --fork https://polygon-mainnet.infura.io/v3/<key> --fork-block-number 45011648
起動しました。
4. コントラクトをデプロイしてテスト
ネットワークにhardhatを指定して、デプロイ用のスクリプトやテスト用のスクリプトを実行します。
これは nounsdaoのコントラクトをデプロイするスクリプトです。 --networkに hardhatを指定することで、フォークした環境へデプロイします。
yarn task:deploy-and-configure --network hardhat --weth 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
まとめ
日本語の紹介がなかったのでhardhatのチュートリアルを辿りながら実行してみましたが、手順自体はとても簡単でした。
これからこの環境を使って、コントラクトの何が悪かったのかデバッグして調べていきます。
以上です。
Discussion