day21. hardhat – 設定(hardhat.config.ts) –

hardhatの設定は、hardhat.config.tsというファイルに記載することによって行うことができます。hardhat.config.tsは、ネットワーク(各環境)、Solidityのコンパイラー、アカウントを始めとするhardhatの動作に関わる様々な設定が定義されます。

hardhatの設定は、hardhat.config.tsというファイルに記載することによって行うことができます。hardhat.config.tsは、ネットワーク(各環境)、Solidityのコンパイラー、アカウントを始めとするhardhatの動作に関わる様々な設定が定義されます。

目次

Hardhatの設定

次のものがhardhat.config.tsの具体的な例(本ガイドで利用するもの)になります。

TypeScript
/// 1. 必要な依存ライブラリーのimport
import "@typechain/hardhat"            // hardhat本体
import "@nomiclabs/hardhat-waffle"     // テストを記述するためのライブラリー。chaiと一緒に使う
import "@nomiclabs/hardhat-etherscan"  // Etherscanにデプロイ後のソースをアップ、検証するためのライブラリー
import "@nomiclabs/hardhat-ethers"     // コントラクトのテスト、デプロイを簡単に行うためのライブラリー。デプロイスクリプト中のethersオブジェクトが利用例
import "hardhat-gas-reporter"          // コントラクトのガス消費状況を可視化するためのライブラリー
import "dotenv/config"                 // .envに定義した環境変数を簡単に利用するためのライブラリー
import "hardhat-deploy"                // デプロイそのものを行うために使うライブラリー。デプロイスクリプト中のdeploy関数やgetNamedAccounts関数など。
import "solidity-coverage"             // テストのカバレッジを可視化するためのライブラリー
import { HardhatUserConfig } from "hardhat/config"

/// 2. 定数の定義(環境変数として外部ファイルに定義されているもの)
// 以下は、環境変数を定数で取得している。これらの定数が設定(HardhatUserConfig)の中で使われる。
const SEPOLIA_RPC_URL = process.env.SEPOLIA_RPC_URL || "https://eth-sepolia.g.alchemy.com/v2/YOUR-API-KEY"
const PRIVATE_KEY = process.env.PRIVATE_KEY || "0x123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0"
const ETHERSCAN_API_KEY = process.env.ETHERSCAN_API_KEY || ""
const COINMARKETCAP_API_KEY = process.env.COINMARKETCAP_API_KEY || ""

/// 3. HardhatUserConfig。実際の設定
const config: HardhatUserConfig = {
    defaultNetwork: "hardhat",
    networks: { // 接続する環境を定義
        hardhat: {
            chainId: 31337,
            // gasPrice: 130000000000,
        },
        sepolia: {
            url: SEPOLIA_RPC_URL,
            accounts: [PRIVATE_KEY],
            chainId: 11155111,
        },
    },
    solidity: { // solidityのコンパイラーのバージョンを定義
        compilers: [
            {
                version: "0.8.8",
            },
            {
                version: "0.6.6",
            },
        ],
    },
    etherscan: { // Etherscanにソースの検証(verify)をリクエストする際のAPIキーを定義
        apiKey: ETHERSCAN_API_KEY,
    },
    gasReporter: { // ガスレポーター(ガス代を可視化するツール)を
        enabled: true,
        currency: "USD",
        outputFile: "gas-report.txt",
        noColors: true,
        coinmarketcap: COINMARKETCAP_API_KEY,
    },
    namedAccounts: { // デプロイやテストで利用するアカウント情報(自分のウォレットの情報等)を定義
        deployer: {
            default: 0, // here this will by default take the first account as deployer
            1: 0, // similarly on mainnet it will take the first account as deployer. Note though that depending on how hardhat network are configured, the account 0 on one network can be different than on another
        },
        user:{
            default: 1, 
        },
    },
}

export default config

設定ファイルは、主に以下の3つのパートからなっていますが、以降で3の設定のセクションについて、解説します。
1および2の詳細な内容は、コメントに記載のとおりです。2では、定数を定義し、その定数を具体的な設定箇所では利用していますが、設定箇所で例えば、apiKey:'${process.env.ETHERSCAN_API_KEY}'のように書いて埋め込むことも可能です。

  1. 必要な依存するライブラリー群をimportするセクション
  2. 定数を定義しているセクション(外部に定義されている環境変数を定数として読み込む)
  3. 実際の設定を行うセクション

HardhatUserConfig

networks

ネットワークの設定例は、次のようになります。

TypeScript
    defaultNetwork: "hardhat",
    networks: { // 接続する環境を定義
        hardhat: {
            chainId: 31337,
            // gasPrice: 130000000000,
        },
        sepolia: {
            url: SEPOLIA_RPC_URL,
            accounts: [PRIVATE_KEY],
            chainId: 11155111,
        },
    },

デプロイやその他のスクリプトを実行する際の環境を定義します。ブロックチェーン・ネットワークとしては、mainnet(本番)、testnet(テスト。上記の例ではSepoliaネットワーク)、hardhat(ローカルの仮想的なブロックチェーン・ネットワーク)があります。それぞれのネットワークでは、chainIdと呼ばれるネットワークの識別子をもっており、それを指定します。localnet(hardhat)の場合は31337、Sepoliaの場合は11155111、mainnetの場合は、1になります。

accountsの項目には、Metamaskなどのローカルのデジタルウォレットで設定されている秘密鍵(Private Key)を設定します(厳密には、.envファイルにそれを定義し、定数として読む)。

MetamaskでPrivate Keyを取得する。

ブロックチェーンのネットワークへトランザクションを発行する(例えば、スマートコントラクトをデプロイするなど)には、ローカル端末からブロックチェーン・ネットワークに接続する必要があります。これらは、RPC(Remote Procedure Call)と呼ばれるノードを通じて行われます(ローカルとブロックチェーン・ネットワークの間をつなぐ、通信路のようなものをイメージすると良いです。もう少し詳細に言うとJSON-RPCを採用しており、JSON形式でやり取りされます)。このようなRPCのサービスを提供するインフラサービスとしては、Alchemy, Infura, QuickNode, Moralisといったサービスがあります。環境変数としても定義しているSEPOLIA_RPC_URLは、個別にAlchemyのサービスで作成したRPCノードになります。

RPCノードを設定するには、alchemyのサイトへ接続、ユーザーアカウントを作成後、以下の手順に従います。

Apps -> Create new app を選択する。
Apps -> Create new app を選択する。
Name, Descriptionを記入し、Networkを選択する。
Name, Descriptionを記入し、Networkを選択し、Create Appを押す。
API Keyを押す。
API Keyを押す。
作成されたノードのHTTPSのURLを確認する。
作成されたノードのHTTPSのURLを確認する。

solidity

TypeScript
    solidity: { // solidityのコンパイラーのバージョンを定義
        compilers: [
            {
                version: "0.8.8",
            },
            {
                version: "0.6.6",
            },
        ],
    },

このセクションでは、Solidityのバージョン(コンパイラーのバージョン)を指定します。実際のSolidityのソースで指定しているバージョンと併せて記載します。

etherscan

TypeScript
    etherscan: { // Etherscanにソースの検証(verify)をリクエストする際のAPIキーを定義
        apiKey: ETHERSCAN_API_KEY,
    },

このセクションでは、EtherscanのAPIキーの設定を行います。Etherscanについての詳細は、Day6で説明していますが、Ethereum上の情報を閲覧するためのブロックエクスプローラーと呼ばれるサービスです。

ブロックチェーンにスマートコントラクトをデプロイすると、バイトコードとしてブロックチェーン上に格納されます。しかし、バイトコードから元のSolidityのソースコードを直接取得することはできません。これは、コードの逆コンパイルが困難であり、また、それが可能だとしても、元のソースコードのコメントや変数名などは復元できないからです。

そのため、開発者がスマートコントラクトの透明性を保つためには、ソースコードを公開し、そのソースコードがデプロイされたバイトコードにコンパイルされることを証明(つまり、検証)する必要があります。これを行うことで、他の人々がそのコントラクトの動作を確認し、信頼性を評価することが可能になります。

Etherscanでは、コントラクトを検証する機能を提供しており、デプロイスクリプトの中で、これを行うためにEtherscanのAPIキーを登録します(APIキーによってVerifyをスクリプト内で自動化することが可能となります)。

Etherscan APIキーの取得は、Etherscanのアカウントを作成後、下図の通り、API Keys > +Add から作成することが可能です。

EtherscanのAPIキー作成画面

gas-reporter

TypeScript
    gasReporter: { // ガスレポーター(ガス代を可視化するツール)を
        enabled: true,
        currency: "USD",
        outputFile: "gas-report.txt",
        noColors: true,
        coinmarketcap: COINMARKETCAP_API_KEY,
    },

このセクションは、gas-reporterの設定を保持する箇所です。gas-reporterは、スマートコントラクトのガス消費量を報告するためのツールで、Hardhatでテストを行う際に、各関数やトランザクションのガス消費量を計測し、それをまとめた報告を生成します。

次の画像は、実際のgas-reporterの実行例です。各関数に対して、ガス(最小、最大、平均)の値が記載されています。このように可視化することによって、コードのどの部分が多くのガスを消費しているかと言ったことがわかり、より低消費にするといった改善に役立てることができます(詳細は、Day25で解説します)。

gas-reporterの実行結果の例。

namedAccounts

TypeScript
    namedAccounts: { // デプロイやテストで利用するアカウント情報(自分のウォレットの情報等)を定義
        deployer: {
            default: 0, 
            1: 0, 
        },
        user:{
            default: 1, 
        },

このセクションでは、デプロイスクリプトやテストスクリプト内で利用するアカウントを定義することができます。

上記の例の場合、deployerという名前のアカウントを定義していて、その中では、デフォルトではアカウントリストの0番目を利用し、1(mainnetchain ID)の場合も0番目のアカウントを利用する、といったことが記述されています。1という数字の代わりに、mainnetといったネットワーク名を利用することも可能です。
同様にuserという名前のアカウントについても定義し、デフォルトを0番目のアカウントとしています。

アカウントリストは、前述のnetworksのセクションでブロックチェーン・ネットワーク毎にaccountsが設定されていますが、ここで秘密鍵または、ニーモニックから生成されます。

ご意見をお聞かせください!

web3チュートリアルシリーズについてのご意見を是非お聞かせください。

この記事、または、web3チュートリアル全体について、是非、あなたのご意見をお聞かせください。
アンケートはこちらからご回答いただけます。

無料相談承ります

ITの専門家が無料相談を受け付けます。web3以外のテーマでもOKです。

オンラインでの無料相談を承っています。ご希望の方は、お問い合わせフォームよりご連絡ください。
ITの専門家があなたのご質問にお答えいたします。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

After joining IBM in 2004, the author gained extensive experience in developing and maintaining distributed systems, primarily web-based, as an engineer and PM. Later, he founded his own company, designing and developing mobile applications and backend services. He is currently leading a Tech team at a venture company specializing in robo-advisory.

コメント

コメントする

CAPTCHA


目次