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ği
PDA imzalayıcısı olmayan CPI'lar
invoke fonksiyonunu kullanma, Anchor CpiContext, Native Rust örnekleri, SOL transfer CPI örnekleri.
PDA imzalayıcılı CPI'lar
invoke_signed'ı imzalayıcı seed'leriyle kullanma, PDA ile Anchor CpiContext, Native Rust PDA imzalama örnekleri.
CPI yürütme ve yetkiler
11 adımlı CPI yürütme akışı, yetki genişletme kuralları, yeniden giriş, hesap doğrulama.
CPI maliyet modeli ve veri senkronizasyonu
CPI maliyet formülü, serileştirme maliyetleri, hesap verisi senkronizasyonu, PDA imzalama, dönüş verisi.
Temel bilgiler
- İki fonksiyon:
invoke(PDA imzalama yok) veinvoke_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,
ReentrancyNotAlloweddöndürür).
Limitler
| Limit | Değer | Kaynak |
|---|---|---|
| Maksimum instruction yığın derinliği | 5 (SIMD-0268 ile 9) | MAX_INSTRUCTION_STACK_DEPTH, MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 |
| CPI çağırma maliyeti | 1.000 CU (SIMD-0339 ile 946) | DEFAULT_INVOCATION_COST, INVOKE_UNITS_COST_SIMD_0339 |
| CPI başına maksimum PDA imzalayıcısı | 16 | MAX_SIGNERS |
| Maksimum CPI instruction data | 10 KiB (10.240 bayt) | MAX_INSTRUCTION_DATA_LEN |
| Maksimum dönüş verisi | 1.024 bayt | MAX_RETURN_DATA |
| Maksimum CPI hesap bilgileri | 128 (SIMD-0339 ile 255)* | MAX_CPI_ACCOUNT_INFOS, MAX_CPI_ACCOUNT_INFOS_SIMD_0339 |
| CPI serileştirme maliyeti | 250 bayt başına 1 CU | cpi_bytes_per_unit |
| CPI başına maksimum hesap verisi yeniden tahsisi | 10.240 bayt (10 KiB) | MAX_PERMITTED_DATA_INCREASE |
invoke ve invoke_signed
Solana, CPI yapmak için iki fonksiyon sağlar:
| Fonksiyon | Kullanım durumu | PDA imzalama |
|---|---|---|
invoke | Tüm gerekli imzacıların orijinal işlemi zaten imzaladığı CPI'lar | Hayır |
invoke_signed | Çağıran programın sahip olduğu bir PDA adına imzalaması gereken CPI'lar | Evet, 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?