Solidity

【Solidity】第6章第4回:ERC-721(NFT)の基本と実装

本記事では、Solidityを用いてERC-721トークン、いわゆるNon-Fungible Token(NFT)の基本と実装について解説します。NFTは、唯一無二のデジタル資産をブロックチェーン上で表現するための標準規格です。

0. 記事の概要

この記事を読むメリット

  • ERC-721の基礎理解:NFTの規格とその基本的な仕組みを学べます。
  • 実践的なNFT開発:Solidityを用いたNFTの作成と管理方法を理解できます。
  • 応用力の向上:NFTを活用したDAppの構築に挑戦できます。

この記事で学べること

  • ERC-721の特徴とユースケース
  • 基本的なNFTの実装手法
  • トークン管理と拡張機能の実現方法

1. ERC-721とは?

1.1 ERC-721の概要

ERC-721はEthereum上で唯一無二のデジタル資産を表現するための標準規格です。この規格は、以下の特徴を持っています:

  • 各トークンが一意のIDを持つ
  • トークンが相互に置き換え不可能
  • 所有者情報がブロックチェーン上で追跡可能

1.2 ERC-721の主なユースケース

  • デジタルアートやコレクティブル
  • ゲーム内アイテムのトークン化
  • 不動産や知的財産のデジタル表現

2. SolidityでのERC-721トークンの実装

2.1 基本的なコード例

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

contract MyNFT is ERC721 {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIdCounter;

    constructor() ERC721("MyNFT", "MNFT") {}

    function mintNFT(address to) public {
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _mint(to, tokenId);
    }
}

動作解説

このコードでは、ERC721を継承してNFTを実装しています。mintNFT関数を呼び出すことで、新しいNFTを指定したアドレスに発行できます。

2.2 トークンURIの追加

// トークンURI機能を追加
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";

contract MyNFTWithURI is ERC721URIStorage {
    uint256 private _tokenIdCounter;

    constructor() ERC721("MyNFT", "MNFT") {}

    function mintNFT(address to, string memory tokenURI) public {
        uint256 tokenId = _tokenIdCounter;
        _tokenIdCounter++;
        _mint(to, tokenId);
        _setTokenURI(tokenId, tokenURI);
    }
}

動作解説

このコードでは、ERC721URIStorageを使用してトークンにURIを紐付けています。_setTokenURI関数で各トークンのメタデータを設定できます。

3. NFT開発時の注意点

3.1 ガスコストの最適化

ERC-721トークンは複雑な構造を持つため、以下の方法でガスコストを削減しましょう:

  • 不要なストレージ操作を避ける
  • 効率的なメタデータ管理を行う

3.2 セキュリティの確保

  • ミント権限を適切に制御する
  • トークンIDの重複を防ぐ
  • トランザクションのエラーハンドリングを実装する

4. 練習問題

以下の課題に挑戦してみましょう:

  1. トークンURIを動的に更新できるNFTを実装してください。
  2. 特定の条件下でのみミントが許可されるNFTを設計してください。

5. まとめ

本記事では、ERC-721トークン(NFT)の基本と実装について解説しました。NFTは、独自の資産やコレクションをブロックチェーン上で管理する強力なツールです。これを活用して、革新的なDAppを構築してみましょう。