Skip to content

Latest commit

 

History

History
256 lines (177 loc) · 6.6 KB

File metadata and controls

256 lines (177 loc) · 6.6 KB

NFT発行ハンズオン

このハンズオンでは、OpenZeppelinを使用してERC721標準のNFTコントラクトを実装、テスト、デプロイする方法を学びます。

📚 目次

  1. 概要
  2. 環境セットアップ
  3. コントラクトの実装
  4. テストの作成
  5. デプロイ
  6. NFTのミント
  7. 次のステップ

概要

このハンズオンで実装するSimpleNFTコントラクトは以下の機能を持ちます:

  • ✅ ERC721標準準拠:NFTの基本機能(転送、所有権管理など)
  • ✅ メタデータストレージ:各NFTに固有のURIを設定
  • ✅ ミント機能:新しいNFTを発行
  • ✅ アクセス制御:オーナーのみがミント可能

環境セットアップ

依存パッケージのインストール

npm install @openzeppelin/contracts

使用技術

  • Solidity: ^0.8.28
  • OpenZeppelin Contracts: ^5.4.0
  • Hardhat: ^3.0.7
  • Viem: ^2.38.0

コントラクトの実装

SimpleNFT.sol

contracts/SimpleNFT.solファイルに以下の主要機能が実装されています:

継承しているコントラクト

  1. ERC721: NFTの基本機能
  2. ERC721URIStorage: トークンURIの保存機能
  3. Ownable: オーナーによるアクセス制御

主要な関数

// NFTをミントする(オーナーのみ)
function safeMint(address to, string memory uri) public onlyOwner returns (uint256)

// 現在のトークンIDを取得
function getCurrentTokenId() public view returns (uint256)

// トークンのURIを取得
function tokenURI(uint256 tokenId) public view returns (string memory)

コードのポイント

// トークンIDのカウンター
uint256 private _nextTokenId;

// コンストラクタでNFTの名前とシンボルを設定
constructor() ERC721("SimpleNFT", "SNFT") Ownable(msg.sender) {
    _nextTokenId = 0;
}

テストの作成

テストファイル: test/SimpleNFT.ts

以下のテストケースを実装しています:

1. デプロイメントテスト

  • ✅ コントラクト名とシンボルが正しく設定されているか
  • ✅ デプロイしたアドレスがオーナーになっているか
  • ✅ 初期トークンIDが0であるか

2. ミント機能テスト

  • ✅ オーナーがNFTをミントできるか
  • ✅ 複数のNFTをミントできるか
  • ✅ オーナー以外がミントを試みると失敗するか

3. 転送機能テスト

  • ✅ NFTの所有者が転送できるか

テストの実行

# すべてのテストを実行
npm test

# SimpleNFTのテストのみ実行
npm run test:nft

テスト結果

✔ 正しい名前とシンボルが設定されているべき
✔ デプロイしたアドレスがオーナーであるべき
✔ 初期トークンIDは0であるべき
✔ オーナーがNFTをミントできるべき
✔ 複数のNFTをミントできるべき
✔ オーナー以外はミントできないべき
✔ NFTの所有者が転送できるべき

7 passing

デプロイ

ローカルネットワークにデプロイ

npm run deploy:nft

Sepoliaテストネットにデプロイ

  1. .envファイルに環境変数を設定:
SEPOLIA_RPC_URL=https://eth-sepolia.g.alchemy.com/v2/YOUR_API_KEY
SEPOLIA_PRIVATE_KEY=YOUR_PRIVATE_KEY
  1. デプロイを実行:
npm run deploy:nft:sepolia

デプロイ結果の例

SimpleNFTコントラクトをデプロイ中...
✅ SimpleNFTがデプロイされました: 0x5fbdb2315678afecb367f032d93f642f64180aa3
デプロイアカウント: 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266

📋 コントラクト情報:
  名前: SimpleNFT
  シンボル: SNFT
  オーナー: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266

NFTのミント

1. ミントスクリプトの編集

scripts/mint-nft.tsを開いて、以下の値を設定します:

// デプロイしたコントラクトアドレス
const NFT_CONTRACT_ADDRESS = "0x5fbdb2315678afecb367f032d93f642f64180aa3";

// NFTを受け取るアドレス
const RECIPIENT_ADDRESS = "0x70997970C51812dc3A010C7d01b50e0d17dc79C8";

// メタデータのURI
const TOKEN_URI = "ipfs://QmYourMetadataHash";

2. ミントの実行

npm run mint:nft

NFTメタデータの例

NFTのメタデータは通常JSONフォーマットで、以下のような構造を持ちます:

{
  "name": "My First NFT",
  "description": "This is my first NFT!",
  "image": "ipfs://QmImageHash",
  "attributes": [
    {
      "trait_type": "Color",
      "value": "Blue"
    },
    {
      "trait_type": "Rarity",
      "value": "Common"
    }
  ]
}

このJSONファイルをIPFSにアップロードし、そのURIをTOKEN_URIとして使用します。

次のステップ

🎨 機能拡張のアイデア

  1. バッチミント機能

    • 一度に複数のNFTをミントできる機能を追加
  2. 最大供給量の設定

    • NFTの総発行数に上限を設ける
  3. ホワイトリスト機能

    • 特定のアドレスのみミントできる機能
  4. ロイヤリティ機能

    • EIP-2981を実装して、二次販売時のロイヤリティを設定
  5. Reveal機能

    • ミント時は共通画像を表示し、後で本物の画像を公開

📚 学習リソース

🔧 便利なツール

まとめ

このハンズオンでは以下のことを学びました:

  1. ✅ OpenZeppelinを使用したNFTコントラクトの実装
  2. ✅ ERC721標準の理解
  3. ✅ Solidityのテストの書き方
  4. ✅ コントラクトのデプロイ方法
  5. ✅ NFTのミント機能の実装

次は、実際にIPFSに画像をアップロードして、独自のNFTを発行してみましょう!🚀