Skip to main content

Como crear un NFT en Solana

Updated on
Jul 3, 2023

10 min read

Introducci贸n

隆Hola querido lector! Bienvenidos a una nueva gu铆a de Solana.

Solana es una blockchain que promete mucho a la hora de intentar resolver los problemas de escalabilidad que podemos apreciar en otras blockchains, como Ethereum por ejemplo.

En esta gu铆a, explicaremos paso a paso c贸mo crear un NFT en la red Solana.

Requisitos:

  • NodeJS instalado
  • Saber usar la Terminal / CLI
  • Editor de texto

驴Qu茅 es Solana?

Solana tiene un objetivo muy particular, escalar la tecnolog铆a blockchain para una adopci贸n global. Solana Labs, los desarrolladores detr谩s de Solana Protocol, est谩n haciendo unas cuantas cosas para poder alcanzar este sue帽o.

La tecnolog铆a de blockchain tiene unas cuantas vueltas cuando se trata de ser m谩s performante. Una de ellas, es el mecanismo de consenso, que es la forma en la que los nodos se comunican entre s铆 y llegan a una conclusi贸n id茅ntica para toda la red. Bitcoin utiliza un mecanismo conocido como Proof of Work (Prueba de Trabajo) o POW, BNB Smart Chain, tambien conocida como BSC, utiliza el mecanismo Proof of Staked Authority o PoSA, Ethereum esta actualmente migrando hacia Proof of Stake o Pos. Como puedes ver, el consenso no es un juego resuelto en este punto de la historia.

Solana utiliza un mecanismo de consenso llamado Proof of History, que funciona por medio de una marca de tiempo, cada transaccion tiene una marca de tiempo que permite su verificacion como una transaccion legitima por el resto de la red en cuestion de una fraccion de segundo.

Solana contiene ocho tecnolog铆as principales que ellos mismos destacan de haberlos puesto en posici贸n de ser las mas rapida, mas escalable y la m谩s segura de todas las blockchains existentes.

Conectando con Solana

Nosotros usaremos Solana Devnet en esta gu铆a. Solana tiene 3 redes diferentes, la principal (mainnet), la de testing (testnet) y otra m谩s de desarrollo (devnet). La 煤ltima, la devnet es un entorno de muy bajo riesgo donde puedes darte a ti mismo SOL (el token de SOLANA).

Antes de conectarnos a la devnet, necesitaremos realizar unos pasos para crear nuestro directorio e instalar las librer铆as principales.

mkdir SolanaNFT
cd SolanaNFT
touch index.js
npm i @solana/web3.js @solana/spl-token

Esta secuencia de comandos crear谩 una nueva carpeta con el nombre SolanaNFT, entrar a esa nueva carpeta, crear un archivo llamado index.js e instalar dos librer铆as: @solana/web3.js @solana/spl-token

Con esto hecho, podemos comenzar a escribir un poco de Javascript para conectarnos a Solana! En el siguiente c贸digo, podemos observar c贸mo conectarnos Solana.

var web3 = require('@solana/web3.js');
var splToken = require('@solana/spl-token');
(async () => {
// Conectar al cluster
var connection = new web3.Connection(
web3.clusterApiUrl("devnet"),
'confirmed',
);
})

En las primeras dos l铆neas, estamos importando las librer铆as que instalamos al principio.

En la funci贸n, puedes ver que creamos una nueva instancia connection, acepta dos argumentos, el primero es la URL donde apunta a la red de Solana. En este caso, utilizamos un m茅todo muy conveniente web3.clusterApiUrl("devnet") para apuntar hacia la devnet de Solana.

Con la conexi贸n establecida, ahora podemos crear el NFT y realizar los dem谩s pasos necesarios.

Creando el NFT

Esta es la parte divertida! La novedad que est谩 barriendo a toda la comunidad, el 煤nico e incomparable NFT! NFT, la abreviaci贸n para Non Fungible Token (Token no fungible), es un hash criptogr谩fico que es 煤nico e irreplicable. Cuando se crea un NFT, es muy similar a crear un ERC20. Sin embargo, la diferencia primordial es que solamente se puede crear ese NFT una sola vez.

Para crear nuestro propio NFT, vamos a tener que replicar una serie de pasos. Podemos ver esta lista ahora y luego introducirnos a como programarla.

Lo que necesitaremos hacer:

  1. Crear una cuenta con una billetera para crear el NFT.
  2. Crear una cuenta con una billetera para enviarle el NFT.
  3. Crear el NFT y enviarlo.

Nota: Cada uno de los bloques de c贸digo van debajo del anterior, todo dentro de la funci贸n as铆ncrona.

Por lo general, el principio es un buen lugar para empezar. Comenzando por la creaci贸n de la wallet y la creaci贸n del NFT

