Как отчеканить NFT на Солане

ПЕРЕД НАЧАЛОМ ЭТОГО РУКОВОДСТВА

Это руководство предоставит вам подробное пошаговое руководство по созданию NFT на Solana с помощью ряда технических шагов. Если вы хотите выполнить эту задачу быстрее и оставить тяжелую работу нам, мы рекомендуем дополнение Crossmint NFT Mint API [mainnet]. Используя Crossmint NFT Mint API [mainnet], вы можете раздавать NFT пользователям и адресам электронной почты Solana с помощью одного запроса POST. Используйте NFT Mint API, чтобы легко создавать коллекции и чеканить NFT!

Попробуйте Crossmint NFT Mint API [основная сеть]

Обзор

Обновлено: 10 апреля 2022 г.

Добро пожаловать в еще одно руководство QuickNode по Solana — многообещающему блокчейну, который призван решить проблемы масштабируемости Ethereum. Мы шаг за шагом рассмотрим, как создать NFT на Solana. NFT, сокращение от Non-Fungible Token, представляет собой криптографически уникальный хэш, который невозможно воспроизвести. Когда вы создаете NFT, это похоже на создание токена ERC20; однако критическая разница заключается в том, что когда-либо выпускается только один токен. В этом руководстве мы будем программно создавать 2 отдельных аккаунта с кошельками, один из которых будет чеканить NFT, а другой — получать его. Затем мы напишем код, который выполнит чеканку и отправку NFT на Солане. Если вы застряли на каком-либо этапе, не стесняйтесь обращаться к полному коду решения в конце руководства. Приступаем к чеканке!

Предпосылки:

  • NodeJS установлен
  • Знакомство с терминалом/CLI
  • Текстовый редактор
  • TypeScript установлен

Что такое Солана?

Цель Соланы уникальна по своей природе. Эта цель состоит в том, чтобы масштабировать блокчейн для глобального принятия. Solana Labs, разработчики протокола Solana, делают несколько разных вещей, чтобы осуществить эту мечту.

Технология Blockchain имеет несколько ручек, когда дело доходит до настройки производительности. Одним из них является механизм консенсуса. Вот как узлы общаются друг с другом, чтобы прийти к одинаковому выводу. Биткойн использует Proof of Work или PoW, интеллектуальная цепочка BNB, также известная как BSC, использует Proof of Staked Authority или PoSA. И Ethereum переходит на Proof of Stake, также известный как PoS. Как вы понимаете, на данный момент консенсус ни в коем случае не является решенной игрой.

Солана использует консенсус под названием Proof of History. Доказательство истории работает через решение для временных меток; каждая транзакция имеет отметку времени, которая позволяет остальной части сети проверить ее как легитимную транзакцию всего за доли секунды. У Соланы есть разбивка восьми технологий, которые, по их мнению, позиционируют себя как самый быстрый, самый масштабируемый и самый безопасный блокчейн в игре.

Локальная настройка проекта

Откройте Терминал и перейдите в папку, в которой вы хотите создать свой проект. Затем выполните следующие команды в точном порядке:

mkdir SolanaNFT
npm install --prefix ./SolanaNFT @solana/web3.js @solana/spl-token
cd SolanaNFT
touch index.ts

Первая команда создает новый каталог проекта с именем SolanaNFT. С помощью npm install — префикс ./SolanaNFT @solana/web3.js @solana/spl-token, мы устанавливаем JavaScript API Solana, @solana/web3.js и библиотеку TypeScript @solana/spl-token, для взаимодействия с Программа токенов SPL. Наконец, с помощью touch index.ts мы создаем файл Typescript, index.ts, в котором мы будем писать весь наш код.

Подключение к Солане

Откройте каталог проекта SolanaNFT в выбранном вами редакторе и давайте начнем писать код для подключения к Solana!

В файле index.ts мы хотим начать с импорта всех необходимых функций из @solana/web3.js и @solana/spl-token. Добавьте следующие два оператора импорта:

import { clusterApiUrl, Connection, Keypair, LAMPORTS_PER_SOL } from  "@solana/web3.js";
import { createMint, getOrCreateAssociatedTokenAccount, mintTo, setAuthority, transfer } from  "@solana/spl-token";

› Примечание. Если вы видите ошибки в этих строках кода, вероятно, у вас не установлены библиотеки. Убедитесь, что вы находитесь в правильном каталоге, и установите их снова.

Под операторами импорта добавьте эту функцию:

(async () => {
// Connect to cluster
const connection = new Connection(clusterApiUrl('devnet'), "confirmed");
})

Здесь мы создаем экземпляр нового соединения. Для этого требуются два аргумента, первый из которых является конечной точкой URL, указывающей на сеть Solana. В нашем случае clusterApiUrl(‘devnet’) — это удобный способ указать на общедоступную конечную точку Solana Devnet, которую мы будем использовать в этом руководстве. У Solana есть 3 разные сети: основная сеть, тестовая сеть и devnet. Девнет — это среда с низким уровнем риска, где вы можете «разбрасывать» токены SOL себе.

