Zum Hauptinhalt springen
Diese Seite wurde mit KI automatisch übersetzt. Maßgeblich ist stets die englische Version.Englische Version ansehen →
CPI (»Cross-Program Invocation«) ist der Mechanismus, mit dem ein Solana-Programm ein anderes aufruft. Raydiums Anchor-Programme werden mit CPI-Wrapper-Crates ausgeliefert, die den Aufrufplatz wie einen typisierten Funktionsaufruf erscheinen lassen — Kontostrukturen mit validierten Feldnamen und cpi::<ix>()-Hilfsfunktionen. Diese Seite dokumentiert das allgemeine Muster; für produktspezifische Snippets siehe die Code-Demos-Seite jedes Produktkapitels.

Cargo-Abhängigkeiten

Das cpi-Feature-Flag sorgt dafür, dass die Crates nur zu der CPI-Oberfläche kompiliert werden (Kontostrukturen + Invoker) anstelle des vollständigen Programms, sodass Ihr Binary klein bleibt. Für funktionierende CPI-Beispiele, die die Kontostrukturen end-to-end verbinden, siehe raydium-io/raydium-cpi-example (behandelt AMM v4, CPMM und CLMM).

Kontolisten-Konstruktion

Jede Raydium-CPI erfordert eine Accounts-Struktur im aufrufenden Programm. Felder entsprechen 1:1 der Kontenreihenfolge des Programm-Befehls mit Feldvalidierungen:
Die meisten Raydium-seitigen Konten sind UncheckedAccount, weil der aufgerufene (Raydium) die Validierung übernimmt. Ihr aufrutendes Programm validiert nur streng Konten, die Sie besitzen — Benutzer-ATAs, Ihre eigenen PDAs. Der /// CHECK:-Doc-Kommentar unterdrückt Anchors Warnung über fehlende Checks.

Aufbau des CPI-Aufrufs

Anchor generiert eine Hilfsfunktion pro Befehl:
cpi::swap_base_input wird aus dem IDL generiert; seine Argumentliste spiegelt die Argumentliste des Anchor-Befehls.

Signierseeds (PDA-signierte CPI)

Wenn Ihr Programm die CPI im Namen einer PDA signiert (häufig bei Tresoren, Hinterlegungen usw.), verwenden Sie CpiContext::new_with_signer:
Die Signierseeds müssen mit der Ableitung der PDA übereinstimmen. Für jedes Konto, das als authority (oder ähnliche Signierrolle) weitergegeben wird, prüft die Solana-Runtime, dass die PDA durch diese Seeds signiert.

Verbleibende Konten

Einige Raydium-Befehle nutzen verbleibende Konten — eine variable Liste, die nach den festen Konten angehängt wird. Die kanonischen Beispiele:
  • CLMM SwapV2: hängt 1–8 TickArrayState-Konten an, die den Tick-Arrays entsprechen, die der Swap durchlaufen könnte.
  • Farm v6 Deposit: hängt (reward_vault, user_reward_ata)-Paare für jeden aktiven Reward-Stream an.
Anchors CPI-Hilfsfunktionen prüfen verbleibende Konten nicht typsicher. Übergeben Sie diese über .with_remaining_accounts(...):
Die Reihenfolge ist wichtig: das Empfängerprogramm iteriert die verbleibenden Konten in der Reihenfolge, in der Sie diese übergeben. Bei CLMM müssen Tick-Arrays direktional sortiert werden (erstes Array in Swap-Richtung zuerst). Bei Farm v6 gehen Reward-Slots in Slot-Index-Reihenfolge.

Error-Propagation

Raydiums Programme geben ihre eigenen Error-Enums zurück. Anchor umhüllt diese; Ihr aufrutendes Programm sieht sie als Err(ProgramError::Custom(code)). Um spezifische Fehler zu handhaben:
Die Error-Code-Nummer ist stabil gemäß der IDL-Richtlinie (sdk-api/anchor-idl). Sie können gegen spezifische Codes testen, indem Sie gegen den numerischen Wert vergleichen.

Compute-Budget in zusammengesetzten CPIs

Jeder CPI-Frame hat Overhead (~1.500 CU für den Aufruf selbst), und der eigene CU-Verbrauch des aufgerufenen Programms stapelt sich auf Ihrem. Eine Transaktion, die einen CPMM-Swap von innerhalb Ihres Programms aufruft, verbraucht:
Für Stacking-Routing (Ihr Programm → Aggregator → CPMM + CLMM + Farm Harvest) Budget ≥500k CU. Setzen Sie immer einen expliziten ComputeBudgetProgram::set_compute_unit_limit(...)-Befehl in der Transaktion — das Standard-200k-CU-Limit wird sich stumm erschöpfen.

AMM v4 — manuelle Instruction-Konstruktion

AMM v4 hat keine Anchor-Crate. Bauen Sie die Instruction von Hand:
Siehe products/amm-v4/code-demos für die vollständige Kontoliste.

Farm v6 — Reward-Pair-verbleibende Konten

Farm v6s Deposit / Withdraw / Harvest nutzen das (reward_vault_i, user_reward_ata_i)-Pair-Muster in verbleibenden Konten. Genaue Reihenfolge:
Ein Pair pro aktiven (laufenden oder beendeten-aber-ungesammelten) Reward-Slot. Lassen Sie ungenutzte Slots weg; das Programm dispatched von farm_state.reward_infos[i].reward_state.

Testen eines CPI-Flows

Local Dev erfordert, dass die Raydium-Programme in Ihrem Test-Validator verfügbar sind. Optionen:
  1. anchor test mit Program Clone — in Anchor.toml:
    Dies zieht den eingesetzten Bytecode von Mainnet in Ihren lokalen Validator.
  2. Devnet — Raydium setzt alle Programme auf Devnet mit denselben Program-IDs wie Mainnet ein. Führen Sie anchor test --provider.cluster devnet aus, um auf Live-Code zuzugreifen.
  3. Lokales Deploy — Klonen Sie die Raydium-Repos und anchor deploy auf einen lokalen Validator. Fügt Test-Zyklus-Overhead hinzu, ermöglicht aber, dass Sie den aufgerufenen Code zum Debuggen ändern.

Verweise

Quellen: