WEB3DEV Español

Delia Viloria T
Delia Viloria T

Posted on

Crea NFTs desde el Backend en Solana

Image description

Ya hemos visto cómo podemos crear NFTs desde el frontend utilizando APIs SHYFT eficientemente. A veces, podemos tener un escenario de caso de uso diferente donde tenemos todos los datos disponibles en el backend y tenemos que crear el NFT directamente desde el backend. Este tutorial muestra uno de estos escenarios de casos de uso donde creamos NFTs directamente desde el backend usando APIs SHYFT.

Requisitos previos

Autenticación: obtener tu clave API Shyft

x-api-key es un parámetro de autenticación que le da acceso a las APIs SHYFT. Puedes obtener tu propia clave API en el sitio web SHYFT. Solo tienes que registrarte con tu ID de correo electrónico aquí y lo puedes obtener de forma gratuita.

Paquetes NPM necesarios

  • path - Este paquete se utiliza para leer la imagen desde una ruta determinada.

  • axios - Este paquete se utiliza para hacer la llamada de la API. También puedes utilizar cualquier otro método o paquete según tus necesidades.

  • @solana/web3.js y @metaplex/js - Estos son necesarios para firmar la transacción desde el backend de la aplicación que está solicitando la API.

La llamada de la API

Para crear NFTs desde el backend usaremos la siguiente API:

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

Esta API acepta los siguientes detalles del NFT que deben crearse en el formato multipart/form-data:

  • network: Especifica la instancia de red Solana, que puede ser Devnet, testnet o mainnet-beta.

  • wallet: Acepta la dirección de la cartera del creador de NFT. Esta cartera tendrá el update_authority de NFT.

  • name: Nombre del NFT a crear.

  • symbol: Símbolo del NFT a crear.

  • description: Una pequeña descripción sobre el NFT que estamos creando.

  • attributes: Acepta los atributos de NFT según su tipo de característica y valor. Consulta a continuación una muestra para el formato.

  • external_url: cualquier URL externo asociado al NFT.

  • max_supply: Número de ediciones del NFT creado actualmente que se pueden acuñar. Si se establece en 0, crea NFTs únicos.

  • royalty: Especifica la regalía del creador en porcentaje, siendo un valor entre 0 - 100.

  • nft_receiver: Especifica la cartera para la cual se acuñará el NFT. Si se deja en blanco, se acuñará en la cartera cuya

  • private_key se haya proporcionado.

  • service_charge: Especifica un valor en SOL que se puede cargar al crear NFTs. Este parámetro es opcional.

Para obtener más información sobre nuestras APIs, consulta la Documentación de API SHYFT o también puedes consultar nuestra documentación aquí.

Suponiendo que tenemos todos los datos disponibles en el backend, vamos a crear un nuevo FormData object y adjuntamos todos los datos necesarios para crear el NFT. (Hemos usado datos estáticos con fines de demostración)

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 datos de Imagen

Ten en cuenta que utilizamos la función createReadStream con la ruta de la imagen para abrir y leer los datos en el archivo/stream. La función path.resolve() se utilizó para resolver la ruta relativa dada a la imagen. Alternativamente, para usar rutas absolutas como ’D:/index.png', tendremos que usar la función path.Join().

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

También podemos obtener los datos de la imagen en un formato de flujo legible desde un URI externo, pero para ello, necesitaríamos algunos pasos adicionales. Primero, tendremos que buscar los datos de la imagen en un formato de flujo legible. Algo así:

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

Una vez que esta solicitud se ha ejecutado con éxito, procederemos a adjuntar la imgData.data, al objeto FormData, de forma tal que pueda pasarse como un parámetro para hacer la llamada a la API de creación del NFT.

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

Una vez hecho esto, ahora estamos listos para hacer la llamada de la API. Usamos el paquete axios para hacer la llamada de la API, pero puedes usar cualquier otro método según tus necesidades. Además, toma en consideración que tenemos que configurar Content_type para Multipart/form-data en el encabezado y tenemos que aprobar la x-api-ke obtenida en el sitio web SHYFT.

Aquí está la llamada de la 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

Una vez ejecutado con éxito, debe devolver una respuesta algo similar a ésta. La mint devuelta en la respuesta es la dirección del NFT que se creará. La función devuelve una encoded_transaction que necesita una firma de la cartera del creador para ejecutarse con éxito.

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

Firmando la transacción

Esta encoded_transaction recibida se puede firmar con esta función

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 función obtiene en la red (Devnet, testnet o mainnet-beta), la clave privada de la cartera de la entidad y la encoded_transaction y firma la transacción utilizando la clave privada. Puedes leer más sobre la firma de transacciones en nuestra guía para desarrolladores aquí. También puedes encontrar todas las funciones relacionadas con la firma de transacciones en GitHub aquí. Una vez firmado con éxito, se creará el NFT.

Esto es casi todo acerca de este tutorial. Si sigues este tutorial paso a paso, podrás crear un nuevo NFT con éxito desde el backend.

Si te ha gustado este tutorial, no dudes en consultar nuestros tutoriales de API en Building your first NFT dApp (cómo crear tu primer dApp de NFT) o Building your Own NFT Marketplace (cómo crear tu propio mercado de NFT).

Fuentes

SHYFT API Documentation (Documentación SHYFT API)

Shyft Website

Get API Key (Obtenga la clave API)

GitHub

Únete a nuestro https://discord.com/invite/VS5ThWVRMn

Espero que te diviertas creando aplicaciones con API SHYFT.
¡Feliz Hacking! 😇

Este artículo fue escrito por el Team Shyft y traducido por Delia Viloria T. El original lo puedes leer aquí.

Si prefieres puedes escribirnos en Twitter a @web3dev_es.

Discussion (0)