فارسی

با جزئیات قراردادهای هوشمند ERC-721 برای NFTها، معماری، پیاده‌سازی، امنیت و کاربردهای واقعی آن‌ها آشنا شوید.

قراردادهای هوشمند NFT: نگاهی عمیق به پیاده‌سازی ERC-721

توکن‌های غیرقابل تعویض (NFTs) چشم‌انداز دارایی‌های دیجیتال را متحول کرده‌اند و امکان نمایش آیتم‌های منحصربه‌فرد را در بلاکچین فراهم ساخته‌اند. در قلب اکثر NFTها، استاندارد ERC-721 قرار دارد؛ مجموعه‌ای از قوانین که نحوه ایجاد، مدیریت و انتقال این توکن‌ها را کنترل می‌کند. این راهنمای جامع، کاوشی عمیق در قراردادهای هوشمند ERC-721 ارائه می‌دهد و معماری، جزئیات پیاده‌سازی، ملاحظات امنیتی و کاربردهای عملی آن‌ها را پوشش می‌دهد.

ERC-721 چیست؟

ERC-721 یک استاندارد برای نمایش توکن‌های غیرقابل تعویض در بلاکچین اتریوم است. برخلاف توکن‌های ERC-20 که قابل تعویض هستند (به این معنی که هر توکن با هر توکن دیگری یکسان است)، توکن‌های ERC-721 منحصربه‌فرد هستند. هر توکن یک شناسه (ID) متمایز دارد که آن را برای نمایش مالکیت دارایی‌های دیجیتال یا فیزیکی منحصربه‌فرد مناسب می‌سازد.

ویژگی‌های کلیدی توکن‌های ERC-721:

معماری قرارداد هوشمند ERC-721

یک قرارداد هوشمند ERC-721 برنامه‌ای به زبان Solidity است که استاندارد ERC-721 را پیاده‌سازی می‌کند. این قرارداد معمولاً شامل اجزای زیر است:

توابع اصلی:

افزونه فراداده (اختیاری):

افزونه شمارش (اختیاری):

پیاده‌سازی یک قرارداد هوشمند ERC-721 با OpenZeppelin

OpenZeppelin یک کتابخانه امن و حسابرسی‌شده از قراردادهای هوشمند را فراهم می‌کند که توسعه توکن‌های ERC-721 را ساده می‌سازد. استفاده از پیاده‌سازی ERC721 در OpenZeppelin خطر ایجاد آسیب‌پذیری در کد شما را کاهش می‌دهد. در اینجا مثالی از نحوه پیاده‌سازی یک قرارداد هوشمند ERC-721 با استفاده از OpenZeppelin آورده شده است:

پیش‌نیازها:

مراحل:

  1. راه‌اندازی یک پروژه Truffle یا Hardhat:
# ترافل
mkdir my-nft-project
cd my-nft-project
truffle init

# هارد‌هت
mkdir my-nft-project
cd my-nft-project
npx hardhat
  1. نصب قراردادهای OpenZeppelin:
npm install @openzeppelin/contracts
  1. ایجاد یک قرارداد هوشمند ERC-721: یک فایل Solidity جدید (مثلاً `MyNFT.sol`) در پوشه `contracts` خود ایجاد کنید.
// 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 _tokenIds;

    string private _baseURI;

    constructor(string memory name, string memory symbol, string memory baseURI) ERC721(name, symbol) {
        _baseURI = baseURI;
    }

    function mintNFT(address recipient) public returns (uint256) {
        _tokenIds.increment();

        uint256 newItemId = _tokenIds.current();
        _mint(recipient, newItemId);
        _setTokenURI(newItemId, string(abi.encodePacked(_baseURI, Strings.toString(newItemId), ".json")));

        return newItemId;
    }

    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        return string(abi.encodePacked(_tokenURI));
    }

    mapping (uint256 => string) private _tokenURIs;

    function setBaseURI(string memory baseURI) public {
        _baseURI = baseURI;
    }



    // توابع زیر به دلیل الزامات سالیدیتی بازنویسی (override) شده‌اند.

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721) {
        super._beforeTokenTransfer(from, to, tokenId);
    }
}

import "@openzeppelin/contracts/utils/Strings.sol";
  1. کامپایل قرارداد هوشمند: از Truffle یا Hardhat برای کامپایل قرارداد هوشمند خود استفاده کنید.
# ترافل
truffle compile

# هارد‌هت
npx hardhat compile
  1. ایجاد یک اسکریپت استقرار: یک فایل جاوااسکریپت جدید (مثلاً `deploy.js`) در پوشه `migrations` یا `scripts` خود ایجاد کنید.
// مثال مایگریشن ترافل
const MyNFT = artifacts.require("MyNFT");

module.exports = async function (deployer) {
  await deployer.deploy(MyNFT, "MyNFT", "MNFT", "ipfs://YOUR_IPFS_CID/");
};

// مثال اسکریپت استقرار هارد‌هت
async function main() {
  const MyNFT = await ethers.getContractFactory("MyNFT");
  const myNFT = await MyNFT.deploy("MyNFT", "MNFT", "ipfs://YOUR_IPFS_CID/");

  await myNFT.deployed();

  console.log("MyNFT در این آدرس مستقر شد:", myNFT.address);
}

main()
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error);
    process.exit(1);
  });
  1. استقرار قرارداد هوشمند: قرارداد هوشمند خود را در یک بلاکچین محلی (مانند Ganache) یا یک شبکه آزمایشی (مانند Ropsten, Rinkeby) مستقر کنید.
# ترافل
truffle migrate

# هارد‌هت
npx hardhat run scripts/deploy.js --network localhost

به یاد داشته باشید که `ipfs://YOUR_IPFS_CID/` را با CID (شناسه محتوا) واقعی IPFS خود جایگزین کنید. این URI پایه به مکانی اشاره می‌کند که فایل‌های JSON فراداده NFT شما در آنجا ذخیره خواهند شد.

ذخیره‌سازی فراداده NFT در IPFS

فراداده NFT معمولاً برای کاهش هزینه ذخیره‌سازی داده در بلاکچین، خارج از زنجیره (off-chain) ذخیره می‌شود. IPFS (سیستم فایل بین سیاره‌ای) یک شبکه ذخیره‌سازی غیرمتمرکز است که معمولاً برای ذخیره‌سازی فراداده NFT استفاده می‌شود. هر NFT یک `tokenURI` دارد که به یک فایل JSON در IPFS اشاره می‌کند که حاوی فراداده مربوط به NFT است، مانند نام، توضیحات، URL تصویر و سایر ویژگی‌ها.

مثال فراداده NFT (JSON):

{
  "name": "My Awesome NFT",
  "description": "This is a unique NFT.",
  "image": "ipfs://YOUR_IPFS_CID/image.png",
  "attributes": [
    {
      "trait_type": "Background",
      "value": "Blue"
    },
    {
      "trait_type": "Character",
      "value": "Robot"
    }
  ]
}

`ipfs://YOUR_IPFS_CID/image.png` را با CID واقعی IPFS تصویر خود جایگزین کنید.

مراحل آپلود فراداده در IPFS:

  1. انتخاب یک کلاینت IPFS: یک کلاینت IPFS مانند IPFS Desktop، Pinata یا NFT.Storage را انتخاب کنید.
  2. آپلود فراداده: فایل‌های JSON فراداده NFT و تصاویر خود را با استفاده از کلاینت انتخابی خود در IPFS آپلود کنید.
  3. دریافت CID IPFS: پس از آپلود فراداده، یک CID IPFS دریافت خواهید کرد. این یک شناسه منحصربه‌فرد برای داده‌های شما در IPFS است.
  4. به‌روزرسانی قرارداد هوشمند: تابع `tokenURI` را در قرارداد هوشمند خود به‌روزرسانی کنید تا به CID IPFS شما اشاره کند.

ملاحظات امنیتی برای قراردادهای هوشمند ERC-721

امنیت هنگام توسعه قراردادهای هوشمند ERC-721 از اهمیت بالایی برخوردار است. در اینجا برخی از ملاحظات امنیتی حیاتی آورده شده است:

کاربردهای واقعی NFT‌های ERC-721

NFT‌های ERC-721 در طیف گسترده‌ای از کاربردها استفاده می‌شوند، از جمله:

مثال‌های بین‌المللی:

مفاهیم پیشرفته ERC-721

ERC-721A

ERC-721A یک پیاده‌سازی کارآمدتر از نظر مصرف گس از استاندارد ERC-721 است که مینت کردن چندین NFT در یک تراکنش را بهینه می‌کند. این استاندارد با سرشکن کردن هزینه‌های ذخیره‌سازی بین چندین توکن، هزینه‌های گس را کاهش می‌دهد. این می‌تواند برای پروژه‌هایی که شامل مینت کردن تعداد زیادی NFT هستند، مفید باشد.

مینتینگ تنبل (Lazy Minting)

مینتینگ تنبل تکنیکی است که در آن NFTها تنها زمانی که خریداری می‌شوند، مینت می‌شوند. این می‌تواند در هزینه‌های گس برای پروژه‌هایی که تعداد زیادی NFT دارند اما انتظار فروش همه آن‌ها را ندارند، صرفه‌جویی کند. فراداده NFT تا زمان خرید NFT به صورت خارج از زنجیره ذخیره می‌شود و در آن زمان توکن مینت شده و فراداده به بلاکچین اضافه می‌شود.

توکن‌های روح‌بند (Soulbound Tokens)

توکن‌های روح‌بند NFTهایی هستند که به طور دائم به یک آدرس خاص گره خورده‌اند و قابل انتقال نیستند. این توکن‌ها می‌توانند برای نمایش گواهی‌نامه‌های غیرقابل انتقال، مانند مدارک تحصیلی، گواهینامه‌های حرفه‌ای یا عضویت در یک جامعه استفاده شوند. این کار با حذف یا محدود کردن تابع `transferFrom` امکان‌پذیر می‌شود.

آینده ERC-721 و NFTها

استاندارد ERC-721 با تحقیقات و توسعه مداوم با تمرکز بر بهبود کارایی، امنیت و عملکرد آن، به تکامل خود ادامه می‌دهد. تحولات آینده ممکن است شامل موارد زیر باشد:

نتیجه‌گیری

قراردادهای هوشمند ERC-721 ابزاری قدرتمند برای نمایش مالکیت دارایی‌های دیجیتال و فیزیکی منحصربه‌فرد در بلاکچین هستند. با درک معماری، جزئیات پیاده‌سازی، ملاحظات امنیتی و کاربردهای عملی ERC-721، توسعه‌دهندگان می‌توانند پروژه‌های NFT نوآورانه و تأثیرگذاری بسازند. همانطور که اکوسیستم NFT به رشد و تکامل خود ادامه می‌دهد، استاندارد ERC-721 نقشی حیاتی در شکل‌دهی آینده مالکیت دیجیتال ایفا خواهد کرد.

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

قراردادهای هوشمند NFT: نگاهی عمیق به پیاده‌سازی ERC-721 | MLOG