Firmar Transacciones y Mensajes
Firma mensajes de transacción y cargas útiles de autenticación fuera de la cadena con billeteras conectadas.
Receta
import { signTransactionMessageWithSigners } from "@solana/kit";
// el adaptador de billetera proporciona un adaptador compatible con TransactionSendingSignerCuándo usar esto:
- Cualquier transacción pagada por el usuario en el navegador.
- Creación de NFTs, intercambios y acciones de juegos.
- Mensajes de inicio de sesión con Solana.
Ejemplo Funcional
"use client";
import { useWallet } from "@solana/wallet-adapter-react";
import {
createTransactionMessage,
setTransactionMessageFeePayerSigner,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstruction,
signTransactionMessageWithSigners,
createSolanaRpc,
} from "@solana/kit";
import { getTransferSolInstruction } from "@solana-program/system";
export function useSendSol() {
const { publicKey, signTransaction } = useWallet();
const rpc = createSolanaRpc(process.env.NEXT_PUBLIC_RPC_URL!);
return async function send(recipient: string, lamports: bigint) {
if (!publicKey || !signTransaction) throw new Error("Wallet not connected");
const { value: bh } = await rpc.getLatestBlockhash().send();
// Utiliza el ayudante de signer de la billetera de tu adaptador
let msg = createTransactionMessage({ version: 0 });
// ... adjuntar instrucción de transferencia, firmar con la billetera, enviar a través de rpc
};
}Lo que esto demuestra:
- Construye el mensaje con
kit; la billetera proporciona la capacidad de firma. - El pagador de la tarifa debe coincidir con la clave pública conectada.
- Simula antes del modal de la billetera cuando sea posible.
Análisis Profundo
Cómo Funciona
- Las billeteras nunca exponen claves secretas; firman dentro de la extensión.
- Se admite la firma parcial para flujos de multisig.
signMessagedevuelve una firma ed25519 sobre bytes arbitrarios.TransactionSendingSignerune el adaptador al pipeline dekit.
Errores Comunes
- Desajuste del pagador de la tarifa - la billetera rechaza. Solución: usa la dirección conectada como pagador.
- Transacciones sobredimensionadas - la interfaz de usuario de la billetera falla. Solución: ALTs y menos cuentas.
- Firma ciega en hardware - riesgo de seguridad. Solución: vista previa verificada de la transacción.
- Asumir que
signTransactiondevuelve una tx confirmada - solo firma; todavía tienes que enviar. - Reutilizar blockhash después de una UX larga - caducidad. Solución: reconstruir el mensaje.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Tx patrocinada por el servidor | Onboarding sin gas | Autocustodia sin confianza |
| Adaptador de billetera móvil | React Native | Solo extensión de escritorio |
Preguntas Frecuentes
¿Devnet o Mainnet?
Coincide la URL de RPC, la red de la billetera y los IDs de programa con un clúster.
¿kit vs web3.js?
Usa @solana/kit 7.0.0 para código nuevo de frontend.
¿Pruebas?
Surfpool 0.12.0 o devnet con faucet SOL.
¿Nivel de compromiso?
confirmed para UX; finalized para lecturas de alto valor.
¿App Router de Next.js?
Proveedores en el layout del cliente; las lecturas pueden ser del lado del servidor.
¿Billetera rechazó la firma?
Muestra reintentar; nunca asumas aprobación.
¿Tarifas de prioridad?
Instrucciones de presupuesto de cómputo en mainnet congestionada.
¿Móvil?
Usa Mobile Wallet Adapter para aplicaciones React Native.
¿Seguridad?
Nunca expongas keypairs del servidor al navegador.
¿Cambios en IDL?
Regenera clientes tipados en CI.
Relacionado
- Firma del Lado del Cliente - Patrones de Next.js
- Firma y Envío - Pipeline de envío de
kit - Keypairs y Signers - Modelo de signer
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.