HardhatでSolidityの開発環境を整え、スマートコントラクトをテストネットにデプロイする
本記事では Hardhat を用いて Solidity のコーディング環境を構築し、テストネット(Sepolia)にスマートコントラクトをデプロイする手順を解説します。基本的には Hardhat のチュートリアルに沿いながら、必要な箇所は補足を加えています。
動作環境
- Node.js 18以上推奨
- Hardhat 最新版
プロジェクト初期化
まずは npm の初期化を行います。
npm init
続いて、Hardhat のインストール。
npm install --save-dev hardhat
そのまま Hardhat を初期化します。
npx hardhat init
今回は TypeScript プロジェクトを選択します。.gitignore
の追加や推奨プラグインのインストールも自動で行われるので y
を選択します。
選択が完了すると、以下のようなディレクトリ構成になります。
my-hardhat-project/
├── contracts/
│ └── Lock.sol
├── ignition/
│ └── modules/
│ └── LockModule.ts
├── scripts/
│ └── deploy.ts
├── test/
│ └── Lock.ts
├── .gitignore
├── hardhat.config.ts
├── package.json
├── tsconfig.json
├── README.md
├── yarn.lock(または package-lock.json)
チュートリアル用 Solidity コントラクト SampleContract.sol
の作成
//SPDX-License-Identifier: UNLICENSED
// Solidity files have to start with this pragma.
// It will be used by the Solidity compiler to validate its version.
pragma solidity ^0.8.0;
contract Sample {
/*
* ETHが送金されると感謝のメッセージをリターンする関数
*/
function storeValue() external payable returns (string memory) {
return "Thank you for your donation!!";
}
}
コンパイル
npx hardhat compile
artifacts
ディレクトリに ABI などが出力されます。
テストネット(Sepolia)へのデプロイ準備
Hardhat設定ファイル hardhat.config.ts
import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
const privateKey = "YOUR_PRIVATE_KEY";
const config: HardhatUserConfig = {
defaultNetwork: "sepolia",
networks: {
hardhat: {},
sepolia: {
url: "https://ethereum-sepolia.rpc.subquery.network/public",
chainId: 11155111,
accounts: [privateKey],
},
},
solidity: "0.8.28",
};
export default config;
各設定項目の説明
-
defaultNetwork
: 明示的にネットワークを指定しない場合に使われるネットワーク(ここではsepolia
)。 -
url
: RPCノードのURL。 -
chainId
: 対象ネットワークのチェーンID(省略可能ですが記載推奨)。 -
accounts
: 使用するウォレットの秘密鍵を配列で指定。ここで指定したアカウントでデプロイされます。
⚠ 秘密鍵の管理に注意!
秘密鍵が漏洩すると、そのアカウントにある資金を全て失うリスクがあります。本記事ではハードコーディングしていますが,環境変数管理や .env
の使用を推奨します。
Hardhat Ignition の利用
Hardhat Ignition はスマートコントラクトのデプロイと操作の流れをモジュールとして管理できる機能です。
公式説明要約:
JavaScript のモジュールのように、コントラクトのインスタンスや操作をまとめて定義・エクスポートできる仕組み。
モジュール作成
ignition/modules/SampleModule.ts
を以下のように作成します。
// This setup uses Hardhat Ignition to manage smart contract deployments.
// Learn more about it at https://hardhat.org/ignition
import { buildModule } from "@nomicfoundation/hardhat-ignition/modules";
const SampleModule = buildModule("SampleModule", (m) => {
const sampleFuture = m.contract("Sample", []);
// この関数は `payable` に指定されているため、ETH を伴うトランザクションで呼び出すことができます。今回の Ignition モジュールでは 100 wei を送金しています。
const storeValue = m.call(sampleFuture, "storeValue", [], {
value: BigInt(100),
});
return { sampleFuture };
});
export default SampleModule;
解説
-
m.contract(name, args)
: スマートコントラクトをデプロイ。 -
m.call(contract, method, args, options)
: 指定したメソッドをコール。
デプロイ実行
以下のコマンドで Sepolia ネットワークにデプロイを実行します。
npx hardhat ignition deploy ignition/modules/SampleModule.ts
ネットワークを確認するプロンプトが出るので y
を入力します。
数秒後、以下のようなメッセージが出れば成功です。
[ SampleModule ] successfully deployed 🚀
EtherScan で確認
デプロイされたアドレスを EtherScan(https://sepolia.etherscan.io)で確認できます。秘密鍵に対応するウォレットアドレスで検索すると、デプロイされたコントラクトや実行されたトランザクションが表示されます。