Cross Program Invocation

Cross Program Invocation (CPI), bir programın yürütme sırasında başka bir programda bir instruction çağırmasıdır. CPI'lar birleştirilebilirliği sağlar: herhangi bir programın instruction'ları, ağdaki diğer herhangi bir program tarafından çağrılabilir.

Cross-program invocation örneğiCross-program invocation örneği

Temel bilgiler

  • İki fonksiyon: invoke (PDA imzalama yok) ve invoke_signed (PDA imzalama ile).
  • Yetki genişletme: Hesap yetkileri (imzalayıcı, yazılabilir) çağıran programdan çağrılan programa uzanır. Çağrılan program, çağıranın ilettiği yetkilerden daha fazla yetki elde edemez.
  • Paylaşılan hesaplama bütçesi: Çağrılan programın CU tüketimi, çağıranın kalan bütçesini azaltır.
  • Yeniden giriş: Doğrudan öz-özyinelemeye izin verilir (A->A->A). Dolaylı yeniden girişe izin verilmez (A->B->A, ReentrancyNotAllowed döndürür).

Limitler

LimitDeğerKaynak
Maksimum instruction yığın derinliği5 (SIMD-0268 ile 9)MAX_INSTRUCTION_STACK_DEPTH, MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268
CPI çağırma maliyeti1.000 CU (SIMD-0339 ile 946)DEFAULT_INVOCATION_COST, INVOKE_UNITS_COST_SIMD_0339
CPI başına maksimum PDA imzalayıcısı16MAX_SIGNERS
Maksimum CPI instruction data10 KiB (10.240 bayt)MAX_INSTRUCTION_DATA_LEN
Maksimum dönüş verisi1.024 baytMAX_RETURN_DATA
Maksimum CPI hesap bilgileri128 (SIMD-0339 ile 255)*MAX_CPI_ACCOUNT_INFOS, MAX_CPI_ACCOUNT_INFOS_SIMD_0339
CPI serileştirme maliyeti250 bayt başına 1 CUcpi_bytes_per_unit
CPI başına maksimum hesap verisi yeniden tahsisi10.240 bayt (10 KiB)MAX_PERMITTED_DATA_INCREASE

invoke ve invoke_signed

Solana, CPI yapmak için iki fonksiyon sağlar:

FonksiyonKullanım durumuPDA imzalama
invokeTüm gerekli imzacıların orijinal işlemi zaten imzaladığı CPI'larHayır
invoke_signedÇağıran programın sahip olduğu bir PDA adına imzalaması gereken CPI'larEvet, imzalayan seed'ler aracılığıyla

Arka planda, invoke basitçe boş bir imzalayan seed'ler dizisi ile invoke_signed'i çağırır. PDA imzalamaya ihtiyacınız olmadığında invoke kullanın ve program bir PDA adına bir eylemi yetkilendirmesi gerektiğinde invoke_signed kullanın.

Her iki fonksiyon da sonuçta aynı syscall'u (sol_invoke_signed_rust) tetikler ve aynı çalışma zamanı yolundan (cpi_common) geçer. Tek fark, imzalayan seed'lerin sağlanıp sağlanmadığıdır. Seed'ler sağlandığında, çalışma zamanı PDA pubkey'lerini türetir ve ayrıcalık kontrolünden önce bunları geçerli imzacılar kümesine ekler.

Is this page helpful?

İçindekiler

Sayfayı Düzenle

Yönetici

© 2026 Solana Vakfı.
Tüm hakları saklıdır.
Bağlanın