Skip to main content
Diese Seite wurde mit KI automatisch übersetzt. Maßgeblich ist stets die englische Version.Englische Version ansehen →
Rayidums neuere Programme (CPMM, CLMM, Farm v6, LaunchLab) sind in Anchor geschrieben — einem Rust-Framework, das auf Solanas nativem Programmmodell aufbaut und Kontovalidierung, Fehlerbehandlung und ein IDL (Interface Description) bereitstellt. AMM v4 und ältere Farms stammen aus der Zeit vor Anchor. Das Verständnis beider Paradigmen hilft Ihnen, den Code zu lesen, Clients aus dem IDL zu generieren und unerwartete Fehler zu debuggen.

Programmbereitstellungsmodell

Jedes Solana-Programm existiert unter einem Pubkey. Der Bytecode des Programms wird in einem ausführbaren Konto gespeichert, das vom BPF Upgradable Loader (BPFLoaderUpgradeab1e11111111111111111111111) verwaltet wird. Eine Programmbereitstellung umfasst drei Konten:
  1. Programmkonto: kleines Metadatenkonto unter der Programm-ID. Besitzer: BPF Upgradable Loader.
  2. ProgramData-Konto: enthält den eigentlichen Bytecode. Abgeleitet als [program_id, "programdata"].
  3. Buffer-Konto (temporär): enthält neuen Bytecode während eines Upgrades. Wird nach dem Upgrade verworfen.
Das ProgramData-Konto hat eine Upgrade-Autorität — einen Schlüssel, der den Bytecode durch eine neue Version ersetzen kann. Rayidums Upgrade-Autorität ist ein Multisig hinter einer 24-Stunden-Zeitsperre; siehe security/admin-and-multisig.

Überprüfung eines bereitgestellten Programms

Um zu bestätigen, dass das On-Chain-Programm dem auditierten Quellcode entspricht:
Übereinstimmende Hashes beweisen, dass Sie mit dem Quellcode interagieren, den Sie erwarten. Raydium veröffentlicht Anweisungen für verifizierte Builds in den Release Notes.

Anchor: ein Framework auf Solana

Raw-Solana-Programme sind Rust-Funktionen mit dieser Signatur:
Anchor wickelt den ganzen Boilerplate ein und lässt Sie schreiben:
Anchor:
  • Generiert automatisch einen deterministischen 8-Byte-Diskriminator für jede Instruktion und jeden Kontotyp.
  • Validiert Kontoeinschränkungen (Besitzer, Seeds, Writable, Signer, Mint-Übereinstimmung, Token-Programm-Übereinstimmung), bevor Ihr Code ausgeführt wird.
  • Generiert ein IDL — eine Schnittstellenbeschreibungsdatei, die Clients zum Aufrufen des Programms verwenden.
  • Wird mit einer Rust-, TypeScript- und Python-Client-Bibliothek ausgeliefert.

Der 8-Byte-Diskriminator

Jedes Anchor-Konto und jede Anchor-Instruktion beginnt mit einem 8-Byte-Diskriminator — den ersten 8 Bytes des SHA-256 einer festen Zeichenkette:
Wenn Sie eine Anchor-Instruktion aufrufen, sind die ersten 8 Bytes der Instruktionsdaten dieser Diskriminator; Anchor leitet an den richtigen Handler weiter, indem er sie nachschlägt. Wenn Sie ein Anchor-Konto lesen, teilen die ersten 8 Bytes seinen Typ mit — entscheidend für Tools wie getProgramAccounts, die alle Konten eines Typs aufzählen.

Fehler

Anchor-Programme definieren Fehler über #[error_code]:
Anchor weist diesen numerischen Codes automatisch ab 6000 (0x1770) zu. Rayidums vollständige Fehlerkodtabelle befindet sich in reference/error-codes.

Das IDL

