本記事は下記の翻訳となります。
『How To Deploy And Verify Contracts On Berachain』
Berachain Artio テストネットの紹介
100 以上のブロックチェーン技術が乱立する世界において、Berachain は開発者にとって注目すべき Cosmos 系の EVM 互換チェーンとして台頭しています。Proof of Liquidity(POL)設計、堅牢なスケーラビリティ、強化されたセキュリティで知られる Berachain は、ユーザーにとってチェーンとの相互作用が有益であるため、開発者の聖地として際立っています。幅広い分散型アプリケーション(dApps)の早期採用と EVM 互換性により、開発者がプロダクトを構築しテストするのに理想的な選択肢となっています。
他のブロックチェーンと同様に、Artio テストネットは今後展開される Berachain メインネットの重要なコンポーネントであり、開発者が事前にツールを準備しテストするための Verify 環境を提供します。ここで、スマートコントラクト、特に非代替性トークン(NFT)の ERC-721 標準の Bera 魔法が生き生きとします。🐻 ❤️
なぜ Hardhat なのか?
Hardhat は、Ethereum 開発における重要なツールです。スマートコントラクトのコンパイル、デプロイ、テスト、デバッグなど、さまざまなプロセスを効率化します。dApp 開発に必要なすべてのツールを備えた、個人用ブロックチェーンワークショップのようなものだと考えてください。
🛠️ 何を構築するのか?
このチュートリアルでは、hardhat-ethers を使用して Berachain テストネット(Artio)上に ERC-721 スマートコントラクトを作成しデプロイする方法をご案内します。このチュートリアルでは、Hardhat と Ethers.js を使用して、非代替性トークン(ERC-721)スマートコントラクトを作成し、デプロイし、さらに Berachain テストネット上で Verify することに焦点を当てています!
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
ファイルと必要な依存関係が含まれていることを確認してください。
注意:非推奨の警告
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
NFT.sol
ファイルでは、Solidity のバージョンがhardhat.config.ts
で指定されているものと一致していることを確認してください。各コンポーネントの目的を説明し、NFT のアーキテクチャにおける OpenZeppelin のコントラクトの役割を強調します。
ステップ 5:MetaMask と Berachain Artio を Hardhat と統合する
このステップでは、MetaMask ウォレットと Berachain テストネットを 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
-
.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 のカスタムチェーン設定に特に注意を払います。
ファイル: ./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
の更新)を作成します。このスクリプトは、ブロックチェーン上にスマートコントラクトをデプロイするための設計図となります。各行のコードと Hardhat のデプロイメント機能を活用する上での役割を説明します。
ファイル: ./scripts/deploy.ts
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"
設定を削除することが必須です。これを自動に設定していると、デプロイに時間がかかり、トランザクションの提出に遅延が生じます。 -
トランザクションを手動で構築し、強制的なガス制限オーバーライドを設定します(これによりガス代が高くなる可能性がありますが、大きな差ではありません)。
Berachain でのコントラクトの Verify
Verify はデプロイ後の重要なステップです。これは、デプロイされたバイトコードを対応するソースコードと公開的に関連付ける作業です。このプロセスにより、ブロックチェーンコミュニティにおける透明性と信頼性が向上します。
@nomicfoundation/hardhat-verify
プラグインをインストールし、正しいコントラクトアドレスを使用することの重要性を強調しながら、ユーザーに Verify プロセスを案内します。
インストール
Hardhat を通じて直接コントラクトを Verify するのに役立つ 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
すでに、コントラクトの Verify に役立つ Routescan API のための以下のコードを含めています。
詳細については、https://artio.beratrail.io/documentation/recipes/hardhat-verification をご覧ください。
Verify
コントラクトを Verify するために必要なのは、デプロイされたコントラクトのアドレスだけです。
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 Explorer(Beratrail)をターミナルで提供されたリンクを使って開くと、コントラクトのソースコードが正常に Verify されたことを確認することができます!
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 でのコントラクトの Verifyについて、包括的なリソースとなることを目指しています。Hardhat を使用したデプロイの基本から、スマートコントラクトの開発と Verify に必要ないくつかの複雑な点やカスタマイズまで、幅広くカバーしています。
🛠️ さらに開発を進めたいですか?
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