ERC-721 — это основной стандарт невзаимозаменяемых токенов (NFT) в экосистеме Ethereum и других EVM-совместимых сетях.
Токены ERC-721 представляют уникальные цифровые объекты: каждый токен имеет свой tokenId и отличается от других. Это удобно для:
- коллекционных NFT (арт, PFP-коллекции);
- игровых предметов и билетов;
- токенизованных прав, сертификатов и доступа.
Если ERC-20 описывает «одинаковые монеты», то ERC-721 — «уникальные карточки».
Ключевые свойства 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;
- кастомные решения, не полностью следующие стандарту (они могут хуже поддерживаться кошельками и маркетплейсами).
