ERC-721 или ERC-1155: какой стандарт NFT выбрать
ERC-721 подходит, когда каждый токен уникален и существует в одном экземпляре: произведение, сертификат, место в клубе. ERC-1155 — когда нужно много видов токенов в одном контракте и у каждого вида может быть много одинаковых копий: игровые предметы, билеты, серии коллекционных карточек. ERC-1155 экономичнее при массовых операциях благодаря пакетным переводам, а ERC-721 проще и лучше поддерживается как «одна вещь — один токен». Выбор зависит от модели продукта, а не от моды.
Чем стандарты отличаются по сути
ERC-721 описывает невзаимозаменяемый токен: у каждого tokenId ровно один владелец. ERC-1155 — мультитокен: у каждого id есть баланс у каждого владельца, как у обычного токена. Если баланс у id может быть только 0 или 1 и всего выпущен один экземпляр, ERC-1155 ведёт себя как NFT. Если копий много, это «серийный» или полувзаимозаменяемый токен.
| Критерий | ERC-721 | ERC-1155 |
|---|---|---|
| Модель | Один tokenId — один владелец | У каждого id балансы у многих владельцев |
| Виды токенов в контракте | Обычно одна коллекция на контракт | Много видов в одном контракте |
| Пакетный перевод | Нет в стандарте, по одному | safeBatchTransferFrom в стандарте |
| Владелец конкретного токена | ownerOf(tokenId) в стандарте | Нет функции «кто владеет», только балансы |
| Метаданные | tokenURI(tokenId) для каждого токена | uri(id), допускается шаблон с подстановкой {id} |
| Одобрение | На конкретный токен или на все | Только на все токены оператору |
| Колбэк получателю | onERC721Received при safe-переводе | onERC1155Received и батч-версия при каждом переводе |
| Где уместен | Уникальные объекты, искусство, сертификаты | Игры, билеты, серии, наборы предметов |
Газ: где разница реальная
При выпуске одного уникального токена стандарты сопоставимы. Разница проявляется при массовых операциях. В ERC-1155 один вызов переводит или выпускает несколько видов сразу, и общая стоимость ниже, чем у множества отдельных транзакций. Для ERC-721 существуют оптимизированные реализации массового минта, например ERC721A, но они меняют распределение затрат: минт дешевле, а первые переводы могут быть дороже. Перед выбором измеряйте газ на своих сценариях, например командой forge test --gas-report в Foundry. О приёмах экономии — в статье о газе в Ethereum.
Метаданные и где хранить картинки
Сам контракт хранит только ссылку на метаданные: JSON с названием, описанием, атрибутами и ссылкой на изображение. Где лежат эти файлы, определяет, насколько NFT долговечен.
| Хранилище | Плюсы | Риски |
|---|---|---|
| Свой сервер по https | Просто, можно менять | Сервер выключат — картинки пропадут; владелец может подменить содержимое |
| IPFS с закреплением (pinning) | Адрес зависит от содержимого, подмена заметна | Нужно оплачивать закрепление, иначе файлы могут исчезнуть из сети |
| Arweave | Разовая оплата постоянного хранения | Своя экосистема и инструменты |
| Прямо в контракте (on-chain SVG) | Ни от кого не зависит | Дорого, подходит только для простой графики |
Роялти: ERC-2981
ERC-2981 задаёт функцию royaltyInfo(tokenId, salePrice), которая сообщает маркетплейсу, кому и сколько платить автору при перепродаже. Важно понимать: стандарт только сообщает информацию. Заставить маркетплейс заплатить он не может, решение остаётся за площадкой. OpenZeppelin содержит готовую реализацию ERC2981, подходящую к обоим стандартам.
Безопасность: на что обратить внимание
- Колбэки получателя.
safeTransferFromи_safeMintвызывают код получателя, если он контракт. Это точка повторного входа: изменяйте состояние до минта и используйте блокировку. Подробно — в статье о reentrancy. - Лимиты минта. Максимальная эмиссия, лимит на адрес и на транзакцию проверяются в контракте, а не только в интерфейсе.
- Вайтлист по подписи или Merkle-дереву. Подпись должна содержать адрес, лимит и срок, иначе её используют повторно. Как защитить подписи — в статье об EIP-712 и повторе подписи.
- Вывод выручки. Средства от продажи выводит роль у мультиподписи, а не любой адрес, и лучше по схеме «забери сам».
- Одобрения.
setApprovalForAllдаёт оператору доступ ко всем токенам владельца. В OpenZeppelin 5.6 запрещено назначать оператором нулевой адрес. - Случайность при раскрытии. Хеш блока и время не подходят для распределения редких предметов, нужна верифицируемая случайность.
Изменения OpenZeppelin, о которых стоит знать
В OpenZeppelin 5.6 изменилось поведение ERC-1155: пакетный перевод с одним элементом теперь вызывает у получателя onERC1155BatchReceived, а не onERC1155Received. Если ваш контракт-получатель реализует только одну из функций, проверьте совместимость. Для ERC-721 в пятой ветке все движения токенов, включая минт и сжигание, проходят через внутреннюю функцию _update, и дополнительные проверки встраивают туда.
Расширения, которые часто просят
| Расширение | Что даёт | Цена |
|---|---|---|
ERC721Enumerable | Перебор всех токенов и токенов владельца прямо в контракте | Заметно дороже минт и переводы; список часто проще строить по событиям индексатором |
ERC721URIStorage | Отдельная ссылка на метаданные для каждого токена | Лишняя запись в storage на каждый токен |
ERC1155Supply | Учёт общего выпуска по каждому id | Дополнительные записи при минте и сжигании |
ERC721Burnable, ERC1155Burnable | Сжигание владельцем | Нужно решить, может ли сжигать оператор |
| Непередаваемые токены (soulbound) | Сертификаты и бейджи, которые нельзя продать | Запрет переводов в _update, кроме минта и сжигания |
Мы советуем подключать расширения только под конкретный сценарий. Например, перебор токенов владельца для интерфейса почти всегда дешевле получить из событий Transfer через индексатор, чем платить за ERC721Enumerable при каждом переводе. Каждое расширение — это код, газ и место для ошибки.
Как выбрать: короткий алгоритм
- Каждый токен уникален и существует в одном экземпляре? Скорее ERC-721.
- Нужно много одинаковых копий одного предмета или билета? ERC-1155.
- Много видов предметов в одном продукте, например в игре? ERC-1155.
- Важна совместимость с инструментами, которые ожидают
ownerOf? ERC-721. - Пользователи часто переводят наборы предметов разом? ERC-1155.
- Сомневаетесь — опишите три главных сценария и измерьте газ на обоих стандартах.
Пример под задачу
| Продукт | Стандарт | Почему |
|---|---|---|
| Коллекция из 5 000 уникальных изображений | ERC-721 | Каждый токен уникален, важен ownerOf |
| Билеты на мероприятие с категориями мест | ERC-1155 | Категория — id, места — количество |
| Игровые ресурсы и предметы | ERC-1155 | Много видов, пакетные переводы |
| Сертификат об окончании курса | ERC-721 | Один документ — один владелец |
| Членство в клубе с уровнями | Оба варианта | Зависит от того, уникально ли каждое членство |
Для игровых и мини-приложений NFT часто дополняют интерфейсом в Telegram, такие проекты мы делаем в направлении мини-приложений. Готовое решение для коллекций с минтом, вайтлистом и выводом выручки описано на странице NFT-коллекции. Если нужна своя логика, начните со страницы разработки смарт-контрактов.
Вопросы и ответы
Чем ERC-721 отличается от ERC-1155?
В ERC-721 каждый токен уникален и у него один владелец. В ERC-1155 в одном контракте много видов токенов, и у каждого вида может быть много одинаковых копий у разных владельцев.
Какой стандарт дешевле по газу?
Для одного уникального токена разница небольшая. При массовом выпуске и переводе наборов ERC-1155 обычно экономичнее за счёт пакетных операций, но измерять стоит на своих сценариях.
Обязаны ли маркетплейсы платить роялти по ERC-2981?
Нет. Стандарт только сообщает, кому и сколько платить. Решение о выплате принимает площадка.
Можно ли сделать NFT, который нельзя продать?
Да. Для сертификатов и бейджей переводы запрещают в коде контракта, оставляя только выпуск и сжигание. Такие токены называют непередаваемыми или soulbound.
Где хранить картинки NFT?
Надёжнее всего в хранилище с адресацией по содержимому, например в IPFS с оплаченным закреплением или в Arweave. Свой сервер проще, но картинки пропадут, если его выключить.