Skip to main content
Bu sayfa yapay zekâ tarafından otomatik olarak çevrilmiştir. İngilizce sürüm esas alınır.İngilizce sürümü görüntüle →
Raydium’un daha yeni programları (CPMM, CLMM, Farm v6, LaunchLab) Anchor ile yazılmıştır — Solana’nın yerel program modelinin üzerine hesap doğrulaması, hata işleme ve IDL (arayüz tanımı) sağlayan bir Rust çerçevesi. AMM v4 ve eski farm’lar Anchor’dan öncedir. Her iki paradigmayı anlamak kodu okumanıza, IDL’den istemci oluşturmanıza ve beklenmedik hataları ayıklamanıza yardımcı olur.

Program dağıtım modeli

Her Solana programı bir Pubkey adresinde yaşar. Programın bayt kodu, BPF Yükseltebilir Yükleyici (BPFLoaderUpgradeab1e11111111111111111111111) tarafından sahip olunan bir yürütülebilir hesapta depolanır. Bir program dağıtımı üç hesaptan oluşur:
  1. Program hesabı: programın kimliğinde küçük bir meta veri hesabı. Sahibi: BPF Yükseltebilir Yükleyici.
  2. ProgramData hesabı: gerçek bayt kodunu tutar. [program_id, "programdata"] olarak türetilir.
  3. Buffer hesabı (geçici): yükseltme sırasında yeni bayt kodu tutar. Yükseltmeden sonra silinir.
ProgramData hesabının bir yükseltme yetkisi vardır — bayt kodunu yeni bir sürümle değiştirebilen bir anahtar. Raydium’un yükseltme yetkisi, 24 saatlik bir zaman kilidi arkasında bir multisig’dir; bkz. security/admin-and-multisig.

Dağıtılan bir programı doğrulama

Zincir üzerindeki kodun denetim onaylı kaynakla eşleştiğini doğrulamak için:
Eşleşen hash’ler, etkileşimde bulunduğunuz kaynağın düşündüğünüz kaynak olduğunu kanıtlar. Raydium, sürüm notlarında doğrulanmış derleme talimatlarını yayınlar.

Anchor: Solana’nın üzerine bir çerçeve

Ham Solana programları bu imzaya sahip Rust işlevleridir:
Anchor tüm standart kodu sarmalamakta ve şunu yazmanıza izin vermektedir:
Anchor:
  • Her talimat ve her hesap türü için belirleyici bir 8 baytlık ayırıcı otomatik olarak oluşturur.
  • Kodunuz çalışmadan önce hesap kısıtlamalarını doğrular (sahibi, seed’ler, yazılabilir, imzalayan, mint eşleşmesi, token-program eşleşmesi).
  • İstemcilerin programı çağırmak için kullandığı bir IDL — arayüz tanımı dosyası oluşturur.
  • Rust, TypeScript ve Python istemci tarafı kütüphanesiyle birlikte gelir.

8 baytlık ayırıcı

Her Anchor hesabı ve her Anchor talimatı, sabit bir dizenin SHA-256’sinin ilk 8 baytı olan bir 8 baytlık ayırıcıyla başlar:
Bir Anchor talimatını çağırdığınızda, talimat verilerinin ilk 8 baytı bu ayırıcıdır; Anchor bunlara bakarak doğru işleyiciye gönderir. Bir Anchor hesabını okuduğunuzda, ilk 8 bayt türünü söyler — getProgramAccounts gibi bir türün tüm hesaplarını numaralandıran araçlar için çok önemlidir.

Hatalar

Anchor programları #[error_code] aracılığıyla hataları tanımlar:
Anchor bu sayısal kodları 6000’den (0x1770) başlayarak otomatik olarak atar. Raydium’un tam hata kodu tablosu reference/error-codes içindedir.

IDL

Bir Anchor IDL (Arayüz Tanımı Dili) dosyası, bir programın JSON tanımıdır: talimatları, hesapları, türleri, hataları ve olayları. Ethereum ABI’nin eşdeğeridir. Raydium tüm Anchor programları için IDL’ler yayınlar. Zincir üzerinden canlı olarak getir:
Veya SDK kaynağından: src/raydium/*/idl/*.json.

IDL yapısı

IDL’den istemci oluşturma

Anchor’un anchor CLI’si TypeScript ve Rust türleri oluşturur:
Codama gibi üçüncü taraf araçlar bir IDL’den Rust, Go, Python veya JavaScript istemcileri oluşturabilir. (Codama, yalnızca bir JavaScript oluşturucusu yayınlamış olan Metaplex’in Kinobi’sinin ardılıdır.)

IDL’nin arkadaş olduğu zaman

Raydium SDK’sı aracılığıyla gitmeyen özel bir entegrasyon oluşturmak istiyorsanız:
  1. IDL’yi getir (zincir üzerinden canlı veya SDK kaynağından).
  2. İstediğiniz talimatı ara (örn. swap_base_input).
  3. Talimat verilerini oluştur: 8 baytlık ayırıcı + kodlanmış argümanlar.
  4. Hesapları IDL’nin belirttiği sırada geç.
Çalışan örnekler için sdk-api/anchor-idl bölümüne bakın.

Anchor Öncesi Programlar: AMM v4 ve Farm v3/v5

Bu programlar Anchor’dan öncedir. Şunları kullanırlar:
  • Manuel talimat gönderimi: instruction_data içinde bir u8 etiketi ve bir match ifadesi.
  • Manuel hesap doğrulaması: if accounts[0].owner != &expected_program { ... }.
  • Borsh serileştirilmiş talimat argümanları: ayırıcı yok, sadece instruction_data[1..].
  • #[repr(C, packed)] aracılığıyla düzen: C-yapı ikili düzeni.
Raydium SDK v2, Anchor olmayan AMM v4 talimatları için TypeScript düzenleri gönderir, böylece istemciler Anchor olmadan kodlayabilir/kodunu çözebilir:
Entegrasyon deseni aynıdır — sadece Anchor’un IDL odaklı otomatik oluşturmasını almıyorsunuz.

Program yükseltme mekanikleri

Yalnızca ProgramData’nın upgrade_authority yükseltebilir. Adımlar:
  1. Yeni bayt kodu derle.
  2. Bunu bir buffer hesabına yaz (solana program write-buffer).
  3. Bir yükseltme talimatı gönder: BpfLoaderUpgradeable::Upgrade { buffer, program, authority }.
  4. Çalışma zamanı, programın bayt kodunu buffer’ın içeriğiyle atomik olarak değiştirir.
Raydium bunu, Squads multisig’in ayarlarında uygulanan bir 24 saatlik zaman kilidi arkasında kapılar. Bir yükseltme işlemi, multisig onayından sonra yürütülmeden önce 24 saat beklemek zorundadır. Bu, acele / zorlanan yükseltmelere karşı koruma sağlar. Bkz. security/admin-and-multisig.

Bir programı değişmez hale getirme

Yükseltme yetkisi None olarak ayarlanabilir, bu noktada program kalıcı olarak değişmez hale gelir. Raydium bunu hiçbir ürün için yapmamıştır — takım güvenlik düzeltmeleri itme yeteneğini korur. Ödünleşim: kullanıcılar multisig + zaman kilidi sürecine güvenmelidir.

Programlar ve kira

Bir program dağıtmak kira muaf lamport’lar tüketir:
  • 50 KB program: ~0,35 SOL kira.
  • 200 KB program: ~1,4 SOL kira.
Bir programı kapatmak (solana program close aracılığıyla) lamport’ları geri verir. Raydium programları etkin kalır ve kapatılmak için planlanmamıştır.

Anchor programlarında hata ayıklama

Günlük çıktısı

Anchor’un msg! makrosu işlemin günlüğüne yazar. Günlükleri görmek için bir işlemi simüle et:
Günlükler şunları içerir:
  • Program çağırması (Program CPMMoo8... invoke [1]).
  • Program kodundan msg! çağrıları.
  • İşlem birimi tüketimi (consumed 137842 of 400000 compute units).
  • Program başarısı veya hatası.

Hata kodları

Bir Anchor programı hata verirse, günlük şunu gösterir:
0x1770 = 6000 ondalık = ilk Anchor hatası (örn. SlippageExceeded). IDL’nin errors dizisiyle çapraz referans yapın. Raydium’un tam hata tablosu için reference/error-codes bölümüne bakın.

Hesap düzeni uyuşmazlıkları

Yanlış hesabı yanlış yuvaya geçirirseniz, Anchor’un hesap doğrulama makroları şu gibi hatalar döndürür:
6000’den düşük hata numaraları Anchor’un yerleşik hataları (Anchor’un ErrorCode enum’unu görün); ≥6000 hataları programın özel kodlarıdır.

İşaretçiler

Kaynaklar: