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 →
PDA’lar (program-türetilmiş adresler) ve CPI’lar (çapraz program çağırma) Raydium’u mümkün kılan iki ilkeldir. PDA’lar bir programın özel anahtarlar olmadan belirleyici adresler “sahip olmasını” sağlar — havuz yetkilendirmeleri ve kasaları bu şekilde çalışır. CPI’lar bir programın başka bir programı çağırmasını sağlar — Raydium’un SPL Token programı aracılığıyla token’ları değiştirmesi ve entegratörlerin Raydium’u kendi akışlarına bileşim yapması bu şekilde gerçekleşir. Raydium kaynak kodunu okumadan önce her ikisini anlamak değerlidir.
PDA’lar: anahtarsız adresler
Program-Türetilmiş Adres şu özelliklere sahip bir genel anahtardır:- ed25519 eğrisi üzerinde değildir (bunun için özel anahtar yoktur).
- Bir program kimliği ve bir tohum seti ile belirleyici bir şekilde türetilir.
- Yalnızca türetme programı tarafından
invoke_signedaracılığıyla imzalanabilir.
Türetme
Bir PDA, program kimliğinin tohumlarla birlikte hash’lenmesi ve sonucu eğri dışına zorlayan bir “bump” baytı bulunması ile hesaplanır. Eğri dışı bir adres üreten ilk bump (tipik olarak 255’ten başlayıp azalan) kazanır; bu kanonik bump’tır.u64 değerleri küçük-endian baytlar olarak. Raydium’un kuralı insan tarafından okunabilir bir ön ek ve ardından benzersiz tanımlayıcılar kullanmaktır.
Raydium PDA desenleri
Raydium programlarında yaygın PDA’lar:
Kullanıcılar ve entegratörler herhangi bir şey getirmeden bu adresler hesaplayabilir — genel girdiler (havuz kimliği, farm kimliği, kullanıcı anahtarı) verildiğinde, PDA belirleyicidir.
Kanonik bump
Prensipte eğri dışı adresler üreten birden fazla bump olabilse de, Raydium programları her zaman kanonik bump’ı (255’ten azaltarak bulunur) kullanır. Bu, PDA’nın hesap verilerinde saklanır, böylece sonraki işlemler bunu iletebilir ve (pahalı) türetme döngüsünü atlayabilir:PoolState’i bunun yerine bump: [u8; 1] depolar, bu nedenle bir şekil varsaymak yerine belirli programın yapısını kontrol edin.)
Sonraki işlemlerde, bump havuz durumundan okunur ve yeniden hesaplanmaz.
CPI’lar: diğer programları çağırma
Çapraz Program Çağırma bir programın başka bir programın talimatlarını tek bir işlem içinde satır içi çağırmasını sağlar. Raydium, CPI’ları kapsamlı bir şekilde kullanır:- Swap talimatları token’ları taşımak için SPL Token programını çağırır.
- CLMM, pozisyon NFT’sini basmak için Metaplex’i çağırır.
- Havuz oluşturma, hesapları tahsis etmek için Sistem Programını çağırır.
- Farm v6, ödülleri aktarmak için SPL Token’ı çağırır.
integration-guides/cpi-integration.
invoke vs invoke_signed
Solana çalışma zamanı iki CPI ilkeli sunar:invoke: başka bir programı çağırın; çağrılan program dış işlemin imzalayanlarını devralır.invoke_signed: başka bir programı bir PDA adına çağırın; çalışma zamanı PDA’nın tohumlarını doğrular ve imzayı yetkilendirir.
invoke_signed, programların özel anahtarları yönetmeden hesaplar üzerinde yetki tutmasını sağlayan sihirdir.
Örnek: Raydium havuz kasasından aktarım yapma
Bir havuz kasası, yetkilendirmesi havuz programının bir PDA’sı olan bir Token Hesabıdır. Bir swap sırasında token’ları dışarı aktarmak için, havuz programı bu PDA olarak imzalamalıdır:invoke_signed’ın CPMM programı tarafından çağrıldığını görür, vault_and_lp_mint_auth_seed + bump’ın CPMM program kimliği ile hash’lendiğinde pool_authority’nin adresine türetildiğini doğrular ve token aktarımında yetkilendirme imzasına izin verir. Özel anahtar söz konusu değildir.
Örnek: entegratör Raydium CPMM’yi çağırma
Bir entegratör programı (örn. emanet) Raydium’unswap_base_input’ını CPI aracılığıyla çağırabilir:
integration-guides/cpi-integration bölümüne bakın.
CPI derinlik sınırı
Solana, CPI derinliğini 4 seviye ile sınırlandırır. Bir işlemin üst düzey talimatı derinlik 0 olarak sayılır; her CPI çağırması derinliği artırır. Pratik sonuç: Raydium’un kendi swap’ı zaten 1-2 seviye CPI kullanır (Raydium → SPL Token). Raydium’u çağıran bir entegratör 2 kullanır. Eğer bu entegratör başka bir entegratör tarafından çağrılırsa, 3’tür. 4. seviye sınırdır. Çoğu bileşim bunu kolayca aşmaz, ancak derin iç içe geçme (toplayıcı → yönlendirici → Raydium → kanca) buna çarpabilir. Derin yerine düz tasarım yapın.Kalan hesaplar
Bir Raydium talimatı değişken sayıda hesaba ihtiyaç duyduğunda (örn. bilinmeyen sayıda tick dizisini geçen CLMM swap), ekstra hesaplar kalan hesaplar olarak iletilir — sabit hesap listesine eklenir, konuma göre yorumlanır. CPMM’ninSwapV2’si transfer-hook programlarının ekstra gerekli hesapları için kalan hesapları kullanır. İstemciler gerekli hesapları getirir ve ekler:
PDA tuzakları
Yanlış tohumlar → yanlış adres
Tohumların yanlış sırada, yanlış kodlamada veya ekstra bir bayt içermesi/hariç tutması sessizce farklı bir PDA üretir. İşlem belirsiz bir şekilde başarısız olur (program var olmayan bir hesabı okumaya çalışır). Tohum türetmesini her zaman bilinen altın değerlere karşı birim testleyin.Bump’ı depolamama
Her işlemde bump’ı yeniden türetirseniz, türetme döngüsü için hesaplama ödersiniz. Kanonik bump’ı PDA’nın verilerinde depolayın ve oradan okuyun.Kanonik vs kanonik olmayan bump’ı karıştırma
Kanonik olmayan bump’lar (eğer biri eğri dışı üreten bulursa)invoke_signed tarafından izin verilir ancak Raydium programları tarafından assert_eq!(bump, canonical_bump) aracılığıyla reddedilir. Biri kanonik olmayan bump ile bir PDA talep etmeye çalışırsa, tx başarısız olur.
Sahip program olmadığınız halde bir PDA’yı imzalayan olarak iletme
Yalnızca PDA’nın türetmesinde kimliği olan programinvoke_signed’ı tohumlarıyla çağırabilir. Çalışırsanız, çalışma zamanı reddeder.
CPI tuzakları
remaining_accounts’ı iletmeyi unutma
Eğer dış talimatınız transfer-hook hesaplarını remaining_accounts’ta iletirse ancak Raydium’a CPI bunu iletmezse, Raydium hook hesaplarını bulamadığı için başarısız olur. Her zaman ihtiyaç duyan CPI’lara with_remaining_accounts ekleyin.
Yazılabilir bayrakları uyuşmazlığı
Dış talimatın yazılabilir olarak işaretlediği bir hesap, çağrılan program bunu yazmayı amaçlıyorsa CPI çağrısında da yazılabilir olmalıdır. Uyuşmazlık → çalışma zamanı reddi.Kirayı hesaba katmama
Bir hesap oluşturan bir programa CPI (örn. ATA oluşturma) ödeyenin kira için yeterli SOL’a sahip olmasını gerektirir. Başarısız kira kontrolleri belirsiz hatalar olarak görünür.Çalışılmış örnek: Raydium CPMM PDA’larını hesaplama
getPoolInfoFromRpc({ poolId }) çağırdığınızda Raydium SDK’sının perde arkasında yaptığı şeydir — gidiş-dönüş olmadan ilişkili PDA’ları türetir.
İşaretçiler
solana-fundamentals/account-model— PDA’ların hesap modelinde nasıl uyduğu.solana-fundamentals/programs-and-anchor— PDA’ları bildirmek için Anchor’ın yardımcıları.integration-guides/cpi-integration— Raydium’a CPI yapan entegrasyonlar oluşturma.sdk-api/rust-cpi— Raydium’un Rust CPI türleri.
- Solana PDA belgeleri.
- Solana CPI belgeleri.
- Anchor PDA belgeleri ve Anchor CPI belgeleri — Anchor’ın birleşik bir sayfası yoktur.

