Uso de la operación de escritura para enviar una transacción
Audiencia: Desarrolladores listos para realizar su primera operación de cambio de estado.
Requisitos previos: Una billetera Sui Devnet financiada y una configuración básica de Node.js.
Objetivo: Escribir un script para transferir tokens Sui a otra dirección, entendiendo el papel de Gas y Firmas.
Introducción
En nuestros tutoriales anteriores, realizamos operaciones de lectura. Pedíamos información al SuiClient (el dependiente), que era libre y anónima.
Ahora, vamos a realizar una operación de escritura. Vamos a transferir tokens Sui de su cartera a otra dirección. Como esto cambia el estado del blockchain, se aplican dos nuevos requisitos:
- Firma: Debes firmar criptográficamente la solicitud para demostrar que eres el propietario de los fondos.
- Gas (Franqueo): Debes pagar una tarifa en tokens Sui para compensar a la red por procesar la transacción.
Requisitos previos
Para este tutorial, no puedes usar un endpoint público aleatorio solo. Necesitas:
- Una billetera financiada: Una frase de recuperación de 12 palabras para una billetera que tenga tokens Sui Devnet.
- La Biblioteca de Pares de Claves Ed25519: Para firmar la transacción.
Instale el paquete de criptografía requerido (si aún no lo ha hecho):
npm install @mysten/sui
En una aplicación real, nunca codifiques tu clave privada o frase de recuperación. Utiliza siempre variables de entorno (por ejemplo,
.env). Para este tutorial, usaremos una variable por simplicidad, pero no confirmes este código en GitHub.
Guía paso a paso
1: Importar herramientas y configurar el cliente
Crea un archivo llamado transfer.js. Necesitamos el SuiClient para la conexión y Ed25519Keypair para actuar como nuestro "bolígrafo" para firmar.
import { SuiClient, getFullnodeUrl } from '@mysten/sui/client';
import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';
import { Transaction } from '@mysten/sui/transactions';
// 1. Conectarse a Devnet
const client = new SuiClient({ url: getFullnodeUrl('devnet') });
// 2. Carga tu Cartera (El Remitente)
// SUSTITUYE ESTO por tu frase mnemotécnica real de 12 palabras
const MNEMONIC = "word1 word2 word3 ... word12";
const keypair = Ed25519Keypair.deriveKeypair(MNEMONIC);
const senderAddress = keypair.getPublicKey().toSuiAddress();
console.log(`📦 Dirección del remitente: ${senderAddress}`);
2: Construir el "Paquete" (transacción)
En Sui, no envías comandos sin procesar. Construyes una Transacción. Piensa en esto como llenar la etiqueta de envío y poner los artículos en la caja antes de sellarla.
Usaremos el comando tx.splitCoins. Esto le dice a la red: "Toma mi moneda SUI principal, divide una cantidad específica y prepárala para transferir."
// 3. Define el Destinatario
const RECIPIENT = '0x9999...'; // Sustituye por la dirección de un amigo o una dirección de quema
// 4. Crea el Contenedor de la Transacción
const tx = new Transaction();
// Divide 1000 MIST (la unidad más pequeña de SUI) de la moneda de gas
const [coinToSend] = tx.splitCoins(tx.gas, [1000]);
// Transfiere la moneda dividida al destinatario
tx.transferObjects([coinToSend], RECIPIENT);
3: Firmar, pagar el franqueo y enviar
Este es el paso crítico donde se calcula el Gas.
Cuando ejecutas el código de abajo, el SuiClient:
- Estima el Gas: Mira tu caja
tx, la pesa (complejidad computacional), y determina el franqueo necesario. - Firma: Utiliza tu
keypairpara firmar criptográficamente la transacción. - Ejecuta: Envía la transacción firmada a la red.
async function sendTransaction() {
try {
console.log("📝 Firmando y enviando transacción...");
const result = await client.signAndExecuteTransactionBlock({
signer: keypair,
transactionBlock: tx,
});
console.log("✅ ¡Transacción Enviada!");
console.log(`Digest (ID de seguimiento): ${result.digest}`);
} catch (error) {
console.error("❌ Transacción Fallida:", error);
}
}
sendTransaction();
Entendiendo el gas en esta transacción
Puede que notes que no establecimos explícitamente un monto para la comisión.
- Presupuesto Automático: Por defecto, el SDK estima automáticamente el costo del gas por ti. Asegura que no pagues de más significativamente mientras proporciona suficiente para que la transacción sea procesada.
- La Fuente de Pago: El SDK selecciona automáticamente un objeto de moneda Sui de tu billetera para pagar esta comisión. Por eso no puedes enviar todo tu Sui; siempre debes dejar una pequeña cantidad para pagar el gas de la propia transferencia.
Salida esperada
Cuando sea exitoso, recibirás un Digest de Transacción. Este es tu número de seguimiento.
📦 Dirección del Remitente: 0x123...
📝 Firmando y enviando transacción...
✅ ¡Transacción Enviada!
Digest (ID de seguimiento): 5T7x...9B2a
Puedes copiar este Digest y pegarlo en un Sui Explorer (como Suiscan) para ver el registro permanente de tu transferencia, incluyendo exactamente cuánto Gas consumió.