
Hardhatの環境構築や使い方に不安がある。
Web3やDeFi、NFTなどに興味があり、DAppsの開発手法を知りたい。
このブログを読むことで、以下のような効果が得られます。
- この記事を読めば、Hardhatを使ってイーサリアムのスマートコントラクトを作成・デプロイするまでの流れが分かる!
- テストネット(Sepolia)で実際にスマートコントラクトをデプロイし、フロントエンド(Vue + ethers.js)と連携する方法が理解できる!
Hardhatの設定ファイル、デプロイスクリプト、Solidityのコードを記載し、初心者でもコピペで試せるようにしています。
Hardhat入門!イーサリアム開発を最短習得
はじめに
イーサリアムのスマートコントラクト開発を始めたい方にとって、Hardhatは最適なツールの一つです。
本記事では、Hardhatの基本から実践的なスマートコントラクトのデプロイまで、最短で習得できる方法を解説します。
「Hardhat チュートリアル」や「イーサリアム スマートコントラクト 初心者」と検索している方の多くは、以下のような悩みを抱えているでしょう。
- Hardhatとは何か?Truffleとの違いは?
- Hardhatのインストール方法と基本的な使い方を知りたい
- スマートコントラクトのデプロイ方法を学びたい
- Hardhatを使ったテストやデバッグ方法を知りたい
本記事で構築する内容の概要図は以下の通りです。
本記事では、最短でHardhatを習得するために必要なステップを体系的にまとめています。
初心者でもスムーズに学べるように、実際のコードを交えながら解説していきます。
Hardhatとは?特徴とメリットを解説
Hardhatとは?概要とできること
Hardhatは、イーサリアムのスマートコントラクト開発を簡単にするための開発環境です。
以下のような機能を備えています。
- Solidityのコンパイル
- スマートコントラクトのデプロイ
- テストの実行
- デバッグやガスコスト分析
Hardhatを使えば、開発・テスト・デプロイがスムーズに行えるため、開発効率が向上します。
Truffleとの違い|どちらを選ぶべきか?
HardhatとTruffleは、どちらもスマートコントラクト開発環境ですが、主な違いは以下の通りです。
項目 | Hardhat | Truffle |
---|---|---|
開発者向け機能 | 高度なデバッグ・ローカルノード機能 | シンプルな開発環境 |
カスタマイズ性 | 高い | 低い |
プラグイン | 豊富 | 一部制限あり |
開発の柔軟性やデバッグ機能を重視するならHardhatを選ぶのがベストです。
Hardhatを使うメリット|開発効率を上げる理由
- ローカル開発環境(Hardhat Network)を提供
- スクリプトで自由にデプロイやテストが可能
- 詳細なエラーメッセージとデバッグ機能
- Ethers.jsとの相性が良い
開発環境準備
まずは前提となる開発環境の準備をしていきます。
実施済の場合は飛ばしてよいです。
メタマスクのインストール・設定
インストール
以下のブログを参照。

