Изучение смарт-контрактов ERC721 NFT с OpenZeppelin Solidity

В мире блокчейна и криптовалют значительную популярность приобрели невзаимозаменяемые токены (NFT). ERC721 — это стандарт реализации NFT в блокчейне Ethereum, позволяющий создавать уникальные цифровые активы и управлять ими. OpenZeppelin — широко используемая библиотека для создания безопасных и проверяемых смарт-контрактов. В этой статье мы углубимся в разработку смарт-контрактов ERC721 NFT с использованием OpenZeppelin Solidity, изучим различные методы и предоставим примеры кода.

  1. Настройка проекта:
    Для начала убедитесь, что у вас есть среда разработки с Solidity и установлены необходимые зависимости. Создайте новый проект Solidity и импортируйте контракты OpenZeppelin ERC721:
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
contract MyNFT is ERC721 {
    // ...
}
  1. Метаданные токена.
    Токены ERC721 часто включают метаданные, такие как имя, символ и URI токена. OpenZeppelin предоставляет контракт ERC721Metadataдля реализации метаданных токена:
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Metadata.sol";
contract MyNFT is ERC721, ERC721Metadata {
    constructor(string memory _name, string memory _symbol) ERC721Metadata(_name, _symbol) {
        // ...
    }
}
  1. Минтинг токенов:
    Чтобы создавать новые NFT, нам необходимо реализовать функцию чеканки. Для управления идентификаторами токенов можно использовать библиотеку CountersOpenZeppelin:
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
function mintNFT(address recipient, string memory tokenURI) public returns (uint256) {
    _tokenIds.increment();
    uint256 newTokenId = _tokenIds.current();
    _mint(recipient, newTokenId);
    _setTokenURI(newTokenId, tokenURI);
    return newTokenId;
}
  1. Владение токеном:
    Контракт ERC721OpenZeppelin предоставляет функции для передачи и запроса владения токеном:
function transfer(address to, uint256 tokenId) public {
    require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
    _transfer(_msgSender(), to, tokenId);
}
function ownerOf(uint256 tokenId) public view returns (address) {
    return _ownerOf(tokenId);
}
  1. Метаданные и URI.
    Токены ERC721 часто включают метаданные, хранящиеся в IPFS или аналогичной децентрализованной системе хранения. Контракт ERC721MetadataOpenZeppelin предоставляет функции для установки и получения URI токена:
function setTokenURI(uint256 tokenId, string memory tokenURI) public {
    require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Metadata: caller is not owner nor approved");
    _setTokenURI(tokenId, tokenURI);
}
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    return _tokenURI(tokenId);
}

Внедрение смарт-контрактов ERC721 NFT с использованием OpenZeppelin Solidity обеспечивает безопасную и проверенную основу для создания уникальных цифровых активов и управления ими. В этой статье мы рассмотрели различные методы, включая настройку проекта, управление метаданными токенов, создание токенов, управление владением и работу с метаданными токенов и URI. Используя библиотеку OpenZeppelin, разработчики могут создавать надежные приложения NFT на блокчейне Ethereum.