ERC-721 — стандарт, на котором держатся NFT
ERC-721: какие функции обязан иметь NFT-контракт, зачем нужен tokenURI и почему setApprovalForAll отдаёт дренажеру всю коллекцию.
Обновлено: 2026-11-01
ERC-721: какие функции обязан иметь NFT-контракт, зачем нужен tokenURI и почему setApprovalForAll отдаёт дренажеру всю коллекцию.
Обновлено: 2026-11-01
В феврале я покупала NFT из коллекции на 10 000 картинок. На последнем шаге кошелёк попросил подписать setApprovalForAll — разрешение распоряжаться всеми токенами коллекции. Я закрыла окно и полезла читать контракт. Внутри оказался ERC-721: набор функций, по которому маркетплейс понимает, как показывать и продавать токен.
Стандарт зафиксировали в EIP-721 в январе 2018 года. До него каждый проект писал NFT-контракт по-своему, и площадкам приходилось разбираться с каждым отдельно. Минимум такой: ownerOf(tokenId) — кто владеет токеном, balanceOf(owner) — сколько токенов у адреса, transferFrom — перевод, approve и setApprovalForAll — права для маркетплейса, tokenURI — ссылка на метаданные. Плюс события Transfer и Approval: по ним кошельки собирают историю.
Один контракт — вся коллекция, а не один токен. У каждого экземпляра свой номер tokenId: от 1 до 10 000. Владелец хранится в маппинге внутри контракта, поэтому перевод NFT — это новая строка в смарт-контракте, а не перемещение файла с картинкой.
Функция возвращает ссылку на JSON с полями name, description, image и attributes. Площадка читает файл и рисует карточку. Если ссылка ведёт на сервер проекта, картинка живёт ровно столько, сколько живёт домен. Если на IPFS — пока кто-то платит за пиннинг. Я видела коллекции, где через год после минта вместо изображения открывался пустой квадрат: домен не продлили.
approve выдаёт права на один токен по его id. setApprovalForAll — сразу на все токены контракта, и именно его просит маркетплейс при первом выставлении лота. Ошибка дорогая: дренажер, получивший такое разрешение, выводит всю коллекцию одним вызовом, а газ платит владелец. Проверить и отозвать права можно на revoke.cash или в разделе Approvals у Etherscan. С тех пор я открываю его раз в месяц.
В 721 каждый токен уникален и имеет собственный tokenURI. В 1155 один контракт держит много типов: у каждого id своё количество копий, метаданные общие на тип. Тысяча одинаковых мечей для игры — это 1155, уникальные картинки — 721. Для взаимозаменяемых монет есть ERC-20: там у токена нет номера вообще.
Минт одного токена — 50 000–100 000 газа. При 20 gwei: 100 000 × 20 = 2 000 000 gwei, то есть 0,002 ETH и около 6 долларов при курсе 3 000. Деплой контракта — порядка 2 000 000 газа, 0,04 ETH или примерно 120 долларов. Роялти по EIP-2981 обычно 5%: с продажи за 1 ETH автору уходит 0,05 ETH, но площадка вправе их не платить — Blur сделал роялти необязательными в 2023 году.
Остались вопросы? Спросите ИИ-ассистента — объяснит другими словами.
Спросить