スマートコントラクト開発（準備）

# はじめに（Introduction）

EVM互換のブロックチェーンで動作するスマートコントラクトを[Hardhat](https://hardhat.org/)を使って作成します。

# 準備

先に以下をインストールしてください。

- [Visual Studio Codee](https://code.visualstudio.com/)（以下 VSCode）
- [Node.js](https://nodejs.org/)

Nodeのバージョンは20系のLTSを利用しています。

VSCodeでは以下の拡張機能（Extension）を入れておいた方が良いです。
- [Japanese Language Pack for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja)
- [Solidity](https://marketplace.visualstudio.com/items?itemName=NomicFoundation.hardhat-solidity)

Solidityという拡張機能はいくつかあるのですが、今回はHardhatを使うのでアイコンは黄色で帽子の絵が付いてるものを選んでください。

# Hardhatのインストール

作業用フォルダを作成し、VSCodeを起動して作成したフォルダを開きます。
VSCodeのターミナルを開きます。

## npm初期化

ます、npmの初期化をします。

```powershell
npm init -y
```

## Hardhatインストール

Hardhatをインストールします。

```powershell
npm install --save-dev hardhat
```

## OpenZeppelinインストール

スマートコントラクトの便利なライブラリである[OpenZeppelin](https://www.openzeppelin.com/)をインストールします。

```powershell
npm install --save-dev @openzeppelin/contracts
```

# プロジェクト作成

以下のコマンドでHardhatプロジェクトを作成します。

```powershell
npx hardhat init
```

いくつかの選択がありますが、ここでは全てエンターで進めていきます。

```text
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.22.4

√ What do you want to do? · Create a JavaScript project
√ Hardhat project root: · <作業フォルダ>
√ Do you want to add a .gitignore? (Y/n) · y
√ Do you want to install this sample project's dependencies with npm (@nomicfoundation/hardhat-toolbox)? (Y/n) · y
```

上記のような表記になり、hardhat-toolboxがインストールされたら完了します。
インストール後は以下のようなフォルダ構成になります。
`Lock`というサンプルコードがあります。

```txt
<作業フォルダ>
│  .gitignore
│  hardhat.config.js
│  package-lock.json
│  package.json
│  README.md
│  
├─contracts
│      Lock.sol
│      
├─ignition
│  └─modules
│          Lock.js
│          
├─node_modules
│          
└─test
        Lock.js
```

# 基本操作

## コンパイル（Compile）

以下のコマンドでSolidity（.sol ファイル）をコンパイルします。

```powershell
npx hardhat compile
```

コンパイルが成功すると`artifacts`フォルダが生成されます。

```text
artifacts
├─build-info
│
└─contracts
    └─Lock.sol
            Lock.dbg.json
            Lock.json
```

`artifacts/contracts/Lock.sol`というフォルダ配下に`Lock.json`ファイルができます。
これには、Contract Application Binary Interface(ABI)やバイナリコードなどが含まれています。

## デプロイ（Deploy）

:::note warn
Hardhat Ignition は Harthat のバージョン 2.18.0 から導入されています。
:::

以下のコマンドで指定したモジュールのデプロイを行います。
`GLOBAL OPTIONS`を指定していないので仮想ノードでのデプロイとなります。

```powershell
npx hardhat ignition deploy .\ignition\modules\Lock.js
```

別のターミナルを開き以下のコマンドで`localhost`にテスト用のノードを起動します。

```powershell
npx hardhat node
```

以下のコマンドで`localhost`のノードにデプロイします。

```powershell
npx hardhat --network localhost ignition deploy .\ignition\modules\Lock.js
```

デプロイが成功すると`ignition`フォルダに以下のようなファイルができます。
`chain-31337`は`chain-`にネットワークIDを付与したものです。

```text
ignition
├─deployments
│  └─chain-31337
│      │  deployed_addresses.json
│      │  journal.jsonl
│      │
│      ├─artifacts
│      │      LockModule#Lock.dbg.json
│      │      LockModule#Lock.json
│      │
│      └─build-info
│              22662767f8b1a09e64d324318d70c2ac.json
│
└─modules
        Lock.js
```

## テスト（Test）

以下のコマンドでテストを行います。

```powershell
npx hardhat test
```

テストファイルを指定することもできます。

```powershell
npx hardhat test .\test\Lock.js
```

# まとめ（Conclusion）

HardhatのインストールとHardhatプロジェクトの作成をしました。
また、基本的な操作について軽く説明をしました。
次回はコントラクトの作成とデプロイ用のモジュールを生成したいと思います。