Zum Hauptinhalt springen

Documentation Index

Fetch the complete documentation index at: https://docs.raydium.io/llms.txt

Use this file to discover all available pages before exploring further.

Diese Seite wurde mit KI automatisch übersetzt. Maßgeblich ist stets die englische Version.Englische Version ansehen →
Raydium’s neuere Programme (CPMM, CLMM, Farm v6, LaunchLab) sind in Anchor geschrieben — ein Rust-Framework, das auf Solana’s nativen Programmmodell aufbaut und Kontenvalidierung, Fehlerbehandlung und ein IDL (Interface-Beschreibung) bietet. AMM v4 und ältere Farms entstanden vor Anchor. Das Verständnis beider Paradigmen hilft Ihnen, den Code zu lesen, Clients aus der IDL zu generieren und unerwartete Fehler zu debuggen.

Bereitstellungsmodell für Programme

Jedes Solana-Programm existiert unter einer Pubkey. Der Bytecode des Programmes wird in einem ausführbaren Konto gespeichert, das vom BPF Upgradeable Loader (BPFLoaderUpgradeab1e11111111111111111111111) gehört. Eine Programmbereitstellung besteht aus drei Konten:
  1. Programmkonto: kleines Metadatenkonto unter der Programm-ID. Besitzer: BPF Upgradeable Loader.
  2. ProgramData-Konto: enthält den eigentlichen Bytecode. Abgeleitet als [program_id, "programdata"].
  3. Buffer-Konto (transient): enthält neuen Bytecode während eines Upgrades. Nach dem Upgrade verworfen.
Das ProgramData-Konto hat eine Upgrade-Berechtigung — einen Schlüssel, der den Bytecode durch eine neue Version ersetzen kann. Raydium’s Upgrade-Berechtigung ist ein Multisig hinter einer 24-Stunden-Zeitsperre; siehe security/admin-and-multisig.

Überprüfung eines bereitgestellten Programmes

Um zu bestätigen, dass das On-Chain-Programm dem audit-genehmigten Source entspricht:
# Programm von Mainnet exportieren
solana program dump CPMMoo8L3F4NbTegBCKVNunggL7H1Zpdmwpwh8KMoZ0F cpmm-onchain.so

# Aus bekanntem Source bauen
cargo build-bpf --manifest-path raydium-cp-swap/programs/cp-amm/Cargo.toml
cp target/deploy/raydium_cp_swap.so cpmm-source.so

# Vergleichen
sha256sum cpmm-onchain.so cpmm-source.so
Übereinstimmende Hashes beweisen, dass Sie mit dem erwarteten Source interagieren. Raydium veröffentlicht Verified-Build-Anweisungen in den Release Notes.

Anchor: ein Framework auf Solana

Raw-Solana-Programme sind Rust-Funktionen mit dieser Signatur:
pub fn process_instruction(
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    instruction_data: &[u8],
) -> ProgramResult {
    // Manuelles Parsen von instruction_data
    // Manuelle Kontenvalidierung
    // Manuelle Deserialisierung von Kontodaten
    // Manuelle Überprüfung von Signer/Writable-Flags
    // ... dann die eigentliche Arbeit
}
Anchor verpackt den ganzen Boilerplate und lässt Sie schreiben:
#[program]
pub mod cpmm {
    use super::*;

    pub fn swap_base_input(
        ctx: Context<Swap>,
        amount_in: u64,
        min_out: u64,
    ) -> Result<()> {
        // Nur die Business-Logik — ctx ist bereits validiert
    }
}

#[derive(Accounts)]
pub struct Swap<'info> {
    pub payer: Signer<'info>,
    #[account(mut, seeds = [b"pool", config.key().as_ref(), ...], bump)]
    pub pool_state: AccountLoader<'info, PoolState>,
    #[account(mut)]
    pub input_vault: Box<Account<'info, TokenAccount>>,
    // ... weitere Konten
}
Anchor:
  • Generiert automatisch einen deterministischen 8-Byte-Diskriminator für jede Instruktion und jeden Kontotyp.
  • Validiert Kontobeschränkungen (Besitzer, Seeds, Writable, Signer, Mint-Übereinstimmung, Token-Programm-Übereinstimmung), bevor Ihr Code ausgeführt wird.
  • Generiert ein IDL — eine Interface-Beschreibungsdatei, die Clients verwenden, um das Programm aufzurufen.
  • Wird mit Rust-, TypeScript- und Python-Bibliotheken für die Client-Seite 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-Hashs eines festen Strings:
Kontodiskriminator:       sha256("account:PoolState")[0..8]
Instruktionsdiskriminator: sha256("global:swap_base_input")[0..8]
Wenn Sie eine Anchor-Instruktion aufrufen, sind die ersten 8 Bytes der Instruktionsdaten dieser Diskriminator; Anchor leitet zur richtigen Behandlung weiter, indem die Bytes nachgeschlagen werden. 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]:
#[error_code]
pub enum ErrorCode {
    #[msg("Slippage tolerance exceeded")]
    SlippageExceeded,
    #[msg("Pool is disabled")]
    PoolDisabled,
    // ...
}
Anchor weist diesen numerischen Codes automatisch ab 6000 (0x1770) zu. Raydium’s vollständige Fehlercodes-Tabelle befindet sich in reference/error-codes.

