本記事は下記の翻訳となります。
『How To Deploy And Verify Contracts On Berachain』
Berachain Artio Testnet の紹介
100 以上のブロックチェーン技術の中で、Berachain は開発者が構築するための goto cosmos ベースの evm 互換チェーンとして浮上しています。その POL デザイン、堅牢なスケーラビリティ、強化されたセキュリティで知られており、Berachain は開発者にとっては魅力的な場所となっています。幅広い分散型アプリケーション(dApps)と evm 互換性の早期採用により、開発者が製品を構築してテストするための理想的な選択肢となっています。
他のブロックチェーンと同様に、Artio テストネットは Berachain メインネットの重要なコンポーネントであり、開発者が事前にツールを準備し、テストするためのテスト環境を提供しています。ここで、スマートコントラクトの魔法が生まれます。特に ERC-721 標準の非代替トークン(NFT)が活躍します。 🐻 ❤️
🤔 Hardhat の利点は?
Hardhat は Ethereum 開発における重要なツールです。コンパイル、デプロイ、テスト、デバッグなど、さまざまなプロセスを効率的に行うことができます。dApp 開発に必要なすべてのツールが揃った、あなた自身のブロックチェーンワークショップと考えてください。
🛠️ 何を構築しますか?
このチュートリアルでは、hardhat-ethers を使用して Berachain テストネット(Artio)上に ERC-721 スマートコントラクトを作成し、デプロイする方法を案内します。このチュートリアルでは、Hardhat と ethers.js を使用して、非代替可能(ERC-721)トークンのスマートコントラクトを書き、デプロイし、検証する方法に焦点を当てています
Snippet of Successful Contract Deployment Using Hardhat
Snippet of Successful Verification of Deployed Contract Using Hardhat
このチュートリアルでは、主に初期設定、コントラクトの作成、およびデプロイについて説明します。
⚠️ 必要条件
この技術的なチュートリアルに取り組む前に、以下のものを準備しておくことが重要です:
- ブロックチェーンの基礎知識とスマートコントラクトの原則についての確固たる理解
- Ethereum ベースのコントラクト開発のための Solidity の習熟度
- マシンに最新バージョンの Node.js と npm がインストールされていること。コマンドラインで
node -v
を実行して確認できます
ステップ 1:Node.js プロジェクトの初期化
まず、新しい Node.js プロジェクトを作成します。この基本的なステップでは、専用のプロジェクトディレクトリを設定し、Node のパッケージ管理ツールで初期化します。
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 プロジェクトの初期化をトリガーします。
ステップ 2: Hardhat のセットアップ
プロジェクトディレクトリに Hardhat をインストールし、新しいプロジェクト環境を初期化します。
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
ファイルと必要な依存関係が含まれていることを確認してください。
Note: 非推奨の警告
npx hardhat を使用してプロジェクトを初期化する方法は非推奨となり、将来的に削除される予定です。代わりに、npx hardhat init を使用してください。
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 のセットアップが完了したら、以下のコマンドで正常に動作しているか確認してください:
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)
ステップ 3:NFT スマートコントラクトの開発に着手
それでは、プロジェクトの核心部分である NFT スマートコントラクトの開発に取り掛かりましょう。contracts
フォルダに移動し、ERC-721 コントラクトのスクリプト作成を始めます。この段階は非常に重要です。ここで作成するコードが、あなたの NFT の特性や動作を定義することになります。
contracts
フォルダに移動し、**NFT.sol
**という新しいファイルを作成してください。
以下は、OpenZeppelin の安全で信頼性の高いライブラリを使用した基本的なテンプレートです:
File: ./contracts/NFT.sol
// 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 のコントラクトは、事前に書かれた安全なコードスニペットの宝庫です。これらを利用することで、開発時間を大幅に短縮し、スマートコントラクトのセキュリティを向上させることができます。
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
I**NFT.sol
ファイルで、Solidity のバージョンがhardhat.config.ts
**で指定されているものと一致していることを確認してください。各コンポーネントの目的を説明し、NFT のアーキテクチャにおける OpenZeppelin のコントラクトの役割を強調してください。
ステップ 5:MetaMask と Berachain Artio を Hardhat と統合する
このステップでは、MetaMask ウォレットと Berachain Testnet を Hardhat 環境にリンクします。この接続は、スマートコントラクトを Berachain Artio にデプロイする上で極めて重要です。
- dotenv のインストール:環境変数を管理するためのツールです。
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 から秘密鍵をエクスポートする方法については、このガイドを参照してください。
.env ファイルは以下のようになるはずです:
PRIV_KEY = 0x"your exported private key"
ステップ 6:hardhat.config.js の設定
このステップでは、Berachain の仕様に合わせて Hardhat の設定を調整します。hardhat.config.ts
ファイルを更新し、必要な依存関係とネットワーク設定を追加します。特に Berachain Artio のカスタムチェーン設定に注意を払ってください。
- まず、必要な依存関係をインポートします。
- Berachain Artio のネットワーク設定を追加します。
- 環境変数から秘密鍵を安全に読み込むように設定します。
- コンパイラのバージョンやその他の設定を適切に行います。
具体的なhardhat.config.ts
の内容は、Berachain の公式ドキュメントやガイドラインに従って設定してください。これには、正確な RPC エンドポイント、チェーン ID、その他のネットワーク固有のパラメータが含まれます。
この設定により、Hardhat プロジェクトが Berachain Artio テストネットと正しく連携できるようになります。
File: ./hardhat.config.ts
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: {
// for testnet
"berachain-artio": {
url: "https://rpc.ankr.com/berachain_testnet",
accounts: [process.env.WALLET_KEY as string],
chainId: 80085,
// gas: "auto",
gasPrice: 10000000000,
},
// for local dev environment
"berachain-local": {
url: "http://localhost:8545",
gasPrice: 1000000000,
},
},
defaultNetwork: "hardhat",
etherscan: {
apiKey: {
berachainArtio: "berachainArtio", // apiKey is not required, just set a placeholder
},
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;
ステップ 7:デプロイメントスクリプトの作成
scripts/ディレクトリにある deploy.ts ファイルを更新し、デプロイメントスクリプトを作成します。このスクリプトは、スマートコントラクトをブロックチェーンにデプロイするための設計図となります。
以下に、典型的なデプロイメントスクリプトの例を示し、各行の役割を説明します:
File: ./scripts/deploy.ts
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);
}
// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
ステップ 8:実際のデプロイメント
Berachain Artio にコントラクトをデプロイするには、以下の手順を実行します:
npx hardhat run scripts/deploy.ts --network berachain-artio
# NFT Contract Deployed at 0xBC862C68CE9EE3aFa762DbF7A51712E3c6E79215
デプロイメントの出力結果の解釈方法についてユーザーに説明し、コントラクトが正常に立ち上がったことを確認する手順を案内してください。
Hardhat に行われた全体的な変更の理解
Berachain Artio で動作するように上記のデプロイメントスクリプトと Hardhat の設定に加えられた変更をすでに理解している場合は、このセクションをスキップしても構いません。
- デフォルトの Hardhat の deployContract にはいくつかの問題があります。しかし、gasLimit と gasPrice を指定してデプロイトランザクションを手動で作成すると、Artio で動作します。
- Hardhat の設定ファイルから gas: "auto"の設定を削除することが必須です。これを自動に設定したままにすると、デプロイにかかる時間が増加し、トランザクションの送信に遅延が生じます。 3.トランザクションを手動で構築し、強制的にガス制限をオーバーライドします(これによりガス代が高くなる可能性がありますが、大きな差はありません)。
Berachain でのコントラクトの検証
検証はデプロイ後の重要なステップです。これは、デプロイされたバイトコードを対応するソースコードと公に関連付ける作業です。このプロセスは、ブロックチェインコミュニティにおける透明性と信頼性を高めます。
@nomicfoundation/hardhat-verify プラグインをインストールし、正しいコントラクトアドレスを使用することの重要性を強調しながら、ユーザーに検証プロセスを案内してください。
インストール
Hardhat を通じて直接コントラクトを検証するのに役立つ hardhat-verify プラグインをインストールします。
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://artio.beratrail.io/documentation/recipes/hardhat-verificationをご覧ください。
検証
コントラクトを検証するために必要なのは、デプロイされたコントラクトのアドレスだけです。
npx hardhat verify --network berachain-artio <0x...>
"<0xaddress>"全体を置き換えることを確認してください。正しい例は次のとおりです:
✅ npx hardhat verify --network berachain-artio 0x3229075dd6F75bD879F7af07d384A0856c30a806
❌ npx hardhat verify --network berachain-artio <0x3229075dd6F75bD879F7af07d384A0856c30a806> (これは不正確です)
完了すると、以下のような出力が表示されるはずです。
# [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 エクスプローラー(Beratrail)をターミナルで提供されたリンクを使って開くと、コントラクトのソースコードが正常に検証されたことを確認することができます!
Complete Code
File: ./contracts/NFT.sol
// 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;
}
}
File: ./scripts/deploy.ts
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);
}
// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
File: ./hardhat.config.ts
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: {
// for testnet
"berachain-artio": {
url: "https://rpc.ankr.com/berachain_testnet",
accounts: [process.env.WALLET_KEY as string],
chainId: 80085,
// gas: "auto",
gasPrice: 10000000000,
},
// for local dev environment
"berachain-local": {
url: "http://localhost:8545",
gasPrice: 1000000000,
},
},
defaultNetwork: "hardhat",
etherscan: {
apiKey: {
berachainArtio: "berachainArtio", // apiKey is not required, just set a placeholder
},
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 リポジトリから完全なコードを入手することもできるはずです。
まとめ
このガイドは、ERC-721 NFT のデプロイの全ステップ、特にBerachain Artio でのコントラクトの検証について、包括的なリソースとなることを目指しています。Hardhat を使用したデプロイの基本から、スマートコントラクトの開発と検証に必要ないくつかの複雑な点やカスタマイズまで、幅広くカバーしています。
🛠️ さらに開発を進めたいですか?
Berachain でさらに開発を進めたい、より多くの実装例を見たいとお考えですか?私たちBerachain GitHub Guides Repo をぜひご覧ください。このリポジトリには、NextJS、Hardhat、Viem、Foundry など、様々な技術を使用した幅広い実装例が用意されています。
より詳細な情報を探求したい場合は、Berachain ドキュメントをご覧ください。
開発者サポートをお探しですか?
質問をするために、Berachain Discordサーバーに参加し、開発者チャンネルをチェックしてください。
❤️ この記事に対して愛を示すのを忘れないでください 👏🏼
【Sunrise とは】
Sunrise は Proof of Liquidity(PoL)と Fee Abstraction(手数料抽象化)を備えたデータ可用性レイヤーです。 私たちは DA の体験を再構築し、多様なエコシステムからのモジュラー型流動性を活用してロールアップを立ち上げています。
【Social Links】
【お問合せ】
Sunrise へのお問い合わせはこちらから 👉 Google Form