スマートコントラクト開発
現在の多くのシステムは、クライアントサーバーシステムによってサービスが提供されます。集中型のサーバーによってプログラムが実行やデータの管理が行われます。これらは処理の集中化や処理がユーザー側に見えにくいなどの問題を伴います。
これに対するの解決策の一つとして、スマートコントラクトが存在します。スマートコントラクトは、ブロックチェーン上で稼働するプログラムであり、FT・NFT・SBT・RWAなどのデジタルトークン活用や分散型アプリケーション(Dapps)に用いられています。スマートコントラクトは設計の難しさやセキュリティなどの問題は残るものの開発ツールの発展に伴い、幅広い応用が期待されています。
スマートコントラクトのメリット
- 第3者の仲介者がいない状態でも分散型のシステムによって一連の契約を正しく履行・証明ができるようになる
- スマートコントラクトはブロックチェーンに記載されるプログラムのため透明性が高く、改ざんをすることが困難
- ブロックチェーン上にあるスマートコントラクトは誰でもアクセスできるためシステムの再利用性が向上する
本記事では、スマートコントラクト開発環境であるHardhatの構築方法について解説します。
Hardhatとは
Hardhat とは、ローカルにブロックチェーンのテスト環境を構築できる開発ツールで、Solidityソースコードのコンパイル・テスト・デプロイの全ての作業が可能です。
Hardhatは以下のツール群から構成されています
- Hardhat runner:スマートコントラクトをコンパイルしてバイナリファイルに変換
- Hardhat Ignition:スマートコントラクトをテストネットやメインネットにデプロイ
- Hardhat Network:仮想的なローカルブロックチェーンのネットワークを構築し、スマートコントラクトのデバッグが可能
しかし2025年にリリースされたHardhat v3では、いくつかの重要な変更が加えられました。
Rustで記述された新しいHardhat Runnerが採用されており、従来よりも高いパフォーマンスを実現しています。これにより、スマートコントラクトのコンパイルやテストの実行がより高速かつ効率的になりました。
また、従来のTypeScriptベースのテストに加えて、Solidityによるテストコードの実行が可能となり、よりネイティブで直感的なテスト環境が整備されています。
他開発ツールとの比較
他のローカルテストネット環境としては、Geth(Go-Ethereum)、GoQuorum、Solc(Solidity Compiler)なども存在します。GethやGoQuorumは、本番環境のブロックチェーンとの接続とノードの運用、ローカルにおけるテストネットワークを構築することができます。より本番に近い環境が必要な場合に重宝されます。
またSolcは、Solidityによって記述されたスマートコントラクトをコンパイルするツールです。しかし単体ではコンパイルのみであり、ブロックチェーンネットワーク上における検証やブロックチェーン上へのデプロイなどは他ツールを活用する必要があります。
どのツールも一長一短ではありますが、Hardhatはスマートコントラクト開発サイクルの全工程における支援を受けることや仮想ブロックチェーンネットワークによる検証が可能です。
| 項目 | Hardhat | Geth | Solc |
|---|---|---|---|
| 開発効率 | 高い | 低い(設定が複雑) | 高い |
| テストネット起動 | 仮想的ネットワークの起動 | 本番同様のノードを起動 | なし |
| デプロイ機能 | 簡単にデプロイ可能 | RPC経由で手動デプロイ | なし |
| 拡張性 | 高い | 高い(本番運用向け) | 高い |
環境情報
- Node.js: v22.10.4
- npm: v10.9.2
- Hardhat: v3.0.6
Hardhatのインストール手順
まずプロジェクト用のディレクトリを作成します
mkdir my-project
cd my-project
以下のコマンドでプロジェクトを初期化します
npx hardhat init
次に以下の項目が出力されてるので自身で最適な内容を選択してください
✔ Which version of Hardhat would you like to use? · hardhat-3
✔ Where would you like to initialize the project?
Please provide either a relative or an absolute path: · .
✔ What type of project would you like to initialize? · mocha-ethers
✨ Template files copied ✨
✔ You need to install the necessary dependencies using the following command:
本記事では、以下の流れで選択しました。
- Hardhatのバージョンを選択するプロンプトで、最新版の
hardhat-3を選択しています - プロジェクトをどのディレクトリに作成するかを尋ねられるので、現在のディレクトリで初期化します
-
mocha-ethersを選択しており、Mochaとethers.jsを組み合わせたテンプレート構成になります - 選択したテンプレートに基づいて、必要なファイルがプロジェクトにコピーされました
- 最後に、テンプレートに必要な依存パッケージをインストールするよう指示されます
これらの項目を選択することで、主に以下のライブラリがインストールされます。V2と比較してhardhat-tool-boxに統合されていたツールがV3では細分化されているため、インストールするフレームワーク数が増加しているものの、カスタマイズ性が向上されているようです。
| ライブラリ名 | 説明 |
|---|---|
| hardhat | Ethereumスマートコントラクト開発のためのフレームワーク |
| hardhat-toolbox-mocha-ethers | Hardhat v3向けの公式ツールボックス |
| hardhat-ignition | スマートコントラクトのデプロイを記述できるフレームワーク |
| chai | JavaScriptのアサーションライブラリ |
| ethers | Ethereumとのやり取りを行うためのクライアントライブラリ |
| forge-std | Solidityベースのテストやfuzzingに使用されます |
| mocha | JavaScriptのテストフレームワーク |
| typescript | JavaScriptに型安全性を加えるための言語 |
ethers.js
ethers.js は、スマートコントラクトを呼び出すクライアント側のツールです。Hardhatと連携して利用することでデプロイやテストコードの作成に使用されるライブラリです。
V2ではHardhat-Toolboxに内包されていますが、
DAppsのフロントエンド開発にも活用されます。web3.jsと並ぶ代表的なブロックチェーンクライアントのライブラリですが、ethers.jsは後発であり、より軽量かつモジュール化されています。
ethers.jsは以下の4つの主要モジュールで構成されています:
- ethers.provider:Ethereumネットワークへの接続を簡単に行う
- ethers.contract:スマートコントラクトの呼び出し、イベント受信、デプロイなどを担当
- ethers.utils:アドレスやETH単位の変換などのユーティリティ関数を提供
- ethers.wallets:ウォレットとの接続や署名操作を簡素化
動作確認
スマートコントラクトの作成には、Visual Studio Code(VSCode)を利用します。VSCodeのインストール方法は割愛しますが、拡張機能「Solidity」を導入することで、コード補完や構文ハイライトなどの支援が受けられます。
次にスマートコントラクトの開発をします。本記事では名前を管理するgettter/setterの開発とテストをします。
まず名前を登録するName.solのスマートコントラクトを作成します。Solidityのソースコードはmy-project/contractsに作成します。
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.28;
contract Name {
string public name = "";
// Set the name
function setName(string memory newName) public {
name = newName;
}
// Get the name
function getName() public view returns (string memory) {
return name;
}
}
次に作成したName.solを検証するName.t.solを作成します。今回はV3で登場したSolidityのテストを利用します。
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.28;
import {Name} from "./Name.sol";
import {Test} from "forge-std/Test.sol";
contract NameTest is Test {
Name name;
function setUp() public {
name = new Name();
}
function testFuzz_SetName(string memory newName) public {
name.setName(newName);
require(keccak256(abi.encodePacked(name.getName())) == keccak256(abi.encodePacked(newName)), "Name should be updated");
}
}
テストの実行は以下のコマンドで実行できます。
npx hardhat test contracts/Name.t.sol
従来のJavaScript/TypeScriptを利用したテストコードでは、exceptが利用されていました。しかしSolidityではrequireを利用することで値の確認をします。
またSolidityのテストコードの特徴としてtestFuzz_をメソッド名の先頭に付けることでファジングが自動で実行されます。stringの場合は、ランダムな文字列を複数入力し、出力が検証されます。
スマートコントラクトのテストコードは、従来と記述方法に多少の違いがありますが、同様にJavaScript/TypeScriptで記述することも可能です。
import { expect } from "chai";
import { network } from "hardhat";
const { ethers } = await network.connect();
describe("Name", function () {
it("Should calling the setName() function", async function () {
// Deploy the contract
const name = await ethers.deployContract("Name");
await name.waitForDeployment();
// Set a new name
const newName = "Alice";
await name.setName(newName);
// Check that the name was set correctly
expect(await name.getName()).to.equal(newName);
});
});
テストの実行は以下のコマンドで実行されます。
npx hardhat test test/Name.ts
Hardhatでは仮想的なブロックチェーンネットワークの起動とデプロイ用のツールも存在します。仮想ネットワークの起動は以下のコマンドで起動します。
npx hardhat node
またスマートコントラクトのデプロイも従来のV2とIgnitionを利用することで同様に行うことができます。まずignition/modulesに'Name.ts'ファイルを作成しデプロイするスマートコントラクトを設定します。
import { buildModule } from "@nomicfoundation/hardhat-ignition/modules";
export default buildModule("NameModule", (m) => {
const name = m.contract("Name");
return { name };
});
以下のコマンドでスマートコントラクトのデプロイを実行します
npx hardhat ignition deploy ignition/modules/Name.ts --network localhost
まとめ
- スマートコントラクトはブロックチェーン上で動作し、仲介者なしで透明性の高い契約を自動実行できる
- HardhatはSolidityのコンパイル・テスト・デプロイを支援する開発ツール
- V3ではRust製Runnerによりパフォーマンスが向上し、Solidityテストにも対応
参考リンク
- ConsenSys GoQuorum, https://docs.goquorum.consensys.io/
- Getting Started with Hardhat 3, https://hardhat.org/docs/getting-started
- go-ethererum, https://geth.ethereum.org/
- Hardhat, https://hardhat.org/
- Solidity Programming Language, https://www.soliditylang.org/

