În pădurea întunecată a Solana, când primești un semnal de actualizare a contului de la modulul Scout, competiția a intrat deja în ultimele câteva milisecunde. Dacă mai ai nevoie să trimiți tranzacția înapoi către nodul RPC pentru "simulare" (Simulate) pentru a obține o ofertă, atunci, când primești rezultatul, șansa este deja luată de cei care au efectuat calculul local.

Un Searcher adevărat nu așteaptă răspunsul de la RPC. Ei păstrează o imagine locală a stării AMM în memoria locală și, în momentul în care primesc datele binare, calculează direct prețul optim prin intermediul unui model matematic.

Acest articol va detalia cum să construim un motor de prețuri locale eficient pentru Raydium (CPMM) și Orca (CLMM).

1. Conceptul principal: Calcul local vs. simulare RPC

1.1 De ce să alegem prețuri locale?

  • Întârziere extremă: Simularea RPC necesită de obicei 50ms-200ms, în timp ce calculul pur matematic local necesită doar microsecunde.

  • Capacitate de concurență: Calculul local nu consumă performanța nodurilor RPC, putând evalua instantaneu mii de căi de arbitraj.

  • Determinism: Prin analizarea datelor originale ale contului (Account Data), poți obține un control de stare mai profund decât simularea.

2. Raydium (CPMM): Arta produsului constant

Standardul piscinei Raydium urmează formula clasică x×y=k. Deși logica este simplă, implementarea ingineriei trebuie să gestioneze deviațiile minore de precizie și comisioane.

2.1 Formula principală de ofertă

În scenariile cu comision, formula pentru calculul versiunii întregi a amount_out este:

  1. Intrare cu comision: AmountInwith_fee=AmountIn×(FeeDenominator−FeeNumerator)AmountInwith_fee​=AmountIn×(FeeDenominator−FeeNumerator)

  2. Calculul producției: AmountOut=AmountInwith_fee×ReserveoutReservein×FeeDenominator+AmountInwith_feeAmountOut=Reservein​×FeeDenominator+AmountInwith_fee​AmountInwith_fee​×Reserveout​​

2.2 Jocul de precizie: Necesitatea U256

În Solana, cantitatea de token-uri este de obicei u64. Dar, atunci când calculăm numitorul (Numerator) al formulei de mai sus, înmulțirea a două u64 mari va duce imediat la depășirea capacității.

  • Soluție: Introduceți U256 în stratul de calcul intermediar. Deși biblioteca oficială Rust nu o oferă direct, prin intermediul macro-ului uint sau a bibliotecii primitive-types, putem asigura calculul cu precizie absolută chiar și în condiții de volatilitate extremă (intrări mari).

3. Orca Whirlpool (CLMM): Analiza precisă a lichidității centralizate

Comparativ cu CPMM, modelul de lichiditate centralizată (CLMM) al Orca este mult mai complex. Acesta implică nu doar prețul, ci și Tick (intervalul de preț) și adâncimea lichidității.

3.1 Reprezentarea prețului: Q64.64 sqrtPrice

Orca folosește prețuri pătrat (sqrtPrice) și le stochează în format de număr flotant Q64.64.

  • Formula: Price=(sqrtPriceX64264)2Price=(264sqrtPriceX64​)2

  • Atunci când analizăm, trebuie să gestionăm numere întregi foarte mari de 128 de biți, extrăgând prețul real prin operații de deplasare.

3.2 Analiză rapidă: Metoda de feliere Offset

Structura contului Orca Whirlpool este foarte mare (inclusiv mai multe seturi de recompense, parametrii de comision etc.), iar utilizarea deserializării complete (Borsh Deserialize) va duce la pierderi mari de performanță.
Soluții de optimizare de nivel industrial:
Localizarea directă a datelor binare ale contului prin Offset. Deoarece structura piscinei este fixă, putem citi direct byte-urile cheie.

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

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

  • data[81..85] -> Tick curent
    Această metodă este cu peste 10 ori mai rapidă decât analiza completă.

