15 мая 2023

Динамические NFT. MVP на коленке

Итак, вы уже читали наверняка мои или чьи-либо ещё опусы о dynamic NFT (можно посмотреть по ссылкам на Forklog: здесь, скажем, или, например, здесь). В любом случае — сегодня на простом примере расскажу, как создать на базе протокола Envelop (разработка NFT 2.0 решений) сделать торгуемый, передаваемый, верифицируемый (все слова выделены не просто так, как убедитесь ниже) индекс по любому интересующему вас набору активов (ассетов). 

Шаг №01. Немного кода & ChatGPT

Скажу сразу, что даже толком кодить для всего, что описано, не нужно: достаточно правильно задать вопрос для ChatGPT. Да, специально это проверил, чтобы всё было доступно любому желающему, провявившему активность. Более того! Не надо даже покупать доступ: достаточно бесплатной версии, расположенной https://chat.openai.com/. В личном кабинете — не ошибётесь:

Menaskop & CMCЗапрос может быть предельно лаконичным к AI: “ты можешь написать код на php, который бы определял цену токена через Coinmarketcap в моменте?”. Вместо php может быть ruby, python, js или что-то ещё. У меня под рукой был VDS с PHP, потому его и взял. 

Menaskop & ChatGPTДобавлю ещё несколько комментариев построчно:

  • Сначала идёт установка параметров запроса:
    • $api_key = ‘ваш_ключ_API’; // замените на свой ключ API CoinMarketCap: взять его можно бесплатно (до 10 000 запросов в месяц) по ссылке: https://coinmarketcap.com/api/. Регистрация не займёт и минуты; 
    • $url = ‘https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest‘; // здесь идёт собственно ULR для формирования запроса;
    • $parameters = [
      • ‘symbol’ => ‘ETH’, // замените на нужный вам символ токена: я взял SUSHI, CAKE, ZEE из экосистемы BSC;
      • ‘convert’ => ‘USD’ // замените на валюту, в которую нужно конвертировать цену
    • ];
  • // Здесь происходит инициализация сеанса cURL и настройка запроса:
    • $ch = curl_init();
    • curl_setopt($ch, CURLOPT_URL, $url . ‘?’ . http_build_query($parameters));
    • curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    • curl_setopt($ch, CURLOPT_HTTPHEADER, [
  •     ‘Content-Type: application/json’,
  •     ‘X-CMC_PRO_API_KEY: ‘ . $api_key
    • ]);
  • Далее — само выполнение запроса: 
    • $response = curl_exec($ch);
    • curl_close($ch);
  • Затем — обработка ответа: 
    • $data = json_decode($response);
    • if (!isset($data->data) || !isset($data->data->ETH) || !isset($data->data->ETH->quote) || !isset($data->data->ETH->quote->USD)) {
  •      die(‘Ошибка получения цены токена’);
    • }
    • $price = $data->data->ETH->quote->USD->price;
  • И, наконец, вывод цены:
    • echo ‘Текущая цена ETH: $’ . number_format($price, 2);

Код полностью:

<?php

$api_key = ‘ваш_ключ_API’;

$url = ‘https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest’;

$parameters = [

    ‘symbol’ => ‘ETH’, 

    ‘convert’ => ‘USD’ 

];

 

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url . ‘?’ . http_build_query($parameters));

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_HTTPHEADER, [

    ‘Content-Type: application/json’,

    ‘X-CMC_PRO_API_KEY: ‘ . $api_key

]);

 

$response = curl_exec($ch);

curl_close($ch);

 

$data = json_decode($response);

if (!isset($data->data) || !isset($data->data->ETH) || !isset($data->data->ETH->quote) || !isset($data->data->ETH->quote->USD)) {

    die(‘Ошибка получения цены токена’);

}

$price = $data->data->ETH->quote->USD->price;

 

// Вывод цены

echo ‘Текущая цена ETH: $’ . number_format($price, 2);

?>

Можно сделать циклом, можно как-то иначе оптимизировать, а можно пойти топорным путём: один файл (см. код выше) — один тике — один актив соответственно. А далее вам надо будет вызвать эти файлы и вывести изображение с данными из них (в моём случае это require_once ‘ZEE.php’; require_once ‘CAKE.php’; require_once ‘SUSHI.php’). Сделать это можно с помощью стандартных команд PHP:

$filename = ‘index_2023_01.png’;   // Здесь определяем путь и имя файла для сохранения.

$img = imagecreate(500, 300); // Здесь пишем ширину и длину изображения.

$bgcolor = imagecolorallocate($img, 81, 238, 218); // Задаём цвет фона.

$fontcolor = imagecolorallocate($img, 20, 22, 22); // Задаём цвет текста.

А потом идут надписи на изображении: 

imagestring($img, 12, 100, 180, «ZEE price: $price_zee USD», $fontcolor);

imagestring($img, 12, 100, 160, «SUSHI price: $price_sushi USD», $fontcolor);

imagestring($img, 12, 100, 140, «CAKE price: $price_cake USD», $fontcolor);

imagestring($img, 12, 100, 120, «$text_01», $fontcolor);

imagestring($img, 12, 100, 100, «$text_02», $fontcolor);

imagestring($img, 12, 100, 80, «Index Elements SUSHI, CAKE, ZEE», $fontcolor);

imagestring($img, 12, 100, 60, «DeFi Index for BSC N01», $fontcolor);

imagestring($img, 12, 100, 40, «DAO Envelop (NIFTSY)», $fontcolor);

 //imagepng($img); // Можете использовать, если хотите не сохранять данные в отдельный файл, а посмотреть прямо “на месте”, то есть из того же php-файла, в котором записан код. Если сомневаетесь, просто удалите эту и строку нажие. //imagedestroy($img);

 header(«Content-Type: image/png»);

 imagepng($img, $filename); // Сохраните изображение в файл. 

imagedestroy($img); // Очистите память, освободите ресурсы. 

Всё! Поздравляю! У вас получится нечто подобное: https://web3time.info/tests_2023_chatgpt/indexes/index_2023_01.png. Это изображение динамически меняет данные (обратите внимание на строку “The price of the index now” и на текущие цены активов: CAKE, SUSHI, ZEE). Можно добавить curl-обновление, можно оптимизировать код вызова и т.д., но мы пойдём дальше. 

NFT & wNFT

Вся прелесть подхода заключается в том, что можно сделать NFT с доступом к URL (в MVP версии этого достаточно: если же вы хотите использовать децентрализованное решение, конечно, придётся смотреть в сторону IPNS в IPFS. 

Коротко — цитата: “адресация содержимого в IPFS по своей природе неизменна: когда вы добавляете файл в IPFS, она создаёт хэш из данных, с помощью которого строится CID. При изменении файла изменяется его хэш, и, следовательно, его CID, который используется в качестве адреса… Тем не менее, существует множество ситуаций, когда данные с адресом содержимого необходимо регулярно обновлять, например, при публикации веб-сайта, который часто меняется. Было бы непрактично передавать новый CID при каждом обновлении сайта. С помощью изменяемых указателей можно один раз поделиться адресом указателя и обновлять указатель — до нового CID — каждый раз, когда публикуете изменения. Межпланетная система имен (IPNS) — система для создания таких изменяемых указателей на CID, известных как имена или имена IPNS. Имена IPNS можно рассматривать как ссылки, которые можно обновлять со временем, сохраняя при этом проверяемость адресации содержимого”.

Как бы там ни было, пока остановился на URL-как-ресурсе для изображения, являющегося метаданными NFT стандарта ERC-721. Посмотреть можно здесь: 

  1. Envelop: appv1.envelop.is/token/56/0x8f3e1324f23c14ca26f0f9ddbc2a8b4dbe9955fc/170;
  2. OpenSea: opensea.io/assets/bsc/0x8f3e1324f23c14ca26f0f9ddbc2a8b4dbe9955fc/169 

При этом надо понимать, что данные на разных сайтах кэшируются по-разному: скажем, в OpenSea — вот так: https://dl.openseauserdata.com/cache/originImage/files/e8df8438be35b93ecee979125da92cd5.png, поэтому увидеть обновления без обновления данных крайне не просто. Самый простой способ: 

  1. Удалить cookies;
  2. Очистить кэш;
  3. И сделать Ctrl+F5 (Command+R). 

Главное, проверьте метаданные — они должны выглядеть примерно так:

Menaskop & Envelop. wNFTДалее — вы можете, используя адрес смарт-контракта этой, оригинальной, NFT, создать wNFT-индекс: как это сделать, рассказывал не раз, поэтому повторяться не буду. Почитать можно по ссылке или здесь. Посмотреть пример индекса обеспеченного — тоже довольно просто

Что получаем в итоге? 

Динамическую (w)NFT с Collateral (обеспечением), внутри которой лежат 3 актива в виде BEP-20 токенов (и это — не что иное, как обеспеченный дериватив, о которых рассказывал на Forklog), а метаданные этой wNFT (данные wNFT считывают метаданные оригинальной NFT) служат скриптом определения начальной (покупной) цены Индекса и его стоимость в моменте. Вы можете взять любую категорию, допустим, отсюда: coinmarketcap.com/cryptocurrency-category/ или можете сформировать свой индекс. 

И далее? И далее — продавать эти NFT 2.0 на любом удобном и доступном ресурсе, сэкономив время покупателям и заработав, скажем, на комиссии при продаже. Или можете с кем-то поспорить, кто говорит, что индекс упадёт на момент времени t, а вы поставите на рост. Или… вариантов множество: главное — понять, что этот рынок совсем молодой и весьма перспективный. 

Считаем трудозатраты

Попробуем посчитать, сколько времени и денег займёт у вас создание подобного индекса:

  1. Код через ChatGPT по шаблонам выше — бесплатно: около 1-5 минут
  2. Загрузка на самый дешёвый сервер (можете использовать список хостингов, где есть оплата (дополнительно) криптоактивами: и даже попробовать децентрализованную альтернативу) — от $3-$5 в месяц: около 1-5 минут
  3. Выбор активов — $0 и около 1-10 минут. Я выбрал эти: 
    1. https://coinmarketcap.com/dexscan/bsc/0x8e799cb0737525ceb8a6c6ad07f748535ff6377b/ — ZEE; 
    2. https://coinmarketcap.com/dexscan/bsc/0xa39af17ce4a8eb807e076805da1e2b8ea7d0755b/ — CAKE;
    3. https://coinmarketcap.com/dexscan/bsc/0x2d90fa69e2e3737218c0531c762baec1b6d2be02/ — SUSHI;
  4. Покупка активов на любой DEXs/AMMs — примерно $1 на комиссии, а сколько захотите заложить — уже ваше дело: около 1-10 минут:
    1. https://bscscan.com/tx/0x298f91bae3be54950b6527a497d88a68305223e8335cad9e45a8478c8c555ca0 с комиссией в $0.16;
    2. https://bscscan.com/tx/0x222384c0935a80485546a2fd1e6964c1828019ffdd1077b220142ec48948e156 с комиссией в $0.24; 
    3. https://bscscan.com/tx/0x2f3361126cc89143bbbb4aceda75aa7d00738bd1556df72878554adb9bdef5be с комиссией в $0.23; 
  5. Итого: полчаса и менее $10. После создания 2-3 — хватит и 5-10 минут и ещё меньше USD. 

Выводы

Сейчас рынок, ОТС и условно — основной, выглядят совсем зелёными, но не это ли — лучшая пора для экспериментов? Думаю, ответ очевиден. Как только дождусь новой версии https://appv1.envelop.is/saft — покажу вам, какие ещё можно фичи проворачивать с помощью подобных протоколов, а пока всё и

До!

Обсудить в Discord!

Menaskop
  • Зарегистрирован: 22 мая 2012 г.
  • Локация:London/United Kingdom
  • Сайт:penroseisparty.com