BerachainでのコントラクトのデプロイとVerify方法[Berachain翻訳]


:::note info
本記事は下記の翻訳となります。
[『How To Deploy And Verify Contracts On Berachain』](https://blog.berachain.com/blog/how-to-deploy-and-verify-contracts-on-berachain)
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926720/9dc3a434-84e7-c48d-1fdd-81f718f69d65.png)

### Berachain Artio テストネットの紹介

100 以上あるブロックチェーン技術の世界で、Berachain は開発者がビルドできる Cosmos ベースの EVM 互換チェーンとして台頭してきています。POL 設計、堅牢なスケーラビリティ、強化されたセキュリティを特徴とし、ユーザーがチェーンと対話することで利益を得られるため、開発者にとって魅力的な環境となっています。分散型アプリケーション（dApps）の幅広い早期採用と EVM 互換性により、開発者がプロダクトを構築しテストするのに理想的な選択肢となっています。

他のブロックチェーンと同様に、Artio テストネットは今後リリースされる Berachain メインネットの重要なコンポーネントであり、開発者が事前にツールを準備しテストできる環境を提供します。ここでスマートコントラクト、特に Non-Fungible Token（NFT）の ERC-721 規格のベアマジックが実現します。🐻 ❤️

### 🤔 なぜ Hardhat なのか？

Hardhat は、Ethereum 開発における重要なツールです。スマートコントラクトのコンパイル、デプロイ、テスト、デバッグなどのプロセスを効率化します。dApp 開発に必要なすべてのツールを備えた、個人用ブロックチェーンワークショップと考えてください。

### 🛠️ 何を構築するのか？

このチュートリアルでは、hardhat-ethers を使用して Berachain テストネット（Artio）に ERC-721 スマートコントラクトを作成しデプロイする方法を説明します。このチュートリアルでは、Hardhat と Ethers.js を使用して NFT（ERC-721）トークンスマートコントラクトの記述、デプロイ、検証に焦点を当てます！

![](https://berachain.ghost.io/content/images/2024/05/1-sxy61hr1_g5kczrvxwg7wq.png)

Hardhat を使用したコントラクトのデプロイ成功のスニペット

![](https://berachain.ghost.io/content/images/2024/05/1-2zffrhhpebesudreo5yvja.png)

Hardhat を使用したデプロイ済みコントラクトの検証成功のスニペット

主に初期セットアップ、コントラクトの作成とデプロイについて説明します！

### ⚠️ 前提条件

この技術的なチュートリアルを始める前に、以下のものを用意する必要があります：

- ブロックチェーンの基礎とスマートコントラクトの原則についての確かな理解
- Ethereum ベースのコントラクト開発の主要言語である Solidity の習熟
- マシンに最新バージョンの Node.js と npm がインストールされていること（`node -v`でコマンドラインから確認可能）

---

### Step 1: Node.js プロジェクトの開始

新しい Node.js プロジェクトを作成することから始めます。この基礎的なステップでは、専用のプロジェクトディレクトリを設定し、Node のパッケージ管理ツールで初期化します。

```bash
mkdir bera-hardhatTest && cd bera-hardhatTest
```

```bash
npm init -y
# Wrote to /Users/dethebera/BeraWork/hardhat-verification-bera/package.json:

# {
#  "name": "hardhat-verification-bera",
#   "version": "1.0.0",
#  "description": "",
#   "main": "index.js",
#   "scripts": {
#     "test": "echo \"Error: no test specified\" && exit 1"
#   },
#   "keywords": [],
#   "author": "",
#   "license": "ISC"
# }
```

このコマンドシーケンスで新しいディレクトリを作成し、デフォルトパラメータで Node.js プロジェクトを初期化します。

### Step 2: Hardhat のセットアップ

プロジェクトディレクトリに Hardhat をインストールし、新しいプロジェクト環境を初期化します：

```bash
npm install --save-dev hardhat

# added 263 packages, and audited 264 packages in 31s

# 52 packages are looking for funding
#  run `npm fund` for details

# found 0 vulnerabilities
```

プロジェクト言語として TypeScript を選択し、セットアッププロンプトに従って`.gitignore`ファイルと必要な依存関係を含めるようにします。

注意: 非推奨の警告

npx hardhat でプロジェクトを初期化することは非推奨であり、将来的に削除される予定です。代わりに*npx hardhat init*を使用してください。

```bash
npx hardhat init
# 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.21.0 👷‍

# ✔ What do you want to do? · Create a TypeScript project
# ✔ Hardhat project root: · /Users/dethebera/BeraWork/hardhat-verification-bera
# ✔ 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

# npm install --save-dev "@nomicfoundation/hardhat-toolbox@^4.0.0"

# added 273 packages, and audited 537 packages in 40s

# 90 packages are looking for funding
#   run `npm fund` for details

# found 0 vulnerabilities

# ✨ Project created ✨

# See the README.md file for some example tasks you can run

# Give Hardhat a star on Github if you're enjoying it! ⭐️✨

#      https://github.com/NomicFoundation/hardhat
```

Hardhat のセットアップ後、以下のコマンドで正常に機能することを確認します：

```bash
npx hardhat test

#Downloading compiler 0.8.24
# Compiled 1 Solidity file successfully (evm target: paris).


#   Lock
#     Deployment
#       ✔ Should set the right unlockTime (691ms)
#       ✔ Should set the right owner
#       ✔ Should receive and store the funds to lock
#       ✔ Should fail if the unlockTime is not in the future
#     Withdrawals
#       Validations
#         ✔ Should revert with the right error if called too soon
#         ✔ Should revert with the right error if called from another account
#         ✔ Shouldn't fail if the unlockTime has arrived and the owner calls it
#       Events
#         ✔ Should emit an event on withdrawals
#       Transfers
#         ✔ Should transfer the funds to the owner


#   9 passing (717ms)
```

### Step 3: NFT スマートコントラクトの開発

次に、プロジェクトの核心部分である NFT スマートコントラクトに取り組みます。`contracts`フォルダに移動し、ERC-721 コントラクトの作成を始めます。この段階は、NFT の特性と動作を定義する実際のコードを含むため、非常に重要です。

contracts フォルダに移動し、新しいファイル**`NFT.sol`**を作成します。

![](https://berachain.ghost.io/content/images/2024/05/1-wnzj54tvajm5l8zehqopdw.png)

以下は、OpenZeppelin の安全で信頼性の高いライブラリを使用した基本テンプレートです：

**ファイル:** **`./contracts/NFT.sol`**

```java
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";

contract NFT is ERC721 {
    uint256 public currentTokenId;

    constructor() ERC721("NFT Name", "NFT") {}

    function mint(address recipient) public payable returns (uint256) {
        uint256 newItemId = ++currentTokenId;
        _safeMint(recipient, newItemId);
        return newItemId;
    }
}
```

OpenZeppelin のコントラクトは、事前に作成された安全なコードスニペットの宝庫です。これらは開発時間を大幅に短縮し、スマートコントラクトのセキュリティを向上させます。

```bash
npm install @openzeppelin/contracts

# added 1 package, and audited 539 packages in 2s

# 91 packages are looking for funding
#   run `npm fund` for details

# found 0 vulnerabilities
```

**`NFT.sol`**ファイルで、Solidity のバージョンが**`hardhat.config.ts`**で指定されているものと同期していることを確認してください。

### Step 5: MetaMask＆Berachain Artio と Hardhat の統合

このステップでは、MetaMask ウォレットと Berachain テストネットを Hardhat 環境にリンクします。この接続は、スマートコントラクトを Berachain Artio にデプロイする上で重要です。

1. **dotenv のインストール**：環境変数を管理するためのツールです。

```bash
npm install dotenv --save

# added 1 package, and audited 538 packages in 612ms

# 91 packages are looking for funding
#   run `npm fund` for details

# found 0 vulnerabilities
```

**2. .env ファイルの設定**：プロジェクトのルートディレクトリに新しく作成した`.env`ファイルに MetaMask の秘密鍵を安全に保存します。

プロジェクトのルートディレクトリに.env ファイルを作成し、MetaMask の秘密鍵を追加します。MetaMask からキーをエクスポートする方法については、[このガイド](https://metamask.zendesk.com/hc/en-us/articles/360015289632?ref=berachain.ghost.io)を参照してください。

.env ファイルは以下のようになります：

```ini
PRIV_KEY = 0x"your exported private key"
```

### Step 6: hardhat.config.js の設定

このステップでは、Berachain のテストネットアーティオにあわせて Hardhat の設定を調整します。`hardhat.config.ts`ファイルを必要な依存関係とネットワーク設定で更新し、Berachain Artio のカスタムチェーン設定に特に注意を払います。

**ファイル:** **`./hardhat.config.ts`**

```typescript
import { HardhatUserConfig } from 'hardhat/config';
import '@nomicfoundation/hardhat-toolbox';
import '@nomicfoundation/hardhat-verify';

require('dotenv').config();

const config: HardhatUserConfig = {
  solidity: {
    version: '0.8.23',
  },
  networks: {
    // テストネット用
    'berachain-artio': {
      url: 'https://rpc.ankr.com/berachain_testnet',
      accounts: [process.env.WALLET_KEY as string],
      chainId: 80085,
      // gas: "auto",
      gasPrice: 10000000000,
    },
    // ローカル開発環境用
    'berachain-local': {
      url: 'http://localhost:8545',
      gasPrice: 1000000000,
    },
  },
  defaultNetwork: 'hardhat',
  etherscan: {
    apiKey: {
      berachainArtio: 'berachainArtio', // apiKeyは不要、プレースホルダーを設定
    },
    customChains: [
      {
        network: 'berachainArtio',
        chainId: 80085,
        urls: {
          apiURL: 'https://api.routescan.io/v2/network/testnet/evm/80085/etherscan',
          browserURL: 'https://artio.beratrail.io',
        },
      },
    ],
  },
};

export default config;
```

### Step 7: デプロイメントスクリプトの作成

`scripts/`ディレクトリで、デプロイメントスクリプト（`deploy.ts`を更新）を作成します。このスクリプトはブロックチェーン上にスマートコントラクトをデプロイするための設計図となります。

**ファイル:** **`./scripts/deploy.ts`**

```javascript
import { setBlockGasLimit } from '@nomicfoundation/hardhat-toolbox/network-helpers';
import { ethers } from 'hardhat';

async function main() {
  const nft = await ethers.deployContract('NFT');

  await nft.waitForDeployment();

  console.log('NFT Contract Deployed at ' + nft.target);
}

// エラー処理のためにasync/awaitパターンを推奨
main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});
```

### Step 8: 実際のデプロイ

Berachain Artio にコントラクトをデプロイします：

```bash
npx hardhat run scripts/deploy.ts --network berachain-artio
# NFT Contract Deployed at 0xBC862C68CE9EE3aFa762DbF7A51712E3c6E79215
```

![](https://berachain.ghost.io/content/images/2024/05/1-sxy61hr1_g5kczrvxwg7wq-1.png)

### Hardhat に対する全体的な変更の理解

このセクションは、上記のデプロイメントスクリプトと Berachain Artio で動作するための hardhat 設定に加えられた変更をすでに理解している場合はスキップできます。

1. デフォルトの Hardhat `deployContract`にはいくつかの問題があります。しかし、`gasLimit`と`gasPrice`を指定してデプロイトランザクションを手動で作成すると、Artio で動作します。
2. hardhat 設定ファイルで gas: "auto"設定を削除することは必須です。自動に設定すると、デプロイ時間が増加し、トランザクションの送信が遅延する原因となります。
3. トランザクションを手動で構築し、強制的なガス制限のオーバーライドを設定します（これはガス代の面では高くなる可能性がありますが、大きな差はありません）。

### Berachain でのコントラクトの検証

検証はデプロイ後の重要なステップです。デプロイされたバイトコードを対応するソースコードと公開的に関連付けることを含みます。このプロセスはブロックチェーンコミュニティにおける透明性と信頼性を高めます。

### Berachain でのコントラクト検証

`@nomicfoundation/hardhat-verify`プラグインをインストールし、正しいコントラクトアドレスを使用することの重要性を強調しながら、検証プロセスについて説明します。

#### インストール

hardhat を通じて直接コントラクトを検証するのに役立つ hardhat-verify プラグインをインストールします。

```bash
npm install --save-dev @nomicfoundation/hardhat-verify

# up to date, audited 539 packages in 3s

# 91 packages are looking for funding
#   run `npm fund` for details

# found 0 vulnerabilities
```

コントラクトの検証に役立つ Routescan API のコードはすでに含まれています。

![](https://berachain.ghost.io/content/images/2024/05/1-4af2q7hhyy9msvnuavceua.png)

詳細については、[https://artio.beratrail.io/documentation/recipes/hardhat-verification](https://artio.beratrail.io/documentation/recipes/hardhat-verification?ref=berachain.ghost.io)を参照してください。

### 検証

コントラクトを検証するには、デプロイされたコントラクトのアドレスが必要です。

```bash
npx hardhat verify --network berachain-artio <0x...>
```

"<0xaddress>"全体を置き換えてください。正しい例は以下の通りです：

✅ npx hardhat verify --network berachain-artio 0x3229075dd6F75bD879F7af07d384A0856c30a806

❌ npx hardhat verify --network berachain-artio <0x3229075dd6F75bD879F7af07d384A0856c30a806> **(これは不正確です)**

実行が完了すると、以下のような出力が表示されます。

```bash
# [INFO] Sourcify Verification Skipped: Sourcify verification is currently disabled. To enable it, add the following entry to your Hardhat configuration:

# sourcify: {
#   enabled: true
# }

# Or set 'enabled' to false to hide this message.

# For more information, visit https://hardhat.org/hardhat-runner/plugins/nomicfoundation-hardhat-verify#verifying-on-sourcify
# The contract 0xBC862C68CE9EE3aFa762DbF7A51712E3c6E79215 has already been verified on Etherscan.
# https://artio.beratrail.io/address/0xBC862C68CE9EE3aFa762DbF7A51712E3c6E79215#code
```

ターミナルで提供されたリンクから Berachain Explorer（Beratrail）に移動すると、コントラクトのソースコードが正常に検証されているのを確認できます！

![](https://berachain.ghost.io/content/images/2024/05/1-uclok5zjgfanewa5zp_ibq.png)

### 完全なコード

**ファイル:** **`./contracts/NFT.sol`**

```java
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
contract NFT is ERC721 {
    uint256 public currentTokenId;
    constructor() ERC721("NFT Name", "NFT") {}
    function mint(address recipient) public payable returns (uint256) {
        uint256 newItemId = ++currentTokenId;
        _safeMint(recipient, newItemId);
        return newItemId;
    }
}
```

**ファイル:** **`./scripts/deploy.ts`**

```javascript
import { setBlockGasLimit } from '@nomicfoundation/hardhat-toolbox/network-helpers';
import { ethers } from 'hardhat';
async function main() {
  const nft = await ethers.deployContract('NFT');
  await nft.waitForDeployment();
  console.log('NFT Contract Deployed at ' + nft.target);
}
// エラー処理のためにasync/awaitパターンを推奨
main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});
```

**ファイル:** **`./hardhat.config.ts`**

```typescript
import { HardhatUserConfig } from 'hardhat/config';
import '@nomicfoundation/hardhat-toolbox';
import '@nomicfoundation/hardhat-verify';
require('dotenv').config();
const config: HardhatUserConfig = {
  solidity: {
    version: '0.8.23',
  },
  networks: {
    // テストネット用
    'berachain-artio': {
      url: 'https://rpc.ankr.com/berachain_testnet',
      accounts: [process.env.WALLET_KEY as string],
      chainId: 80085,
      // gas: "auto",
      gasPrice: 10000000000,
    },
    // ローカル開発環境用
    'berachain-local': {
      url: 'http://localhost:8545',
      gasPrice: 1000000000,
    },
  },
  defaultNetwork: 'hardhat',
  etherscan: {
    apiKey: {
      berachainArtio: 'berachainArtio', // apiKeyは不要、プレースホルダーを設定
    },
    customChains: [
      {
        network: 'berachainArtio',
        chainId: 80085,
        urls: {
          apiURL: 'https://api.routescan.io/v2/network/testnet/evm/80085/etherscan',
          browserURL: 'https://artio.beratrail.io',
        },
      },
    ],
  },
};
export default config;
```

完全なコードは、以下の公式 Github リポジトリからも入手できます。

[guides/apps/hardhat-contract-verification at main · berachain/guides](https://github.com/berachain/guides/tree/main/apps/hardhat-contract-verification?ref=berachain.ghost.io)

### まとめ

このガイドは、ERC-721 NFT のデプロイ、そして特に**Berachain Artio でのコントラクトの検証**について、すべてのステップを網羅的に説明することを目的としています。Hardhat を使用したデプロイの基本から、スマートコントラクト開発と検証に必要な細かな調整まで解説しました。

---

---

:::note info
【Sunrise とは】
Sunrise は Proof of Liquidity(PoL)と Fee Abstraction（手数料抽象化）を備えたデータ可用性レイヤーです。 私たちは DA の体験を再構築し、多様なエコシステムからのモジュラー型流動性を活用してロールアップを立ち上げています。

- [Sunrise - Specialized DA Layer for Proof of Liquidity](https://sunriselayer.io/)
- [Sunrise / Gluon Docs](https://docs.sunriselayer.io/)

【Social Links】

- [X(旧 Twitter)[英語])](https://twitter.com/SunriseLayer)
- [X(旧 Twitter)[日本語])](https://twitter.com/SunriseLayer)
- [Discord Community](https://discord.com/invite/sunrise)
- [Medium](https://sunriselayer.medium.com/)
- [Github](https://github.com/sunriselayer)
- [Linkedin](https://www.linkedin.com/company/sunriselayer)

【お問合せ】
Sunrise へのお問い合わせはこちらから 👉 [Google Form](https://forms.gle/h8RVahxRtXUvYwnv6)

![1080x360.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839047/8971d83b-3331-4757-dc72-320d28618735.jpeg)

:::