No "escuro bosque" de Solana, quando você recebe um sinal de atualização de conta do módulo Scout, a competição já entrou nos últimos milissegundos. Se você ainda precisar enviar a transação de volta para o nó RPC para "simular" e obter uma cotação, então, quando você obtiver o resultado, a oportunidade já foi muitas vezes roubada por aqueles que completaram os cálculos localmente.

Um verdadeiro profissional Searcher nunca espera o feedback do RPC. Eles mantêm uma imagem do estado do AMM na memória local e, assim que recebem os dados binários, calculam diretamente o preço ótimo através de um modelo matemático.

Este artigo irá desmontar como construir um motor de precificação local eficiente para Raydium (CPMM) e Orca (CLMM).

1. Conceito central: Cálculo local vs. Simulação RPC

1.1 Por que escolher preços locais?

  • Latência extrema: simulações RPC geralmente levam de 50ms a 200ms, enquanto cálculos puramente matemáticos locais levam apenas microssegundos.

  • Capacidade de concorrência: o cálculo local não consome o desempenho dos nós RPC, podendo rapidamente avaliar milhares de caminhos de arbitragem.

  • Determinismo: através da análise de dados de conta brutos (Account Data), você pode obter um controle de estado mais fundamental do que na simulação.

2. Raydium (CPMM): A arte do produto constante

Os pools padrão da Raydium seguem a clássica fórmula x×y=k. Embora a lógica seja simples, a implementação engenheiral precisa lidar com pequenas discrepâncias de precisão e taxas.

2.1 Fórmula central de cotação

No cenário com taxa, a fórmula para calcular a versão inteira de amount_out é:

  1. Entrada com taxa: AmountInwith_fee=AmountIn×(FeeDenominator−FeeNumerator)AmountInwith_fee=AmountIn×(FeeDenominator−FeeNumerator)

  2. Cálculo de saída: AmountOut=AmountInwith_fee×ReserveoutReservein×FeeDenominator+AmountInwith_feeAmountOut=Reservein×FeeDenominator+AmountInwith_feeAmountInwith_fee×Reserveout

2.2 Jogo de precisão: A necessidade do U256

Na Solana, a quantidade de tokens é geralmente u64. Mas ao calcular o numerador (Numerator) da fórmula acima, multiplicar dois grandes u64 resulta imediatamente em estouro.

  • Solução: introduzir U256 na camada de cálculo intermediária. Embora a biblioteca oficial Rust não forneça isso diretamente, através de macros uint ou da biblioteca primitive-types, podemos garantir a precisão absoluta mesmo sob alta volatilidade (grandes entradas).

3. Orca Whirlpool (CLMM): análise precisa da liquidez concentrada

Comparado ao CPMM, o modelo de liquidez concentrada (CLMM) da Orca é muito mais complexo. Ele envolve não apenas preço, mas também Tick (intervalo de preço) e profundidade de liquidez.

3.1 A representação do preço: Q64.64 sqrtPrice

A Orca utiliza preço quadrático (sqrtPrice) e armazena em formato de ponto flutuante Q64.64.

  • Fórmula: Price=(sqrtPriceX64264)2Price=(264sqrtPriceX64)2

  • Durante a análise, precisamos lidar com inteiros super grandes de 128 bits, extraindo o preço real por meio de operações de deslocamento.

3.2 Análise rápida: Método de fatias Offset

A estrutura da conta da Orca é muito grande (inclui vários conjuntos de recompensas, parâmetros de taxa, etc.), e se usar a desserialização completa (Borsh Deserialize), a perda de desempenho é enorme.
Solução de otimização de nível industrial:
Localizar diretamente os dados binários da conta com deslocamento (Offset). Como a estrutura do pool é fixa, podemos ler as bytes-chave diretamente.

  • data[49..65] -> Liquidez (Liquidity)

  • data[65..81] -> Preço (sqrtPrice)

  • data[81..85] -> Tick atual
    Esse método é mais de 10 vezes mais rápido do que a análise completa.

4. Design de arquitetura: camada de cotação

Para que a camada de estratégia (Strategy) não precise se preocupar com as diferenças matemáticas entre DEXs, precisamos construir um motor de cotação unificado:

fluxograma LR
RawData[Dados de conta brutos] -->|Análise| AMMState[Imagem de memória do AMM]
AMMState -->|Valor de entrada| LocalMath[Modelo matemático local]
LocalMath -->|Saída| AmountOut[Cotação estruturada]

subgraph "Camada de poder computacional local"
LocalMath
AMMState
end

Este motor irá manter em tempo real o saldo do pool Vault. Quando o Scout detecta qualquer alteração em um Vault, o motor de cotação recalcula imediatamente a cotação completa para aquele par de tokens.

5. Otimização de engenharia: velocidade nos detalhes

  1. Cálculo de alocação zero: evite alocação de memória (Heap Allocation) durante o cálculo, utilizando tipos nativos na pilha.

  2. Processar requisições RPC em lote: embora a precificação seja local, o saldo do cofre ainda precisa ser sincronizado. Use getMultipleAccounts para obter em lote todos os estados do Vault relevantes, reduzindo a latência de rede.

  3. Pré-cálculo: para parâmetros fixos, como taxas, realize a análise na fase de inicialização fria, não calcule repetidamente a cada milissegundo no Hot Path.

6. Demonstração técnica: Lógica de cotação CPMM (versão Python)

Embora o ambiente de produção busque o desempenho extremo do Rust, sua lógica matemática central pode ser claramente demonstrada em Python:

# Simulação de cálculos de cotação local de alto desempenho
def calculate_local_quote(amount_in, res_in, res_out, fee_pct=0.0025):
"""
Cotação local CPMM: x * y = k
"""
# Simulação de cálculo U256 para evitar estouro
fee_numerator = int(fee_pct * 10000)
fee_denominator = 10000

# 1. Calcular o valor efetivo de entrada após deduzir taxas
amount_in_with_fee = amount_in * (fee_denominator - fee_numerator)

# 2. Calcular a saída de acordo com a fórmula
numerator = amount_in_with_fee * res_out
denominator = (res_in * fee_denominator) + amount_in_with_fee

amount_out = numerator // denominator

# 3. Calcular o impacto de preço (Price Impact)
price_impact = (amount_out / res_out) if res_out > 0 else 1

return amount_out, price_impact

# Simulação: 1 SOL troca por USDC, o pool tem 1000 SOL / 100.000 USDC
out, impact = calculate_local_quote(1 10*9, 1000 10*9, 100000 10*6)
print(f"[*] Estimativa de saída: {out / 10**6} USDC")
print(f"[*] Impacto de preço: {impact:.4%}")

7. Resumo: poder computacional é lucro

No mundo da MEV da Solana, a capacidade de precificação local determina seu nível de competição.

  • Jogadores iniciantes dependem de simulações RPC, apenas podendo pegar o que sobra.

  • Jogadores intermediários implementam CPMM localmente.

  • Jogadores avançados podem analisar com precisão cada Tick do CLMM e implementar arbitragem atomizada com Jito.

Próximo passo previsto

Agora que temos o "Scout" e o "Cérebro (AMM Math)", vamos entrar na parte mais emocionante: como elaborar estratégias de arbitragem entre DEXs? Diante de um cenário complexo com múltiplos caminhos e protocolos, como encontrar o caminho mais lucrativo?

Este artigo foi escrito por Levi.eth. Na Solana, cada otimização das fórmulas matemáticas pode se traduzir em ganhos reais on-chain.

JTO
JTOUSDT
0.3412
-1.70%
SOL
SOLUSDT
127.6
-1.29%