Установив соединение, мы теперь можем создать NFT и выполнить другие связанные шаги.

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

Создание нового кошелька и раздача SOL

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

Here we are instantiating a new connection instance. This requires two arguments, the first being a URL endpoint that points to the Solana Network. In our case, clusterApiUrl('devnet') is a convenient method to point to the public endpoint of the Solana Devnet which is what we will be using in this tutorial. Solana has 3 different networks: the mainnet, the testnet, and the devnet. The devnet is a low-risk environment where you can "air drop" SOL tokens to yourself. 

With a connection established, we can now create the NFT and perform the other associated steps. 

> Note: Each of the code blocks we write going forward should be placed directly underneath the previous block, all within the curly braces of the top-level async function. We'll provide you with the full code at the end to check yours against. 

Creating a New Wallet and Airdropping SOL
The first task we'll need to accomplish is creating an account with a wallet and funding it. We'll also need to ensure that each step has completed successfully before moving on to the next. Here's what this code will look like:

Не забудьте добавить этот код в функцию async. Давайте теперь разберем его по строкам.

Строка 2: мы используем импортированный ранее класс Keypair для создания новой пары ключей путем вызова метода generate(). Это создает новую пару открытого и секретного ключей и сохраняет ее в fromWallet.

Строка 4: мы запрашиваем аирдроп на наш кошелек. Метод requestAirdrop() принимает открытый ключ и количество ламппортов в SOL, которое вы хотели бы получить. Лампорты — это аналог вей Соланы, наименьшая сумма, на которую можно разбить SOL. Большинство методов, требующих числового значения, по умолчанию используют измерение Лампорта. В нашем случае LAMPORTS\_PER\_SOL — это константа, которая представляет стоимость ламппортов в 1 SOL.

Строка 9: Чтобы подтвердить, что аирдроп прошел успешно, мы используем метод confirmTransaction и ожидаем его успеха. Этот вызов позволяет нам передать подписанную транзакцию в качестве аргумента и заставить программу ждать, пока она не будет подтверждена, прежде чем переходить к другим частям кода. Это важно, так как наш следующий шаг должен будет заплатить комиссию, и нам потребуются средства, полученные с помощью airdrop.

Создание нового монетного двора токена

Теперь нам нужно создать новый монетный двор токена и получить нашу учетную запись токена.

const mint = await createMint(
  connection, 
  fromWallet,            // Payer of the transaction
  fromWallet.publicKey,  // Account that will control the minting 
  null,                  // Account that will control the freezing of the token 
  0                      // Location of the decimal place 
);

Функция createMint будет тем, что создаст наш фактический токен. Он принимает 6 аргументов:

1. Подключение к сети Solana. (связь)

2. Счет, с которого будет производиться оплата. (из кошелька)

3. Публичный ключ учетной записи, которая имеет право чеканить токены этого типа. (изWallet.publicKey)

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

5. Расположение десятичного знака для токена.

Для получения дополнительной информации об этой функции и других функциях spl-токена, используемых в этом руководстве, посетите эту страницу в Solana-labs.github.io.

После создания монетного двора токена нам нужно получить учетную запись токена с адреса fromWallet Solana. Если его нет, мы должны его создать. Для этого мы будем использовать функцию getorCreateAssociatedTokenAccount(), передав большую часть предыдущих значений и сохранив их в fromTokenAccount:

// Get the token account of the "fromWallet" Solana address. If it does not exist, create it.
const fromTokenAccount = await getOrCreateAssociatedTokenAccount(
  connection,
  fromWallet,
  mint,
  fromWallet.publicKey
);

Вы можете думать о цепочке хранения следующим образом: NFT находится в учетной записи, и ваш кошелек владеет этой учетной записью.

› Ключи -> Кошелек -> Аккаунт -> NFT (сверху вниз)

Создание учетной записи с кошельком для отправки NFT на

У нас есть учетная запись для отправки NFT; теперь нам нужна учетная запись для отправки NFT в. Код для этого должен выглядеть очень знакомо, так как мы будем использовать те же функции и переменные для создания нового кошелька и получения монетного двора токена, как мы делали ранее.

// Generate a new wallet to receive the newly minted token
const toWallet = Keypair.generate();

// Get the token account of the "toWallet" Solana address. If it does not exist, create it.
const toTokenAccount = await mint.getOrCreateAssociatedAccountInfo(
  connection,
  fromWallet,
  mint,
  toWallet.publicKey
);

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

Создание NFT и его отправка

Теперь пришло время создать NFT и отправить его кому-нибудь! Найдите минутку, чтобы посмотреть на приведенный ниже код, который достигает этого, и прочитайте комментарии, чтобы понять, что делает каждая функция.

// Minting 1 new token to the "fromTokenAccount" account we just returned/created.
let signature = await mintTo(
  connection,
  fromWallet,               // Payer of the transaction fees 
  mint,                     // Mint for the account 
  fromTokenAccount.address, // Address of the account to mint to 
  fromWallet.publicKey,     // Minting authority
  1                         // Amount to mint 
);

await setAuthority(
  connection,
  fromWallet,            // Payer of the transaction fees
  mint,                  // Account 
  fromWallet.publicKey,  // Current authority 
  0,                     // Authority type: "0" represents Mint Tokens 
  null                   // Setting the new Authority to null
);

signature = await transfer(
  connection,
  fromWallet,               // Payer of the transaction fees 
  fromTokenAccount.address, // Source account 
  toTokenAccount.address,   // Destination account 
  fromWallet.publicKey,     // Owner of the source account 
  1                         // Number of tokens to transfer 
);

  
 console.log("SIGNATURE", signature);
})();

Мы кратко коснемся функции setAuthority(), так как это одна из самых важных частей. Эта функция аннулирует привилегии чеканки и гарантирует, что мы не сможем создавать дополнительные токены этого типа. Обратите внимание, что это действие нельзя отменить.

Для запуска программы последовательно выполните следующие команды:

tsc index.ts

node index.js

Эти две команды запустят файл TypeScript, сгенерируют файл JavaScript с тем же именем и запустят этот файл. Через некоторое время вы должны увидеть подпись, зарегистрированную в терминале.

Если вы посещаете Solana Explorer, вы должны увидеть свою подпись. Это будет выглядеть примерно так:

Вот полный код, который у вас должен быть:

import { clusterApiUrl, Connection, Keypair, LAMPORTS_PER_SOL } from  "@solana/web3.js";
import { createMint, getOrCreateAssociatedTokenAccount, mintTo, setAuthority, transfer } from  "@solana/spl-token";

(async () => {
  // Connect to cluster
  const connection = new Connection(clusterApiUrl("devnet"), "confirmed");

  // Generate a new wallet keypair and airdrop SOL
  const fromWallet = Keypair.generate();
  const fromAirdropSignature = await connection.requestAirdrop(
    fromWallet.publicKey,
    LAMPORTS_PER_SOL
  );

  // Wait for airdrop confirmation
  await connection.confirmTransaction(fromAirdropSignature);

  // Create a new token 
  const mint = await createMint(
    connection, 
    fromWallet,            // Payer of the transaction
    fromWallet.publicKey,  // Account that will control the minting 
    null,                  // Account that will control the freezing of the token 
    0                      // Location of the decimal place 
  );

  // Get the token account of the fromWallet Solana address. If it does not exist, create it.
  const fromTokenAccount = await getOrCreateAssociatedTokenAccount(
    connection,
    fromWallet,
    mint,
    fromWallet.publicKey
  );

  // Generate a new wallet to receive the newly minted token
  const toWallet = Keypair.generate();

  // Get the token account of the toWallet Solana address. If it does not exist, create it.
  const toTokenAccount = await getOrCreateAssociatedTokenAccount(
    connection,
    fromWallet,
    mint,
    toWallet.publicKey
  );

  // Minting 1 new token to the "fromTokenAccount" account we just returned/created.
  let signature = await mintTo(
    connection,
    fromWallet,               // Payer of the transaction fees 
    mint,                     // Mint for the account 
    fromTokenAccount.address, // Address of the account to mint to 
    fromWallet.publicKey,     // Minting authority
    1                         // Amount to mint 
  );

  await setAuthority(
    connection,
    fromWallet,            // Payer of the transaction fees
    mint,                  // Account 
    fromWallet.publicKey,  // Current authority 
    0,                     // Authority type: "0" represents Mint Tokens 
    null                   // Setting the new Authority to null
  );

  signature = await transfer(
    connection,
    fromWallet,               // Payer of the transaction fees 
    fromTokenAccount.address, // Source account 
    toTokenAccount.address,   // Destination account 
    fromWallet.publicKey,     // Owner of the source account 
    1                         // Number of tokens to transfer 
  );

  console.log("SIGNATURE", signature);

})();

Заключение

Если вы зашли так далеко, вы узнали кое-что из этого урока и кое-что из других наших руководств по Солане, так что поздравляем! Пройдя через это, вы успешно создали NFT на блокчейне Solana. Следующим шагом для вас будет привязка этого уникального единственного в своем роде токена к какому-либо активу. На рынке прямо сейчас это, как правило, изображение, которое было создано случайным образом с различными свойствами, или одноразовое произведение искусства.

Подпишитесь на нашу рассылку новостей, чтобы получать больше статей и руководств по Ethereum. Если у вас есть какие-либо отзывы, не стесняйтесь обращаться к нам через Twitter. Вы всегда можете пообщаться с нами на нашем сервере сообщества Discord, где представлены одни из самых крутых разработчиков, которых вы когда-либо встречали :)