En el "bosque oscuro" de Solana, cuando recibes una señal de actualización de cuenta del módulo Scout, la competencia ha entrado en los últimos milisegundos. Si aún necesitas enviar la transacción de vuelta al nodo RPC para "simular" y obtener una cotización, entonces cuando obtienes el resultado, la oportunidad ya ha sido robada por aquellos competidores que completaron los cálculos localmente.
Un verdadero profesional Searcher nunca espera la retroalimentación del RPC. Mantendrán una imagen del estado de AMM en la memoria local y, en el instante en que reciban los datos binarios, calcularán directamente el precio óptimo a través de un modelo matemático.
Este artículo desglosará cómo construir un motor de precios locales eficiente para Raydium (CPMM) y Orca (CLMM).
1. Concepto clave: Cálculo local vs. Simulación RPC
1.1 ¿Por qué elegir precios locales?
Latencia extrema: La simulación RPC generalmente requiere de 50 ms a 200 ms, mientras que el cálculo matemático puro local solo necesita microsegundos.
Capacidad de concurrencia: El cálculo local no consume el rendimiento de los nodos RPC, pudiendo explorar instantáneamente miles de rutas de arbitraje.
Determinismo: Al analizar los datos de cuenta originales (Account Data), puedes obtener un control de estado más bajo que con simulaciones.
2. Raydium (CPMM): El arte del producto constante
El pool estándar de Raydium sigue la clásica fórmula x×y=kx×y=k. Aunque la lógica es simple, en la implementación de ingeniería se deben manejar pequeñas desviaciones de precisión y tarifas.
2.1 Fórmula clave de cotización
En escenarios con tarifas, la fórmula entera para calcular amount_out es:
Entrada con tarifa: AmountInwith_fee=AmountIn×(FeeDenominator−FeeNumerator)AmountInwith_fee=AmountIn×(FeeDenominator−FeeNumerator)
Cálculo de salida: AmountOut=AmountInwith_fee×ReserveoutReservein×FeeDenominator+AmountInwith_feeAmountOut=Reservein×FeeDenominator+AmountInwith_feeAmountInwith_fee×Reserveout
2.2 Juego de precisión: La necesidad de U256
En Solana, la cantidad de tokens suele ser u64. Pero al calcular el numerador de la fórmula anterior, multiplicar dos grandes u64 provocará inmediatamente un desbordamiento.
Solución: Introducir U256 en la capa de cálculo intermedia. Aunque la biblioteca oficial de Rust no lo proporciona directamente, a través de macros uint o la biblioteca primitive-types, podemos asegurar el cálculo de precisión absoluta incluso en alta volatilidad (grandes entradas).
3. Orca Whirlpool (CLMM): Análisis preciso de liquidez concentrada
En comparación con CPMM, el modelo de liquidez concentrada (CLMM) de Orca es mucho más complejo. No solo implica precios, sino también Tick (rango de precios) y profundidad de liquidez.
3.1 Representación del precio: Q64.64 sqrtPrice
Orca utiliza precios de raíz cuadrada (sqrtPrice) y se almacenan en formato de punto flotante Q64.64.
Fórmula: Precio=(sqrtPriceX64264)2Precio=(264sqrtPriceX64)2
Al analizar, necesitamos manejar enteros extremadamente grandes de 128 bits, extrayendo el precio real mediante operaciones de desplazamiento.
3.2 Análisis rápido: Método de corte Offset
La estructura de cuentas de Orca en Whirlpool es muy grande (incluye múltiples grupos de recompensas, parámetros de tarifas, etc.), si se utiliza la deserialización completa (Borsh Deserialize), la pérdida de rendimiento es significativa.
Solución de optimización de nivel industrial:
Localizar directamente los datos binarios de la cuenta mediante la posición de Offset. Dado que la estructura del pool es fija, podemos leer directamente los bytes clave mediante corte:
data[49..65] -> Liquidez (Liquidity)
data[65..81] -> Precio (sqrtPrice)
data[81..85] -> Tick actual
Este método es más de 10 veces más rápido que el análisis completo.
4. Diseño de arquitectura: Capa de cotización (Quote)
Para que la capa de estrategia no tenga que preocuparse por las diferencias matemáticas entre diferentes DEX, necesitamos construir un motor de cotización unificado:
diagrama de flujo LR
RawData[Datos de cuenta originales] --\u003e|Análisis| AMMState[Imagen de estado AMM en memoria]
AMMState --\u003e|Monto de entrada| LocalMath[Modelo matemático local]
LocalMath --\u003e|Salida| AmountOut[Cotización estructurada]
subgráfico "Capa de potencia de cálculo local"
LocalMath
AMMState
fin
Este motor mantendrá en tiempo real el saldo del vault del pool. Cuando Scout detecte cualquier cambio en un Vault, el motor de cotización recalculará inmediatamente la cotización de ruta completa para ese par de tokens.
5. Optimización de ingeniería: Velocidad desde los detalles
Cálculo de asignación cero: Durante el proceso de cálculo, trata de evitar la asignación de memoria (Heap Allocation), usando tipos nativos en la pila.
Procesar solicitudes RPC en lotes: Aunque la fijación de precios es local, el saldo del vault aún necesita sincronización. Usar getMultipleAccounts para obtener el estado de todos los vaults relevantes en lotes, reduciendo el tiempo de ida y vuelta de la red.
Pre-cálculo: Para parámetros fijos como las tarifas, completar el análisis en la fase de arranque en frío, no repetir cálculos en cada milisegundo en el Hot Path.
6. Demostración técnica: Lógica de cotización CPMM (versión Python)
Aunque el entorno de producción busca el rendimiento extremo de Rust, su lógica matemática central puede demostrarse claramente en Python:
# Simulación de cálculos de cotización locales de alto rendimiento
def calculate_local_quote(amount_in, res_in, res_out, fee_pct=0.0025):
"""
Cotización local CPMM: x * y = k
"""
# Simulación de cálculos U256, para prevenir desbordamientos
fee_numerator = int(fee_pct * 10000)
fee_denominator = 10000
# 1. Calcular la entrada efectiva después de deducir la tarifa
amount_in_with_fee = amount_in * (fee_denominator - fee_numerator)
# 2. Calcular la salida según la fórmula
numerador = amount_in_with_fee * res_out
denominador = (res_in * fee_denominator) + amount_in_with_fee
amount_out = numerador // denominador
# 3. Calcular el impacto del precio (Price Impact)
impacto_precio = (amount_out / res_out) si res_out > 0 sino 1
return amount_out, impacto_precio
# Simulación: 1 SOL cambia a USDC, el pool tiene 1000 SOL / 100,000 USDC
out, impacto = calculate_local_quote(1 10*9, 1000 10*9, 100000 10*6)
print(f"[*] Salida estimada: {out / 10**6} USDC")
print(f"[*] Impacto del precio: {impacto:.4%}")
7. Resumen: El poder de cálculo es beneficio
En el mundo de Solana MEV, la capacidad de fijación de precios locales determina tu nivel de competencia.
Los jugadores principiantes dependen de simulaciones RPC y solo pueden recoger las sobras.
Los jugadores intermedios logran la localización de CPMM.
Los jugadores avanzados pueden analizar con precisión cada Tick de CLMM y realizar arbitraje atomizado en combinación con Jito.
Próxima previsión
Ahora que tenemos el "Explorador (Scout)" y el "Cerebro (AMM Math)", es hora de entrar en la parte más emocionante: ¿cómo formular estrategias de arbitraje entre DEX? Frente a un panorama complejo de múltiples rutas y protocolos, ¿cómo encontrar la ruta más rentable?
Este artículo fue escrito por Levi.eth. En Solana, cada optimización de fórmula matemática puede traducirse en beneficios reales en la cadena.

