Keypairs & Signers
Los signers (firmantes) abstraen quién puede firmar transacciones y mensajes en @solana/kit.
Receta
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
import { generateKeyPairSigner, createKeyPairSignerFromBytes } from "@solana/kit";
const dev = await generateKeyPairSigner();
// o cargar bytes JSON de solana-keygenCuándo usar esto:
- Scripts de servidor que pagan tarifas con un archivo keypair.
- Pruebas que necesitan signers deterministas.
- Integración de adaptadores de wallet en mensajes de kit.
- Firma de mensajes para autenticación (off-chain).
Ejemplo de Trabajo
import {
generateKeyPairSigner,
createTransactionMessage,
setTransactionMessageFeePayerSigner,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstruction,
signTransactionMessageWithSigners,
createSolanaRpc,
} from "@solana/kit";
import { getTransferSolInstruction } from "@solana-program/system";
const rpc = createSolanaRpc("https://api.devnet.solana.com");
const payer = await generateKeyPairSigner();
const recipient = await generateKeyPairSigner();
const { value: bh } = await rpc.getLatestBlockhash().send();
let msg = createTransactionMessage({ version: 0 });
msg = setTransactionMessageFeePayerSigner(payer, msg);
msg = setTransactionMessageLifetimeUsingBlockhash(bh, msg);
msg = appendTransactionMessageInstruction(
getTransferSolInstruction({ source: payer, destination: recipient.address, amount: 1_000n }),
msg
);
const signed = await signTransactionMessageWithSigners(msg);Lo que esto demuestra:
- El pagador de tarifas es un
Signer, no una cadena de clave pública en bruto. signTransactionMessageWithSignersresuelve los signers incrustados en el mensaje.- Las wallets implementan la misma interfaz de signer en tiempo de ejecución.
Análisis Profundo
Cómo Funciona
- Los keypairs Ed25519 se mapean a
Address(clave pública base58). KeyPairSignercontiene material secreto para scripts de Node.- Las wallets del navegador exponen
TransactionSendingSignersin revelar secretos. - Existen rutas de importación de
CryptoKeypara integraciones de Web Crypto.
Tipos de Signer
| Tipo | Se expone el secreto | Fuente Típica |
|---|---|---|
| Key pair | Sí (servidor) | Archivo keypair JSON |
| Wallet | No | Phantom, Solflare |
| No-op | N/A | Marcador de posición en compilaciones parciales |
Notas de TypeScript
// Nunca registres ni serialices los bytes de la clave secreta
const { address } = await generateKeyPairSigner();Errores Comunes
- Pagador de tarifas solo como cadena de dirección - el mensaje no se firmará. Solución:
setTransactionMessageFeePayerSigner. - Confirmar JSON de keypair - riesgo total de drenaje de wallet. Solución: gitignore y gestor de secretos.
- Usar la misma clave en mainnet y devnet - gastos accidentales en mainnet. Solución: keypairs por clúster.
- Asumir que la wallet = pagador de tarifas - el usuario puede rechazar la discrepancia del pagador de tarifas. Solución: alinear la clave pública conectada.
- Cantidades de SOL en punto flotante - pérdida de precisión. Solución: lamports bigint.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Signers del Estándar de Wallet | dApps del navegador | Scripts de CI sin cabeza |
| Wallet de hardware | Claves de alto valor | Iteración local rápida |
| Servicio KMS/HSM | Servidores de producción | Solo desarrollo local |
Preguntas Frecuentes
¿Funciona esto en devnet?
Sí - apunta el RPC y la wallet al mismo clúster.
¿Puedo mezclar kit y web3.js?
Evítalo en un módulo - migra completamente por ruta.
¿Qué pasa con los adaptadores de wallet?
Las wallets proporcionan signers; el kit construye mensajes.
¿Cómo fijo la versión de @solana/kit?
Bloquea 7.0.0 en package.json y CI.
¿Dónde están las tarifas de prioridad?
Instrucciones de presupuesto de cómputo antes de enviar.
¿Cómo probar?
Surfpool 0.12.0 o validador local con clones de devnet.
¿Lamports o SOL?
Siempre lamports bigint en el código del kit.
¿Qué compromiso?
Confirmado para UI; finalizado para tesorería.
¿Componentes de servidor Next.js?
Lecturas en el servidor; firma en componentes cliente.
¿Depurar transacciones fallidas?
Simular, leer logs, verificar propietarios de cuentas.
Relacionado
- Construcción de Mensajes de Transacción - componer mensajes
- Firma y Envío - transmitir
- Conceptos Básicos de Wallet - wallets del navegador
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.