Escribiendo en la red
En la sección anterior, aprendiste cómo leer datos de la red Solana. Ahora aprenderás cómo escribir datos en ella. Escribir en la red Solana implica enviar transacciones que contienen una o más instrucciones.
Los programas definen la lógica de negocio para lo que hace cada instrucción. Cuando envías una transacción, el runtime de Solana ejecuta cada instrucción en secuencia y de forma atómica. Los ejemplos en esta sección muestran cómo construir y enviar transacciones para invocar programas de Solana, estos incluyen:
- Transferir SOL entre cuentas
- Crear un nuevo token
Transferir SOL
El siguiente ejemplo transfiere SOL entre dos cuentas. Cada cuenta tiene un programa propietario, que es el único programa que puede reducir el saldo de SOL de la cuenta.
Todas las cuentas de billetera son propiedad del System Program. Para transferir SOL, debes invocar la instrucción transfer del System Program.
import {LAMPORTS_PER_SOL,SystemProgram,Transaction,sendAndConfirmTransaction,Keypair,Connection} from "@solana/web3.js";const connection = new Connection("http://localhost:8899", "confirmed");const sender = new Keypair();const receiver = new Keypair();const signature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: receiver.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});const transaction = new Transaction().add(transferInstruction);const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[sender]);console.log("Transaction Signature:", `${transactionSignature}`);const senderBalance = await connection.getBalance(sender.publicKey);const receiverBalance = await connection.getBalance(receiver.publicKey);console.log("Sender Balance:", `${senderBalance}`);console.log("Receiver Balance:", `${receiverBalance}`);
Crea un Connection para manejar el envío de transacciones y la obtención de
datos de cuentas.
En este ejemplo, nos estamos conectando al validador de prueba local que se
ejecuta en localhost:8899.
const connection = new Connection("http://localhost:8899", "confirmed");
Genera nuevos pares de claves para usar como cuentas de emisor y receptor.
const sender = new Keypair();const receiver = new Keypair();
Añade SOL a la cuenta del emisor. En redes que no sean la red principal, puedes
usar el método requestAirdrop para obtener SOL para pruebas.
const signature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");
El método SystemProgram.transfer() crea una instrucción que transfiere SOL
desde la cuenta fromPubkey a la cuenta
toPubkey por la cantidad especificada de
lamports.
const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: receiver.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});
Crea una transacción y añade la instrucción a la transacción. En este ejemplo, estamos creando una transacción con una sola instrucción. Sin embargo, puedes añadir múltiples instrucciones a una transacción.
const transaction = new Transaction().add(transferInstruction);
Firma y envía la transacción a la red. El keypair del remitente es necesario en el array de firmantes para autorizar la transferencia de SOL desde su cuenta.
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[sender]);
La firma de la transacción es un identificador único que puede utilizarse para buscar la transacción en Solana Explorer.
Crear un token
El siguiente ejemplo crea un nuevo token en Solana utilizando el Token Extensions Program. Esto requiere dos instrucciones:
- Invocar el System Program para crear una nueva cuenta.
- Invocar el Token Extensions Program para inicializar esa cuenta como un Mint.
import {Connection,Keypair,SystemProgram,Transaction,sendAndConfirmTransaction,LAMPORTS_PER_SOL} from "@solana/web3.js";import {MINT_SIZE,TOKEN_2022_PROGRAM_ID,createInitializeMint2Instruction,getMinimumBalanceForRentExemptMint,getMint} from "@solana/spl-token";const connection = new Connection("http://localhost:8899", "confirmed");const wallet = new Keypair();// Fund the wallet with SOLconst signature = await connection.requestAirdrop(wallet.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");// Generate keypair to use as address of mint accountconst mint = new Keypair();// Calculate lamports required for rent exemptionconst rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);// Instruction to create new account with space for new mint accountconst createAccountInstruction = SystemProgram.createAccount({fromPubkey: wallet.publicKey,newAccountPubkey: mint.publicKey,space: MINT_SIZE,lamports: rentExemptionLamports,programId: TOKEN_2022_PROGRAM_ID});// Instruction to initialize mint accountconst initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2, // decimalswallet.publicKey, // mint authoritywallet.publicKey, // freeze authorityTOKEN_2022_PROGRAM_ID);// Build transaction with instructions to create new account and initialize mint accountconst transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet, // payermint // mint address keypair]);console.log("Transaction Signature:", `${transactionSignature}`);const mintData = await getMint(connection,mint.publicKey,"confirmed",TOKEN_2022_PROGRAM_ID););
Crear un token requiere usar tanto las bibliotecas @solana/web3.js como
@solana/spl-token. El código en el ejemplo a continuación:
- Creará una conexión
- Generará un keypair para pagar la transacción
- Solicitará un airdrop para financiar el keypair
const connection = new Connection("http://localhost:8899", "confirmed");const wallet = new Keypair();const signature = await connection.requestAirdrop(wallet.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(signature, "confirmed");
Genera un keypair para la cuenta mint. La clave pública se utilizará como la dirección de la cuenta mint.
const mint = new Keypair();
Calcula los lamports mínimos requeridos para una cuenta mint. La función
getMinimumBalanceForRentExemptMint calcula cuántos lamports deben asignarse
para los datos en una cuenta mint.
const rentExemptionLamports =await getMinimumBalanceForRentExemptMint(connection);
La primera instrucción invoca la instrucción createAccount del System Program
para:
- Asignar el número de bytes necesarios para almacenar los datos del mint.
- Transferir lamports desde la billetera para financiar la nueva cuenta.
- Asignar la propiedad de la cuenta al Token Extensions Program.
const createAccountInstruction = SystemProgram.createAccount({fromPubkey: wallet.publicKey,newAccountPubkey: mint.publicKey,space: MINT_SIZE,lamports: rentExemptionLamports,programId: TOKEN_2022_PROGRAM_ID});
La segunda instrucción invoca la instrucción createInitializeMint2Instruction
del Token Extensions Program para inicializar la cuenta
mint con los siguientes datos:
- 2 decimales
- Billetera como autoridad de emisión y autoridad de congelación
const initializeMintInstruction = createInitializeMint2Instruction(mint.publicKey,2,wallet.publicKey,wallet.publicKey,TOKEN_2022_PROGRAM_ID);
Añade ambas instrucciones a una sola transacción. Esto asegura que la creación de la cuenta y la inicialización ocurran de forma atómica. (O ambas instrucciones tienen éxito, o ninguna lo tiene.)
Este enfoque es común al construir transacciones complejas en Solana, ya que garantiza que todas las instrucciones se ejecuten juntas.
const transaction = new Transaction().add(createAccountInstruction,initializeMintInstruction);
Firma y envía la transacción. Se requieren dos firmas:
- La cuenta billetera firma como pagador de las comisiones de transacción y la creación de la cuenta
- La cuenta mint firma para autorizar el uso de su dirección para la nueva cuenta
const transactionSignature = await sendAndConfirmTransaction(connection,transaction,[wallet,mint]);
La firma de transacción devuelta puede utilizarse para inspeccionar la transacción en Solana Explorer.
Is this page helpful?