Saltar al contenido principal

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 financiada en la devnet de Sui y una configuración básica de Node.js.

Objetivo: escribir un script para transferir tokens Sui a otra dirección, comprendiendo el papel del gas y las firmas.


Introducción

En tutoriales anteriores, realizaste operaciones de lectura consultando al SuiClient para obtener datos sin incurrir en tarifas de red.

Ahora, realizas una operación de escritura para transferir tokens Sui desde tu billetera a otra dirección. Como esto modifica el estado en la cadena, se aplican dos requisitos:

  1. Firma: debes firmar criptográficamente la solicitud para demostrar la propiedad de los fondos.
  2. Gas (franqueo): debes pagar una tarifa en tokens Sui para compensar a la red por procesar la transacción.

Requisitos previos

Para ejecutar este tutorial, necesitas:

  • Una billetera financiada: una frase de recuperación de 12 palabras para una billetera que contenga tokens de la devnet de Sui. Puedes solicitar tokens de prueba gratuitos a través del grifo de Sui en Discord o directamente dentro de una billetera compatible con Sui.
  • El paquete de pares de claves Ed25519: @mysten/sui para firmar la transacción.

Instala el paquete requerido (si aún no lo has hecho):

Terminal
npm install @mysten/sui
aviso

En aplicaciones en producción, nunca escribas directamente en el código tu clave privada ni tu frase de recuperación. Utiliza siempre variables de entorno (por ejemplo, .env). Este tutorial utiliza una variable en memoria a modo de demostración, pero nunca subas frases de recuperación privadas a GitHub.

1. Importar dependencias y configurar el cliente

Crea un archivo llamado transfer.js. Importa SuiClient para la comunicación con la red y Ed25519Keypair para firmar la transacción.

transfer.js
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. Cargar tu billetera (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}`);
consejo

Antes de enviar una transacción, tu dirección de remitente necesita tokens de prueba para pagar el gas. Copia la Dirección del remitente mostrada en tu terminal y solicita tokens a través del canal #devnet-faucet en el Discord de Sui.

2. Construir la transacción

En Sui, construyes una Transacción en lugar de enviar comandos sin procesar. Piensa en esto como rellenar una etiqueta de envío y empaquetar artículos en una caja antes de sellarla.

Utiliza el comando tx.splitCoins para separar una cantidad específica de tu moneda de gas principal:

transfer.js
// 3. Definir el destinatario
const RECIPIENT = '0x9999...'; // Sustituye por la dirección de un amigo o una dirección de quema

// 4. Crear el contenedor de la transacción
const tx = new Transaction();

// Dividir 1000 MIST (la unidad más pequeña de SUI) de la moneda de gas
const [coinToSend] = tx.splitCoins(tx.gas, [1000]);

// Transferir la moneda dividida al destinatario
tx.transferObjects([coinToSend], RECIPIENT);

3. Firmar y enviar la transacción

Este paso calcula y paga el gas antes de ejecutar la transacción en la cadena.

Ciclo de vida de la transacción PTB
┌─────────────────────────┐ ┌─────────────────────────┐ ┌───────────────────────────┐
│ 1. Crear transacción │ ──► │ 2. Firmar con par clave │ ──► │ 3. Enviar con SuiClient │
│ (splitCoins, transfer) │ │ (Prueba criptográfica) │ │ (Transmite a Devnet) │
└─────────────────────────┘ └─────────────────────────┘ └───────────────────────────┘

Al llamar a signAndExecuteTransaction, el SuiClient:

  1. Estima el gas: calcula la complejidad computacional y establece el presupuesto de gas necesario.
  2. Firma: aplica la firma de tu keypair para aprobar el cambio de estado.
  3. Envía: transmite la transacción firmada a través del nodo completo RPC a la red.
transfer.js
async function sendTransaction() {
try {
console.log("📝 Firmando y enviando transacción...");

const result = await client.signAndExecuteTransaction({
signer: keypair,
transaction: tx,
});

console.log("✅ ¡Transacción enviada!");
console.log(`Digest (ID de seguimiento): ${result.digest}`);

} catch (error) {
console.error("❌ La transacción falló:", error);
}
}

sendTransaction();

Entendiendo el gas en esta transacción

No necesitas calcular los costes de gas manualmente.

  • Presupuestación automática: por defecto, el SDK estima el coste de gas por ti. Establece un presupuesto suficiente para la ejecución sin sobrepagos excesivos.
  • Fuente de pago: el SDK selecciona automáticamente un objeto de moneda SUI de tu billetera para pagar esta tarifa. Por esto, reserva siempre una pequeña cantidad de SUI en tu billetera para cubrir el gas.

Salida esperada

Cuando la ejecución tiene éxito, el script genera un Digest de la transacción (tu ID de seguimiento de la transacción):

Salida del terminal
📦 Dirección del remitente: 0x123...
📝 Firmando y enviando transacción...
✅ ¡Transacción enviada!
Digest (ID de seguimiento): 5T7x...9B2a

Copia este digest y búscalo en Suiscan. El explorador muestra el registro permanente en la cadena, incluyendo el consumo de gas y el estado de ejecución.


Próximos pasos

Ahora que has ejecutado tu primera transacción de escritura en la cadena: