ГЛАВНАЯ / ИНСТРУКЦИИ / ERC-721 SAFE TRANSFER: ЗАЧЕМ ПОЛУЧАТЕЛЬ NFT ПОДТВЕРЖДАЕТ ПЕРЕВОД
ERC-721 safe transfer: зачем получатель NFT подтверждает перевод
В ERC-721 transferFrom меняет владельца, но не проверяет, умеет ли контракт-получатель обрабатывать NFT. safeTransferFrom добавляет acceptance check: если адрес назначения является контрактом, токен вызывает onERC721Received и ожидает специальное bytes4-значение. Revert, отсутствие нужного callback или неверный ответ должны привести к откату транзакции. Эта проверка помогает избежать случайно застрявшего NFT, но не удостоверяет, что контракт получателя безопасен или позволит вернуть актив.
safeTransferFrom проверяет контракт-получатель
ERC-721 включает transferFrom и две формы safeTransferFrom, одна из которых передаёт дополнительный bytes data. transferFrom выполняет перевод без callback-подтверждения получателя. safeTransferFrom после изменения владельца проверяет, является ли получатель контрактом, и если да, вызывает его onERC721Received.
Перед выбором функции определите тип адреса назначения и его поведение. Адрес, который выглядит как обычная hex-строка, может быть контрактом. В сети назначения проверьте code по адресу; для proxy или account abstraction учитывайте, какой код реально будет выполнен при приёме NFT.
- transferFrom отделён от safeTransferFrom
- код адреса-получателя проверен
- сеть и tokenId подтверждены
Получатель должен вернуть точное magic value
Callback получает operator, предыдущего владельца from, tokenId и произвольный bytes data, переданный отправителем. Контракт возвращает bytes4 selector функции onERC721Received. Именно это значение сообщает токену, что получатель распознал передачу. Любое другое значение или revert callback должен откатить всю транзакцию вместе с изменением владения.
Callback срабатывает только при переводе на контракт; для адреса без кода проверка обычно не нужна. Не путайте этот интерфейс с supportsInterface: получатель может показывать interface ID 0x150b7a02, но фактический критерий safe transfer – корректное выполнение callback и magic value. Конкретный NFT-контракт может вводить дополнительные ограничения.
- callback получает ожидаемые аргументы
- magic value сверено
- revert и неверный ответ обработаны
| Проверка | Что означает | Результат при отказе |
|---|---|---|
| Код у получателя | Выполняется callback-путь | Без кода callback не вызывается |
| onERC721Received | Контракт обрабатывает NFT | Вызов может revert |
| Magic value | Приём явно подтверждён | Неверный ответ откатывает перевод |
| ownerOf(tokenId) | Текущее состояние | Сверить после успешного receipt |
Callback снижает риск отправить NFT неподготовленному контракту
Контракт может вернуть ожидаемое значение только если предусмотрел сценарий приёма, записал NFT или намеренно согласился его принять. Без callback перевод через safeTransferFrom к несовместимому контракту откатится вместо успешного изменения owner, который получатель не умеет обрабатывать.
Это не страховка от вредоносной логики. Получатель может подтвердить NFT и затем заблокировать вывод, удерживать его по своим правилам, обращаться к внешним контрактам или быть обновляемым. Проверьте назначение адреса, исходный код и административные возможности, прежде чем отправлять актив.
Внешний callback требует проверки состояния до передачи управления
onERC721Received – внешний вызов к коду получателя. При разработке контракта до вызова проверьте полномочия отправителя, согласуйте owner и внутренний учёт, а после callback подтвердите предусловия следующих действий. Receiver может выполнять собственный код и инициировать другие вызовы в рамках той же транзакции.
Если вы просто переводите NFT через кошелёк, изучите адрес назначения и предупреждения транзакции. Если вы пишете контракт или маркетплейс, включите callback в модель угроз и тестируйте успешный magic value, revert, неверный ответ, повторный вызов и отправку в тот же контракт.
- внешний вызов включён в модель угроз
- повторный вход протестирован
- ownerOf проверен после receipt
Частые вопросы
Почему transferFrom считается unsafe?
Он не вызывает acceptance hook на контрактном адресе назначения; контракт может не уметь обрабатывать полученный NFT.
Что возвращает onERC721Received?
Специальный bytes4 magic value из сигнатуры этой функции.
safeTransferFrom проверяет владельца после операции?
Критерий стандарта – выполнение перевода и корректное подтверждение contract recipient. Для диагностики отдельно читайте ownerOf и receipt.
Можно ли через safeTransferFrom отправить NFT вредоносному контракту?
Да. Callback означает, что контракт согласился на приём, но не подтверждает безопасность его дальнейшей логики.
Что произойдёт при revert callback?
Вся транзакция safe transfer должна откатиться, включая изменение состояния перевода.
Чек-лист: erc-721 safe transfer: зачем получатель nft подтверждает перевод
- сеть, адрес коллекции и tokenId проверены;
- адрес получателя взят из доверенного контекста;
- тип получателя определён в нужной сети;
- для контракта проверено выполнение callback;
- возвращаемый selector точно соответствует стандарту;
- параметр data понятен получателю;
- после транзакции сверены receipt и ownerOf;
- callback включён в reentrancy-анализ интеграции.
Материал подготовлен редакцией сайта и проверен 12 ноября 2026 года. Условия бирж, кошельков и блокчейн-сетей могут меняться. Перед операцией сверяйте данные в интерфейсе выбранного сервиса.