EthereumではGas(ガス)代の高騰がしばしば問題になることがあります。ローカルネットやテストネットならまだ良いですが、メインネットでは実コストが多くかかってしまうことになってしまうためです。
このような背景から、Gas使用量を把握し、必要に応じて改善を行うことは、重要な内容です。
Gas(ガス)レポーター
Day20では、hardhatの開発で利用するライブラリーを紹介しましたが、その中に、hardhat-gas-reporter
というライブラリーが含まれます。このライブラリーを用いると、実装対象のコントラクトのGasの使用状況に関するレポートを出力することが可能になります。
具体的な設定は、Day21で解説したhardhat.config.ts内にありますが、次の部分になります。それぞれの項目の説明は、コメントに記載の通りです。
// hardhat.config.ts より抜粋
...
gasReporter: { // ガスレポーター(ガス代を可視化するツール)を
enabled: true, // Gasレポートの有効・無効を切り替えるフラグ
currency: "USD", // Gas使用量の金額を表示する際の通貨を指定
outputFile: "gas-report.txt", // 生成されたGasレポートの出力先を指定する
noColors: true, // ターミナル上のカラー表示を無効化するかどうかを指定する
},
...
Gas(ガス)レポート
yarn hardhat test
を実行すると、gas-reporter.txt
という名前のファイルが出力されます。その実行結果は次の通りとなりました。
·-------------------------|----------------------------|-------------|-----------------------------·
| Solc version: 0.8.8 · Optimizer enabled: false · Runs: 200 · Block limit: 30000000 gas │
··························|····························|·············|······························
| Methods · 41 gwei/gas · 1656.05 usd/eth │
·············|············|··············|·············|·············|···············|··············
| Contract · Method · Min · Max · Avg · # calls · usd (avg) │
·············|············|··············|·············|·············|···············|··············
| Funding · fund · 72474 · 89574 · 86154 · 5 · 5.85 │
·············|············|··············|·············|·············|···············|··············
| Funding · withdraw · - · - · 44146 · 2 · 3.00 │
·············|············|··············|·············|·············|···············|··············
| Deployments · · % of limit · │
··························|··············|·············|·············|···············|··············
| Funding · - · - · 538126 · 1.8 % · 36.54 │
·-------------------------|--------------|-------------|-------------|---------------|-------------·
このGasレポートは、Solidityコントラクトの各メソッドおよびデプロイメントの実行にかかるガス使用状況を示しています。以下はレポートの詳細な解説です。
- Solc version: Solidityコンパイラのバージョンです。この例ではバージョン0.8.8を使用しています。
- Optimizer enabled: オプティマイザの有効化状態を示します。この例ではオプティマイザは無効です。
- Runs: Solidityコードをコンパイルする際に、オプティマイザがコードを最適化する回数です。
- Block limit: ガスのブロック制限を示します。一つのブロックで使用できるガスの最大量です。
次に、レポートのメソッドごとのカラムについての解説です。
- Contract: コントラクト名です。”Funding”コントラクトです。
- Method: コントラクト内のメソッド名です。”fund”と”withdraw”があります。
- Min: このメソッドの実行にかかった最小ガス量です。
- Max: このメソッドの実行にかかった最大ガス量です。
- Avg: このメソッドの実行にかかった平均ガス量です。
- # calls: このメソッドが呼び出された回数です。
- usd (avg): 平均ガス量を基に、USDでの評価を示します。(USDの表示には、CoinMarketCapというサービスのAPIを利用する必要があります。次節にて説明)
デプロイメントのカラムでは、デプロイされたコントラクトごとの使用ガスの状況が示されます。
このレポートを通じて、各メソッドやデプロイメントがどれくらいのガスを使用しているか、最適化が有効かどうかなどが分かります。これによって、コントラクトの実行にかかるガスの使用状況を分析し、効率的なコントラクトを設計する際に役立てることができます。
CoinMarketCap API Keyの登録
CoinMarketCapのサイトでアカウント登録を行います。メール認証を行い、サインインすると、次の画面が表示されます。ここに記載されているAPIキーをコピーし、.envファイルに追記。.envファイルで定義した変数をhardhart.config.tsで呼び出し、変数定義を行います(Day20の.envの設定例、Day21のhardhat.config.tsの設定例もご参照ください)。
ご意見をお聞かせください!
この記事、または、web3チュートリアル全体について、是非、あなたのご意見をお聞かせください。
アンケートはこちらからご回答いただけます。
無料相談承ります
オンラインでの無料相談を承っています。ご希望の方は、お問い合わせフォームよりご連絡ください。
ITの専門家があなたのご質問にお答えいたします。
コメント