Серия НФТ

Как сжечь NFT

С контрактом ERC721 Solidity

Что такое NFT

Незаменяемый токен (NFT) — это уникальный идентифицируемый цифровой актив, хранящийся в блокчейне. В отличие от взаимозаменяемых криптовалют, NFT уникален.

Право собственности на NFT регистрируется в блокчейне и может быть передано владельцем, что позволяет продавать и обменивать NFT.

NFT обычно относятся к цифровым файлам (изображениям, видео и т. д.), а рыночная стоимость NFT привязана к цифровому файлу, к которому он относится.

Итак, если NFT являются ценными цифровыми активами, почему я должен их сжигать?

Зачем сжигать NFT

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

Но чаще компании:

  • предложить владельцам возможность сжечь свои NFT в обмен на физические продукты или «обновленную» версию NFT
  • побуждать людей быстро покупать NFT в падении, объявляя, что они уничтожат все непроданные NFT после определенной даты
  • устранить непроданные или проблемные NFT

Как записать

Странно то, что в EIP-721 указано:

«…уничтожение ЯТЦ («сжигание») не входит в спецификацию. В вашем контракте это может быть реализовано другими способами».

Хорошо, давайте обсудим функцию записи!

Нам нужно начать с реализации ERC-721. OpenZeppelin ERC721 — одна из наиболее широко используемых реализаций.

Это фрагмент кода контракта:

Как мы видим, эта реализация уже предоставляет внутреннюю функцию _burn. Функция принимает идентификатор токена в качестве входных данных и делает следующее:

  • получает владельца NFT
  • вызывает функцию ловушки _beforeTokenTransfer (что такое ловушка, будет яснее позже)
  • очищает все одобрения для токена
  • уменьшает баланс владельца
  • генерирует событие Transfer
  • вызывает функцию ловушки _afterTokenTransfer

Итак, дело сделано?

Подожди, чего-то не хватает!

Функция не проверяет, авторизован ли отправитель для работы с токеном. Сделаем сами!

Для этой цели мы можем использовать функцию ловушки _beforeTokenTransfer.

Как сказано в Документации OpenZeppelin:

«Хуки — это просто функции, которые вызываются до или после того, как происходит какое-то действие. Они обеспечивают централизованную точку для подключения и расширения исходного поведения».

Хук _beforeTokenTransfer — это внутренняя виртуальная функция, предназначенная для вызова перед любой передачей токена, включая чеканку и сжигание, со следующими условиями:

  • когда оба «от» и «до» не равны нулю, мы находимся в случае передачи токена
  • когда «от» — нулевой адрес, мы в деле о минтинге
  • когда «to» равно нулю, tokenId будет сожжено
  • "от" и "до" никогда не равны нулю

Следуя Правилам хуков OpenZeppelin, следует BurnableNFT реализация.

В строке 33 проверяем, что находимся в сценарии записи или передачи («откуда» — не нулевой адрес).

Затем единственным адресом, которому разрешено передавать или сжигать NFT, должен быть его владелец, поэтому в строке 34 мы получаем владельца tokenId и «требуем», чтобы он был равен отправителю транзакции (msg.sender).

Затем остается только добавить общедоступную функцию burn, которая вызывает функцию родительского контракта _burn.

Весь код солидности и тесты можно найти по адресу: https://github.com/donpabblo/burnable-nft

Если вы здесь, спасибо, что читаете. Я искренне надеюсь, что это объяснение было для вас полезным.

Узнайте больше из серии NFT.