ERC-721 — стандарт NFT-токенов в Ethereum

ERC-721 — это основной стандарт невзаимозаменяемых токенов (NFT) в экосистеме Ethereum и других EVM-совместимых сетях.

Токены ERC-721 представляют уникальные цифровые объекты: каждый токен имеет свой tokenId и отличается от других. Это удобно для:

  • коллекционных NFT (арт, PFP-коллекции);
  • игровых предметов и билетов;
  • токенизованных прав, сертификатов и доступа.

Если ERC-20 описывает «одинаковые монеты», то ERC-721 — «уникальные карточки».

ERC-721 — базовый стандарт NFT в Ethereum

Ключевые свойства ERC-721

  • Невзаимозаменяемость.

Каждый токен имеет уникальный идентификатор tokenId. 1 NFT ≠ другой NFT того же контракта.

  • Единый интерфейс.

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

  • Гибкая метадата.

Для каждого tokenId контракт может возвращать отдельные метаданные: картинку, название, свойства.

  • Поддержка безопасных трансферов.

Метод safeTransferFrom защищает от отправки NFT на контракты, которые не умеют их принимать.

Обязательные функции ERC-721

Классический набор методов, который должен реализовать любой контракт ERC-721:

  • balanceOf(address owner)

Возвращает, сколько NFT данного контракта принадлежит адресу owner.

  • ownerOf(uint256 tokenId)

Возвращает адрес владельца конкретного токена tokenId.

  • transferFrom(address from, address to, uint256 tokenId)

Передаёт токен от from к to.

Требует, чтобы вызывающий был:

  • владельцем токена;
  • или одобренным оператором (через approve / setApprovalForAll).
  • safeTransferFrom(address from, address to, uint256 tokenId)

Более безопасная версия transferFrom:

  • если to — контракт, он должен реализовывать интерфейс приёма NFT;
  • иначе операция откатится (revert) и токен не «застрянет» в неподдерживающем контракте.
  • approve(address to, uint256 tokenId)

Разрешает адресу to управлять конкретным токеном tokenId (одиночная делегированная передача).

  • getApproved(uint256 tokenId)

Показывает, какой адрес в данный момент одобрен на управление этим tokenId.

  • setApprovalForAll(address operator, bool approved)

Даёт/отзывает массовое разрешение оператору управлять всеми токенами владельца.

  • isApprovedForAll(address owner, address operator)

Проверяет, является ли operator глобальным оператором для owner.

Также стандартом предусмотрены функции для проверки поддержки интерфейса (через смарт-контракт и EIP-165), но в базовом UX чаще всего используются методы выше.

События ERC-721

Для отслеживания действий контракт должен эмитить:

  • Transfer(address indexed from, address indexed to, uint256 indexed tokenId)

Логируется при:

  • минте (обычно from = 0x0);
  • трансфере;
  • бёрне (обычно to = 0x0).
  • Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)

Фиксирует выдачу или изменение разрешения на один конкретный токен.

  • ApprovalForAll(address indexed owner, address indexed operator, bool approved)

Логирует установку/отзыв глобального оператора для всех токенов owner.

По этим событиям:

  • блок-обозреватели строят историю владения NFT;
  • маркетплейсы отслеживают выставление и снятие токенов с продажи;
  • аналитические сервисы считают статистику коллекций.

Метаданные и tokenURI

