😎

DockerでHardhatの開発環境を作る

2023/10/23に公開

はじめに

Dappsを作りたくなったらローカルにブロックチェーンとスマートコントラクトを実行できる環境が欲しくなると思います。ローカルでブロックチェーンを動かし、スマートコントラクトのテスト等ができるHardhatの環境をDockerで構築してみます。

ファイル構成

hardhat
├ docker
│ └ Dockerfile
└ src
docker-compose.yml

Dockerfile

FROM node:21-bullseye

RUN apt update && apt -y upgrade

WORKDIR hardhat

RUN npm install -g npm
RUN npm install --save-dev hardhat

docker-compose.yml

version: "3.8"

services:
  hardhat:
    container_name: hhat
    build: ./hardhat/docker
    ports:
      - 8545:8545
    volumes:
      - ./hardhat/src:/hardhat
    tty: true
    environment:
      - TZ=Asia/Tokyo

volumes:
  node_modules

「volumes」の指定は、後工程で作成されるnode_modulesディレクトリをボリュームマウントへ変更するためのものです。詳しくは以下を参照ください。
https://zenn.dev/nsystk/articles/77d77737e82853

コンテナ起動

docker-compose up -d

Hardhatの初期化

docker-compose exec hardhat /bin/bash

以下はコンテナ内で実行します

npx hardhat init

ウィザードが表示されるので要件に応じて選択してください。以下は例です。

✔ What do you want to do? · Create a TypeScript project
✔ Hardhat project root: · /hardhat
✔ Do you want to add a .gitignore? (Y/n) · y
✖ Help us improve Hardhat with anonymous crash reports & basic usage data? (Y/n) · y
✔ Do you want to install this sample project's dependencies with npm (hardhat @nomicfoundation/hardhat-toolbox)? (Y/n) · y

TypeScriptでプロジェクトを作成すると、アカウントを一覧表示するコマンドがないようなので作成します。hardhat.config.tsを以下のように編集します。

import { HardhatUserConfig, task } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
import { HardhatRuntimeEnvironment } from "hardhat/types";

const accounts = async (args: string, hre: HardhatRuntimeEnvironment) => {
  const accounts = await hre.ethers.getSigners();

  for (const account of accounts) {
    console.log(account.address);
  }
};
task("accounts", "Show the list of accounts", accounts);

const config: HardhatUserConfig = {
  solidity: "0.8.17",
};

export default config;

こちらは以下を参考にしています。
https://qiita.com/raorao1011/items/acc54a215064bbb888c6

まとめ

以上でhardhatの動作する環境自体は準備できました。スマートコントラクトを作成したり、ローカルノードを立ち上げたりするのは別で取り上げようと思います。

Discussion