Firma y Envío
Firma mensajes de transacción y confirma el aterrizaje en Agave 4.1.1.
Receta
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
import {
signTransactionMessageWithSigners,
getSignatureFromTransaction,
sendAndConfirmTransactionFactory,
createSolanaRpc,
createSolanaRpcSubscriptions,
} from "@solana/kit";
const signed = await signTransactionMessageWithSigners(message);
const sendAndConfirm = sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions });
await sendAndConfirm(signed, { commitment: "confirmed" });Cuándo usar esto:
- Envío de transferencias e instrucciones de programa desde TypeScript.
- Envíos aprobados por la billetera después de la construcción del mensaje.
- Scripts que necesitan confirmación antes de continuar.
Ejemplo de Trabajo
import {
createSolanaRpc,
createSolanaRpcSubscriptions,
signTransactionMessageWithSigners,
getSignatureFromTransaction,
sendAndConfirmTransactionFactory,
getBase64EncodedWireTransaction,
} from "@solana/kit";
const rpc = createSolanaRpc(process.env.RPC_URL!);
const rpcSubscriptions = createSolanaRpcSubscriptions(process.env.RPC_WSS_URL!);
const signed = await signTransactionMessageWithSigners(message);
const signature = getSignatureFromTransaction(signed);
const simulation = await rpc
.simulateTransaction(getBase64EncodedWireTransaction(signed), { sigVerify: true })
.send();
if (simulation.value.err) throw new Error(JSON.stringify(simulation.value.err));
const sendAndConfirm = sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions });
await sendAndConfirm(signed, { commitment: "confirmed" });
console.log("https://explorer.solana.com/tx/" + signature + "?cluster=devnet");Lo que esto demuestra:
- Simular antes de enviar para detectar errores del programa de forma temprana.
sendAndConfirmTransactionFactoryempareja el envío HTTP con la suscripción de firma.- Los enlaces del explorador ayudan al soporte y control de calidad.
Análisis Profundo
Cómo Funciona
- La firma produce una transacción en el cable con firmas Ed25519 válidas.
- RPC
sendTransactiontransmite al clúster. - La confirmación espera hasta que se alcance el compromiso elegido.
- Los errores devuelven los registros del programa en la simulación y los metadatos de la transacción.
Opciones de Confirmación
| Estrategia | Compromiso |
|---|---|
sendAndConfirm | Simple; necesita WSS |
Encuesta getSignatureStatuses | Funciona solo con HTTP |
signatureNotifications | Estado de UI detallado |
Errores Comunes
- Omitir la simulación - los usuarios pagan tarifas por fallos predecibles. Solución: simular en desarrollo y staging.
- No hay WSS para la fábrica de confirmación - se cuelga o recurre a un fallback. Solución: proporcionar
rpcSubscriptions. processedtratado como final - posible reversión de la UI. Solución: confirmar enconfirmedo superior.- Doble envío al reintentar - transacciones duplicadas si el hash del bloque aún es válido. Solución: claves de idempotencia o nuevo hash de bloque.
- Firma parcial de la billetera - error de firmante faltante al enviar. Solución: asegurar que se invocan todos los firmantes.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Paquetes Jito | Prioridad de aterrizaje | Pruebas de humo en Devnet |
Solo sendTransaction | Analíticas de "disparar y olvidar" | Transferencias visibles para el usuario |
| Envío patrocinado por el servidor | Experiencia de usuario sin gas | Solo autocustodia sin confianza |
Preguntas Frecuentes
¿Funciona esto en devnet?
Sí - apunta RPC y billetera al mismo clúster.
¿Puedo mezclar kit y web3.js?
Evitar en un módulo - migrar completamente por ruta.
¿Qué pasa con los adaptadores de billetera?
Las billeteras proporcionan firmantes; kit construye mensajes.
¿Cómo fijo @solana/kit?
Bloquear 7.0.0 en package.json y CI.
¿Dónde están las tarifas de prioridad?
Instrucciones de presupuesto de cómputo antes del envío.
¿Cómo probar?
Surfpool 0.12.0 o validador local con clones de devnet.
¿Lamports o SOL?
Siempre lamports bigint en el código de kit.
¿Qué compromiso?
confirmed para UI; finalized para tesorería.
¿Componentes de servidor Next.js?
Lectura en el servidor; firma en componentes cliente.
¿Depurar transacciones fallidas?
Simular, leer registros, verificar propietarios de cuentas.
Relacionado
- Construcción de Mensajes de Transacción - componer primero
- RPC y Suscripciones - confirmación WSS
- UX de Transacciones - patrones de UI
Versiones de Stack: Esta página fue escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, y LiteSVM 0.6.x.