Для отображения NFT в интерфейсах используются метаданные:

  • контракт реализует функцию tokenURI(uint256 tokenId);
  • она возвращает URL (часто ipfs://... или https://...), по которому лежит JSON с полями:
    • name — название токена;
    • description — описание;
    • image — ссылка на картинку;
    • attributes или traits — свойства (редкость, характеристики и т.п.).

Метаданные могут быть:

  • фиксированными — заданы при минте и не меняются;
  • динамическими — контракт меняет tokenURI по условиям игры, стейкинга, времени и др.;
  • on-chain — часть данных вообще не хранится во внешнем JSON, а собирается контрактом на лету (например, SVG-картинки из кода).

С точки зрения стандарта важен только интерфейс tokenURI; структура JSON де-факто стандартизирована рынком (NFT-маркетплейсы ожидают определённые поля).

Чем ERC-721 отличается от ERC-20 и ERC-1155

Стандарт Тип токена Основной сценарий Особенности
ERC-20 Взаимозаменяемый Монеты, стейблкоины, governance-токены Все единицы одинаковы, простой учёт балансов.
ERC-721 Невзаимозаменяемый NFT, уникальные объекты Каждый tokenId уникален, индивидуальная метадата.
ERC-1155 Гибрид (multi-token) Игровые предметы, коллекции, комбинированные активы Один контракт управляет множеством типов токенов, оптимизация по gas.

Основные отличия ERC-721 от ERC-20:

  • вместо amount в фокусе конкретный токен с tokenId;
  • нет понятия «десятичные знаки» — NFT не делятся на дроби;
  • логика отображения и UX завязаны на картинку и свойства, а не на баланс.

Типичные ошибки и риски при работе с ERC-721

  • Отправка NFT на неподдерживающий контракт.

Если использовать transferFrom и отправить токен на контракт, который не реализует интерфейс приёма NFT, токен может там «застрять» навсегда.

Поэтому в большинстве интерфейсов предпочитают safeTransferFrom.

  • Ошибки в реализации tokenURI.

Неправильные URL, сломанные JSON-метаданные или нестабильная инфраструктура (серверы, IPFS-шлюзы) портят отображение коллекции.

  • Чрезмерные полномочия операторов.

Разрешения setApprovalForAll дают маркетплейсам и dApp право управлять всеми NFT пользователя этой коллекции. При взломе или ошибке в контракте-операторе можно потерять все связанные токены.

  • Централизация хранения.

Если метаданные и картинка лежат на централизованном сервере, владелец инфраструктуры может менять вид и смысл NFT, даже если токен сам по себе on-chain.

Базовые практики безопасности:

  • использовать проверенные реализации (например, библиотеки стандартных контрактов);
  • аккуратно работать с setApprovalForAll;
  • по возможности хранить важные коллекции с метаданными в децентрализованных хранилищах (IPFS, Arweave и т.д.).

Роль ERC-721 в Web3-экосистеме

ERC-721 стал фундаментом:

  • NFT-рынка: PFP-коллекции, цифровое искусство, музыкальные и медийные NFT;
  • игровых проектов (GameFi): уникальные персонажи, предметы, земельные участки;
  • токенизации прав и доступа: билеты, абонементы, членство в клубах;
  • онлайн-идентичности: доменные имена (ENS и др.), профили.

Благодаря унификации интерфейса:

  • маркетплейсы могут поддерживать любые коллекции без кастомной интеграции;
  • кошельки и dApp одинаково отображают NFT из разных проектов;
  • разработчики сосредотачиваются на логике и дизайне, а не на «изобретении велосипеда» с нуля.

Частые вопросы (FAQ) про ERC-721

Может ли один адрес владеть несколькими ERC-721-токенами? Да. Адрес может владеть любым количеством NFT одного контракта (разные tokenId) и бесконечным числом NFT из разных контрактов.

Можно ли разделить один ERC-721-токен на части? Базовый стандарт этого не предусматривает. Разделение владения обычно реализуют:

  • через отдельные токены (например, ERC-20, представляющие доли);
  • через DAO и смарт-контракты владения, но сам ERC-721 остаётся неделимым.

Чем «коллекция NFT» отличается от одного токена ERC-721? Чаще всего коллекция — это один контракт ERC-721, внутри которого множество tokenId. Все они разделяют общий код и правила, но имеют разные метаданные.

Все ли NFT — это ERC-721? Большинство классических NFT на Ethereum — да. Но есть:

  • мульти-токены по ERC-1155;
  • кастомные решения, не полностью следующие стандарту (они могут хуже поддерживаться кошельками и маркетплейсами).

См. также

Task Runner