Как устроены NFT на базе TON
Сегодня стандарт TON NFT получил статус Release Candidate.
Это означает, что активные обсуждения уже прошли и больше масштабных изменений не планируются. Помимо стандарта, опубликованы примеры смарт-контрактов NFT-коллекции, NFT-токенов и смарт-контракт простого маркетплейса с обменом NFT на Toncoin. Также разработчики представили JavaScript SDK и примеры работы с NFT смарт-контрактами.
Создатели NFT-проектов и разработчики сервисов могут начинать встраивать технологию в свои продукты в тестовой сети. От запусков в основной сети стоит пока воздержаться – хотя больших изменений и не планируется, для полноценного запуска вашего продукта стоит дождаться финального релиза стандарта.
Принцип работы NFT в TON
TON воспользовался редкой возможностью разработать стандарт, который действительно ориентирован на предоставление наилучшего продукта, а не только на экономию сетевых комиссий, как в других сетях (например, ERC721). Учтены многие уроки мирового криптосообщества, извлеченные из предыдущих реализаций в других блокчейнах.
В большинстве других блокчейнов, например в Ethereum, NFT представляет собой единый смарт-контракт, где хранятся все элементы коллекции.
Большой и популярный NFT с тысячами элементов становится узким местом в сети – тысячи транзакций обращаются к одному единственному смарт-контракту.
TON построен на концепции шардирования (разделения на части) для обеспечения масштабируемости сети. Поэтому NFT в TON это один смарт-контракт NFT-коллекции и множество отдельных смарт-контрактов для каждого элемента. Если вы выпускаете коллекцию в 10 000 элементов, то вы выпустите 10 000 + 1 смарт-контракт.
Благодаря эффективности TON, сетевая комиссия при таком выпуске всё равно обойдется вам примерно в 500 раз дешевле, чем выпуск одного единственного смарт-контракта в Ethereum.
В пользу такого подхода также выступают и некоторые другие технические особенности блокчейна TON, но об этом мы расскажем в другой раз.
Смарт-контракт NFT-коллекции
Такой смарт контракт обязательно имеет 3 обязательных get-метода:
- get_collection_data – возвращает общее количество созданных NFT для выбранной коллекции на данный момент, а также метаданные коллекции (название, описание и так далее). Формат данных описан ниже.
- get_nft_address_by_index – возвращает адрес смарт-контракта NFT из выбранной коллекции по его порядковому номеру.
- get_nft_content – передав в этот метод метаданные конкретного NFT, он вернет полноценные метаданные коллекции.
Дело в том, что смарт-контракт коллекции хранит общие для всех элементов данные, а смарт-контракты NFT-элементов – только свою индивидуальную часть. В этом методе происходит их объединение.
Например, если у NFT-элемента в данных есть ссылка на его контент, то домен «https://mynft.com» будет храниться в контракте коллекции, а оставшаяся часть «kind-cobra» – в самом контракте NFT.
Объединив их, получим полный адрес «https://mynft.com/kind-cobra».
Чеканка
В обычном случае смарт-контракт коллекции занимается также и "чеканкой" – через него автор выпускает новые NFT с нужными данными.
Смарт-контракт NFT-элемента
Имеет всего один обязательный метод get_nft_data, который возвращает данные этого NFT, включающие в себя:
- Порядковый номер в коллекции
- Адрес смарт-контракта коллекции, к которой он принадлежит
- Адрес текущего владельца
- Метаданные этого NFT (формат описан ниже)
Должен уметь обрабатывать два сообщения:
transfer(new_owner_address) – меняет владельца и отправляет ему сообщение с оповещением на новый адрес.
get_static_data – отправляет в ответ неизменяемые данные: порядковый номер и адрес смарт-контракта коллекции.
Расширения стандарта
Стандарт может расширятся другими стандартами NFTRoyalty, NFTEditable, NFTUpgradable. Расскажем о каждом из них подробнее.
Расширение NFTRoyalty
Добавляет ещё один обязательный метод royalty_params, который возвращает числовое значение процента, который желает получать автор коллекции от каждой продажи NFT, а также адрес, куда отправлять эти монеты (возможно, автор хочет забирать их не себе, а, например, отправлять в благотворительный фонд).
На входящее сообщение get_royalty_params смарт-контракт обязан отправить в ответ эти royalty-параметры.
Расширение NFTEditable
Коллекция и NFT-элементы хранят адрес Редактора данных, который может поменять данные коллекции или отдельного NFT-элемента.
Это может быть использовано для реализации игровых механик, где два предмета взаимодействуют и влияют друг на друга. Например, один меч ломает другой. В таком случае в роли Редактора будет выступать смарт-контракт игры. Также предусмотрена смена текущего редактора данных.
Расширение NFTUpgradable
Коллекция и NFT-элементы хранят также адрес Редактора кода, который может поменять код смарт-контракта коллекции или NFT-элемента.
Это может быть использовано для ещё более интересных игровых механик. При желании текущего редактора кода можно сменить.
Формат хранения контента
Предусмотрено два варианта хранения контента для коллекции и NFT.
1. Оффчейн
Смарт-контракт хранит только ссылку на JSON-файл, содержащий все необходимые данные. JSON-файл совместим с тем, что использует OpenSea.
Такой же формат преимущественно используют NFT в сети Ethereum.
2. Ончейн
Смарт-контракт хранит все данные в блокчейне в формате ключ → значение. Ключом выступает произвольная строка. Некоторые строки (вроде "name", "description" и "image") стандартизованы.
Можно также совместить оба варианта, храня одну часть оффчейн, а другую – в блокчейне.
Смарт-контракты маркетплейса, продажи и аукционов
Хотя маркетплейсы и аукционы не являются частью стандарта, разработчиками были предложены их возможные реализации.
Пользователь может создать новый смарт-контракт продажи своего NFT за фиксированную сумму в Toncoin либо с помощью аукциона.
При создании смарт-контракта пользователь, а точнее интерфейс маркетплейса, через который совершается продажа, задаёт следующие параметры: адрес NFT, цена продажи, максимальная длительность продажи, процент роялти автору, процент комиссии маркетплейсу.
После создания маркетплейс проверяет данные этого смарт-контракта и, если они верны (совпадают с royalty_params коллекции, минимальной комиссией маркетплейса и так далее), инициализируется новый контракт.
После этого продавец переводит NFT на смарт-контракт аукциона, а покупатель может просто отправить Toncoin на адрес смарт-контракта.
Если отправленная сумма достаточна – NFT автоматически передаётся покупателю, а Toncoin распределятся по заданным параметрам между продавцом, автором коллекции и маркетплейсом.
Конкретные маркетплейсы могут добавлять в свои смарт-контракты и других получателей. Например, перечислять процент партнерским площадкам и т.п.
Аукционы с некорректными данными просто не будут отображаться в интерфейсе маркетплейса.