Русский

Изучите тонкости смарт-контрактов 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 deployed to:", 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/` на ваш фактический CID (Content Identifier) из IPFS. Этот базовый URI указывает на место, где будут храниться ваши JSON-файлы с метаданными NFT.

Хранение метаданных NFT в IPFS

Метаданные NFT обычно хранятся вне блокчейна, чтобы снизить стоимость хранения данных в сети. IPFS (InterPlanetary File System) — это децентрализованная сеть хранения, которая обычно используется для хранения метаданных 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` на фактический 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)

Непередаваемые токены — это NFT, которые постоянно привязаны к определенному адресу и не могут быть переданы. Эти токены могут использоваться для представления непередаваемых учетных данных, таких как дипломы об образовании, профессиональные сертификаты или членство в сообществе. Это достигается путем удаления или ограничения функции `transferFrom`.

Будущее ERC-721 и NFT

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

Заключение

Смарт-контракты ERC-721 являются мощным инструментом для представления права собственности на уникальные цифровые и физические активы в блокчейне. Понимая архитектуру, детали реализации, вопросы безопасности и практическое применение ERC-721, разработчики могут создавать инновационные и значимые NFT-проекты. По мере того как экосистема NFT продолжает расти и развиваться, стандарт ERC-721 будет играть решающую роль в формировании будущего цифрового владения.

Это руководство закладывает прочную основу для понимания и реализации смарт-контрактов ERC-721. Всегда помните о безопасности и следуйте лучшим практикам при разработке и развертывании собственных NFT-проектов. Удачи!