WEB3DEV

Cover image for Crie NFTs a partir do backend na Solana
Fatima Lima
Fatima Lima

Posted on

Crie NFTs a partir do backend na Solana

Image description

Nós já vimos como podemos criar NFTs a partir do frontend usando APIs SHYFT com eficiência. Algumas vezes, podemos ter um cenário de caso de uso diferente onde temos todos os dados disponíveis no backend e temos que criar o NFT diretamente do backend. Este tutorial mostra um desses cenários de caso de uso onde criamos NFTs diretamente do backend usando APIs SHYFT.

Pré-requisitos

Autenticação: Obtendo sua chave API Shyft

x-api-key é um parâmetro de autenticação, que lhe dá acesso às APIs SHYFT. Você pode obter sua própria chave API no SHYFT website. Basta se inscrever com seu ID de e-mail aqui e você pode obtê-lo gratuitamente.

Pacotes NPM Necessários

  • path — Este pacote é usado para ler a imagem a partir de um caminho determinado.
  • axios — Este pacote é usado para fazer a chamada da API. Você também pode usar qualquer outro método ou pacote de acordo com sua necessidade.
  • @solana/web3.js e @metaplex/js — Estes são necessários para assinar a transação do backend do aplicativo que está solicitando a API.

A chamada da API

Para criar NFTs a partir do backend vamos usar a seguinte API :

POST https://api.shyft.to/sol/v1/nft/create
Enter fullscreen mode Exit fullscreen mode

Essa API aceita os seguintes detalhes do NFT que deve ser criado no formato multipart/form-data:

  • network: Especifica a instância da rede Solana, que pode ser devnet, testnet ou mainnet-beta.
  • wallet : Aceita o endereço da carteira do criador do NFT. Essa carteira terá o update_authority do NFT.
  • name: Nome do NFT a ser criado.
  • symbol: Símbolo do NFT a ser criado.
  • description: Uma pequena descrição sobre o NFT que estamos criando.
  • attributes: Aceita os atributos do NFT de acordo com seu tipo de característica e valor. Confira abaixo uma amostra para o formato.
  • external_url: qualquer URL externo associado ao NFT.
  • max_supply: Número de edições do NFT criado atualmente que podem ser cunhados. Se definido como 0, cria NFTs únicos.
  • royalty: Especifica o royalty do criador em porcentagem, sendo um valor entre 0 - 100.
  • nft_receiver: Especifica a carteira para a qual o NFT será cunhado. Se deixado em branco, será cunhado na carteira cuja private_key tenha sido fornecida.
  • service_charge: Especifica um valor em SOL, que pode ser cobrado durante a criação dos NFTs. Este parâmetro é opcional.

Para mais detalhes sobre nossas APIs, consulte a Documentação da API SHYFT ou você também pode verificar nossa documentação aqui.

Supondo que tenhamos todos os dados disponíveis no backend, vamos criar um novo FormData object e anexar todos os dados necessários para criar o NFT. (Usamos dados estáticos para fins de demonstração)

const data = new FormData();

data.append('network', 'devnet');
data.append('wallet', 'WALLET_ADDRESS_OF_NFT_CREATOR'); //carteira com cuja chave privada precisaremos para assinar a Txn
data.append('name', 'TrendySkeleton');
data.append('symbol', 'TSK');
data.append('description', 'hair on fire problem solving');
data.append('attributes', '[{"trait_type": "speed", "value": 100},\n{"trait_type": "aggression", "value": "crazy"},\n{"trait_type": "energy", "value": "very high"}]');
data.append('external_url', 'https://shyft.to/');
data.append('max_supply', '1');
data.append('royalty', '10');
data.append('file', fs.createReadStream(path.resolve(__dirname, './images/index.png')));
data.append('receiver', 'B6CxZxad7JLKE5QvQo3D6Pc3qox3UyhRy5bu97HgKN9N');
Enter fullscreen mode Exit fullscreen mode

Enviando Dados da Imagem

Observe que usamos a função createReadStream com o caminho da imagem para abrir e ler os dados no arquivo/stream. A função path.resolve() foi usada para resolver o caminho relativo fornecido para a imagem. Alternativamente, para usar caminhos absolutos como 'D:/index.png’, teremos que usar a função path.join().

data.append('file', fs.createReadStream(path.join('D:/index.png')));
Enter fullscreen mode Exit fullscreen mode

Também podemos obter os dados da imagem em um formato de fluxo legível de um URI externo, mas, para isso, precisaríamos de alguns passos extras. Primeiro, teremos que buscar os dados da imagem em um formato de fluxo legível. Algo assim:

const imgData = await axios.get('https://www.arweave.net/GZtct3fpYUlB9ZT92SMkVEp7TUvLlFV-kke4f5I5D9E?ext=jpg', { responseType: 'stream' });
Enter fullscreen mode Exit fullscreen mode

Uma vez que essa solicitação tenha sido executada com sucesso, prosseguimos e anexamos o imgData.data para o objeto FormData, para que possa ser repassado como um parâmetro para fazer a chamada da API do NFT criado.

data.append('file', imgData.data, 'test.jpg');
Enter fullscreen mode Exit fullscreen mode

