読了時間:6分
概要
Hardhatなどのイーサリアム開発環境を利用すると、スマートコントラクトやイーサリアムノードの操作が容易になります。これらの環境は、スマートコントラクトの作成、テスト、デプロイをシームレスに行える一連のツールを提供しています。このガイドでは、Hardhat と Quicknode を使用して、「Hello World」スマートコントラクトを作成し、Sepolia テストネットにデプロイします。
前提条件
- Quicknodeアカウント(こちらから無料で作成できます)
- EVM対応のウォレット(例:MetaMask)
- Node.jsがインストールされました
- ヘルメットを着用(この点についてもガイド内で説明します)
- CLI/ターミナルウィンドウ
- コードエディタまたはテキストエディタ(例:VSCode)
- Sepoliaテストネット上のETH(Quicknodeのマルチチェーン・ファウセットを使えば、無料で入手できます)
「ハードハット」とは何ですか?
Hardhatは、開発者がイーサリアムアプリケーションのコンパイル、デプロイ、テスト、デバッグを行うのを支援する開発環境です。そのドキュメントは、非常に整理されており、詳細な内容となっています。また、Hardhatには、デバッグを目的として、JavaScriptと同様のconsole.log()機能も備わっています。さらに、Hardhatには多くのプラグインが用意されており、機能性をさらに拡張することができます。
Hardhat およびその他の依存関係のインストール
node.js に付属するnpm を使って、Hardhat をインストールします。
まず、新しいプロジェクトディレクトリを作成し、そのディレクトリに移動します。ここでは、お好きな名前を自由に使用してください:
mkdir HardhatTutorial
cd HardhatTutorial
プロジェクトディレクトリでターミナルまたはコマンドプロンプトを開き、以下のコマンドを入力してください。
npm init --y
npm install --save-dev hardhat
Hardhatのインストールが完了したので、新しいHardhatプロジェクトを作成しましょう。その際にはnpxを使用します。npxはNode.jsの実行ファイルの処理を支援するツールです。
npx hardhat init
CLIのHardhatインターフェースが表示されます。「Create an empty hardhat.config.js」を選択し、Enterキーを押してください。

それでは、Hardhat を使用するために必要なその他の依存関係をインストールしましょう。
npm install --save-dev @nomiclabs/hardhat-ethers ethers @nomiclabs/hardhat-waffle ethereum-waffle chai
契約の自動テストを作成するには、これらの依存関係が必要です。
npm を使ってパッケージをインストールする際に最もよく発生する問題は、`node-gyp` の内部的な不具合である可能性があります。node-gyp のインストール手順については、こちらをご覧ください。
注:node-gypに関する問題が発生した場合は、お使いのPythonのバージョンが、上記の手順に記載されている互換バージョンのいずれかと一致している必要があります。
もう1つよくある問題として、キャッシュが古くなっていることが挙げられます。ターミナルで以下のコマンドを入力するだけで、npmのキャッシュをクリアできます:
npm cache clean
それでは、ウォレット用の秘密鍵、ガス代として使うテスト用のETH、そしてイーサリアムノードを用意しましょう。これらはすべて、スマートコントラクトをデプロイするために必要となります。
秘密鍵の作成・取得
スマートコントラクトのデプロイ費用を支払うには、イーサリアムウォレットが必要になります。
ウォレットの作成が完了し、その秘密鍵を取得したら、次のセクションでそれをHardhatの設定ファイル(例:hardhat.config.js)に追加します。
Quicknodeのガイドに従えば、JavaScript、Ruby、Python、Go、PHPで秘密鍵とイーサリアムアドレスを生成することができます。
MetaMaskウォレットから秘密鍵を取得するには、以下の手順に従ってください:
- ブラウザ上のMetaMaskアイコン(スタイリッシュなキツネの頭)をクリックしてください。表示されていない場合は、ブラウザの「拡張機能」ページを確認してください。
- ⋮のアイコンをクリックし、次に「アカウントの詳細」を選択します。
- 次に、「秘密鍵を表示」をクリックし、表示される指示に従ってください。

秘密鍵をコピーして保存してください。後の手順で必要になります。
秘密鍵などの機密情報は、.envファイルに保存し、環境変数を使って設定ファイルに取り込むか、開発専用として新しい MetaMask ウォレットを作成することをお勧めします。
テストネットのETHを入手する
このコントラクトをSepoliaテストネットにデプロイします。作業を始めるには、前の手順で説明したように、MetaMaskウォレットにテスト用のETHを準備しておく必要があります。
Quicknode Multi-Chain Faucetにアクセスし、ウォレットを接続するか、ウォレットアドレスを貼り付けてください。イーサリアムチェーンとセポリアネットワークを選択してから、資金の受け取りをリクエストする必要があります。
注:このファウセットを利用するには、イーサリアムメインネットの残高が0.001 ETH以上である必要があります。

Quicknodeのイーサリアムエンドポイントの設定
イーサリアムのセポリア(Sepolia)ブロックチェーンにコントラクトをデプロイするには、イーサリアム・セポリアのノードへのアクセスが必要です。そのためには、Geth や OpenEthereum(旧 Parity)など、ほぼどのイーサリアムクライアントでも使用できます。ただし、コントラクトを1つデプロイするだけのためにこれを行うのは少々手間がかかるため、ここではQuicknode の無料アカウントを作成し、簡単にイーサリアムのエンドポイントを生成することにします。 無料のイーサリアム・セポリア・エンドポイントを作成したら、HTTPプロバイダーのURLを手元に用意しておいてください。次のセクションで必要になります。

設定ファイルの設定
hardhat.config.jsファイルを開き、以下の内容を貼り付けてください:
require("@nomiclabs/hardhat-waffle");
const endpointUrl = "ADD_YOUR_QUICKNODE_URL_HERE";
const privateKey = "ADD_YOUR_PRIVATE_KEY_HERE";
module.exports = {
solidity: "0.8.21",
networks: {
sepolia: {
url: endpointUrl,
accounts: [privateKey],
},
},
};
「ADD_YOUR_PRIVATE_KEY_HERE」を前の手順で取得した秘密鍵に、「ADD_YOUR_QUICKNODE_URL_HERE」を前の手順で取得したHTTPノードのURLにそれぞれ置き換え、ファイルを保存してください。
上記のコードの説明:
-
1行目:hardhat-waffle パッケージをインポートします。
-
3~4行目:エンドポイントURLと秘密鍵の定義。
-
6行目~14行目:Solidityのバージョンを指定し、sepoliaネットワークを定義しています。
契約の作成
それでは、契約(contract)を作成するために、新しいディレクトリ「contracts」を作成し、その中に新しいファイル「HelloWorld.sol」を配置してください。
mkdir contracts && echo > contracts/HelloWorld.sol
以下のコードを、HelloWorld.solという名前のSolidityファイルにコピー&ペーストしてください:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract HelloWorld {
string saySomething;
constructor() {
saySomething = "Hello World!";
}
function speak() public view returns(string memory) {
return saySomething;
}
}
上記のコードの説明:
- 1行目:SPDXライセンスタイプを指定します。これはSolidity ^0.6.8以降で追加された機能です。
スマートコントラクトのソースコードが一般に公開される際、これらのライセンスは著作権上の問題を解決・回避するのに役立ちます。ライセンスの種類を指定したくない場合は、特別なライセンス「UNLICENSED」を使用するか、コメント全体を省略することもできます(エラーにはならず、警告が表示されるだけです)。
-
2行目:Solidityのバージョンを宣言しています。
-
4行目:契約「」を開始します
HelloWorld. -
6行目:変数の宣言
saySomething型は文字列です。 -
8行目~10行目:コンストラクタを呼び出し、文字列「Hello World!」を
saySomething変数。 -
12~14行目:という名前の関数の作成
話すpublic 型の変数で、これはsaySomething変数。
ファイルを保存し、以下の Hardhat コマンドを使用してコントラクトをコンパイルします。
npx hardhat compile
契約が正常にコンパイルされると、次のような出力が得られます:

「Hello World」スマートコントラクトのデプロイ
それでは、コントラクトをデプロイするために、scripts という名前の新しいディレクトリ内にdeploy.jsファイルを作成しましょう。
mkdir scripts && echo > scripts/deploy.js
以下の内容を deploy.js ファイルにコピー&ペーストしてください:
async function main() {
const [deployer] = await ethers.getSigners();
console.log(
"Deploying contracts with the account:",
deployer.address
);
const HelloWorld = await ethers.getContractFactory("HelloWorld");
const contract = await HelloWorld.deploy();
console.log("Contract deployed at:", contract.address);
const saySomething = await contract.speak();
console.log("saySomething value:", saySomething);
}
main()
.then(() => process.exit(0))
.catch(error => {
console.error(error);
process.exit(1);
});
上記のコードの説明。
-
1行目:という名前の非同期関数を開始する
メイン. -
3行目:トランザクションに署名するためのイーサリアムアドレスを取得し、それをデプロイ元アドレスに格納する。
-
5行目~8行目:イーサリアムアドレスと文字列をコンソールに出力します。
-
10行目:ethers.js のメソッドを呼び出す ContractFactory. これにより、
HelloWorld.solファイルから、使用可能なインスタンスを返しますContractFactoryメソッドを有効にする。 -
11行目:deploy を呼び出す
ContractFactory契約を展開するには。 -
13行目:デプロイされたコントラクトのアドレスをコンソールに出力します。
-
15行目:関数の呼び出し
話す展開済みの契約の。 -
17行目:関数の戻り値を出力する
話すコンソールへ。 -
20行目:関数の呼び出し
メイン. -
21~24行目:エラーの有無を確認し、エラーがある場合はそれを表示して、プロセスを終了する。
ファイルを保存し、以下のコマンドを実行してコントラクトをデプロイしてください。
npx hardhat run scripts/deploy.js --network sepolia
コントラクトのデプロイが成功すると、デプロイされたコントラクトのアドレスと、speak関数の戻り値であるsaySomethingの値を含む出力が表示されます。

Sepolia Etherscanの検索バーにデプロイされたコントラクトのアドレスをコピーして貼り付けることで、デプロイを確認できます。これにより、デプロイされたコントラクトに関する情報が表示されます。

結論
以上です!これで、Hardhat を使ったスマートコントラクトの作成、コンパイル、デプロイの基本をマスターしました。しかし、それだけではありません。Hardhat には、コードのテストやデバッグを行うためのツールも用意されています。さらに詳しく知りたい方は、Hardhat の公式ドキュメントをご覧ください。
イーサリアムに関する記事やガイドをもっと読みたい方は、ニュースレターにご登録ください。ご質問がある場合は、Discordの専用チャンネルをご利用いただくか、以下のフォームからフィードバックをお寄せください。Twitterや Telegramの告知チャンネルをフォローして、最新情報をチェックしてください。
皆様からのフィードバックを心よりお待ちしております!❤️
ご意見や新しいトピックに関するご要望などがありましたら、ぜひお知らせください。皆様からのご連絡を心よりお待ちしております。