// Generar una nueva wallet y generar nuevo SOL para esa wallet.
var fromWallet = web3.Keypair.generate();
var fromAirdropSignature = await connection.requestAirdrop(
fromWallet.publicKey,
web3.LAMPORTS_PER_SOL,
);
// Esperar por la confirmaci贸n de la generaci贸n de SOL hacia la wallet
await connection.confirmTransaction(fromAirdropSignature);
// Crear un nuevo NFT
let mint = await splToken.Token.createMint(
connection,
fromWallet,
fromWallet.publicKey,
null,
9,
splToken.TOKEN_PROGRAM_ID,
);
// Obtener la cuenta del token desde la variable fromWallet que representa la direcci贸n en Solana, si no existe, la crea
let fromTokenAccount = await mint.getOrCreateAssociatedAccountInfo(
fromWallet.publicKey,
);

He realizado un comentario en cada parte del c贸digo, pero vamos a revisar cada m茅todo y profundizar en los detalles sobre qu茅 par谩metros hay y cual es la funci贸n que cumplen.

  1. fromWallet - Crea un nuevo par de llaves p煤blicas y privadas con el m茅todo Keypair.generate()
  2. fromAirDropSignature - El m茅todo requestAirdrop() toma una llave p煤blica, una cantidad de lamports en SOL que quieres recibir. Lamports es el equivalente al wei de Ethereum pero en Solana, es la cantidad m谩s peque帽a en la que puede dividirse SOL. La mayor铆a de los m茅todos que requieren una cantidad, lo har谩n en lamports. En nuestro caso, LAMPORTS_PER_SOL es una constante que representa 1 SOL en lamports.
  3. confirmTransaction - Este m茅todo nos permite pasar una transacci贸n firmada como par谩metro y hacer que el programa espere hasta que sea confirmada sin que se ejecute ning煤n c贸digo posterior. Esto es importante porque en el siguiente paso vamos a requerir de pagar comisiones y por lo tanto, necesitamos tener SOL en nuestra wallet.
  4. mint - La funci贸n createMint es la que se encarga de crear nuestro token. Recibe 6 argumentos.
    • La conexi贸n con la red Solana (connection)
    • La cuenta que pagar谩 las comisiones (fromWallet)
    • La llave p煤blica de la cuenta que tiene la autoridad para mintear (generar) los tokens de este tipo (fromWallet.publicKey)
    • La llave p煤blica de la cuenta que tiene la autoridad para congelar los tokens de este tipo. Este argumento es opcional (null)
    • El 'program id' del token, puedes leer mucho mas sobre que son estos 'program id' aqui
  5. fromTokenAccount - Esto crea o pide la cuenta asociada a la llave p煤blica fromWallet.publicKey. Puedes ver la cadena de custodia como: NFT reside en la cuenta, y tu billetera (wallet) es due帽a de esa cuenta.

Cadena de custodia: Llaves -> Wallet -> Cuenta

Con esto ya revisado, podemos movernos hacia el paso 2!

Ya tenemos una cuenta para enviar los NFT, ahora necesitamos una cuenta para recibir con los NFT.

Vamos al c贸digo para lograr esto:

// Generar una nueva wallet para recibir el reci茅n creado token
var toWallet = web3.Keypair.generate();
// Obtener la cuenta del token de la direccion "toWallet", si no existe, se crea
var toTokenAccount = await mint.getOrCreateAssociatedAccountInfo(
toWallet.publicKey,
);

No hemos hecho demasiado en estos pasos. Repetimos los m茅todos que usamos anteriormente, por lo tanto, no voy a entrar en detalles aqu铆. El bloque de c贸digo anterior crea una wallet con una juego separado de llaves p煤blicas/privadas y tambi茅n, crea una nueva cuenta que est谩 enlazada a nuestra variable mint.

Con estos dos pasos completados, podemos movernos hacia el paso n煤mero 3.

Es momento de crear de mintear el NFT y enviarlo!

// Minteando 1 nuevo token hacia "fromTokenAccount" 
await mint.mintTo(
fromTokenAccount.address, //donde va a ir
fromWallet.publicKey, // quien tiene la autoridad de crear el token
[], // multisig
1000000000, // Cuanto
);
await mint.setAuthority(
mint.publicKey,
null,
"MintTokens",
fromWallet.publicKey,
[]
)
// Crear la transacci贸n
var transaction = new web3.Transaction().add(
splToken.Token.createTransferInstruction(
splToken.TOKEN_PROGRAM_ID,
fromTokenAccount.address,
toTokenAccount.address,
fromWallet.publicKey,
[],
1,
),
);
// Firmar la transacci贸n, emitirla y confirmar que se ha realizado con 茅xito
var signature = await web3.
sendAndConfirmTransaction(
connection,
transaction,
[fromWallet],
{commitment: 'confirmed'},
);
console.log('SIGNATURE', signature);

隆Espectacular! Dos nuevos m茅todos se encargan de la l贸gica para crear el NFT y los permisos del token. Los metodos sendAndConfirmTransaction() y Transaction().add() ya han sido explicados anteriormente en una guia anterior, si no estas familiarizado con esta guia, aqui la dejo: How to send a transaction in Solana, puede que quieras observar esta guia un poco para ver de que se trata.

