Серия НФТ
Как сжечь 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.