بازارهای NFT به‌دلیل قابلیت‌های منحصر به فرد خود در انتقال دارایی‌های دیجیتال به ابزارهای محبوبی تبدیل شده‌اند. در اینجا، نمونه‌ای از چگونگی ساخت بازار NFT با استفاده از زبان برنامه‌نویسی سالیدیتی و استاندارد ERC-721 توضیح داده می‌شود.

استاندارد ERC-721

استاندارد ERC-721 برای ایجاد توکن‌های غیرقابل تقسیم (NFT) طراحی شده است. این نوع توکن‌ها به هر واحد توکن ویژگی‌ها و مشخصات منحصر به فردی می‌دهند.

مراحل ساخت بازار NFT

1. نصب ابزارهای ضروری

شما نیاز به نصب Node.js و Truffle دارید. پس از نصب Node.js، Truffle را با استفاده از npm نصب کنید:

npm install -g truffle

2. ایجاد پروژه جدید Truffle

یک پوشه جدید برای پروژه خود ایجاد کرده و وارد آن شوید. سپس دستور زیر را برای ایجاد پروژه Truffle اجرا کنید:

truffle init

آموزش سالیدیتی

3. نوشتن قرارداد ERC-721

یک فایل جدید در پوشه contracts با نام MyNFT.sol ایجاد کنید و کد زیر را وارد کنید:

// SPDX-License-Identifier: MIT
pragma solidity ^.8.;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract MyNFT is ERC721, Ownable {
    uint public nextTokenId;
    mapping(uint => string) public tokenURI;

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

    function mint(string memory _tokenURI) external onlyOwner {
        uint tokenId = nextTokenId;
        nextTokenId++;
        _safeMint(msg.sender, tokenId);
        tokenURI[tokenId] = _tokenURI;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return "https://myapi.com/api/token/";
    }
}

4. نوشتن قرارداد بازار NFT

حالا فایل دیگری در پوشه contracts با نام Marketplace.sol ایجاد کنید و کد زیر را وارد کنید:

// SPDX-License-Identifier: MIT
pragma solidity ^.8.;

import "./MyNFT.sol";

contract Marketplace {
    struct Listing {
        uint tokenId;
        address seller;
        uint price;
    }

    MyNFT public nft;
    mapping(uint => Listing) public listings;

    constructor(address _nftAddress) {
        nft = MyNFT(_nftAddress);
    }

    function listNFT(uint _tokenId, uint _price) external {
        require(nft.ownerOf(_tokenId) == msg.sender, "You are not the owner");
        require(_price > , "Price must be greater than ");

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

    function buyNFT(uint _tokenId) external payable {
        Listing memory listing = listings[_tokenId];
        require(msg.value == listing.price, "Incorrect price");
        
        nft.transferFrom(listing.seller, msg.sender, _tokenId);
        payable(listing.seller).transfer(msg.value);

        delete listings[_tokenId];
    }
}

5. تنظیمات و تست‌ها

پس از نوشتن قراردادها، باید آن‌ها را در شبکه آزمایشی تست کنید. فایل migrations/2_deploy_contracts.js را ایجاد کنید:

const MyNFT = artifacts.require("MyNFT");
const Marketplace = artifacts.require("Marketplace");

module.exports = function(deployer) {
    deployer.deploy(MyNFT).then(function() {
        return deployer.deploy(Marketplace, MyNFT.address);
    });
};

6. راه‌اندازی شبکه محلی

برای راه‌اندازی یک شبکه محلی، دستور زیر را در ترمینال اجرا کنید:

truffle develop

سپس در کنسول Truffle، قراردادها را با استفاده از دستور زیر دیپلوی کنید:

migrate --reset

7. تست قراردادها

می‌توانید از تست‌های خودکار برای بررسی عمل‌کرد قراردادها استفاده کنید. ایجاد یک فایل تست جدید در پوشه test با نام Marketplace.test.js و نوشتن تست‌های مربوط به قراردادها:

const MyNFT = artifacts.require("MyNFT");
const Marketplace = artifacts.require("Marketplace");

contract("Marketplace", (accounts) => {
    it("should list and buy nft", async () => {
        const nftInstance = await MyNFT.new();
        const marketplaceInstance = await Marketplace.new(nftInstance.address);

        await nftInstance.mint("https://example.com/token1.json");
        await nftInstance.approve(marketplaceInstance.address, , { from: accounts[] });
        
        await marketplaceInstance.listNFT(, web3.utils.toWei("1", "ether"), { from: accounts[] });

        const listing = await marketplaceInstance.listings();
        assert.equal(listing.tokenId.toString(), "");
        
        await marketplaceInstance.buyNFT(, { from: accounts[1], value: web3.utils.toWei("1", "ether") });

        const newOwner = await nftInstance.ownerOf();
        assert.equal(newOwner, accounts[1]);
    });
});

8. راه‌اندازی تست‌ها

برای اجرای تست‌ها از دستور زیر استفاده کنید:

truffle test

نتیجه‌ گیری

با پیروی از مراحل بالا، شما می‌توانید یک بازار NFT ساده را با استفاده از سالیدیتی و استاندارد ERC-721 ایجاد کنید. این کد به شما این امکان را می‌دهد که NFTها را ایجاد کرده و آن‌ها را در یک بازار خرید و فروش کنید. البته می‌توانید ویژگی‌های بیشتری به آن اضافه کنید تا کارایی و امنیت آن افزایش یابد.