コントラクトをテストネットにデプロ イしよう
🏝 コントラクトをテストネットにデプロイする
これから、実際にコントラクトをテストネットにデプロイしていきます。
テストネットにデプロイすると、NFTをオンラインで見ることができます。
🦊 MetaMask をダウンロードする
次に、イーサリアムウォレットをダウンロードしましょう。
このプロジェクトではMetaMaskを使用します。
- こちら からブラウザの拡張機能をダウンロードし、MetaMaskウォレットをあなたのブラウザに設定します。
すでに別のウォレットをお持ちの場合でも、今回はMetaMaskを使用してください。
✍️: MetaMask が必要な理由 ユーザーが、スマートコントラクトを呼び出すとき、本人のイーサリアムアドレスと秘密鍵を備えたウォレットが必要となります。
- これは、認証作業のようなものです。
💳 トランザクション
イーサリアムネットワーク上でブロックチェーンに新しく情報を書き込むことを、トランザクションと呼びます。
ここまでのレッスンに登場したトランザクションは以下です。
- 新規にスマートコントラクトをイーサリアムネットワークにデプロイしたという情報をブロックチェーン上に書き込む。
- ユーザーが NFT を Mint したという情報をブロックチェーンに書き込む。
トランザクションにはマイナーの承認が必要ですので、Alchemyを導入します。
Alchemyは、世界中のトランザクションを一元化し、マイナーの承認を促進するプラットフォームです。
こちら からAlchemyのアカウントを作成してください。
💎 Alchemy でネットワークを作成
Alchemyのアカウントを作成したら、CREATE APP
ボタンを押してください。
次に、下記の項目を埋めていきます。下図を参考にしてください。
NAME
: プロジェクトの名前(例:MyEpicGame
)DESCRIPTION
: プロジェクトの概要CHAIN
:Ethereum
を選択。NETWORK
:sepolia
を選択。
それから、作成したAppのVIEW DETAILS
をクリックします。
プロジェクトを開いたら、VIEW KEY
ボタンをクリックします。
ポップアップが開くので、HTTP
のリンクをコピーしてください。
これがあなたが本番環境のネットワークに接続する際に使用するAPI Key
になります。
- これは、後に何回か必要になるので、あなたの PC 上のわかりやすいところに、メモとして残しておいてください。
🐣 テストネットから始める
今回のプロジェクトでは、コスト(= 本物のETH)が発生するメインネットではなく、テストネットにコントラクトをデプロイします。
テストネットはイーサリアムメインネットを模しています。
-
イーサリアムメインネットにコントラクトをデプロイした際に発生するイベントのテストを行うのに最適です。
-
テストネットは偽のETHを使用しているため、いくらでもトランザクションのテストを行えます。
今回は、以下のイベントをテストしていきます。
1. トランザクションの発生を世界中のマイナーたちに知らせる
2. あるマイナーがトランザクションを発見する
3. そのマイナーがトランザクションを承認する
4. そのマイナーがトランザクションを承認したことをほかのマイナーたちに知らせ、トランザクションのコピーを更新する
このセクションでは、コードを書きながら、これらのイベントについての理解を深めていきます。
🚰 偽の ETH を取得する
今回は、Sepolia
というイーサリアム財団によって運営されているテストネットを使用します。
Sepolia
にコントラクトをデプロイし、コードのテストを行うために、偽のETHを取得しましょう。ユーザーが偽のETHを取得するために用意されたインフラは、「フォーセット(=蛇口)」と呼ばれています。
フォーセットを使用する前に、あなたのMetaMaskウォレットをSepolia Test Network
に設定してください。
✍️: MetaMask で
Sepolia Test Network
を設定する方法 1 . MetaMask ウォレットのネットワークトグルを開く。
2 .
Show/hide test networks
をクリック。
3 .
Show test networks
をON
にする。
4 .
sepolia Test Network
を選択する。
MetaMaskウォレットにSepolia Test Network
が設定されたら、下記のリンクの中から条件に合うものを選んで、少量の偽ETHを取得しましょう。
- Alchemy - 1 Sepolia ETH(24時間に1度もらうことができる)
- ウォレットアドレスを入力して
Send Me ETH
ボタンを押下するとその場でもらえます。
- ウォレットアドレスを入力して
🚀 deploy.js
ファイルを作成する
今までは、ローカル環境でスマートコントラクトのテストを行う際に、run.js
スクリプトを使用してきました。
contract/scripts
ディレクトリに、scripts
ディレクトリの中にあるdeploy.js
を以下のとおり更新します。
内容は、既存のrun.js
に、mintCharacterNFT
関数の呼び出しを追加しただけです。
const main = async () => {
// これにより、`MyEpicGame` コントラクトがコンパイルされます。
// コントラクトがコンパイルされたら、コントラクトを扱うために必要なファイルが artifacts ディレクトリの直下に生成されます。
const gameContractFactory = await hre.ethers.getContractFactory("MyEpicGame");
// Hardhat がローカルの Ethereum ネットワークを、コントラクトのためだけに作成します。
const gameContract = await gameContractFactory.deploy(
["ZORO", "NAMI", "USOPP"], // キャラクターの名前
[
"https://i.imgur.com/TZEhCTX.png", // キャラクターの画像
"https://i.imgur.com/WVAaMPA.png",
"https://i.imgur.com/pCMZeiM.png",
],
[100, 200, 300], // キャラクターのHP
[100, 50, 25] // キャラクターの攻撃力
);
// ここでは、`nftGame` コントラクトが、
// ローカルのブロックチェーンにデプロイされるまで待つ処理を行っています。
const nftGame = await gameContract.deployed();
console.log("Contract deployed to:", nftGame.address);
/* ---- mintCharacterNFT関数を呼び出す ---- */
// Mint 用に再代入可能な変数 txn を宣言
let txn;
// 3体のNFTキャラクターの中から、0番目のキャラクターを Mint しています。
// キャラクターは、3体(0番, 1番, 2番)体のみ。
txn = await gameContract.mintCharacterNFT(0);
// Minting が仮想マイナーにより、承認されるのを待ちます。
await txn.wait();
console.log("Minted NFT #1");
txn = await gameContract.mintCharacterNFT(1);
await txn.wait();
console.log("Minted NFT #2");
txn = await gameContract.mintCharacterNFT(2);
await txn.wait();
console.log("Minted NFT #3");
console.log("Done deploying and minting!");
};
const runMain = async () => {
try {
await main();
process.exit(0);
} catch (error) {
console.log(error);
process.exit(1);
}
};
runMain();
📈 hardhat.config.js
ファイルを編集する
hardhat.config.js
ファイルを変更する必要があります。
これは、スマートコントラクトプロジェクトのルートディレクトリにあります。
- 今回は、
contract
ディレクトリの直下にhardhat.config.js
が存在するはずです。
例)contract
でls
を実行した結果
yukis4san@Yukis-MacBook-Pro contract % ls
README.md package-lock.json
artifacts package.json
cache scripts
contracts test
hardhat.config.js
hardhat.config.js
をVS Codeで開いて、中身を編集していきます。
require("@nomicfoundation/hardhat-toolbox");
module.exports = {
solidity: "0.8.17",
networks: {
sepolia: {
url: "YOUR_ALCHEMY_API_URL",
accounts: ["YOUR_PRIVATE_SEPOLIA_ACCOUNT_KEY"],
},
},
};
- .
YOUR_ALCHEMY_API_URL
の取得
hardhat.config.js
のYOUR_ALCHEMY_API_URL
の部分を先ほど取得した Alchemy の URL(HTTP
リンク) と入れ替えます。
- .
YOUR_PRIVATE_SEPOLIA_ACCOUNT_KEY
の取得1. お使いのブラウザから、MetaMask プラグインをクリックして、ネットワークを
Sepolia Test Network
に変更します。2. それから、
Account details
を選択してください。3.
Account details
からExport Private Key
をクリックしてください。4. MetaMask のパスワードを求められるので、入力したら
Confirm
を推します。5. あなたの秘密鍵(=
Private Key
)が表示されるので、クリックしてコピーします。hardhat.config.js
のYOUR_PRIVATE_SEPOLIA_ACCOUNT_KEY
の部分をここで取得した秘密鍵とを入れ替えます。
🙊 秘密鍵は誰にも教えてはいけません
hardhat.config.js
を更新したら、ここで一度立ち止まりましょう。
🚨:
hardhat.config.js
ファイルをあなたの秘密鍵の情報を含んだ状態で Github にコミットしてはいけません。 この秘密鍵は、あなたのイーサリアムメインネットの秘密鍵と同じです。秘密鍵が流出してしまうと、誰でもあなたのウォレットにアクセスすることができてしまうので、とても危険です。
絶対に秘密鍵を自分以外の人が見れる場所に置かないようにしましょう。
下記を実行して、VS Codeで.gitignore
ファイルを編集しましょ う。
code .gitignore
.gitignore
にhardhat.config.js
の行を追加します。
.gitignore
の中身が下記のようになっていれば、問題ありません。
node_modules
.env
coverage
coverage.json
typechain
typechain-types
#Hardhat files
cache
artifacts
hardhat.config.js
.gitignore
に記載されているファイルやディレクトリは、GitHubにディレクトリをプッシュされずに、ローカル環境にのみ保存されます。
✍️: スマートコントラクトをデプロイするのに秘密鍵が必要な理由 > 新しくスマートコントラクトをイーサリアムネットワーク上にデプロイすることも、トランザクションの一つです。
トランザクションを行うためには、ブロックチェーンに「ログイン」する必要があります。
「ログイン」には下記の情報が必要となります。
- ユーザー名: 公開アドレス
- パスワード: 秘密鍵
ユーザー名とパスワードを使用して、AWS にログインしてプロジェクトをデプロイするのと同じです。
🚀 Sepolia Test Network にコントラクトをデプロイする
hardhat.config.js
の更新が完了したら、Sepolia Test Networkにコントラクトをデプロイしてみましょう。
ターミナル上で下記の コマンドを実行しましょう。
yarn contract deploy
ターミナルに、下記のような結果が出力されていることを確認してください。
Contract deployed to: 0x534bA0eEFbA75bb8C306CD306AB02E8FfFB4eB71
Minted NFT #1
Done deploying and minting!
⚠️: 注意
通常 1〜2 分程度でデプロイが完了します。
deploy.js
で NFT を Mint し、マイナーにトランザクションを承認してもらう必要があるため、時間がかかります。