Как чеканить 1 млрд+ образов NFT на лету с устройства iOS

Как чеканить 1 млрд+ образов NFT на лету с устройства iOS

11 апреля 2022 г.

Вы, наверное, слышали о CryptoPunks, Bored APE или Metroverse. Все это NFT (или невзаимозаменяемые токены). Модное слово, которое может [окупиться] (https://decrypt.co/62898/most-expensive-nfts-ever-sold).


Процесс чеканки NFT — это не ракетостроение. Однако это может быть непросто, особенно в приложении для iOS. На сегодняшний день нет готового метода взаимодействия с блокчейном (или со смарт-контрактом) из iOS.


Поэтому мы решили создать частный API для создания образов NFT на лету.


Слои


Вот список того, что нам нужно иметь и что мы должны сделать:


1., тонны изображений


2., Обработка платежей


3., Смарт-контракт


4., Децентрализованное хранилище файлов


5., Взаимодействие с блокчейном


6., Получение коллекционного идентификатора


7., Интеграция с iOS


Кроме того, вы можете загрузить демо-приложение из App Store.


1., Изображения


У нас есть 6 коллекций. В коллекциях у нас есть 6-8 слоев. Каждый слой содержит от 10 до 50 отдельных изображений. Если мы посчитаем, то количество вариаций легко превысит 1 миллиард.


Слои


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


Слои


2., Обработка платежей


Поскольку мы говорим о NFT и блокчейне, кажется очевидным, что оплата должна происходить с использованием криптовалюты (например, биткойнов, эфириума и т. д.). Но удачи вам в том, чтобы убедить Apple разрешить пользователям расплачиваться криптовалютой в приложении для iOS.


Из-за строгих правил Apple нам нужно, чтобы платежи пользователей управлялись Apple. В данном случае это означает покупку в приложении.


Таким образом, мы получаем платежи от Apple (в долларах США), и в какой-то момент нам нужно использовать нашу собственную криптовалюту для оплаты транзакционных сборов за чеканку NFT (и смарт-контракт).


3. Смарт-контракт


Что такое смарт-контракт?


«Умный контракт» — это просто программа, работающая на блокчейне Ethereum. Это набор кода (его функций) и данных (его состояния), который находится по определенному адресу в блокчейне Ethereum.


В блокчейне Ethereum есть два типа учетных записей:


  • Внешние учетные записи (тот, что у вас есть в MetaMask или любых кошельках). Вы можете управлять этим типом учетной записи с помощью закрытого ключа.

  • Контрактные счета. Этот тип управляется кодом.

Таким образом, NFT в ваших кошельках связаны с контрактом, который живет в блокчейне. Например, адрес контракта CryptoPunks: «0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB».


Но как мы «создаем» смарт-контракт? Сам контракт написан на языке программирования Solidity, а затем развернут в блокчейне Ethereum. Давайте посмотрим детали.


Контракт ECR721


ERC721 — это стандарт для представления права собственности на невзаимозаменяемые токены, то есть каждый токен уникален.


Однако создать токен ECR721 и соблюсти все стандарты с нуля непросто. Вот почему мы решили использовать Мастер OpenZeppelin, который позволяет нам иметь все предварительно созданные функции контракта ECR721 в нескольких строках. кода.


В нашем случае договор должен иметь следующие особенности:


  • Mintable (с автоинкрементными идентификаторами)

  • Хранилище URI (здесь мы помещаем URI образа NFT)

Наша функция монетного двора очень похожа на функцию мастера по умолчанию:


function safeMint (адрес, строковый uri памяти) public onlyOwner {


uint256 tokenId = _tokenIdCounter.current();


_tokenIdCounter.increment();


_safeMint (до, tokenId);


_setTokenURI(tokenId, uri);


Компиляция и развертывание


Когда у нас есть код смарт-контракта (написанный на Solidity), нам нужно скомпилировать и развернуть его в блокчейне.


Hardhat — это среда разработки Ethereum, которую можно использовать для этой работы. Для получения более подробной информации ознакомьтесь с полным [учебником] (https://hardhat.org/tutorial).


Мы можем легко развернуть контракт, выполнив двухстрочную команду:


``ш


Скомпилировать


Компиляция в каске npx


Развернуть его в основной сети


npx hardhat run scripts/deploy.js --network mainnet


После развертывания мы должны увидеть что-то вроде этого:


Развертывание контрактов с учетной записью: 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB


Контракт теперь развернут в блокчейне со своим собственным адресом.


4. Децентрализованное хранилище файлов


Во-первых, нам нужно загрузить изображение в IPFS. Межпланетная файловая система (IPFS) — это протокол и одноранговая сеть для хранения и обмена данными в распределенной файловой системе.


Для этой задачи мы будем использовать Pinata. Pinata — это простой в использовании API с оплатой по факту использования, который позволяет вам взаимодействовать с IPFS без необходимости запуска собственного узла.


Когда мы загружаем изображение в IPFS, Pinata возвращает идентификатор контента (CID), который можно использовать в качестве ссылки на изображение. Этот идентификатор уникален для актива:


```js


const imagePin = await pinata.pinFileToIPFS(


fs.createReadStream(изображениеPath),


опции


console.log(imagePin.IpfsHash);


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


Что такое метаданные NFT?


Метаданные NFT — это простой файл JSON с некоторой уникальной информацией, связанной с NFT (и коллекцией, к которой он принадлежит). Кошельки (например, MetaMask или Coinbase Wallet) и торговые площадки (например, OpenSea) извлекают этот файл JSON непосредственно из блокчейна для отображения NFT.


Если вы работаете с токеном хранилища ERC-721 URI, вы можете использовать функцию контракта tokenURI для получения метаданных JSON.


```json


"name": "Блок № 4793",


"image": "ipfs://QmYLSvE6K1iVEoVDRbF4kbqqNF33ZsdkLvT8ZveUT4sNGb/4793.jpeg",


"description": "Metroverse — это стратегическая игра NFT для торговли землей на блокчейне Ethereum. Собирайте, торгуйте и делайте ставки на свои городские кварталы, чтобы заработать $MET, служебный токен Metroverse."


Как только метаданные будут сгенерированы в виде файла JSON, мы сможем загрузить их в IPFS. В результате он вернет CID метаданных, который можно использовать на следующем шаге для создания NFT.


IPFS


5. Взаимодействие с блокчейном


Получив CID метаданных IPFS, мы можем создать NFT, взаимодействуя со смарт-контрактом, который живет в блокчейне.


Но у нас есть проблема. Взаимодействовать с блокчейном сложно. Это требует твердых технических знаний и мощного компьютера.


Нам нужно управлять полным узлом, и нам нужно загрузить все данные блокчейна (часто несколько сотен гигабайт). Эти задачи нельзя выполнить из приложения iOS.


Возможным решением этой проблемы является [Алхимия] (https://www.alchemy.com).


Алхимия — это API, который позволяет вам взаимодействовать с блокчейном, не беспокоясь о знаниях и ресурсах. Используя Alchemy API (через Node.js SDK), мы можем взаимодействовать со смарт-контрактом.


Загрузить контракт


Во-первых, давайте загрузим наш контракт, используя адрес контракта. Поскольку контракт живет в блокчейне, у него есть адрес, как и у любого кошелька.


```js


const nftContract = новый web3.eth.Contract(


контракт.аби,


адрес договора


Создайте объект транзакции


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


```js


const nonce = await web3.eth.getTransactionCount(


публичный ключ,


"самый последний"


пусть тх = {


от: публичный ключ,


кому: адрес договора,


одноразовый номер: одноразовый номер,


данные: nftContract.methods.safeMint(получатель, tokenURI).encodeABI(),


Оценить плату за газ


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


Поскольку топливо позволяет вашему автомобилю двигаться, газ в блокчейне — это то, что позволяет майнеру проверять (или «майнить») действия, которые вы хотите выполнить в смарт-контракте (в нашем случае чеканка NFT).


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


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


```js


const оцениваемый газ = ожидание web3.eth.estimateGas (tx);


постоянная цена = ожидание web3.eth.getMaxPriorityFeePerGas();


тх = {


... тк,


газ: расчетныйГаз,


maxPriorityFeePerGas: цена,


Подпишите и отправьте транзакцию


Теперь наша транзакция готова к отправке в блокчейн для проверки. Последний шаг — подписать эту транзакцию, используя закрытый ключ нашего кошелька.


Из соображений безопасности закрытый ключ вашего кошелька никогда не должен передаваться через блокчейн. Таким образом, единственный способ аутентифицировать себя — использовать «криптографическую подпись».


```js


const signedTx = ожидание web3.eth.accounts.signTransaction(


ТХ, приватный ключ


const transactionReceipt = await web3.eth.sendSignedTransaction(


подписаннаяTx.rawтранзакция


Процесс чеканки


6., Получение коллекционного идентификатора


После того, как транзакция была добыта, мы можем получить NFT «tokenId», используя хэш транзакции. Однако этот шаг также может быть сложным, поэтому мы будем использовать инструмент обозревателя блокчейна, такой как [Etherscan] (https://etherscan.io) или [Polygonscan] (https://polygonscan.com).


Мы решили автоматизировать этот процесс с помощью API Polygonscan.


Мы можем получить коллекционный идентификатор NFT с помощью простого запроса GET:


```js


const explorerResponse = ожидание axios.get(


https://api.polygonscan.com/api?module=account&action=tokennfttx&contractaddress=${contractAddress}&address=${walletAddress}&page=1&offset=1&sort=desc&apikey=${apiKey}


константная транзакция = explorerResponse.data.result[0];


console.log(transaction.tokenID);


7. Интеграция с iOS


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


Мы решили развернуть код Node.js как облачные функции Firebase. Мы также используем базу данных Firebase Realtime для хранения некоторых данных, связанных с чеканкой NFT.


С точки зрения iOS весь процесс — это просто вызов облачной функции и некоторое управление базой данных в реальном времени.


Когда у нас есть коллекционный идентификатор и адрес контракта, пользователь может легко [импортировать] (https://ethereum.org/fr/developers/tutorials/how-to-view-nft-in-metamask) NFT в свой/ ее кошелек MetaMask.


Демонстрационное приложение можно загрузить из App Store.



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE