Lesson 1: スマートコントラクトをデプロイする
このレッスンでは、ゲームの結果を記録し、NFTをミントするためのスマートコントラクトをBase Sepoliaテストネットにデプロイします。
🎮 ゲームコントラクトの概要
今回使用するスマートコントラクトShootingGameNFT.sol
は、ERC1155規格に準拠したNFTコントラクトです。
主な機 能は以下の通りです。
-
NFTのミント:
プレイヤーがゲームで倒した敵の数だけ、対応するIDのNFTをミントします。 -
所有権:
OpenZeppelinのOwnable
を継承しており、コントラクトのオーナーのみがURIの設定や一括ミントなどの管理者機能を実行できます。 -
供給量の追跡:
ERC1155Supply
を継承しており、各NFTの総供給量を追跡できます。
スタータープロジェクトのpackages/contract/src/ShootingGameNFT.sol
にコードが用意されています。
// SPDX-License-Identifier: MIT
// Compatible with OpenZeppelin Contracts ^5.4.0
pragma solidity ^0.8.27;
import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import {ERC1155Burnable} from "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol";
import {ERC1155Supply} from "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
/**
* シューティングゲームNFT
* 倒した敵の数だけERC1155のNFTがミントされる
*/
contract ShootingGameNFT is ERC1155, Ownable, ERC1155Burnable, ERC1155Supply {
/**
* コンストラクター
*/
constructor(address initialOwner) ERC1155("") Ownable(initialOwner) {}
/**
* トークンURIを変更するメソッド
*/
function setURI(string memory newuri) public onlyOwner {
_setURI(newuri);
}
/**
* NFTをミントするメソッド
*/
function mint(address account, uint256 id, uint256 amount, bytes memory data)
public
{
_mint(account, id, amount, data);
}
/**
* 複数のNFTをまとめて一括でミントするメソッド
*/
function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)
public
onlyOwner
{
_mintBatch(to, ids, amounts, data);
}
// The following functions are overrides required by Solidity.
function _update(address from, address to, uint256[] memory ids, uint256[] memory values)
internal
override(ERC1155, ERC1155Supply)
{
super._update(from, to, ids, values);
}
}
🔧 Remix IDEでのデプロイ
スマートコントラクトのデプロイには、ブラウザで利用できるRemix IDEを使用します。
1. ファイルの準備
まず、Remix IDEにコントラクトのコードを貼り付けます。
- Remix IDEを開きます。
File Explorers
パネルのcontracts
フォルダ内に、ShootingGameNFT.sol
という名前で新しいファイルを作成します。- 上記のソースコードをすべてコピーし、Remixの
ShootingGameNFT.sol
に貼り付けます。
2. コントラクトのコンパイル
次に、SolidityのコードをEVMが実行できる形式にコンパイル(変換)します。
- 左のメニューから「Solidity Compiler」タブを選択します。
COMPILER
のバージョンが0.8.27
以降になっていることを確認します。ShootingGameNFT.sol
が開かれている状態で、「Compile ShootingGameNFT.sol」ボタンをクリックします。- コンパイラタブのアイコンに緑色のチェックマークが表示されれば、コンパイル成功です。
3. Base Sepoliaへの接続
デプロイ先をBase Sepoliaテストネットに設定します。これにはMetaMaskのようなブラウザウォレットが必要です。
- ウォレットにBase Sepoliaテストネットを追加し、ネットワークを切り替えます。
- Coinbase Faucetなどから、テスト用のETHを取得しておきます。
- Remixの左メニューから「Deploy & run transactions」タブを選択します。
ENVIRONMENT
のドロップダウンから「Injected Provider - (ウォレット名)」を選択します。ウォレットがポップアップし、接続を求められたら許可してください。接続先がbase sepoliaになっていればOKです!
4. デプロイの実行
いよいよコントラクトをデプロイします。
CONTRACT
のドロップダウンでShootingGameNFT - contracts/ShootingGameNFT.sol
が選択されていることを確認します。Deploy
ボタンの横にあるテキストフィールドに、initialOwner
としてあなた自身のウォレットアドレスを入力します。- 「Deploy」ボタンをクリックします。
- ウォレットがポップアップし、トランザクションの確認を求められます。内容を確認し、「確認」をクリックしてガス代を支払います。
- デプロイが完了すると、Remixの下部にあるターミナルに成功ログが表示され、
Deployed Contracts
セクションにコントラクトが表示されます。
📝 コントラクトアドレスの設定
デプロイしたコントラクトをフロントエンドから利用するために、コントラクトアドレスを設定します。
- Remixの
Deployed Contracts
セクションに表示されているSHOOTINGGAMENFT
コントラクトの横にあるコピーアイコンをクリックして、コントラクトアドレスをコピーします。 utils/constants.ts
ファイルを開きます。GAME_NFT_CONTRACT_ADDRESS
の値を、先ほどコピーしたあなた自身のコントラクトアドレスに書き換えてください。
// utils/constants.ts
// base sepoliaにデプロイしたシューティングゲームNFT
export const NFT_ADDRESS = '<ここにコントラクトアドレスを貼り付ける>';
これで、スマートコントラクトのデプロイとフロントエンドへの設定が完了しました。
次のセクションでは、いよいよフロントエンドアプリケーションの実装に入ります。
🙋♂️ 質問する
ここまでの作業で何かわからないことがある場合は、Discordの#base
で質問をしてください。
ヘルプをするときのフローが円滑になるので、エラーレポートには下記の3点を記載してください ✨
- 質問が関連しているセクション番号とレッスン番号
- 何をしようとしていたか
- エラー文をコピー&ペースト
- エラー画面のスクリーンショット