Solidity

【Solidity】第9章第6回:NFTマーケットプレイスの構築

本記事では、Solidityを用いてNFTマーケットプレイスを構築する方法を解説します。NFT(非代替性トークン)を安全に取引できるプラットフォームを構築し、出品、購入、管理機能を備えたスマートコントラクトの作成を学びます。

0. 記事の概要

この記事を読むメリット

  • NFTマーケットプレイスの仕組みを理解: スマートコントラクトを用いたNFT取引の仕組みを学べます。
  • 出品・購入機能の実装: SolidityでNFTの売買を行うコントラクトを開発できます。
  • セキュリティ対策の習得: NFT取引における安全性を確保する方法を理解できます。

この記事で学べること

  • NFTマーケットプレイスの基本概念
  • Solidityでの出品・購入機能の実装
  • スマートコントラクトを活用した取引の流れ

1. NFTマーケットプレイスの概要

1.1 NFTとは?

NFT(Non-Fungible Token)は、ブロックチェーン上で発行される一意性を持つデジタル資産です。主にデジタルアートやゲームアイテム、音楽などに活用されています。

1.2 NFTマーケットプレイスの仕組み

NFTマーケットプレイスは、ユーザーがNFTを出品・購入できるプラットフォームです。主な機能は以下の通りです:

  • 出品機能: ユーザーがNFTを販売リストに登録。
  • 購入機能: 他のユーザーがNFTを購入し、所有権が移転。
  • 取引履歴管理: すべての取引はブロックチェーン上に記録される。

2. SolidityでのNFTマーケットプレイス実装

2.1 NFTの出品機能

// NFT出品機能の実装
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";

contract NFTMarketplace {
    struct Listing {
        address seller;
        address nftAddress;
        uint256 tokenId;
        uint256 price;
    }

    mapping(uint256 => Listing) public listings;
    uint256 public listingCount;

    function listNFT(address _nftAddress, uint256 _tokenId, uint256 _price) public {
        IERC721 nft = IERC721(_nftAddress);
        require(nft.ownerOf(_tokenId) == msg.sender, "You don't own this NFT");
        require(nft.getApproved(_tokenId) == address(this), "Marketplace not approved");

        listings[listingCount] = Listing(msg.sender, _nftAddress, _tokenId, _price);
        listingCount++;
    }
}

動作解説

  • ユーザーがNFTを出品する際に listNFT() を呼び出す。
  • スマートコントラクトは、出品者がNFTの所有者であることを検証。
  • 出品リスト listings に情報を保存。

2.2 購入機能の実装

// NFT購入機能の実装
function buyNFT(uint256 listingId) public payable {
    Listing memory item = listings[listingId];
    require(msg.value == item.price, "Incorrect price");

    IERC721 nft = IERC721(item.nftAddress);
    nft.safeTransferFrom(item.seller, msg.sender, item.tokenId);
    payable(item.seller).transfer(msg.value);
    delete listings[listingId];
}

動作解説

  • 購入者が buyNFT() を呼び出し、指定した価格を支払う。
  • スマートコントラクトがNFTの所有権を移転。
  • 売上を出品者に送金し、リストから削除。

3. セキュリティと拡張性

3.1 スマートコントラクトの安全対策

NFTマーケットプレイスのセキュリティを向上させるため、以下の対策を講じます:

  • リプレイ攻撃の防止: 購入トランザクションの一意性を確保。
  • 手数料の導入: 取引ごとに手数料を徴収し、運営資金とする。

4. 練習問題

以下の課題に挑戦し、NFTマーケットプレイスの理解を深めましょう:

  1. NFTのオークション機能を追加し、最高入札者がNFTを獲得できるようにしてください。
  2. 購入時に手数料を徴収し、一部をマーケットプレイスの管理者へ送る機能を追加してください。

5. まとめ

本記事では、Solidityを用いたNFTマーケットプレイスの基本構造を解説しました。適切なセキュリティ対策と拡張機能を加えることで、安全で利便性の高いNFT取引プラットフォームを構築できます。