[Solidityのはじめ方] Part23: デプロイスクリプトとネットワーク設定

Solidity

作成したスマートコントラクトをブロックチェーンにデプロイしよう!

スマートコントラクトを作成したら、次はそれをイーサリアムネットワークにデプロイする必要があります。このステップでは、Hardhat を使ってデプロイプロセスを自動化する「デプロイスクリプト」の作成方法と、ローカル環境やテストネット、メインネットといった様々なネットワークへの接続設定について学びます。🔧

コントラクトをデプロイするとは、コントラクトのコードをブロックチェーン上に記録し、特定のアドレスに関連付けるプロセスです。これにより、誰でもそのアドレスを通じてコントラクトの機能を利用できるようになります。

Hardhatにおけるネットワーク設定 🌐

Hardhat でコントラクトをデプロイしたり、タスクを実行したりするには、どのネットワークに接続するかを設定する必要があります。この設定は、プロジェクトルートにある hardhat.config.js (または hardhat.config.ts) ファイルで行います。

このファイルの中心的な役割は、Hardhat の動作、プラグイン、カスタムタスク、そしてネットワーク接続情報を定義することです。

主なネットワークの種類

  • Hardhat Network: Hardhat に組み込まれているローカル開発用のネットワークです。テストやスクリプト実行時に自動で起動され、デプロイやトランザクションを高速に実行できます。デフォルトでは、Hardhat の実行が終了すると状態はリセットされます。
  • ローカルネットワーク (localhost): npx hardhat node コマンドで起動するローカルノードに接続するための設定です。Hardhat Network とは異なり、ノードを停止するまで状態が保持されます。
  • テストネット (Sepolia など): イーサリアムメインネットのシミュレーション環境です。実際の ETH ではなく、テスト用の ETH (フォーセットから入手可能) を使って、メインネットに近い環境でコントラクトの動作を確認できます。
  • メインネット: 実際のイーサリアムネットワークです。デプロイには本物の ETH が必要となり、ガス代も発生します。デプロイは慎重に行う必要があります。

設定ファイル (hardhat.config.js) の例

以下は、Hardhat Network、ローカルネットワーク、そしてテストネット (Sepolia) の設定例です。


require("@nomicfoundation/hardhat-toolbox");
require("dotenv").config(); // .envファイルを使うために必要

// ハードハットの構成変数を取得 (Hardhat v2.18.0 以降推奨)
// const { vars } = require("hardhat/config");
// const INFURA_API_KEY = vars.get("INFURA_API_KEY");
// const SEPOLIA_PRIVATE_KEY = vars.get("SEPOLIA_PRIVATE_KEY");

// 従来のdotenvを使った方法
const INFURA_API_KEY = process.env.INFURA_API_KEY;
const SEPOLIA_PRIVATE_KEY = process.env.PRIVATE_KEY;

/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
  solidity: "0.8.24", // 使用するSolidityのバージョンを指定
  defaultNetwork: "hardhat", // デフォルトで使用するネットワーク
  networks: {
    hardhat: {
      // Hardhat Network の設定 (オプション)
      // 例: メインネットのフォーク
      // forking: {
      //   url: `https://mainnet.infura.io/v3/${INFURA_API_KEY}`,
      // }
    },
    localhost: {
      url: "http://127.0.0.1:8545", // npx hardhat node で起動したローカルノード
    },
    sepolia: {
      url: `https://sepolia.infura.io/v3/${INFURA_API_KEY}`, // InfuraなどのRPCノードURL
      accounts: [SEPOLIA_PRIVATE_KEY], // デプロイに使用するアカウントの秘密鍵
      chainId: 11155111, // SepoliaのChain ID
    },
    // メインネット設定例 (デプロイは慎重に!)
    // mainnet: {
    //   url: `https://mainnet.infura.io/v3/${INFURA_API_KEY}`,
    //   accounts: [MAINNET_PRIVATE_KEY],
    //   chainId: 1,
    // }
  },
  paths: {
    sources: "./contracts",   // コントラクトソースファイルの場所
    tests: "./test",          // テストファイルの場所
    cache: "./cache",         // Hardhatのキャッシュディレクトリ
    artifacts: "./artifacts"  // コンパイル結果(ABI, バイトコード)の出力先
  },
  mocha: {
    timeout: 40000 // テストのタイムアウト時間 (ミリ秒)
  }
};
                

🚨 注意: 秘密鍵の管理

hardhat.config.js に秘密鍵を直接書き込むのは非常に危険です! 😱 必ず .env ファイルを作成し、そこに秘密鍵を記述し、.gitignore.env を追加して、Git リポジトリに秘密鍵が含まれないようにしてください。

.env ファイルの例:


INFURA_API_KEY=あなたのInfura_APIキー
PRIVATE_KEY=あなたのウォレットの秘密鍵
                    

そして、.env ファイルを読み込むために dotenv パッケージをインストールします。


npm install --save-dev dotenv
# または
yarn add --dev dotenv
                    

Hardhat v2.18.0 以降では、vars を使った設定変数の管理が推奨されています。詳細はHardhat Configuration Variables Guideを参照してください。

RPC URL の取得

テストネットやメインネットに接続するには、RPC (Remote Procedure Call) ノードの URL が必要です。これは、ブロックチェーンネットワークと通信するための窓口のようなものです。以下のサービスで API キーを取得し、URL を生成できます。

これらのサービスに登録し、プロジェクトを作成して API キーを取得した後、hardhat.config.js.env ファイルに設定します。

デプロイスクリプトの作成と実行 📜

ネットワーク設定ができたら、次は実際にコントラクトをデプロイするためのスクリプトを作成します。Hardhat では、scripts ディレクトリ内に JavaScript または TypeScript ファイルとしてデプロイスクリプトを作成するのが一般的です。

デプロイスクリプトは、主に以下の処理を行います。

  1. デプロイするコントラクトのファクトリ (インスタンス生成器) を取得する。
  2. コントラクトファクトリを使ってコントラクトをデプロイする。
  3. デプロイが完了するのを待つ。
  4. デプロイされたコントラクトのアドレスやその他の情報を表示する。

Hardhat は内部で ethers.js ライブラリを使用しており、スクリプト内で簡単に利用できます。

デプロイスクリプトの例 (scripts/deploy.js)

簡単な Greeter コントラクトをデプロイするスクリプトの例です。


// ethersライブラリをHardhat環境からインポート
const { ethers } = require("hardhat");

async function main() {
  // デプロイに使用するアカウント(Signer)を取得
  // const [deployer] = await ethers.getSigners();
  // console.log("Deploying contracts with the account:", deployer.address);

  // デプロイするコントラクト名(.solファイル名ではない)を指定
  const contractName = "Greeter";
  console.log(`Deploying ${contractName} contract...`);

  // コントラクトファクトリを取得
  // これはコントラクトのインスタンスを作成するための抽象化レイヤーです
  const Greeter = await ethers.getContractFactory(contractName);

  // コンストラクタに渡す引数を指定してデプロイを実行
  // コンストラクタがない場合は引数なしで deploy() を呼び出す
  const initialGreeting = "Hello, Hardhat!";
  const greeter = await Greeter.deploy(initialGreeting);

  // デプロイトランザクションがブロックチェーンに承認されるのを待つ (ethers v6以降推奨)
  await greeter.waitForDeployment();
  // 以前のバージョン (ethers v5) では await greeter.deployed(); を使用

  // デプロイされたコントラクトのアドレスを取得 (ethers v6以降)
  const deployedAddress = await greeter.getAddress();
  console.log(`${contractName} deployed to: ${deployedAddress}`);

  // 必要であれば、デプロイ後にコントラクトの関数を呼び出すことも可能
  // const currentGreeting = await greeter.greet();
  // console.log(`Current greeting: ${currentGreeting}`);
}

// スクリプト実行のエントリポイント
main()
  .then(() => process.exit(0)) // 成功したらプロセス終了
  .catch((error) => {
    console.error(error); // エラー発生時に表示
    process.exit(1);      // 異常終了
  });
                

スクリプトの実行

作成したデプロイスクリプトは、npx hardhat run コマンドで実行します。--network フラグを使って、デプロイ先のネットワークを指定します。

ローカルの Hardhat Network で実行する場合 (テスト目的):


npx hardhat run scripts/deploy.js
# または (明示的に指定する場合)
npx hardhat run scripts/deploy.js --network hardhat
                

ローカルノード (localhost) で実行する場合:

まず、別のターミナルでローカルノードを起動します。


npx hardhat node
                

次に、デプロイスクリプトを実行します。


npx hardhat run scripts/deploy.js --network localhost
                

Sepolia テストネットで実行する場合:


npx hardhat run scripts/deploy.js --network sepolia
                

実行すると、コンソールにデプロイの進捗やデプロイされたコントラクトのアドレスが表示されます 🎉。

💡 Hardhat Ignition

Hardhat は Hardhat Ignition という宣言的なデプロイシステムも提供しています。これは、特に複雑なデプロイメントやアップグレード可能なコントラクトを管理する場合に便利です。基本的なスクリプトに慣れたら、Ignition の利用も検討してみましょう。

デプロイ時の注意点 ⚠️

  • ガス代: ローカルネットワーク以外 (テストネットやメインネット) へのデプロイにはガス代が必要です。テストネットではフォーセットからテスト用 ETH を入手できますが、メインネットでは実際の ETH が消費されます。デプロイ前にガス代の見積もりを確認しましょう。
  • 秘密鍵の管理: 何度も強調しますが、秘密鍵の管理は非常に重要です。絶対に公開リポジトリなどにプッシュしないようにしてください。
  • テストの重要性: メインネットにデプロイする前に、必ずローカルネットワークやテストネットで十分にテストを行い、意図した通りに動作することを確認してください。一度デプロイしたコントラクトのコードは基本的に変更できません (アップグレード可能なパターンを除く)。
  • コンパイル: `npx hardhat run` コマンドは、通常、実行前に自動的にコントラクトをコンパイルします。明示的にコンパイルしたい場合は `npx hardhat compile` を実行します。
  • Verify (検証): テストネットやメインネットにデプロイした後、Etherscan などのブロックエクスプローラーでコントラクトのソースコードを Verify (検証) することをお勧めします。これにより、コントラクトの透明性が高まり、ユーザーがコードを確認できるようになります。Hardhat には Etherscan プラグインがあり、検証プロセスを自動化できます。

まとめ

このステップでは、Hardhat を使用してスマートコントラクトを様々なネットワークにデプロイするための設定方法と、デプロイスクリプトの作成・実行方法を学びました。

  • hardhat.config.js でネットワーク接続情報 (RPC URL, アカウント秘密鍵) を設定する。
  • 秘密鍵は .env ファイルなどで安全に管理する。
  • scripts ディレクトリにデプロイ処理を記述した JavaScript/TypeScript ファイルを作成する。
  • ethers.js を利用してコントラクトファクトリを取得し、deploy() メソッドでデプロイする。
  • npx hardhat run scripts/your-script.js --network <network-name> でスクリプトを実行する。

これで、自分で作成したスマートコントラクトをブロックチェーン上で実際に動かす準備が整いました! 💪 次のステップでは、いよいよフロントエンドとスマートコントラクトを接続し、DApp (分散型アプリケーション) の構築に進みます。

参考情報

コメント

タイトルとURLをコピーしました