Eine Anchor-IDL-Datei (Interface Description Language) ist eine JSON-Beschreibung eines Programms: seine Instruktionen, Konten, Typen, Fehler und Events. Sie ist das Äquivalent eines Ethereum ABI. Raydium veröffentlicht IDLs für alle Anchor-Programme. Abrufen direkt von der Chain:
Oder aus der SDK-Quelle: src/raydium/*/idl/*.json.

IDL-Struktur

Generieren eines Clients aus dem IDL

Anchors anchor CLI generiert TypeScript- und Rust-Typen:
Tools von Drittanbietern wie Kinobi können Rust-, Python-, C- oder Go-Clients aus einem IDL generieren.

Wenn das IDL Ihr Freund ist

Wenn Sie eine benutzerdefinierte Integration erstellen möchten, die nicht durch das Raydium SDK läuft:
  1. Rufen Sie das IDL ab (live von der Chain oder aus der SDK-Quelle).
  2. Schlagen Sie die gewünschte Instruktion nach (z. B. swap_base_input).
  3. Konstruieren Sie die Instruktionsdaten: 8-Byte-Diskriminator + kodierte Argumente.
  4. Übergeben Sie Konten in der Reihenfolge, die das IDL angibt.
Siehe sdk-api/anchor-idl für durchgearbeitete Beispiele.

Pre-Anchor-Programme: AMM v4 und Farm v3/v5

Diese Programme stammen aus der Zeit vor Anchor. Sie verwenden:
  • Manuelle Instruktionsverteilung: ein u8-Tag in instruction_data mit einer match-Anweisung.
  • Manuelle Kontovalidierung: if accounts[0].owner != &expected_program { ... }.
  • Borsh-serialisierte Instruktionsargumente: kein Diskriminator, nur instruction_data[1..].
  • Layout über #[repr(C, packed)]: C-Struktur-Binärlayout.
Raydium SDK v2 wird mit TypeScript-Layouts für die nicht-Anchor AMM v4-Instruktionen ausgeliefert, damit Clients ohne Anchor kodieren/dekodieren können:
Das Integrationsmuster ist dasselbe — Sie erhalten nur nicht Anchors IDL-gesteuerte automatische Generierung.

Programmaktualisierungsmechaniken

Nur die upgrade_authority des ProgramData kann aktualisieren. Schritte:
  1. Kompilieren Sie den neuen Bytecode.
  2. Schreiben Sie ihn in ein Buffer-Konto (solana program write-buffer).
  3. Reichen Sie eine Upgrade-Instruktion ein: BpfLoaderUpgradeable::Upgrade { buffer, program, authority }.
  4. Die Runtime ersetzt den Bytecode des Programms atomisch durch den Inhalt des Buffers.
Raydium sperrt dies hinter einer 24-Stunden-Zeitsperre ein, die in den Einstellungen des Squads-Multisigs implementiert ist. Eine Upgrade-Transaktion muss 24 Stunden nach der Multisig-Genehmigung warten, bevor sie ausgeführt werden kann. Dies schützt vor übereilten oder erzwungenen Upgrades. Siehe security/admin-and-multisig.

Ein Programm unveränderlich machen

Eine Upgrade-Autorität kann auf None gesetzt werden, woraufhin das Programm dauerhaft unveränderlich wird. Raydium hat dies für kein Produkt getan — das Team behält die Möglichkeit, Sicherheitspatches bereitzustellen. Kompromiss: Benutzer müssen dem Multisig- und Zeitsperre-Prozess vertrauen.

Programme und Miete

Die Bereitstellung eines Programms verbraucht mietbefreite Lamports:
  • Ein 50-KB-Programm: ~0,35 SOL Miete.
  • Ein 200-KB-Programm: ~1,4 SOL Miete.
Das Schließen eines Programms (über solana program close) gibt die Lamports zurück. Raydium-Programme bleiben aktiv und sind nicht für die Schließung geplant.

Debugging von Anchor-Programmen

Protokollausgabe

Anchors msg!-Makro schreibt in das Transaktionsprotokoll. Simulieren Sie eine Transaktion, um Protokolle zu sehen:
Protokolle enthalten:
  • Programmaufrufe (Program CPMMoo8... invoke [1]).
  • msg!-Aufrufe aus dem Programmcode.
  • Compute-Unit-Verbrauch (consumed 137842 of 400000 compute units).
  • Programmerfolg oder Fehler.

Fehlercodes

Wenn ein Anchor-Programm wirft, zeigt das Protokoll:
0x1770 = 6000 dezimal = der erste Anchor-Fehler (z. B. SlippageExceeded). Kreuzen Sie mit dem errors-Array des IDL ab. Siehe reference/error-codes für Rayidums vollständige Fehlertabelle.

Kontolay-Nichtübereinstimmungen

Wenn Sie das falsche Konto in den falschen Slot übergeben, geben Anchors Kontovalidierungsmakros Fehler wie zurück:
Fehlernummern unter 6000 sind Anchors integrierte Fehler (siehe Anchors ErrorCode-Enum); Fehler ≥6000 sind die benutzerdefinierten Codes des Programms.

Verweise

Quellen: