Українська

Дослідіть тонкощі смарт-контрактів ERC-721 для NFT. Дізнайтеся про їхню архітектуру, реалізацію, аспекти безпеки та реальні приклади застосування.

Смарт-контракти NFT: Глибоке занурення у реалізацію ERC-721

Невзаємозамінні токени (NFT) здійснили революцію у світі цифрових активів, уможлививши представлення унікальних об'єктів на блокчейні. В основі більшості NFT лежить стандарт ERC-721 — набір правил, що регулюють створення, управління та передачу цих токенів. Цей вичерпний посібник пропонує поглиблене дослідження смарт-контрактів ERC-721, охоплюючи їхню архітектуру, деталі реалізації, аспекти безпеки та практичне застосування.

Що таке ERC-721?

ERC-721 — це стандарт для представлення невзаємозамінних токенів на блокчейні Ethereum. На відміну від токенів 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:
# Truffle
mkdir my-nft-project
cd my-nft-project
truffle init

# Hardhat
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;
    }



    // Наступні функції є перевизначеннями, яких вимагає Solidity.

    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
truffle compile

# Hardhat
npx hardhat compile
  1. Створіть скрипт розгортання: Створіть новий файл JavaScript (наприклад, `deploy.js`) у вашому каталозі `migrations` або `scripts`.
// Приклад міграції для Truffle
const MyNFT = artifacts.require("MyNFT");

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

// Приклад скрипту розгортання для Hardhat
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
truffle migrate

# Hardhat
npx hardhat run scripts/deploy.js --network localhost

Не забудьте замінити `ipfs://YOUR_IPFS_CID/` на ваш фактичний IPFS CID (Content Identifier). Цей базовий URI вказує на місце, де будуть зберігатися файли метаданих JSON вашого NFT.

Зберігання метаданих NFT на IPFS

Метадані NFT зазвичай зберігаються поза блокчейном, щоб зменшити вартість зберігання даних на ньому. IPFS (InterPlanetary File System) — це децентралізована мережа зберігання, яка часто використовується для зберігання метаданих NFT. Кожен NFT має `tokenURI`, який вказує на JSON-файл на IPFS, що містить метадані про NFT, такі як його назва, опис, URL-адреса зображення та інші атрибути.

Приклад метаданих NFT (JSON):

{
  "name": "Мій крутий NFT",
  "description": "Це унікальний NFT.",
  "image": "ipfs://YOUR_IPFS_CID/image.png",
  "attributes": [
    {
      "trait_type": "Фон",
      "value": "Синій"
    },
    {
      "trait_type": "Персонаж",
      "value": "Робот"
    }
  ]
}

Замініть `ipfs://YOUR_IPFS_CID/image.png` на фактичний IPFS CID вашого зображення.

Кроки для завантаження метаданих на IPFS:

  1. Оберіть клієнт IPFS: Виберіть клієнт IPFS, такий як IPFS Desktop, Pinata або NFT.Storage.
  2. Завантажте ваші метадані: Завантажте ваші JSON-файли метаданих NFT та зображення на IPFS за допомогою обраного клієнта.
  3. Отримайте IPFS CID: Після завантаження метаданих ви отримаєте IPFS CID. Це унікальний ідентифікатор ваших даних на IPFS.
  4. Оновіть смарт-контракт: Оновіть функцію `tokenURI` у вашому смарт-контракті, щоб вона вказувала на ваш IPFS CID.

Аспекти безпеки для смарт-контрактів 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 (Прив'язані до душі токени)

Soulbound токени — це NFT, які назавжди прив'язані до конкретної адреси і не можуть бути передані. Ці токени можуть використовуватися для представлення непередаваних облікових даних, таких як освітні дипломи, професійні сертифікати або членство в спільноті. Це досягається шляхом видалення або обмеження функції `transferFrom`.

Майбутнє ERC-721 та NFT

Стандарт ERC-721 продовжує розвиватися, і ведуться постійні дослідження та розробки, спрямовані на покращення його ефективності, безпеки та функціональності. Майбутні розробки можуть включати:

Висновок

Смарт-контракти ERC-721 є потужним інструментом для представлення права власності на унікальні цифрові та фізичні активи на блокчейні. Розуміючи архітектуру, деталі реалізації, аспекти безпеки та практичне застосування ERC-721, розробники можуть створювати інноваційні та впливові NFT-проєкти. Оскільки екосистема NFT продовжує рости та розвиватися, стандарт ERC-721 відіграватиме вирішальну роль у формуванні майбутнього цифрової власності.

Цей посібник надає міцну основу для розуміння та реалізації смарт-контрактів ERC-721. Не забувайте завжди надавати пріоритет безпеці та дотримуватися найкращих практик при розробці та розгортанні власних NFT-проєктів. Хай щастить!