Ένα Cross-Program Invocation (CPI) είναι όταν ένα πρόγραμμα καλεί μια εντολή σε άλλο πρόγραμμα κατά τη διάρκεια της εκτέλεσης. Τα CPIs επιτρέπουν τη συνθεσιμότητα: οι εντολές οποιουδήποτε προγράμματος μπορούν να κληθούν από οποιοδήποτε άλλο πρόγραμμα στο δίκτυο.
Παράδειγμα cross-program invocation
CPIs χωρίς υπογράφοντες PDA
Χρήση της συνάρτησης invoke, Anchor CpiContext, παραδείγματα Native Rust, παραδείγματα CPI μεταφοράς SOL.
CPIs με υπογράφοντες PDA
Χρήση invoke_signed με signer seeds, Anchor CpiContext με PDA, παραδείγματα υπογραφής PDA σε Native Rust.
Εκτέλεση και προνόμια CPI
Ροή εκτέλεσης CPI 11 βημάτων, κανόνες επέκτασης προνομίων, reentrancy, επικύρωση λογαριασμού.
Μοντέλο κόστους CPI και συγχρονισμός δεδομένων
Τύπος κόστους CPI, κόστη σειριοποίησης, συγχρονισμός δεδομένων λογαριασμού, υπογραφή PDA, επιστροφή δεδομένων.
Βασικά στοιχεία
- Δύο συναρτήσεις:
invoke(χωρίς υπογραφή PDA) καιinvoke_signed(με υπογραφή PDA). - Επέκταση προνομίων: Τα προνόμια λογαριασμού (signer, writable) επεκτείνονται από τον καλούντα στον καλούμενο. Ο καλούμενος δεν μπορεί να αυξήσει τα προνόμια πέρα από αυτά που πέρασε ο καλών.
- Κοινός προϋπολογισμός υπολογισμού: Η κατανάλωση CU του καλούμενου μειώνει τον υπόλοιπο προϋπολογισμό του καλούντος.
- Reentrancy: Η άμεση αυτο-αναδρομή επιτρέπεται (A->A->A). Η έμμεση
reentrancy δεν επιτρέπεται (A->B->A επιστρέφει
ReentrancyNotAllowed).
Όρια
| Όριο | Τιμή | Πηγή |
|---|---|---|
| Μέγιστο βάθος στοίβας εντολών | 5 (9 με SIMD-0268) | MAX_INSTRUCTION_STACK_DEPTH, MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 |
| Κόστος κλήσης CPI | 1.000 CUs (946 με SIMD-0339) | DEFAULT_INVOCATION_COST, INVOKE_UNITS_COST_SIMD_0339 |
| Μέγιστοι υπογράφοντες PDA ανά CPI | 16 | MAX_SIGNERS |
| Μέγιστα δεδομένα εντολής CPI | 10 KiB (10.240 bytes) | MAX_INSTRUCTION_DATA_LEN |
| Μέγιστα δεδομένα επιστροφής | 1.024 bytes | MAX_RETURN_DATA |
| Μέγιστα account infos CPI | 128 (255 με SIMD-0339)* | MAX_CPI_ACCOUNT_INFOS, MAX_CPI_ACCOUNT_INFOS_SIMD_0339 |
| Κόστος σειριοποίησης CPI | 1 CU ανά 250 bytes | cpi_bytes_per_unit |
| Μέγιστη επαναδιάταξη δεδομένων λογαριασμού ανά CPI | 10.240 bytes (10 KiB) | MAX_PERMITTED_DATA_INCREASE |
invoke έναντι invoke_signed
Η Solana παρέχει δύο συναρτήσεις για την πραγματοποίηση CPIs:
| Συνάρτηση | Περίπτωση χρήσης | Υπογραφή PDA |
|---|---|---|
invoke | CPIs όπου όλοι οι απαιτούμενοι υπογράφοντες έχουν ήδη υπογράψει την αρχική συναλλαγή | Όχι |
invoke_signed | CPIs όπου το πρόγραμμα κλήσης πρέπει να υπογράψει εκ μέρους ενός PDA που κατέχει | Ναι, μέσω signer seeds |
Στο παρασκήνιο, η invoke απλώς καλεί την invoke_signed με έναν κενό
πίνακα signer seeds. Χρησιμοποιήστε την invoke όταν δεν χρειάζεστε
υπογραφή PDA, και την invoke_signed όταν το πρόγραμμα πρέπει να
εξουσιοδοτήσει μια ενέργεια εκ μέρους ενός PDA.
Και οι δύο συναρτήσεις τελικά ενεργοποιούν την ίδια syscall
(sol_invoke_signed_rust)
και ακολουθούν την ίδια διαδρομή runtime
(cpi_common).
Η μόνη διαφορά είναι αν παρέχονται signer seeds. Όταν παρέχονται seeds, το
runtime παράγει τα pubkeys των PDA και τα προσθέτει στο σύνολο των έγκυρων
υπογραφόντων πριν από τον έλεγχο προνομίων.
Is this page helpful?