Solidity

【Solidity】第6章第5回:ERC-721の標準関数と応用例

本記事では、ERC-721トークンの標準関数について詳しく解説し、それらを応用した具体例を紹介します。NFTの開発に必要なスキルを習得し、独自のアプリケーションを作成できるようになりましょう。

0. 記事の概要

この記事を読むメリット

  • ERC-721標準関数の理解:NFTの基本的な操作方法を習得できます。
  • 応用力の向上:標準関数を活用したNFTプロジェクトの設計が可能になります。
  • 実践的なスキル:NFTの開発を効率化する具体的な方法を学べます。

この記事で学べること

  • ERC-721標準関数の役割と動作
  • 実践的な応用例とその実装方法
  • NFT開発のベストプラクティス

1. ERC-721の標準関数とは?

1.1 ERC-721の主要関数

ERC-721の標準関数は、NFTを管理するための基本的な操作を提供します。主な関数は以下の通りです:

  • balanceOf(address owner): 所有者が持つトークン数を返します。
  • ownerOf(uint256 tokenId): 指定されたトークンIDの所有者を返します。
  • safeTransferFrom(address from, address to, uint256 tokenId): 安全にトークンを転送します。
  • transferFrom(address from, address to, uint256 tokenId): トークンを転送します。
  • approve(address to, uint256 tokenId): トークンの操作権限を与えます。
  • getApproved(uint256 tokenId): 指定されたトークンIDの承認済みアドレスを返します。
  • setApprovalForAll(address operator, bool approved): 特定のアドレスに全てのトークンの操作を許可します。
  • isApprovedForAll(address owner, address operator): オペレーターが全てのトークンの操作を許可されているか確認します。

1.2 関数の特徴と用途

これらの関数を使用することで、NFTの所有権管理や転送、操作権限の付与など、基本的な機能を実装できます。

2. ERC-721標準関数の実装例

2.1 トークンの転送

// トークン転送の例
function transferFrom(address from, address to, uint256 tokenId) public {
    require(ownerOf(tokenId) == from, "トークンの所有者ではありません");
    require(to != address(0), "無効なアドレスです");

    _approve(address(0), tokenId); // トークンの承認をリセット
    _transfer(from, to, tokenId);
}

動作解説

transferFrom関数は、指定されたトークンIDを現在の所有者から別のアドレスに転送します。この関数では所有者確認やアドレス検証を行います。

2.2 承認と操作権限

// 操作権限の付与
function approve(address to, uint256 tokenId) public {
    address owner = ownerOf(tokenId);
    require(msg.sender == owner || isApprovedForAll(owner, msg.sender), "操作権限がありません");

    _approve(to, tokenId);
}

動作解説

approve関数は、指定されたトークンIDの操作権限を別のアドレスに付与します。この機能はマーケットプレイスや取引所での取引に利用されます。

2.3 安全なトークン転送

// 安全なトークン転送
function safeTransferFrom(address from, address to, uint256 tokenId) public {
    require(ownerOf(tokenId) == from, "トークンの所有者ではありません");
    require(to != address(0), "無効なアドレスです");

    _safeTransfer(from, to, tokenId, "");
}

動作解説

safeTransferFrom関数は、トークン転送時に受信者のコントラクトが適切な処理を行えるか確認します。

3. 応用例:マーケットプレイス

3.1 概要

ERC-721の標準関数を活用して、NFTの売買を行うマーケットプレイスを構築できます。

3.2 マーケットプレイスのコード例

// シンプルなマーケットプレイス
contract NFTMarketplace {
    struct Listing {
        address seller;
        uint256 price;
    }

    mapping(uint256 => Listing) public listings;

    function listNFT(uint256 tokenId, uint256 price) public {
        listings[tokenId] = Listing(msg.sender, price);
    }

    function buyNFT(address nftContract, uint256 tokenId) public payable {
        Listing memory listing = listings[tokenId];
        require(msg.value >= listing.price, "価格が不足しています");

        IERC721(nftContract).safeTransferFrom(listing.seller, msg.sender, tokenId);
        payable(listing.seller).transfer(msg.value);

        delete listings[tokenId];
    }
}

動作解説

このコードでは、NFTをリストし購入するための基本的なマーケットプレイス機能を実装しています。

4. 練習問題

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

  1. マーケットプレイスに取引履歴を記録する機能を追加してください。
  2. 特定の条件を満たした場合のみトークンを転送できるようにしてください。

5. まとめ

本記事では、ERC-721の標準関数とその応用例について解説しました。これらの関数を活用することで、より高度で実用的なNFTアプリケーションを構築できます。