Hardhat入門!イーサリアム開発を最短習得

その他(DeFi・NFT・P2Eなど)
イーサリアムのスマートコントラクト開発を始めたいが、どこから手を付けるべきか分からない。
Hardhatの環境構築や使い方に不安がある。
Web3やDeFi、NFTなどに興味があり、DAppsの開発手法を知りたい。

このブログを読むことで、以下のような効果が得られます。

  • この記事を読めば、Hardhatを使ってイーサリアムのスマートコントラクトを作成・デプロイするまでの流れが分かる!
  • テストネット(Sepolia)で実際にスマートコントラクトをデプロイし、フロントエンド(Vue + ethers.js)と連携する方法が理解できる!

Hardhatの設定ファイル、デプロイスクリプト、Solidityのコードを記載し、初心者でもコピペで試せるようにしています。

Hardhat入門!イーサリアム開発を最短習得

  1. はじめに
  2. Hardhatとは?特徴とメリットを解説
    1. Hardhatとは?概要とできること
    2. Truffleとの違い|どちらを選ぶべきか?
    3. Hardhatを使うメリット|開発効率を上げる理由
  3. 開発環境準備
    1. メタマスクのインストール・設定
      1. インストール
      2. Ethereumテストネットの設定(Sepolia推奨)
    2. テストETH取得
    3. Infuraのアカウント作成し、InfuraのプロジェクトIDを取得
    4. WSL (またはローカル環境) のセットアップ
    5. Node.jsインストール
      1. nvmをインストール
      2. 最新の安定版Node.jsをインストール
      3. Node.jsのバージョンを確認
  4. Hardhatのインストールと基本設定
    1. Hardhatのインストール手順(Windows / Mac / Linux)
    2. Hardhatプロジェクトのセットアップと基本設定
    3. Hardhatの主要コマンド解説(compile, test, deploy)
  5. Hardhatを使ったスマートコントラクト開発
    1. コントラクトとは
    2. ディレクトリ構成理解
    3. Solidityで簡単なスマートコントラクトを作成
    4. 必要なモジュールのインストール
    5. Hardhatの設定ファイル (hardhat.config.js)
    6. Hardhatでコンパイル・デプロイする方法
      1. デプロイスクリプトとは
      2. コンパイル+デプロイ実行
  6. Hardhatを使ったテストとデバッグの方法
    1. Hardhatでスマートコントラクトのテストを実行する
  7. フロントエンド(Vue + ethers.js)
    1. ABI情報の配置
    2. src/App.vue を以下の通り修正
  8. まとめ|Hardhatを活用して効率的に開発しよう
    1. 関連

はじめに

イーサリアムのスマートコントラクト開発を始めたい方にとって、Hardhatは最適なツールの一つです。
本記事では、Hardhatの基本から実践的なスマートコントラクトのデプロイまで、最短で習得できる方法を解説します。
「Hardhat チュートリアル」や「イーサリアム スマートコントラクト 初心者」と検索している方の多くは、以下のような悩みを抱えているでしょう。

  • Hardhatとは何か?Truffleとの違いは?
  • Hardhatのインストール方法と基本的な使い方を知りたい
  • スマートコントラクトのデプロイ方法を学びたい
  • Hardhatを使ったテストやデバッグ方法を知りたい

本記事で構築する内容の概要図は以下の通りです。

本記事では、最短でHardhatを習得するために必要なステップを体系的にまとめています。
初心者でもスムーズに学べるように、実際のコードを交えながら解説していきます。


Hardhatとは?特徴とメリットを解説

Hardhatとは?概要とできること

Hardhatは、イーサリアムのスマートコントラクト開発を簡単にするための開発環境です。
以下のような機能を備えています。

  • Solidityのコンパイル
  • スマートコントラクトのデプロイ
  • テストの実行
  • デバッグやガスコスト分析

Hardhatを使えば、開発・テスト・デプロイがスムーズに行えるため、開発効率が向上します。

Truffleとの違い|どちらを選ぶべきか?

HardhatとTruffleは、どちらもスマートコントラクト開発環境ですが、主な違いは以下の通りです。

項目 Hardhat Truffle
開発者向け機能 高度なデバッグ・ローカルノード機能 シンプルな開発環境
カスタマイズ性 高い 低い
プラグイン 豊富 一部制限あり

開発の柔軟性やデバッグ機能を重視するならHardhatを選ぶのがベストです。

Hardhatを使うメリット|開発効率を上げる理由

  1. ローカル開発環境(Hardhat Network)を提供
  2. スクリプトで自由にデプロイやテストが可能
  3. 詳細なエラーメッセージとデバッグ機能
  4. Ethers.jsとの相性が良い

開発環境準備

まずは前提となる開発環境の準備をしていきます。
実施済の場合は飛ばしてよいです。

メタマスクのインストール・設定

インストール

以下のブログを参照。

MetaMask(メタマスク)とは?PC版とスマホ版のインストール方法と使い方を徹底解説|ブロックチェーンゲーム インフォ
この記事では、PC版とスマホ版のインストールから実際に使うまで流れを簡単に説明します。メタマスクの日本語表記方法や送金の方法、ポートフォリオ機能など、よくある質問についてもしっかり解説しています。ぜひご覧ください。(2024年7月更新)

Ethereumテストネットの設定(Sepolia推奨)

最低でも本利用のアカウントとテスト用のアカウントを分ける(本利用アカウントの秘密鍵流出を防ぐため)

テスト用のアカウントIDをメモします。

テストETH取得

Ethereum Sepolia Faucet
Get free Sepolia ETH to deploy smart contracts, debug transactions, and experiment on testnet.

ウォレットのアドレスを入力してボタンを押すだけでテストETHがもらえる

Infuraのアカウント作成し、InfuraのプロジェクトIDを取得

https://developer.metamask.io/

後に、.envに以下のような形で格納するので保管しておく。

INFURA_API_URL=https://sepolia.infura.io/v3/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
PRIVATE_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

WSL (またはローカル環境) のセットアップ

WSLインストールは以下を参照。UBUNTUを利用する。

とほほのWSL入門 - とほほのWWW入門

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を活用し、スムーズな開発を目指しましょう!

コメント

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