Die IDL

Eine Anchor-IDL (Interface Description Language) Datei ist eine JSON-Beschreibung eines Programmes: seine Instruktionen, Konten, Typen, Fehler und Events. Sie ist das Äquivalent eines Ethereum ABI. Raydium veröffentlicht IDLs für alle Anchor-Programme. Abrufen live von On-Chain:
anchor idl fetch CPMMoo8L3F4NbTegBCKVNunggL7H1Zpdmwpwh8KMoZ0F -o cpmm.idl.json
Oder aus dem SDK-Source: src/raydium/*/idl/*.json.

IDL-Struktur

{
  "version":      "0.1.0",
  "name":         "raydium_cp_swap",
  "instructions": [ { "name": "swap_base_input", "accounts": [ ... ], "args": [ ... ] }, ... ],
  "accounts":     [ { "name": "PoolState", "type": { ... } }, ... ],
  "types":        [ { "name": "AmmConfig", "type": { ... } }, ... ],
  "errors":       [ { "code": 6000, "name": "SlippageExceeded", "msg": "..." }, ... ],
  "events":       [ { "name": "SwapEvent", "fields": [ ... ] }, ... ]
}

Generieren eines Clients aus der IDL

Die Anchor anchor CLI generiert TypeScript- und Rust-Typen:
anchor idl build -o target/idl/cpmm.json
# TypeScript-Typen automatisch von Anchor's ts-client generiert
# Raydium SDK enthält diese bereits
Tools von Drittanbietern wie Kinobi können Clients in Rust, Python, C oder Go aus einer IDL generieren.

Wenn die IDL Ihr Freund ist

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

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

Diese Programme entstanden vor Anchor. Sie verwenden:
  • Manuelle Instruktionsverteilung: ein u8-Tag in instruction_data mit einer match-Anweisung.
  • Manuelle Kontenvalidierung: 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 Non-Anchor-AMM-v4-Instruktionen ausgeliefert, damit Clients ohne Anchor kodieren/dekodieren können:
import { liquidityStateV4Layout, swapInstructionData }
  from "@raydium-io/raydium-sdk-v2";

const data = swapInstructionData.encode({
  instruction: 9,   // swap
  amountIn:    1_000_000n,
  minAmountOut: 950_000n,
});
Das Integrationsmuster ist dasselbe — Sie erhalten einfach nicht Anchor’s IDL-gesteuerte Auto-Generierung.

Programmaktualisierungsmechanik

Nur die upgrade_authority des ProgramData kann aktualisiert werden. 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 Programmes atomar durch den Inhalt des Buffers.
Raydium schränkt dies mit 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/erzwungenen Upgrades. Siehe security/admin-and-multisig.

Ein Programm unveränderbar machen

Eine Upgrade-Berechtigung kann auf None gesetzt werden. Danach wird das Programm permanent unveränderbar. Raydium hat dies für kein Produkt getan — das Team behält die Fähigkeit, Sicherheitspatches bereitzustellen. Kompromiss: Benutzer müssen dem Multisig + Zeitsperre-Prozess vertrauen.

Programme und Miete

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

Debugging von Anchor-Programmen

Log-Ausgabe

Das msg! Makro von Anchor schreibt in das Transaktionslog. Simulieren Sie eine Transaktion, um Logs zu sehen:
const sim = await connection.simulateTransaction(tx);
console.log(sim.value.logs);
Logs beinhalten:
  • Programmaufruf (Program CPMMoo8... invoke [1]).
  • msg!-Aufrufe aus Programmcode.
  • Compute-Unit-Verbrauch (consumed 137842 of 400000 compute units).
  • Programmerfolg oder Fehler.

Fehlercodes

Wenn ein Anchor-Programm fehlschlägt, zeigt das Log:
Program CPMMoo8... failed: custom program error: 0x1770
0x1770 = 6000 dezimal = der erste Anchor-Fehler (z. B. SlippageExceeded). Kreuzen Sie mit dem Array errors der IDL ab. Siehe reference/error-codes für Raydium’s vollständige Fehlertabelle.

Konto-Layout-Mismatch

Wenn Sie das falsche Konto in den falschen Slot übergeben, geben Anchor’s Kontenvalidierungs-Makros Fehler wie folgt zurück:
AnchorError: AccountNotInitialized. Error Number: 3012
Fehlernummern unter 6000 sind Anchor’s integrierte Fehler (siehe Anchor’s ErrorCode-Enum); Fehler ≥6000 sind die benutzerdefinierten Codes des Programmes.

Zeiger

Quellen: