Как устроены 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-метода:

  1. get_collection_data – возвращает общее количество созданных NFT для выбранной коллекции на данный момент, а также метаданные коллекции (название, описание и так далее). Формат данных описан ниже.
  2. get_nft_address_by_index – возвращает адрес смарт-контракта NFT из выбранной коллекции по его порядковому номеру.
  3. get_nft_content – передав в этот метод метаданные конкретного NFT, он вернет полноценные метаданные коллекции.

Дело в том, что смарт-контракт коллекции хранит общие для всех элементов данные, а смарт-контракты NFT-элементов – только свою индивидуальную часть. В этом методе происходит их объединение.

Например, если у NFT-элемента в данных есть ссылка на его контент, то домен «https://mynft.com» будет храниться в контракте коллекции, а оставшаяся часть «kind-cobra» – в самом контракте NFT.

Объединив их, получим полный адрес «https://mynft.com/kind-cobra».

С запуском TON Storage, автор коллекции сможет одной операцией заменить адрес на «ton://storage/my-nft/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 распределятся по заданным параметрам между продавцом, автором коллекции и маркетплейсом.

Конкретные маркетплейсы могут добавлять в свои смарт-контракты и других получателей. Например, перечислять процент партнерским площадкам и т.п.

Аукционы с некорректными данными просто не будут отображаться в интерфейсе маркетплейса.