4. Proiectare arhitecturală: Strat de ofertă (Quote)

Pentru a permite stratului de strategie să nu se îngrijoreze de diferențele matematice între diferitele DEX-uri, trebuie să construim un motor de ofertă unificat.

flowchart LR
RawData[Datele contului originale] -->|Analiză| AMMState[Imaginea de memorie AMM]
AMMState -->|Sumă de intrare| LocalMath[Modelul matematic local]
LocalMath -->|Ieșire| AmountOut[Ofertă structurat]

subgraph "Stratul de putere de calcul local"
LocalMath
AMMState
end

Acest motor va menține în timp real soldul piscinei Vault. Atunci când Scout detectează orice modificare a unui Vault, motorul Quote va recalcula imediat oferta completă pentru acel pereche de token-uri.

5. Optimizare inginerie: Viteza din detalii

  1. Calculul fără alocare: În timpul procesului de calcul, evitați pe cât posibil alocarea de memorie (Heap Allocation), folosind tipuri native pe stivă.

  2. Batch RPC Requests: Deși prețul este local, soldul trezoreriei trebuie să fie sincronizat. Folosiți getMultipleAccounts pentru a obține în mod eficient toate stările relevante ale trezoreriei, reducând călătoriile de rețea.

  3. Precalculare: Pentru parametrii fixați, cum ar fi ratele, analiza trebuie finalizată în etapa de pornire rece, fără a repeta calculul în fiecare milisecundă pe Calea Fierbinte.

6. Demonstrație tehnică: Logica ofertelor CPMM (versiunea Python)

Deși mediul de producție caută performanța extremă a Rust, logica matematică de bază poate fi demonstrată clar prin Python:

# Simularea calculului de prețuri locale de înaltă performanță
def calculate_local_quote(amount_in, res_in, res_out, fee_pct=0.0025):
"""
Prețul local CPMM: x * y = k
"""
# Simularea calculului U256, prevenind depășirea capacității
fee_numerator = int(fee_pct * 10000)
fee_denominator = 10000

# 1. Calculați intrarea efectivă după comision
amount_in_with_fee = amount_in * (fee_denominator - fee_numerator)

# 2. Calculați producția conform formulei
numerator = amount_in_with_fee * res_out
denominator = (res_in * fee_denominator) + amount_in_with_fee

amount_out = numerator // denominator

# 3. Calculați impactul prețului (Price Impact)
price_impact = (amount_out / res_out) if res_out > 0 else 1

return amount_out, price_impact

# Simulare: 1 SOL schimbat cu USDC, în piscină sunt 1000 SOL / 100,000 USDC
out, impact = calculate_local_quote(1 10*9, 1000 10*9, 100000 10*6)
print(f"[*] Estimare a producției: {out / 10**6} USDC")
print(f"[*] Impactul prețului: {impact:.4%}")

7. Concluzie: Puterea de calcul este venit

În lumea MEV din Solana, capacitatea de preț local determină nivelul tău de competiție.

  • Jucătorii de bază se bazează pe simularea RPC, putând doar să culeagă resturile.

  • Jucătorii de nivel mediu implementează CPMM localizat.

  • Jucătorii avansați pot analiza cu precizie fiecare Tick al CLMM și pot implementa arbitraj atomic prin Jito.

Anunțul următor

Acum că avem „Scout” și „AMM Math”, să trecem la partea cea mai interesantă: cum să elaborăm strategii de arbitraj inter-DEX? În fața unei situații complexe cu multiple căi și protocoale, cum să găsim calea cea mai profitabilă?

Acest articol a fost scris de Levi.eth. În Solana, fiecare optimizare a formulelor matematice poate fi transformată în câștiguri reale pe lanț.

JTO
JTOUSDT
0.463
+7.45%
SOL
SOLUSDT
146.09
+5.62%