Feito isso, agora estamos prontos para fazer a chamada da API. Usamos o pacote axios para fazer a chamada da API, mas você pode usar qualquer outro método conforme sua necessidade. Além disso, observe que temos que definir o Content_type para multipart/form-data no cabeçalho e temos que aprovar a x-api-key obtida no SHYFT website.

Aqui está a chamada da API:

const response = await axios.post('<https://api.shyft.to/sol/v1/nft/create>', data, { headers: {
   'Content-Type': 'multipart/form-data',
   'x-api-key': YOUR_API_KEY,
 } });
 console.log('data', response.data); // exibindo a resposta
Enter fullscreen mode Exit fullscreen mode

Uma vez executado com sucesso, deve retornar uma resposta um tanto semelhante a esta. A mint retornada na resposta é o endereço do NFT que será criado. A função retorna uma encoded_transaction que precisa de uma assinatura da carteira do criador para ser executada com sucesso.

data {
 success: true,
 message: 'NFT mint request generated successfully',
 result: {
   encoded_transaction: 'AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC27JVbuNHIOEULfw1sgRQuvvJQ0IUXS/YSIqY9xmKYvrLePqCGb1KyFnPAILISfg5azLgpYsfD99Q5jCspVP8MAgAFCpXqS1o4B7cm8SUpVIGtSepqRLjd4BxsljsfhTo2dtWZxNJgpx/pX0uOUYLw72dzlimFx29mhXDNLSkv2td91yiIHz20cJSaZwOfQ8MQeB4U9MctSSdHEoMhEPzRhjgDrJYDGATvNDyoI/kL4kcQhLPqeWdwwmPzTIDLQtI2QfVmyheA5Q4iB7L3q6RRFUrXtLhJMGZ74uk9Lu7OAVAlCJ8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyXJY9OJInxuz0QKRSODYMLWhOZ2v8QhASOe9jb6fhZC3BlsePRfEU4nVJ/awTDzVi4bHMaoP21SbbRvAP4KUYGp9UXGSxcUSGMyUw9SvF/WNruCJuh/UTj29mKAAAAAAbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpfqIKPSLEnjgG9GkYttVKxRMSaOeF5IYaiSXPga0YgOcGBQIAATQAAAAAYE0WAAAAAABSAAAAAAAAAAbd9uHXZaGT2cvhRs7reawctIXtX1s3kTqM9YV+/wCpCQIBCEMAAJXqS1o4B7cm8SUpVIGtSepqRLjd4BxsljsfhTo2dtWZAZXqS1o4B7cm8SUpVIGtSepqRLjd4BxsljsfhTo2dtWZBgcABAABBQkIAAkDAQQACQcBAAAAAAAAAAcHAgEAAAAFCKIBEA4AAABUcmVuZHlTa2VsZXRvbgMAAABUU0tYAAAAaHR0cHM6Ly9uZnRzdG9yYWdlLmxpbmsvaXBmcy9iYWZrcmVpZ2syY2hncmRpc2E3YXB0dGNsZHl3bm1mNHM1azJrY2lpZHc1eHlnMnl4bTJ4NGhtYTU2NOgDAQEAAACV6ktaOAe3JvElKVSBrUnqakS43eAcbJY7H4U6NnbVmQFkAAABBwkDAQAAAAIJBQgKEQEBAAAAAAAAAA==',
   mint: 'EFJy8TKnbn7UXKK5YUacrb38KuyLB7m8mWnZ9nr9RQSb'
 }
}
Enter fullscreen mode Exit fullscreen mode

Assinando a transação

Essa encoded_transaction recebida pode ser assinada usando esta função

async function confirmTransactionFromBackend(network, encodedTransaction, privateKey) {
 const connection = new Connection(clusterApiUrl(network), 'confirmed');
 const feePayer = Keypair.fromSecretKey(decode(privateKey));
 const wallet = new NodeWallet(feePayer);
 const recoveredTransaction = Transaction.from(
   Buffer.from(encodedTransaction, 'base64')
 );
 const signedTx = await wallet.signTransaction(recoveredTransaction);
 const confirmTransaction = await connection.sendRawTransaction(
   signedTx.serialize()
 );
 return confirmTransaction;
}
Enter fullscreen mode Exit fullscreen mode

Esta função obtém na rede (devnet, testnet ou mainnet-beta), a chave privada da carteira da entidade e a encoded_transactione assina a transação usando a chave privada. Você pode ler mais sobre a assinatura de transações em nosso guia de desenvolvedores aqui. Você também pode encontrar todas as funções relacionadas à assinatura de transações no GitHub aqui. Uma vez assinada com sucesso, o NFT será criado.

Isso é praticamente tudo sobre este tutorial. Se você seguir este tutorial passo a passo, poderá criar um novo NFT com sucesso a partir do backend.

Se você gostou deste tutorial, fique à vontade para consultar nossos tutoriais de API em Building your first NFT dApp (como criar seu primeiro dApp de NFT) ou Building your own NFT marketplace (como criar seu próprio mercado de NFT).

Fontes

SHYFT API Documentation (Documentação SHYFT API)

Shyft Website

Get API Key (Obtenha a Chave API)

GitHub

Junte-se a nosso Discord

Espero que você se divirta criando aplicativos com APIs SHYFT. Feliz Hacking!! 😇

Esse artigo foi escrito pelo Team Shyft e traduzido por Fátima Lima. O original pode ser lido aqui.

Latest comments (0)