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 (contratos inteligentes) definen la lógica de negocio para lo que cada instrucción hace. Cuando envías una transacción, el entorno de ejecución de Solana ejecuta cada instrucción en secuencia y de forma atómica (lo que significa que todas las instrucciones tienen éxito o toda la transacción falla).

Esta sección cubre los siguientes ejemplos:

  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 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 su 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}`);
const senderBalance = await connection.getBalance(sender.publicKey);
const receiverBalance = await connection.getBalance(receiver.publicKey);
console.log("Sender Balance:", `${senderBalance}`);
console.log("Receiver Balance:", `${receiverBalance}`);
Console
Click to execute the code.

Crea un Connection para manejar el envío de transacciones y la obtención de datos de cuentas.

En este ejemplo, nos conectamos al validador de prueba local que se ejecuta en localhost:8899.

Connection
const connection = new Connection("http://localhost:8899", "confirmed");

Genera nuevos keypairs para usar como cuentas de remitente y receptor.

Un Keypair incluye:

  • Una clave pública que sirve como dirección de la cuenta
  • Una clave privada utilizada para firmar transacciones
Generate Keypairs
const sender = new Keypair();
const receiver = new Keypair();

Antes de poder transferir SOL, la cuenta del remitente necesita tener saldo de SOL.

En redes que no sean la mainnet, puedes usar el método requestAirdrop para obtener SOL para pruebas.

Airdrop
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.

Transfer Instruction
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.

Transaction
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.

Send Transaction
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.

Crea un Connection para manejar el envío de transacciones y la obtención de datos de cuentas.

En este ejemplo, nos conectamos al validador de prueba local que se ejecuta en localhost:8899.

Connection
const connection = new Connection("http://localhost:8899", "confirmed");

Genera nuevos keypairs para usar como cuentas de remitente y receptor.

Un Keypair incluye:

  • Una clave pública que sirve como dirección de la cuenta
  • Una clave privada utilizada para firmar transacciones
Generate Keypairs
const sender = new Keypair();
const receiver = new Keypair();

Antes de poder transferir SOL, la cuenta del remitente necesita tener saldo de SOL.

En redes que no sean la mainnet, puedes usar el método requestAirdrop para obtener SOL para pruebas.

Airdrop
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.

Transfer Instruction
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.

Transaction
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.

Send Transaction
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.

Transfer SOL
import {
LAMPORTS_PER_SOL,
SystemProgram,
Transaction,
sendAndConfirmTransaction,
Keypair,
Connection
} from "@solana/web3.js";
const connection = new Connection("http://localhost:8899", "confirmed");

Crear un token

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

  1. Invocar el System Program 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,
getMint
} 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("Transaction Signature:", `${transactionSignature}`);
const mintData = await getMint(
connection,
mint.publicKey,
"confirmed",
TOKEN_2022_PROGRAM_ID
);
);
Console
Click to execute the code.

Crear un token en Solana requiere usar tanto la biblioteca @solana/web3.js como @solana/spl-token.

  • Crear una conexión
  • Generar un keypair para pagar la transacción
  • Solicitar un airdrop para financiar el keypair
Connection & Wallet Setup
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 de este keypair se utilizará como la dirección para la cuenta mint.

Mint Keypair
const mint = new Keypair();

Calcula los lamports mínimos requeridos para una cuenta mint.

La función getMinimumBalanceForRentExemptMint calcula exactamente cuánto SOL (en lamports) debe asignarse para los datos en una cuenta mint.

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

La primera instrucción invoca la instrucción createAccount del System Program para:

  1. Asignar los bytes requeridos para almacenar datos del mint
  2. Transferir lamports desde la billetera 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
});

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
Initialize Mint Instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2,
wallet.publicKey,
wallet.publicKey,
TOKEN_2022_PROGRAM_ID
);

Añade ambas instrucciones a una sola transacción.

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 cuando se construyen transacciones más complejas en Solana, ya que garantiza que todas las instrucciones se ejecuten juntas.

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

Firma y envía la transacción. Se requieren dos firmas:

  • Wallet firma como pagador de las tarifas de transacción y la creación de la cuenta
  • Mint firma para autorizar el uso de su dirección para la nueva cuenta
Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet,
mint
]
);

La firma de transacción devuelta puede usarse para inspeccionar la transacción en Solana Explorer.

Crear un token en Solana requiere usar tanto la biblioteca @solana/web3.js como @solana/spl-token.

  • Crear una conexión
  • Generar un keypair para pagar la transacción
  • Solicitar un airdrop para financiar el keypair
Connection & Wallet Setup
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 de este keypair se utilizará como la dirección para la cuenta mint.

Mint Keypair
const mint = new Keypair();

Calcula los lamports mínimos requeridos para una cuenta mint.

La función getMinimumBalanceForRentExemptMint calcula exactamente cuánto SOL (en lamports) debe asignarse para los datos en una cuenta mint.

Rent Exemption
const rentExemptionLamports =
await getMinimumBalanceForRentExemptMint(connection);

La primera instrucción invoca la instrucción createAccount del System Program para:

  1. Asignar los bytes requeridos para almacenar datos del mint
  2. Transferir lamports desde la billetera 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
});

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
Initialize Mint Instruction
const initializeMintInstruction = createInitializeMint2Instruction(
mint.publicKey,
2,
wallet.publicKey,
wallet.publicKey,
TOKEN_2022_PROGRAM_ID
);

Añade ambas instrucciones a una sola transacción.

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 cuando se construyen transacciones más complejas en Solana, ya que garantiza que todas las instrucciones se ejecuten juntas.

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

Firma y envía la transacción. Se requieren dos firmas:

  • Wallet firma como pagador de las tarifas de transacción y la creación de la cuenta
  • Mint firma para autorizar el uso de su dirección para la nueva cuenta
Send Transaction
const transactionSignature = await sendAndConfirmTransaction(
connection,
transaction,
[
wallet,
mint
]
);

La firma de transacción devuelta puede usarse para inspeccionar la transacción en Solana Explorer.

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,
getMint
} from "@solana/spl-token";
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");

Is this page helpful?

Tabla de Contenidos

Editar Página