W mrocznym lesie Solany, gdy otrzymujesz sygnał aktualizacji konta z modułu Scout, rywalizacja wchodzi w ostatnie milisekundy. Jeśli musisz wysłać transakcję z powrotem do węzła RPC w celu "symulacji" w celu uzyskania oferty, szansa często zostaje już wykorzystana przez konkurentów, którzy dokonali obliczeń lokalnie.
Prawdziwy profesjonalista Searcher nigdy nie czeka na odpowiedź RPC. Przechowuje on lokalnie kopię stanu AMM w pamięci i natychmiast po otrzymaniu danych binarnych oblicza optymalną cenę za pomocą modelu matematycznego.
Ten artykuł rozłoży na czynniki sposób budowy wydajnego lokalnego silnika wyceny dla Raydium (CPMM) i Orca (CLMM).
1. Kluczowa idea: lokalne obliczenia vs. symulacje RPC
1.1 Dlaczego wybrać lokalne ceny?
Ekstremalne opóźnienie: symulacja RPC zwykle wymaga 50ms-200ms, podczas gdy lokalne czyste obliczenia potrzebują tylko mikrosekund.
Zdolność równoległa: lokalne obliczenia nie zużywają wydajności węzłów RPC, mogą natychmiast przeszukiwać tysiące ścieżek arbitrażu.
Deterministyczność: poprzez analizę surowych danych konta (Account Data) możesz uzyskać kontrolę nad stanem na niższym poziomie niż podczas symulacji.
2. Raydium (CPMM): sztuka stałych iloczynów
Standardowa pula Raydium stosuje klasyczną formułę x×y=k. Mimo że logika jest prosta, w realizacji inżynieryjnej należy zająć się niewielkimi odchyleniami w precyzji i opłatach.
2.1 Kluczowa formuła wyceny
W przypadku scenariuszy z opłatami, całkowita wersja formuły do obliczenia amount_out to:
Wejście z opłatą: AmountInwith_fee=AmountIn×(FeeDenominator−FeeNumerator)AmountInwith_fee=AmountIn×(FeeDenominator−FeeNumerator)
Obliczanie wyniku: AmountOut=AmountInwith_fee×ReserveoutReservein×FeeDenominator+AmountInwith_feeAmountOut=Reservein×FeeDenominator+AmountInwith_feeAmountInwith_fee×Reserveout
2.2 Gra o precyzję: Konieczność U256
Na Solana liczba tokenów to zazwyczaj u64. Jednak podczas obliczania wspomnianego wzoru w liczniku (Numerator) dwa duże u64 mnożone razem natychmiast prowadzą do przepełnienia.
Rozwiązanie: Wprowadzenie U256 do warstwy obliczeniowej. Choć oficjalna biblioteka Rust tego nie dostarcza, dzięki makro uint lub bibliotece primitive-types możemy zapewnić absolutną precyzję obliczeń nawet przy bardzo dużej zmienności (duże wejścia).
3. Orca Whirlpool (CLMM): precyzyjna analiza skoncentrowanej płynności
W przeciwieństwie do CPMM, model skoncentrowanej płynności Orca (CLMM) jest znacznie bardziej złożony. Obejmuje nie tylko ceny, ale także Tick (zakres cenowy) i głębokość płynności.
3.1 Reprezentacja ceny: Q64.64 sqrtPrice
Orca używa ceny pierwiastkowej (sqrtPrice) i przechowuje ją w formacie zmiennoprzecinkowym Q64.64.
Formuła: Price=(sqrtPriceX64264)2Price=(264sqrtPriceX64)2
Podczas analizy musimy obsługiwać bardzo duże liczby całkowite 128-bitowe, wydobywając prawdziwe ceny za pomocą operacji przesunięcia.
3.2 Ekstremalna analiza: Metoda przesunięcia Offset
Struktura konta Orca Whirlpool jest bardzo duża (zawiera wiele zestawów nagród, parametrów opłat itp.), jeśli użyjesz pełnej deserializacji (Borsh Deserialize), straty wydajności są ogromne.
Przemysłowe rozwiązanie optymalizacyjne:
Bezpośrednie lokalizowanie binarnych danych konta za pomocą przesunięcia (Offset). Ponieważ struktura puli jest stała, możemy bezpośrednio odczytać kluczowe bajty:
data[49..65] -> Płynność (Liquidity)
data[65..81] -> Cena (sqrtPrice)
data[81..85] -> Aktualny Tick
Ten sposób jest ponad 10 razy szybszy niż pełna analiza.
4. Projekt architektury: Warstwa wyceny
Aby warstwa strategii (Strategy) nie musiała się martwić o matematyczne różnice między różnymi DEX, musimy zbudować jednolity silnik wyceny:
flowchart LR
RawData[Surowe dane konta] -->|Analiza| AMMState[Obraz pamięci AMM]
AMMState -->|Kwota wejściowa| LocalMath[Model matematyczny lokalny]
LocalMath -->|Wynik| AmountOut[Zorganizowana wycena]
subgraph "Lokalna warstwa mocy obliczeniowej"
LocalMath
AMMState
end
Ten silnik będzie w czasie rzeczywistym utrzymywał saldo skarbca. Gdy Scout usłyszy jakąkolwiek zmianę w skarbcu, silnik wyceny natychmiast przeliczy pełną wycenę tej pary tokenów.
5. Optymalizacja inżynieryjna: szybkość z detali
Obliczenia z zerową alokacją: W trakcie obliczeń staraj się unikać alokacji pamięci (Heap Allocation), używaj natywnych typów na stosie.
Partia żądań RPC: Chociaż wycena jest lokalna, saldo skarbca musi być zsynchronizowane. Użyj getMultipleAccounts, aby jednocześnie pobrać wszystkie związane stany skarbca, zmniejszając liczbę wędrówek sieciowych.
Preobliczenia: W przypadku stałych parametrów, takich jak stawki, zakończ analizę w fazie zimnego uruchamiania, nie obliczaj ich na każdej milisekundzie w gorącej ścieżce.
6. Prezentacja techniczna: logika wyceny CPMM (wersja Python)
Chociaż środowisko produkcyjne dąży do ekstremalnej wydajności Rust, jego podstawowa logika matematyczna może być jasno demonstrowana w Pythonie:
# Symulacja obliczeń lokalnych o wysokiej wydajności
def calculate_local_quote(amount_in, res_in, res_out, fee_pct=0.0025):
"""
Lokalna wycena CPMM: x * y = k
"""
# Symulacja obliczeń U256, aby zapobiec przepełnieniu
fee_numerator = int(fee_pct * 10000)
fee_denominator = 10000
# 1. Oblicz efektywną kwotę wejściową po odjęciu opłat
amount_in_with_fee = amount_in * (fee_denominator - fee_numerator)
# 2. Oblicz wynik według wzoru
numerator = amount_in_with_fee * res_out
denominator = (res_in * fee_denominator) + amount_in_with_fee
amount_out = numerator // denominator
# 3. Oblicz wpływ ceny (Price Impact)
price_impact = (amount_out / res_out) if res_out > 0 else 1
return amount_out, price_impact
# Symulacja: 1 SOL na USDC, w puli jest 1000 SOL / 100,000 USDC
out, impact = calculate_local_quote(1 10*9, 1000 10*9, 100000 10*6)
print(f"[*] Szacowany wynik: {out / 10**6} USDC")
print(f"[*] Wpływ ceny: {impact:.4%}")
7. Podsumowanie: moc obliczeniowa to zysk
W świecie Solana MEV zdolności do wyceny lokalnej decydują o poziomie konkurencji.
Początkujący gracze polegają na symulacjach RPC, mogą tylko zbierać resztki rosołu.
Gracze średniego poziomu realizują lokalizację CPMM.
Zaawansowani gracze mogą precyzyjnie analizować każdy Tick CLMM i wdrażać zatomizowany arbitraż z Jito.
Następny krok zapowiedzi
Teraz, gdy mamy „zmysł (Scout)” i „mózg (AMM Math)”, czas na najbardziej ekscytującą część: jak opracować strategię arbitrażu między DEX? W obliczu złożonej sytuacji z wieloma ścieżkami i protokołami, jak znaleźć tę najbardziej zyskowną ścieżkę?
Ten artykuł został napisany przez Levi.eth. Na Solanie, każda linia optymalizacji wzoru matematycznego może przekształcić się w rzeczywisty zysk na łańcuchu.

