Cross Program Invocation (CPI) adalah ketika satu program memanggil sebuah instruksi pada program lain selama eksekusi. CPI memungkinkan komposabilitas: instruksi program apa pun dapat dipanggil oleh program lain mana pun di jaringan.
Contoh cross-program invocation
CPI tanpa penandatangan PDA
Menggunakan fungsi invoke, Anchor CpiContext, contoh Native Rust, contoh CPI transfer SOL.
CPI dengan penandatangan PDA
Menggunakan invoke_signed dengan signer seeds, Anchor CpiContext dengan PDA, contoh penandatanganan PDA Native Rust.
Eksekusi dan hak istimewa CPI
Alur eksekusi CPI 11 langkah, aturan ekstensi hak istimewa, reentrancy, validasi akun.
Model biaya CPI dan sinkronisasi data
Formula biaya CPI, biaya serialisasi, sinkronisasi data akun, penandatanganan PDA, return data.
Fakta kunci
- Dua fungsi:
invoke(tanpa penandatanganan PDA) daninvoke_signed(dengan penandatanganan PDA). - Ekstensi hak istimewa: Hak istimewa akun (signer, writable) diperluas dari pemanggil ke yang dipanggil. Yang dipanggil tidak dapat meningkatkan hak istimewa melebihi apa yang diberikan pemanggil.
- Anggaran komputasi bersama: Konsumsi CU yang dipanggil mengurangi anggaran pemanggil yang tersisa.
- Reentrancy: Rekursi diri langsung diperbolehkan (A->A->A). Reentrancy
tidak langsung tidak diperbolehkan (A->B->A mengembalikan
ReentrancyNotAllowed).
Batasan
| Batasan | Nilai | Sumber |
|---|---|---|
| Kedalaman stack instruksi maks | 5 (9 dengan SIMD-0268) | MAX_INSTRUCTION_STACK_DEPTH, MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 |
| Biaya pemanggilan CPI | 1.000 CU (946 dengan SIMD-0339) | DEFAULT_INVOCATION_COST, INVOKE_UNITS_COST_SIMD_0339 |
| Penandatangan PDA maks per CPI | 16 | MAX_SIGNERS |
| instruction data CPI maks | 10 KiB (10.240 byte) | MAX_INSTRUCTION_DATA_LEN |
| Return data maks | 1.024 byte | MAX_RETURN_DATA |
| Account info CPI maks | 128 (255 dengan SIMD-0339)* | MAX_CPI_ACCOUNT_INFOS, MAX_CPI_ACCOUNT_INFOS_SIMD_0339 |
| Biaya serialisasi CPI | 1 CU per 250 byte | cpi_bytes_per_unit |
| Realloc data akun maks per CPI | 10.240 byte (10 KiB) | MAX_PERMITTED_DATA_INCREASE |
invoke vs invoke_signed
Solana menyediakan dua fungsi untuk melakukan CPI:
| Fungsi | Kasus penggunaan | Penandatanganan PDA |
|---|---|---|
invoke | CPI di mana semua penandatangan yang diperlukan telah menandatangani transaksi asli | Tidak |
invoke_signed | CPI di mana program pemanggil perlu menandatangani atas nama PDA yang dimilikinya | Ya, melalui signer seeds |
Di balik layar, invoke hanya memanggil invoke_signed dengan array
signer seeds kosong. Gunakan invoke ketika Anda tidak memerlukan
penandatanganan PDA, dan invoke_signed ketika program harus mengotorisasi
tindakan atas nama PDA.
Kedua fungsi pada akhirnya memicu syscall yang sama
(sol_invoke_signed_rust)
dan mengalir melalui jalur runtime yang sama
(cpi_common).
Satu-satunya perbedaan adalah apakah signer seeds disediakan. Ketika seeds
disediakan, runtime menurunkan pubkey PDA dan menambahkannya ke set
penandatangan yang valid sebelum pemeriksaan hak istimewa.
Is this page helpful?