Escribiendo en la red

En la sección anterior, aprendiste cómo leer datos de la red Solana. Ahora explora cómo escribir datos en ella. Escribir en la red Solana implica enviar transacciones que contienen una o más instrucciones.

Los programas (contratos inteligentes) procesan estas instrucciones según su lógica de negocio para cada instrucción respectiva. Cuando envías una transacción, el runtime de Solana ejecuta cada instrucción en secuencia y de forma atómica (lo que significa que o todas las instrucciones tienen éxito o toda la transacción falla).

En esta sección, verás dos ejemplos básicos:

  1. Transferir SOL entre cuentas
  2. Crear un nuevo token

Estos ejemplos muestran cómo construir y enviar transacciones para invocar programas de Solana. Para más detalles, consulta las páginas de Transacciones e Instrucciones y Tarifas en Solana.

Transferir SOL

En este ejemplo, aprenderás cómo transferir SOL entre dos cuentas.

En Solana, cada cuenta tiene un programa específico como propietario. Solo el programa propietario puede deducir el saldo de SOL (lamport) de una cuenta.

El System Program es el propietario de todas las cuentas "monedero". Para transferir SOL, debes invocar la instrucción transfer del System Program.

Transfer SOL
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}`);
Click to execute the code.

Estos son los pasos para construir transacciones para interactuar con cualquier programa en Solana.

Crea la instrucción que quieres invocar.

Instruction
const transferInstruction = SystemProgram.transfer({
fromPubkey: sender.publicKey,
toPubkey: receiver.publicKey,
lamports: 0.01 * LAMPORTS_PER_SOL
});

Añade la instrucción a una transacción:

Transaction
const transaction = new Transaction().add(transferInstruction);

Firma y envía la transacción:

Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[sender] // signer keypair
);

Crear un token

En este ejemplo, aprenderás cómo crear un nuevo token en Solana usando el Token Extensions Program. Esto requiere dos instrucciones:

  1. Invocar el Programa del Sistema para crear una nueva cuenta.
  2. Invocar el Token Extensions Program para inicializar esa cuenta como un Mint.
Create Mint Account
import {
Connection,
Keypair,
SystemProgram,
Transaction,
sendAndConfirmTransaction,
LAMPORTS_PER_SOL
} from "@solana/web3.js";
import {
MINT_SIZE,
TOKEN_2022_PROGRAM_ID,
createInitializeMint2Instruction,
getMinimumBalanceForRentExemptMint
} from "@solana/spl-token";
const connection = new Connection("http://localhost:8899", "confirmed");
const wallet = new Keypair();
// Fund the wallet with SOL
const signature = await connection.requestAirdrop(
wallet.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");
// Generate keypair to use as address of mint account
const mint = new Keypair();
// Calculate lamports required for rent exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);
// Instruction to create new account with space for new mint account
const createAccountInstruction = SystemProgram.createAccount({
fromPubkey: wallet.publicKey,
newAccountPubkey: mint.publicKey,
space: MINT_SIZE,
lamports: rentExemptionLamports,
programId: TOKEN_2022_PROGRAM_ID
});
// Instruction to initialize mint account
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2, // decimals
wallet.publicKey, // mint authority
wallet.publicKey, // freeze authority
TOKEN_2022_PROGRAM_ID
);
// Build transaction with instructions to create new account and initialize mint account
const transaction = new Transaction().add(
createAccountInstruction,
initializeMintInstruction
);
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet, // payer
mint // mint address keypair
]
);
console.log("Mint Account:", `${mint.publicKey}`);
console.log("Transaction Signature:", `${transactionSignature}`);
Click to execute the code.

Aquí hay un desglose paso a paso de lo que hace el ejemplo:

Crear una conexión y financiar la billetera

Connection and Wallet
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");

Generar un keypair para la cuenta Mint

Mint Keypair
const mint = new Keypair();

Calcular los lamports mínimos para la exención de rent

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

Crear una instrucción para crear una nueva cuenta

  1. Asignar el espacio requerido para almacenar datos de mint
  2. Transferir lamports desde la wallet para financiar la nueva cuenta
  3. Asignar la propiedad de la cuenta al programa Token Extensions (TOKEN_2022_PROGRAM_ID)
Create Account Instruction
const createAccountInstruction = SystemProgram.createAccount({
fromPubkey: wallet.publicKey,
newAccountPubkey: mint.publicKey,
space: MINT_SIZE,
lamports: rentExemptionLamports,
programId: TOKEN_2022_PROGRAM_ID
});

Crear una instrucción para inicializar la cuenta Mint

Initialize Mint Instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2, // decimals
wallet.publicKey, // mint authority
wallet.publicKey, // freeze authority
TOKEN_2022_PROGRAM_ID
);

Añadir ambas instrucciones a una transacción

Build Transaction
const transaction = new Transaction().add(
createAccountInstruction,
initializeMintInstruction
);

Enviar y confirmar la transacción con ambos firmantes requeridos

Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[wallet, mint]
);

Imprimir la cuenta Mint y la firma de la transacción

Output
console.log("Mint Account:", `${mint.publicKey}`);
console.log("Transaction Signature:", `${transactionSignature}`);

Al combinar ambas instrucciones en una sola transacción, te aseguras de que la creación e inicialización de la cuenta ocurran de forma atómica. O ambas instrucciones tienen éxito, o ninguna lo tiene. Este enfoque es común al construir transacciones más complejas en Solana, ya que garantiza que todas las instrucciones se ejecuten juntas.

Is this page helpful?

Tabla de Contenidos

Editar Página