Ethereumテストネットの設定(Sepolia推奨)
最低でも本利用のアカウントとテスト用のアカウントを分ける(本利用アカウントの秘密鍵流出を防ぐため)
テスト用のアカウントIDをメモします。
テストETH取得
ウォレットのアドレスを入力してボタンを押すだけでテストETHがもらえる
Infuraのアカウント作成し、InfuraのプロジェクトIDを取得
後に、.envに以下のような形で格納するので保管しておく。
INFURA_API_URL=https://sepolia.infura.io/v3/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
PRIVATE_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
WSL (またはローカル環境) のセットアップ
WSLインストールは以下を参照。UBUNTUを利用する。
Node.jsインストール
WSL上にインストールする。(ローカルPCとは環境分離するメリットがある)
nvmをインストール
curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.4/install.sh | bash
source ~/.bashrc
最新の安定版Node.jsをインストール
nvm install --lts
Node.jsのバージョンを確認
node -v
npm -v
Hardhatのインストールと基本設定
Hardhatのインストール手順(Windows / Mac / Linux)
Hardhatを使うには、Node.jsとnpmが必要です。
以下のコマンドでインストールできます。
npm install --global hardhat
※プロジェクトフォルダ内にインストールする場合は以下のコマンドになりっます。
mkdir my-hardhat-project && cd my-hardhat-project
npm init -y
npm install --save-dev hardhat
Hardhatプロジェクトのセットアップと基本設定
以下のコマンドでHardhatプロジェクトをセットアップします。
npx hardhat
セットアップ時に以下のオプションが表示されるので、「Create a basic sample project」を選択しましょう。
Hardhatの主要コマンド解説(compile, test, deploy)
コマンド | 説明 |
---|---|
npx hardhat compile |
スマートコントラクトをコンパイル |
npx hardhat test |
スマートコントラクトのテストを実行 |
npx hardhat run scripts/deploy.js |
デプロイスクリプトを実行 |
Hardhatを使ったスマートコントラクト開発
コントラクトとは
Solidity言語で書かれたスマートコントラクトのコード本体。
Ethereumブロックチェーン上で動くプログラム(契約)。
データの保持(例:メッセージ格納)や処理(例:メッセージの更新)を担当。
ディレクトリ構成理解
「contracts/」→ スマートコントラクトを書く場所
「scripts/」→ そのコントラクトをネットワーク上にアップロード(デプロイ)するためのコード
Solidityで簡単なスマートコントラクトを作成
以下のSolidityコードをcontracts/MyDapp.sol
に作成します。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
contract MyDapp {
string public message;
constructor(string memory _message) {
message = _message;
}
function setMessage(string calldata newMessage) external {
message = newMessage;
}
function retmessage() public view returns (string memory) {
return message;
}
}
必要なモジュールのインストール
dotenvのインストール
npm install dotenv
InfuraのAPIとKeyを.envに格納しておきましょう。
INFURA_API_URL=https://sepolia.infura.io/v3/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
PRIVATE_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Hardhatの設定ファイル (hardhat.config.js)
Sepoliaネットワークの設定を行います。
・hardhat.config.jsを以下に修正
import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
import * as dotenv from "dotenv";
dotenv.config();
const config: HardhatUserConfig = {
solidity: {
version: "0.8.28",
settings: {
optimizer: {
enabled: true,
runs: 200,
},
},
},
networks: {
sepolia: {
url: process.env.INFURA_API_URL || "",
accounts: process.env.PRIVATE_KEY ? [process.env.PRIVATE_KEY] : [],
},
},
};
export default config;
Hardhatでコンパイル・デプロイする方法
デプロイスクリプトとは
Hardhatで用意されたコントラクトをブロックチェーンにデプロイするスクリプト。
Hardhatが自動でコントラクトをコンパイル・デプロイしてくれる。
コントラクトのアドレスを出力するようにしており、このアドレスはフロントエンドから接続する際に利用する。
scripts/deploy.js
async function main() {
const [deployer] = await ethers.getSigners();
console.log("Deploying contracts with the account:", deployer.address); //deployer.addressはメタマスクのアドレス
// コントラクトファクトリを取得
const ContractFactory = await ethers.getContractFactory("MyDapp");
// コンストラクタに引数を渡してデプロイ
const contract = await ContractFactory.deploy("Hello, world!");
// コントラクトアドレスを取得
console.log("Contract deployed to:", contract.target); // ethers v6では contract.target を使用
const contracta = await ethers.getContractAt("MyDapp", contract.target);
await contracta.setMessage("New Message!");
console.log(await contracta.retmessage());
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});
コンパイル+デプロイ実行
npx hardhat run scripts/deploy.js --network sepolia
表示された「Contract deployed to」の部分がSepolia にデプロイされたコントラクトのアドレスになります。後で利用するので控えておきます。
Contract deployed to: 0xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
デプロイを実行するとartifacts/contracts/MyDapp.sol/MyDapp.jsonが作成されます。
MyDapp.jsonも後で利用します。
MyDapp.jsonにABI内容が含まれます。ABIはスマートコントラクトの説明書みたいなものです。
Hardhatを使ったテストとデバッグの方法
Hardhatでスマートコントラクトのテストを実行する
test/MyDapp.js
を作成し、以下のようにテストを記述します。
const { expect } = require("chai");
const { ethers } = require("hardhat");
describe("MyDapp", function () {
let MyDapp, myDapp, owner;
beforeEach(async function () {
// コントラクトのデプロイ
MyDapp = await ethers.getContractFactory("MyDapp");
[owner] = await ethers.getSigners();
// 初期メッセージ "Hello, World!" をセットしてデプロイ
myDapp = await MyDapp.deploy("Hello, World!");
await myDapp.waitForDeployment();
});
it("コンストラクタで初期メッセージがセットされる", async function () {
expect(await myDapp.message()).to.equal("Hello, World!");
});
it("setMessage を呼び出すとメッセージが更新される", async function () {
const tx = await myDapp.setMessage("New Message!");
await tx.wait();
expect(await myDapp.message()).to.equal("New Message!");
});
it("retmessage が現在のメッセージを返す", async function () {
await myDapp.setMessage("Another Message");
const returnedMessage = await myDapp.retmessage();
expect(returnedMessage).to.equal("Another Message");
});
});
npx hardhat test
テストがPassすることを確認できます。
フロントエンド(Vue + ethers.js)
mkdir my-dapp-frontend
npm create vue@latest my-dapp-frontend
cd my-dapp-frontend
npm install ethers
ABI情報の配置
src/contracts/配下に先ほどのスマートコントラクトデプロイ時に作成されたMyDapp.jsonを配置
src/App.vue を以下の通り修正
<template>
<div id="app">
<h1>Hello Vue + Hardhat!</h1>
<p>Message from Smart Contract: {{ message }}</p>
<input v-model="newMessage" placeholder="Enter new message">
<p><button @click="setMessage">Set New Message</button></p>
</div>
</template>
<script setup>
import { ref, onMounted } from "vue";
import { ethers } from "ethers";
import contractArtifact from "@/contracts/MyContract.json";
const message = ref("");
const newMessage = ref(""); // 新しいメッセージ用の変数
const contractAddress = "0xXXXX"; // 先ほど控えたデプロイされたコントラクトのアドレス
const contractABI = contractArtifact.abi; // ABIの内容
let signer, contract;
onMounted(async () => {
if (window.ethereum) {
const provider = new ethers.BrowserProvider(window.ethereum);
await provider.send("eth_requestAccounts", []);
signer = await provider.getSigner();
contract = new ethers.Contract(contractAddress, contractABI, signer);
message.value = await contract.message();
} else {
console.error("MetaMask is not installed!");
}
});
async function setMessage() {
if (!contract) return console.error("Contract not initialized!");
if (!newMessage.value) return console.error("Message cannot be empty!");
const tx = await contract.setMessage(newMessage.value);
await tx.wait();
message.value = await contract.message(); // 更新後のメッセージ取得
newMessage.value = ""; // 入力フィールドをクリア
}
</script>
<style>
#app {
font-family: Arial, sans-serif;
text-align: center;
}
input {
margin-top: 10px;
padding: 5px;
font-size: 16px;
}
</style>
vueでWebサーバーを起動
npm run dev
これで以下URLからサンプルアプリが確認できます。
http://127.0.0.1:5173/
まとめ|Hardhatを活用して効率的に開発しよう
Hardhatを使うことで、スマートコントラクト開発の効率を飛躍的に向上させることができます。
今後は、以下の点を学ぶとさらにレベルアップできます。
- セキュリティ対策
- ガス最適化のテクニック
- 本番環境へのデプロイ手順
これからもHardhatを活用し、スムーズな開発を目指しましょう!
コメント