Entonces, hay dos m茅todos para explicar, empecemos:

  1. mintTo() - Este m茅todo toma el token creado y crea algunos. Acepta 4 argumentos:
  1. El destino: es la direcci贸n de la cuenta que va a recibir el token (fromTokenAccount.address) b. Es la llave p煤blica de quien tiene autoridad sobre el token. (fromWallet.publicKey) c. Aqu铆 es donde puedes pasar m煤ltiples direcciones que firman la transacci贸n, si tienes configurado el token para que sea multicuenta. En nuestro caso, no es as铆, por lo tanto pasamos un array vac铆o. d. Cu谩ntos tokens queremos enviar. Como tenemos 9 decimales en este token en particular, estamos enviado exactamente 1 token a la direcci贸n. (1000000000)
  1. setAuthority() - Esta es la parte m谩s crucial de todo este proceso. Esta funci贸n va a revocar el privilegio para crear tokens y asegurarse de que no podamos crear m谩s token adicionales de este tipo. Esta acci贸n no se puede revertir y toma 5 argumentos:
  1. La cuenta del token (mint.publicKey) b. La nueva autoridad (null) c. El tipo de autoridad que la cuenta tiene actualmente (MintTokens) d. La llave p煤blica de quien guarda actualmente el token (fromWallet.publicKey) e. Una colecci贸n de cuentas que pueden firmar. En nuestro caso, un array vac铆o. ([])

Con todo esto cubierto, la unica accion que nos queda por realizar es mirar el Explorador de Solana en Devnet

Si observas un poco m谩s abajo, puedes ver como la cuenta tiene ahora exactamente 1 token y como hemos deshabilitado la posibilidad de crear nuevos tokens, ahora representa un NFT. Es oficialmente un token 煤nico en s铆 mismo!

Para evitar estar copiando cada bloque de c贸digo, voy a incluir uno con todo el c贸digo junto, por si acaso llegas a tener un inconveniente para poner todo junto

var web3 = require('@solana/web3.js');
var splToken = require('@solana/spl-token');
(async () => {
// Connect to cluster
var connection = new web3.Connection(
web3.clusterApiUrl("devnet"),
'confirmed',
);
// Generate a new wallet keypair and airdrop SOL
var fromWallet = web3.Keypair.generate();
var fromAirdropSignature = await connection.requestAirdrop(
fromWallet.publicKey,
web3.LAMPORTS_PER_SOL,
);
//wait for airdrop confirmation
await connection.confirmTransaction(fromAirdropSignature);
//create new token mint
let mint = await splToken.Token.createMint(
connection,
fromWallet,
fromWallet.publicKey,
null,
9,
splToken.TOKEN_PROGRAM_ID,
);
//get the token account of the fromWallet Solana address, if it does not exist, create it
let fromTokenAccount = await mint.getOrCreateAssociatedAccountInfo(
fromWallet.publicKey,
);
// Generate a new wallet to receive newly minted token
var toWallet = web3.Keypair.generate();
//get the token account of the toWallet Solana address, if it does not exist, create it
var toTokenAccount = await mint.getOrCreateAssociatedAccountInfo(
toWallet.publicKey,
);
//minting 1 new token to the "fromTokenAccount" account we just returned/created
await mint.mintTo(
fromTokenAccount.address, //who it goes to
fromWallet.publicKey, // minting authority
[], // multisig
1000000000, // how many
);
await mint.setAuthority(
mint.publicKey,
null,
"MintTokens",
fromWallet.publicKey,
[]
)
// Add token transfer instructions to transaction
var transaction = new web3.Transaction().add(
splToken.Token.createTransferInstruction(
splToken.TOKEN_PROGRAM_ID,
fromTokenAccount.address,
toTokenAccount.address,
fromWallet.publicKey,
[],
1,
),
);
// Sign transaction, broadcast, and confirm
var signature = await web3.sendAndConfirmTransaction(
connection,
transaction,
[fromWallet],
{commitment: 'confirmed'},
);
console.log('SIGNATURE', signature);
})();

Conclusi贸n

Si has llegado hasta aqu铆, has aprendido algunas cosas de este tutorial y te has divertido un poco con nuestras gu铆as de Solana, as铆 que, felicitaciones! Siguiendo esta gu铆a, has creado un NFT en la Blockchain de Solana exitosamente. El siguiente paso que deber谩s seguir, es enlazar este token 煤nico e irrepetible con algo espec铆fico. En el mercado actual, esto es com煤nmente una imagen que ha sido generada aleatoriamente con varias propiedades o una pieza 煤nica de arte. Si quieres aprender como hacer exactamente esto, puedes hacerlo en este tutorial!

Suscribete a nuestro newsletter para m谩s art铆culos y gu铆as en Ethereum. Si tienes alg煤n tipo de comentario, se libre de comentarlos en nuestro Twitter. Siempre puedes hablar con nosotros en nuestro servidor de Discord, puedes encontrar algunos de los m谩s geniales desarrolladores.

Share this guide