【Hardhat】環境構築とサンプルのテスト実行
ずいぶん前に、RemixでSolidityを少しいじってみたことはあったけれども(はじめてのSolidity参照)、少し触った程度でずっと放置したままになっていました💦
しばらく自分の関心が技術分野から、BakerySwap、PancakeSwap、BabySwapといったDeFiなどのサービスにすっかり移ってしまいました。
Web3分野で新しいものを生み出したいという気持ちはあるのですが、とくにトークンをつくりたいわけでもNFTを発行したいわけでもなくて、すでに世の中には若くて優秀なエンジニアの方がたくさんいますから、彼らが次々と生み出すプロダクトを日々追っているだけでもワクワクしてしまいます。
時代にすっかり取り残されてしまい追いつくのはなかなか難しいですが、それでも頑張って学んでいきましょ。
Hardhat環境構築
あらかじめ、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/") {} }