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 →
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_signed aracılığıyla imzalanabilir.
Her Raydium havuz yetkilendirmesi, her havuz durum hesabı, her kasa, her farm durumu — hepsi PDA’dır.

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.
Tohumlar herhangi bir şey olabilir — dizeler, diğer genel anahtarlar, 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:
(CLMM’nin 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.
Entegratörler ayrıca Raydium’a çağrı yapmak için CPI’ları kullanır — kasa stratejileri, kaldıraçlı LP protokolleri ve otomatik bileşim yapıcılar bu şekilde çalışır. Bkz. 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:
Çalışma zamanı 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’un swap_base_input’ını CPI aracılığıyla çağırabilir:
Bu kanonik entegrasyon desenidir — tam emanet örneği için 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’nin SwapV2’si transfer-hook programlarının ekstra gerekli hesapları için kalan hesapları kullanır. İstemciler gerekli hesapları getirir ve ekler:
CPI seviyesinde, entegratörler kalan hesapları kendi talimatları aracılığıyla iletmelidir:

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 program invoke_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

Bu, 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

Kaynaklar: