APIs de Tarifa de Prioridad y Simulación
Utiliza getRecentPrioritizationFees, simulateTransaction y las APIs de tarifas del proveedor para estimar las unidades de cómputo y las tarifas de prioridad antes de enviar transacciones.
Receta
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
import { createSolanaRpc, getBase64EncodedWireTransaction } from "@solana/kit";
const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");
await rpc.getRecentPrioritizationFees([]).send();
await rpc.simulateTransaction(encodedTx, {
commitment: "processed",
sigVerify: false,
}).send();Cuándo usar esto:
- Establecer tarifas de prioridad dinámicas a partir de percentiles recientes de la red.
- Estimar el consumo de unidades de cómputo (CU) para establecer instrucciones de presupuesto de cómputo.
- Comprobación previa de errores de programas personalizados sin confirmación en la red.
- Depuración de fallos de transacciones en entornos de prueba.
Ejemplo Funcional
import { createSolanaRpc } from "@solana/kit";
const rpc = createSolanaRpc(process.env.RPC_URL!);
// Tarifas de prioridad recientes para cuentas relevantes (vacío = muestra global)
const fees = await rpc.getRecentPrioritizationFees([]).send();
const recent = fees.map((f) => f.prioritizationFee).filter((n) => n > 0);
recent.sort((a, b) => a - b);
const p75 = recent[Math.floor(recent.length * 0.75)] ?? 0;
console.log("precio sugerido de microLamports por CU (p75):", p75);
// Simular tx firmada o parcialmente firmada (wire en base64)
const simulation = await rpc
.simulateTransaction("BASE64_WIRE_TX", {
commitment: "processed",
sigVerify: false,
replaceRecentBlockhash: true,
})
.send();
console.log("err:", simulation.value.err);
console.log("units:", simulation.value.unitsConsumed);
console.log("logs:", simulation.value.logs?.slice(0, 5));Lo que esto demuestra:
- La RPC de simulación de tarifas de prioridad utiliza muestras de transacciones recientes confirmadas para obtener orientación sobre las tarifas.
- La simulación devuelve
unitsConsumedy registros sin confirmar estado (excepto cuando está configurado). replaceRecentBlockhashayuda a simular transacciones con blockhashes caducados.
Análisis Profundo
Cómo Funciona
- Las tarifas de prioridad son micro-lamports por unidad de cómputo que se pagan a los validadores además de la tarifa base.
getRecentPrioritizationFeesdevuelve observaciones de tarifas por slot para conjuntos de bloqueo de cuentas.simulateTransactionejecuta SVM contra una instantánea del banco en el nivel de compromiso elegido.- Los proveedores pueden exponer puntos finales mejorados
priorityFeeEstimatecon estadísticas de percentiles.
Opciones de Simulación
| Opción | Efecto |
|---|---|
sigVerify: false | Simulación más rápida, omite las comprobaciones de firma |
replaceRecentBlockhash | Actualiza el blockhash para transacciones obsoletas |
innerInstructions | Devuelve el desglose de CPI |
accounts | Devuelve los estados de cuenta posteriores a la simulación |
Notas de TypeScript
// Después de la simulación, establece la ix del presupuesto de cómputo con margen
const units = simulation.value.unitsConsumed ?? 200_000;
const limit = Math.ceil(units * 1.1);
const microLamports = Math.max(p75, 1_000);Errores Comunes
- Éxito de simulación ≠ confirmación en la red - la congestión y los blockhashes caducados aún fallan al enviar. Solución: combinar con un blockhash nuevo y reintentos de tarifa de prioridad.
- Tarifa de prioridad infravalorada - la simulación pasa pero la transacción se cae. Solución: apuntar al percentil 75-90 con un límite.
sigVerifyfalso ocultando errores del firmante - falsos positivos. Solución: pre-vuelo final consigVerify: trueantes de enviar a mainnet.- Muestra de priorización obsoleta - las tarifas se disparan durante las acuñaciones de NFT. Solución: actualizar las tarifas por lote de envío.
- Ignorar
unitsConsumed- el límite predeterminado de 200k CU puede ser demasiado bajo. Solución: establecer un límite explícito a partir de la simulación + 10% de margen.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Tarifa de prioridad fija | Bajo tráfico en devnet | Períodos de congestión en mainnet |
| APIs de propinas de Jito | Agrupación de confirmaciones | Transferencias simples |
| Simulación de Surfpool | DeFi precisa de fork | Aplicaciones solo de billetera |
CLI solana confirm -v | Depuración post-envío | Planificación pre-envío |
Preguntas Frecuentes
¿Qué unidades utiliza prioritizationFee?
Micro-lamports por unidad de cómputo para la instrucción de tarifa de prioridad: multiplique por el presupuesto de CU solicitado para obtener el total de lamports de prioridad.
¿Con qué frecuencia actualizar las tarifas?
Por lote de transacciones durante la congestión; con menos frecuencia en devnet con poco tráfico.
¿SimulateTransaction cuesta SOL?
No hay gasto en la cadena: solo cómputo RPC; algunos proveedores limitan las simulaciones intensivas.
¿Puedo simular sin todos los firmantes?
A menudo sí con sigVerify: false - útil para flujos de firma parcial.
¿Cómo se relaciona esto con el programa de presupuesto de cómputo?
La simulación informa los valores de las instrucciones SetComputeUnitLimit y SetComputeUnitPrice.
¿Difieren las APIs de tarifas del proveedor?
Helius y otros ofrecen estimaciones de percentiles; recurra a getRecentPrioritizationFees para portabilidad.
¿Por qué simular con compromiso procesado?
Retroalimentación más rápida durante la depuración iterativa: igualar el compromiso de envío para comprobaciones finales.
¿Puede la simulación detectar fallos de slippage?
Sí, si el programa devuelve un error por salida insuficiente: lea los registros y el campo err.
¿Codifica kit 7.0.0 las transacciones wire?
Utilice getBase64EncodedWireTransaction al construir transacciones con pipelines de kit antes de simular.
¿Dónde está documentada la política de confirmación?
Consulte Establecer Tarifas de Prioridad y Estimar Unidades de Cómputo.
Relacionado
- Estimar Unidades de Cómputo - margen de CU
- Establecer Tarifas de Prioridad - estrategia de tarifas
- Simular Transacciones - modelo conceptual
- Proveedores RPC - APIs mejoradas
Versiones de Stack: Esta página se escribió 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.