Cross Program Invocation

Ένα Cross-Program Invocation (CPI) είναι όταν ένα πρόγραμμα καλεί μια εντολή σε άλλο πρόγραμμα κατά τη διάρκεια της εκτέλεσης. Τα CPIs επιτρέπουν τη συνθεσιμότητα: οι εντολές οποιουδήποτε προγράμματος μπορούν να κληθούν από οποιοδήποτε άλλο πρόγραμμα στο δίκτυο.

Παράδειγμα cross-program invocationΠαράδειγμα cross-program invocation

Βασικά στοιχεία

  • Δύο συναρτήσεις: 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
Κόστος κλήσης CPI1.000 CUs (946 με SIMD-0339)DEFAULT_INVOCATION_COST, INVOKE_UNITS_COST_SIMD_0339
Μέγιστοι υπογράφοντες PDA ανά CPI16MAX_SIGNERS
Μέγιστα δεδομένα εντολής CPI10 KiB (10.240 bytes)MAX_INSTRUCTION_DATA_LEN
Μέγιστα δεδομένα επιστροφής1.024 bytesMAX_RETURN_DATA
Μέγιστα account infos CPI128 (255 με SIMD-0339)*MAX_CPI_ACCOUNT_INFOS, MAX_CPI_ACCOUNT_INFOS_SIMD_0339
Κόστος σειριοποίησης CPI1 CU ανά 250 bytescpi_bytes_per_unit
Μέγιστη επαναδιάταξη δεδομένων λογαριασμού ανά CPI10.240 bytes (10 KiB)MAX_PERMITTED_DATA_INCREASE

invoke έναντι invoke_signed

Η Solana παρέχει δύο συναρτήσεις για την πραγματοποίηση CPIs:

ΣυνάρτησηΠερίπτωση χρήσηςΥπογραφή PDA
invokeCPIs όπου όλοι οι απαιτούμενοι υπογράφοντες έχουν ήδη υπογράψει την αρχική συναλλαγήΌχι
invoke_signedCPIs όπου το πρόγραμμα κλήσης πρέπει να υπογράψει εκ μέρους ενός 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?

Πίνακας Περιεχομένων

Επεξεργασία Σελίδας

Διαχειρίζεται από

© 2026 Ίδρυμα Solana.
Με επιφύλαξη παντός δικαιώματος.
Συνδεθείτε