Temas Técnicos Avanzados: Token-2022, PDA, Multisig y Errores
Guía técnica avanzada que cubre fallos de transacciones, especificidades de Token-2022, gestión de cuentas PDA, integración de billeteras hardware e interpretación de códigos de error.
#¿Por qué fallan las transacciones: razones técnicas?
Incluso transacciones correctamente formadas pueden no llegar a un bloque. Entender las razones ayuda a evitar pérdida de tiempo y gas.
Arquitectura de Transacciones en Solana
Cada transacción en Solana tiene límites estrictos y restricciones temporales:
- Tamaño máximo: 1232 bytes (MTU de paquete de red)
- Límite de Compute Units: 1,400,000 CU por transacción
- Tiempo de vida: 150 slots (~60-90 segundos)
- Validez de blockhash: Válido solo para bloques recientes
Transaction Expired: Error Más Común
Qué sucedió: La transacción contiene referencia a un blockhash reciente (identificador de bloque). Si pasaron más de 150 slots mientras esperaba en cola, la red rechaza la transacción como obsoleta.
Proceso técnico:
- Formas transacción con blockhash del bloque N
- Transacción espera inclusión en bloque
- Red alcanza bloque N+150
- Tu blockhash ya no está en lista "recent blockhashes"
- Validadores rechazan transacción con error "Blockhash not found"
Por qué sucede:
Congestión de red: Durante mints populares de NFT o hype de nuevos tokens, red recibe millones de transacciones. Priority Fee determina el orden.
Priority Fee Baja: Si estableciste comisión mínima, validadores priorizarán transacciones con pago más alto.
Problemas de RPC: Nodos RPC públicos pueden ser lentos o perder conexión.
Solución:
- ✅ Aumentar Priority Fee a "Medium" o "High" en configuración de billetera
- ✅ Reintentar después de 1-2 minutos (blockhash se actualizará automáticamente)
- ✅ Usar endpoints RPC privados (Helius, Triton) para estabilidad
Importante: Transacción expirada no deduce comisión. Tus fondos están seguros.
Account State Changed: Conflicto de Datos
Qué sucedió: Entre el momento de formación de transacción y su ejecución, el estado de cuenta cambió.
Escenarios típicos:
Escenario 1: Recarga durante limpieza
- Escáner determinó: cuenta vacía, balance = 0
- Formas transacción CloseAccount
- Alguien te envía 1 token a esta cuenta
- Transacción intenta cerrar cuenta con balance > 0
- Error: "Account has non-zero balance"
Escenario 2: Race condition con otra transacción
- Enviaste swap de token A en DEX
- Simultáneamente enviaste transacción de cierre de cuenta de token A
- Ambas transacciones intentan modificar una cuenta
- Una pasa, segunda rechazada
Solución:
- ✅ Re-ejecutar escaneo - datos se actualizarán
- ✅ Usar herramientas con simulación pre-flight (verificación antes de enviar)
- ✅ Evitar operaciones simultáneas con un token
Compute Budget Exceeded: Límite de Computación Excedido
Qué sucedió: Transacción intentó ejecutar operaciones demasiado complejas, excediendo límite de 1.4M Compute Units.
Causas:
- Demasiadas instrucciones en paquete: Intentar cerrar 30-40 cuentas a la vez
- Smart contracts complejos: Algunos Token-2022 con extensiones requieren más computación
- Llamadas de programa anidadas: Programa A llama programa B, que llama C
Solución:
- ✅ Reducir número de cuentas en paquete (cerrar 15-20 en lugar de 25-30)
- ✅ Usar herramientas que optimizan automáticamente tamaño de paquetes
- ✅ Agregar instrucción
ComputeBudgetProgram.setComputeUnitLimit()para aumentar límite
Detalle técnico: Puedes solicitar hasta 1,400,000 CU, pero esto requiere Priority Fee proporcionalmente mayor:
Priority Fee = CU solicitadas × Precio por CU
Insufficient Lamports: Fondos Insuficientes
Qué sucedió: SOL insuficiente en balance para ejecutar operación.
Causas no obvias:
Mínimo rent-exempt: Si intentas transferir todo el SOL pero tienes cuentas vacías abiertas, billetera debe preservar mínimo para cubrir renta de todas las cuentas.
Cambio dinámico de gas: Durante congestión, Priority Fee puede crecer 10-100x. Transacción formada con cálculo de 0.000005 SOL de gas puede requerir 0.0005 SOL.
Múltiples transacciones: Enviaste 5 transacciones seguidas, cada una reserva gas. Última no pasa por falta de fondos libres.
Solución:
- ✅ Siempre mantener mínimo 0.01-0.02 SOL en balance
- ✅ Usar modo "Advanced" en billetera para controlar reserva de gas
- ✅ Enviar transacciones secuencialmente, esperando confirmación
#¿Cómo funciona Token-2022 y cómo recuperar renta de él?
Token Extensions Program (Token-2022) es la evolución del SPL Token clásico, lanzado en 2023.
Diferencias Clave con SPL Token
SPL Token (clásico):
- Program ID:
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA - Tamaño fijo: 165 bytes
- Funcionalidad básica: transfer, mint, burn, approve
Token-2022:
- Program ID:
TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb - Tamaño variable: 165-500+ bytes (depende de extensiones)
- Funcionalidad extendida: 16+ capacidades adicionales
Extensiones Principales
Transfer Fee Extension:
Permite al creador del token cobrar comisión en cada transferencia.
Ejemplo:
Transferir 100 tokens
Comisión: 2% = 2 tokens
Receptor recibe: 98 tokens
Creador recibe: 2 tokens de comisión
Impacto en recuperación de renta: Cuentas con Transfer Fee ocupan más espacio → renta aumenta a ~0.0025 SOL.
Permanent Delegate:
Creador de token designa dirección que puede transferir tokens de cualquier billetera sin consentimiento del propietario.
Aplicaciones:
- Stablecoins centralizadas (USDC puede congelar fondos de criminales)
- Tokens de juegos (desarrollador puede confiscar en ban)
Riesgo: Creador tiene acceso backdoor a tus fondos.
Confidential Transfers:
Encriptación de balances usando pruebas de conocimiento cero.
Cómo funciona:
- Solo balance encriptado visible públicamente
- Remitente y receptor conocen cantidades reales
- Validadores pueden verificar corrección sin revelación
Tamaño de cuenta: Hasta 400 bytes → renta hasta ~0.004 SOL
Non-Transferable Tokens:
Tokens que no pueden transferirse (soulbound).
Aplicaciones:
- Certificados y diplomas
- Logros en juegos
- Tokens KYC (verificación de identidad)
Especificidad de recuperación de renta: Tales tokens no pueden quemarse, pero cuenta puede cerrarse si creador previó esta función.
Por Qué Herramientas Antiguas No Ven Token-2022
Razón técnica: Servicios de limpieza clásicos usan método RPC que solo devuelve tokens SPL. Enfoque correcto requiere dos consultas separadas para programas SPL y Token-2022.
Recuperación de Renta de Token-2022
Cantidades de recuperación (aproximadas):
- Token-2022 básico: ~0.00204 SOL (como SPL)
- Con una extensión: ~0.0025 SOL
- Con dos extensiones: ~0.003 SOL
- Con Confidential Transfers: ~0.004 SOL
Importante: Cantidad real depende del tamaño exacto de cuenta en bytes.
Proceso de cierre: Idéntico a tokens SPL - quemar remanentes (si hay), luego instrucción CloseAccount. Única diferencia: necesitas usar Program ID correcto al formar instrucción.
#¿Qué son las cuentas PDA y se puede recuperar renta de ellas?
Program Derived Address (PDA) - cuentas controladas por programas, no usuarios.
Qué es PDA Técnicamente
Cuenta regular:
Clave Privada → Clave Pública (dirección)
Firma de transacción = tu clave privada
PDA:
Program ID + Seeds → Dirección determinística
Firma de transacción = programa (vía invoke_signed)
Característica clave: PDA no tiene clave privada. Solo el programa puede firmar operaciones en su nombre.
Dónde se Usan PDAs
Protocolos de lending (Solend, MarginFi):
Cuando haces depósito:
- Programa crea PDA para almacenar tu colateral
- Eres el propietario pero no controlas directamente
- Retiro solo posible a través de función withdraw() del programa
DEX (Raydium, Orca):
Órdenes abiertas almacenadas en PDAs - Order Book contiene PDA de cada orden abierta. Cancelar orden = cerrar PDA + devolver renta
Programas de staking:
Tus tokens stakeados están en PDA - programa controla período de unlock, no puedes "robar" tus propios tokens antes de vencimiento
¿Se Puede Devolver Renta de PDA?
Depende de implementación del programa.
Si programa proporcionó Close Authority para usuario:
✅ Puedes cerrar PDA y devolver renta
Ejemplos: Versiones obsoletas de Serum DEX, protocolos de lending antiguos
Si programa no proporcionó:
❌ PDA permanece abierto para siempre
Ejemplos: Algunos programas de staking crean PDAs permanentemente
Si fondos aún en uso:
❌ Cierre imposible hasta retiro
Ejemplo: No puedes cerrar PDA con préstamo activo en lending
Cómo Determinar Si Puedes Devolver Renta
Paso 1: Verificar Owner
Abrir cuenta en Solscan y verificar si Owner es programa conocido (Raydium, Orca).
Paso 2: Verificar Balance
Si balance = solo renta (sin tokens/datos), cierre puede ser posible.
Paso 3: Verificar Close Authority
Algunos explorers muestran campo Close Authority. Si es tu dirección - puedes cerrar.
Detección Automática en Herramientas de Limpieza
Servicios de calidad:
- Escanean todas las cuentas donde eres Rent Payer
- Filtran por programas con lógica conocida
- Verifican balance y estado vía RPC
- Muestran solo PDAs seguros para cerrar
Advertencia: No cierres PDAs manualmente sin entender. Puedes perder acceso a fondos en protocolo.
#¿Cómo usar Ledger y billeteras hardware para limpieza?
Las billeteras frías proporcionan máxima seguridad pero requieren pasos adicionales para operaciones de limpieza.
Por Qué Ledger Bloquea Transacciones Complejas
Limitación de pantalla: Ledger Nano S/X tiene pantalla de 128×64 píxeles. Puede mostrar dirección (parcialmente), cantidad de transferencia e información básica de transacción, pero NO detalles de 20 instrucciones CloseAccount, lista de todas las cuentas afectadas o llamadas complejas de smart contracts.
Mecanismo de protección: Si Ledger no puede mostrar detalles de transacción, la rechaza por defecto con error:
Condition of use not satisfied (0x6985)
Qué es Blind Signing
Blind Signing (Firma ciega) - modo donde permites a Ledger firmar transacciones sin mostrar detalles completos en pantalla.
Cómo habilitar:
- Conectar Ledger a computadora
- Abrir app Solana en dispositivo
- Presionar ambos botones simultáneamente para entrar en Settings
- Encontrar opción "Blind signing"
- Cambiar a "Enabled"
- Salir de Settings
Importante: Esta configuración está dentro de app Solana en Ledger, no en Ledger Live en computadora.
Riesgos de Blind Signing
Pérdida de verificación en dispositivo: No ves lo que estás firmando. Teóricamente, sitio malicioso podría enviar transacción transfiriendo todo el SOL al hacker y cerrando tus cuentas - y no verías esto en pantalla de Ledger.
Cómo minimizar riesgos:
- ✅ Habilitar Blind Signing solo para operación específica
- ✅ Usar solo servicios verificados
- ✅ Verificar simulación de transacción en billetera Phantom/Solflare (si usas como interfaz)
- ✅ Deshabilitar Blind Signing inmediatamente después de usar
Flujo de Trabajo Alternativo Sin Blind Signing
Método 1: Limpieza parcial
Algunas operaciones simples no requieren Blind Signing - cerrar 1-3 cuentas por transacción, tokens SPL simples sin extensiones.
Método 2: Exportar vía xpub
- Exportar clave pública extendida de Ledger
- Importar a billetera caliente (solo lectura)
- Hacer limpieza en billetera caliente
- Enviar SOL recuperado de vuelta a Ledger
Método 3: Crear billetera intermedia
- Transferir fondos a billetera caliente temporal
- Hacer limpieza en billetera caliente
- Devolver fondos a Ledger
#¿Cómo recuperar renta de billeteras multisig?
Las billeteras multifirma (Squads Protocol, Goki) usan múltiples claves para autorizar transacciones.
Cómo Funciona Multisig en Solana
Estructura:
Multisig Vault (PDA)
├── Firmante 1: Alice (1/3 voto)
├── Firmante 2: Bob (1/3 voto)
└── Firmante 3: Charlie (1/3 voto)
Umbral: 2/3 (necesarias firmas de dos de tres)
Proceso de transacción:
- Alice crea Propuesta: "Cerrar 50 cuentas vacías"
- Bob revisa y Aprueba
- Umbral alcanzado (2/3) → transacción se ejecuta automáticamente
- Charlie puede Aprobar después (pero ya innecesario)
Por Qué Herramientas Regulares de Limpieza No Funcionan con Multisig
Problema: Servicios estándar intentan enviar transacción inmediatamente después de conectar billetera. Pero en Multisig:
- Una firma insuficiente
- Necesitas crear Propuesta
- Esperar otros firmantes
Momento técnico: Multisig Vault es un PDA. Tokens almacenados no en direcciones de firmantes sino en Vault. Por eso escanear dirección de Alice mostrará 0 cuentas, aunque Vault tenga cientos.
Flujo de Trabajo para Limpieza Multisig
Paso 1: Escanear dirección de Vault
Encontrar dirección de Multisig Vault en interfaz de Squads, pegarla en escáner de limpieza (solo lectura).
Paso 2: Exportar lista de cuentas
Algunas herramientas avanzadas permiten exportar lista de cuentas de tokens para cerrar.
Paso 3: Crear Propuesta manualmente
En interfaz de Squads:
- New Proposal → Custom Instruction
- Program: Token Program / Token-2022 Program
- Instruction: CloseAccount
- Account list: pegar desde exportación
- Create Proposal
Paso 4: Recolectar firmas
Enviar enlace de Propuesta a otros firmantes. Después de alcanzar umbral, transacción se ejecuta.
Automatización para Multisig
Desarrolladores pueden crear scripts usando Squads SDK para automatizar creación de propuestas, recolección de firmas y ejecución. Costo incluye gas para creación de Propuesta más gas de ejecución de transacción.
#¿Cómo interpretar códigos de error comunes de Solana?
Solana usa códigos de error numéricos que no siempre son claros para usuarios.
Códigos de Error Comunes Durante Limpieza
0x0 (Success): No es error. Transacción ejecutada exitosamente.
0x1 (Insufficient funds): SOL insuficiente para gas o pago de mínimo rent-exempt. Solución: Recargar balance.
0x3 (Invalid account data): Cuenta tiene estructura de datos incorrecta. Causa: Token bugueado, metadatos corruptos. Solución: Omitir esta cuenta, cerrar otras.
0x7 (Account already in use): Otra transacción modificando simultáneamente esta cuenta. Solución: Esperar 5-10 segundos, reintentar.
0xBB8 (3000 - Account not rent exempt): Intento de crear cuenta sin depósito suficiente. En contexto de limpieza: Bug de herramienta (error raro).
0x1771 (6001 - Custom program error): Error específico de programa particular. Necesitas verificar detalles en mensaje de error.
Cómo Obtener Detalles de Error
En Phantom/Solflare:
Después de transacción fallida aparece:
Transaction failed
View in Explorer →
Hacer clic → abre Solscan con registro completo.
En Solscan:
- Encontrar sección "Program Logs"
- Buscar líneas con "Error:"
- A menudo hay descripción legible
Ejemplo:
Program log: Error: Account has non-zero balance
Program TokenkegQf... failed: custom program error: 0x10
Interpretación: 0x10 = "Non-zero balance", no se puede cerrar cuenta con tokens.