Cryptocurrency Research Lab.

Cryptocurrency関連技術についての調査・研究

【Hardhat】環境構築とサンプルのテスト実行

ずいぶん前に、RemixでSolidityを少しいじってみたことはあったけれども(はじめてのSolidity参照)、少し触った程度でずっと放置したままになっていました💦

しばらく自分の関心が技術分野から、BakerySwapPancakeSwapBabySwapといったDeFiなどのサービスにすっかり移ってしまいました。

Web3分野で新しいものを生み出したいという気持ちはあるのですが、とくにトークンをつくりたいわけでもNFTを発行したいわけでもなくて、すでに世の中には若くて優秀なエンジニアの方がたくさんいますから、彼らが次々と生み出すプロダクトを日々追っているだけでもワクワクしてしまいます。

時代にすっかり取り残されてしまい追いつくのはなかなか難しいですが、それでも頑張って学んでいきましょ。

Hardhat環境構築

https://hardhat.org/tutorial/

あらかじめ、Node.jsがインストールされている必要があります。3/21時点で最新のNode.js v17はサポート外でしたので、LTSのv16.x系を入れました。

適当なディレクトリを作成して、以下のコマンドを実行して環境を整えましょう。

$ npm init --yes
$ npm install --save-dev hardhat

hardhatのメニューからサンプルを生成することができます。

$ npx hardhat
You are using a version of Node.js that is not supported by Hardhat, and it may work incorrectly, or not work at all.

Please, make sure you are using a supported version of Node.js.

To learn more about which versions of Node.js are supported go to https://hardhat.org/nodejs-versions
888    888                      888 888               888
888    888                      888 888               888
888    888                      888 888               888
8888888888  8888b.  888d888 .d88888 88888b.   8888b.  888888
888    888     "88b 888P"  d88" 888 888 "88b     "88b 888
888    888 .d888888 888    888  888 888  888 .d888888 888
888    888 888  888 888    Y88b 888 888  888 888  888 Y88b.
888    888 "Y888888 888     "Y88888 888  888 "Y888888  "Y888

Welcome to Hardhat v2.9.1

? What do you want to do? … 
  Create a basic sample project
  Create an advanced sample project
▸ Create an advanced sample project that uses TypeScript
  Create an empty hardhat.config.js
  Quit

テスト

生成されたサンプルのテストを実行してみましょう。

サンプルのSolidityソースはcontracts/Greeter.solに出力されており、テストスクリプトはtest/index.tsに出力されています。

以下のコマンドを実行することで、自動Unitテストがはじまります。

$ npx hardhat test

Hardhatを使えば、ブロックチェーンのノードを構築しなくてもテストが行えます。

開発したスマートコントラクトは、Ethereumへの配備はもちろん、EVM互換チェーンであるBNB ChainやAstar Network、Polygonなどもターゲットにできるかと思いますので、まずはチェーンをあまり意識せずに、Hardhat上で開発していけばよいかと思います。

OpenZeppelin

クラッチでスマートコントラクトをつくるのもいいですが、トークン(ERC-20)やNFT(ERC-721)などは、OpenZeppelinを使うとよいでしょう。

npm install --save-dev @openzeppelin/contracts

トークンの作成は、以前『【Flare Networks】Coston Testnet ③ERC-20』の記事で試してみたことがあったので、今回はERC721を試してみることにしましょう。

以下の記事が参考になります。あまりカスタマイズする必要が無ければ、OpenZeppelinプリセットが豊富にありますので、これを使うことで簡単につくれます。

https://zenn.dev/cauchye/articles/ethereum-contract-erc721

NFTの画像URLなどの情報は外部のJSONファイルに保存することになります。以下は、プリセットの「ERC721PresetMinterPauserAutoId」を適用した例です。

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;
import "hardhat/console.sol";
import "@openzeppelin/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol";

contract NFT is ERC721PresetMinterPauserAutoId {
  constructor() ERC721PresetMinterPauserAutoId("Test NFT", "TNFT", "https://・・・/api/v1/tokens/") {}
}