Προϋπολογισμός υπολογισμού

Περίληψη

Προεπιλογή 200K CUs ανά εντολή, μέγιστο 1.4M ανά συναλλαγή. Χρησιμοποιήστε τις εντολές SetComputeUnitLimit και SetComputeUnitPrice για βελτιστοποίηση. Η χρέωση προτεραιότητας βασίζεται στις αιτούμενες CUs, όχι στην πραγματική χρήση.

Όριο μονάδων υπολογισμού

Σε κάθε εντολή εκχωρούνται προεπιλεγμένα 200.000 CUs, και κάθε συναλλαγή περιορίζεται σε 1.400.000 CUs. Όταν δεν υπάρχει ρητή εντολή SetComputeUnitLimit, η προεπιλογή υπολογίζεται βάσει του τύπου εντολής:

Default CU limit calculation
default_cu_limit = (num_non_migratable_builtin_instructions * 3,000)
+ (num_not_migrated_builtin_instructions * 3,000)
+ (num_non_builtin_instructions * 200,000)
+ (num_migrated_builtin_instructions * 200,000)
  • Ενσωματωμένες εντολές (System Program, Stake, Vote κ.λπ. που δεν έχουν μεταφερθεί σε SBF): σε καθεμία εκχωρούνται MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT = 3.000 CUs (σύμφωνα με το SIMD-0170).
  • Μη ενσωματωμένες εντολές (προγράμματα SBF που έχουν αναπτυχθεί από χρήστες): σε καθεμία εκχωρούνται DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT = 200.000 CUs.
  • Ενσωματωμένες υπό μετάβαση που έχουν ολοκληρώσει τη μετάβαση σε SBF (με feature gate): αντιμετωπίζονται ως μη ενσωματωμένες (200.000 CUs η καθεμία).

Το αποτέλεσμα περιορίζεται στο MAX_COMPUTE_UNIT_LIMIT (1.400.000).

Μπορείτε να παρακάμψετε αυτήν την προεπιλογή συμπεριλαμβάνοντας μια εντολή SetComputeUnitLimit στη συναλλαγή σας.

Για να προσδιορίσετε το κατάλληλο όριο CU:

  1. Προσομοιώστε τη συναλλαγή για να μετρήσετε την κατανάλωση CU.
  2. Προσθέστε ένα περιθώριο ασφαλείας 10% στην προσομοιωμένη τιμή.

Η χρέωση προτεραιότητας καθορίζεται από το αιτούμενο όριο μονάδων υπολογισμού στη συναλλαγή, όχι από τον πραγματικό αριθμό μονάδων υπολογισμού που χρησιμοποιήθηκαν. Εάν ορίσετε ένα όριο μονάδων υπολογισμού που είναι πολύ υψηλό ή χρησιμοποιήσετε την προεπιλεγμένη ποσότητα, πληρώνετε για μη χρησιμοποιούμενες μονάδες υπολογισμού.

Οδηγίες προϋπολογισμού υπολογισμού

Το Compute Budget Program (ComputeBudget111111111111111111111111111111) διαθέτει τέσσερις οδηγίες.

ΠαραλλαγήΔιακριτικόΠαράμετροςΤύποςΠεριγραφή
RequestHeapFrame1bytesu32Ζητούμενο μέγεθος heap σε bytes για κάθε πρόγραμμα στη συναλλαγή
SetComputeUnitLimit2unitsu32Μέγιστα CUs που μπορεί να καταναλώσει η συναλλαγή
SetComputeUnitPrice3micro_lamportsu64Τιμή CU σε micro-lamports
SetLoadedAccountsDataSizeLimit4bytesu32Μέγιστα συνολικά bytes δεδομένων λογαριασμού που μπορεί να φορτώσει η συναλλαγή

Πηγή: ComputeBudgetInstruction enum

Περιορισμοί και συνθήκες σφάλματος

Οι ακόλουθοι κανόνες ισχύουν κατά την επεξεργασία οδηγιών προϋπολογισμού υπολογισμού:

  • Μία ανά τύπο: επιτρέπεται μόνο μία από κάθε παραλλαγή οδηγίας ανά συναλλαγή. Η συμπερίληψη διπλότυπων προκαλεί σφάλμα DuplicateInstruction (ολόκληρη η συναλλαγή αποτυγχάνει).
  • RequestHeapFrame: η τιμή πρέπει να είναι μεταξύ MIN_HEAP_FRAME_BYTES (32 KiB) και MAX_HEAP_FRAME_BYTES (256 KiB), και πρέπει να είναι πολλαπλάσιο του 1.024. Διαφορετικά η συναλλαγή αποτυγχάνει με InvalidInstructionData. Το μέγεθος heap ισχύει για κάθε πρόγραμμα που καλείται στη συναλλαγή (συμπεριλαμβανομένων των CPIs).
  • SetComputeUnitLimit: οποιαδήποτε τιμή u32 γίνεται αποδεκτή. Το πραγματικό όριο περιορίζεται στο MAX_COMPUTE_UNIT_LIMIT (1.400.000).
  • SetComputeUnitPrice: οποιαδήποτε τιμή u64 γίνεται αποδεκτή (0 έως u64::MAX).
  • SetLoadedAccountsDataSizeLimit: η τιμή πρέπει να είναι μεγαλύτερη από 0 (NonZeroU32). Τιμή 0 προκαλεί InvalidLoadedAccountsDataSizeLimit. Το πραγματικό όριο περιορίζεται στο MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES (64 MiB).
  • Μη αναγνωρίσιμα δεδομένα: οποιαδήποτε οδηγία αποστέλλεται στο Compute Budget Program που δεν αποσειριοποιείται σε γνωστή παραλλαγή αποτυγχάνει με InvalidInstructionData.

Το μοντέλο κόστους του χρονοπρογραμματιστή που περιγράφεται παρακάτω αφορά την εσωτερική εκτίμηση κόστους προ-εκτέλεσης του validator. Οι περισσότεροι προγραμματιστές χρειάζονται μόνο τις οδηγίες compute budget που αναφέρονται παραπάνω.

Μοντέλο κόστους χρονοπρογραμματιστή

Ο χρονοπρογραμματιστής του validator χρησιμοποιεί ένα μοντέλο κόστους για να εκτιμήσει τη χρήση πόρων της συναλλαγής πριν από την εκτέλεση. Αυτές οι εκτιμήσεις κόστους προ-εκτέλεσης καθορίζουν αν μια συναλλαγή χωράει στην υπολειπόμενη χωρητικότητα του block. Είναι ξεχωριστές από τη μέτρηση CU που συμβαίνει κατά την εκτέλεση.

Το συνολικό κόστος του χρονοπρογραμματιστή είναι το άθροισμα πέντε συνιστωσών (UsageCostDetails::sum):

Scheduler cost formula
total_cost = signature_cost
+ write_lock_cost
+ data_bytes_cost
+ programs_execution_cost
+ loaded_accounts_data_size_cost

Συνιστώσες κόστους

ΣυνιστώσαΠεριγραφή
Κόστος υπογραφήςΚόστος ανά υπογραφή για κάθε τύπο υπογραφής
Κόστος write lockΑνά εγγράψιμο λογαριασμό
Κόστος instruction dataΒασισμένο στο συνολικό μέγεθος instruction data σε bytes
Κόστος εκτέλεσης προγραμμάτωνΌριο CU από το compute budget ή προεπιλογή
Κόστος φορτωμένων δεδομένων λογαριασμώνΒασισμένο στο συνολικό μέγεθος φορτωμένων δεδομένων λογαριασμών

Όλες οι τιμές είναι σε compute units.

Σταθερές κόστους χρονοπρογραμματιστή

Κόστος συναλλαγής ψήφου

Οι συναλλαγές ψήφου χρησιμοποιούν ένα στατικό κόστος 3.428 CUs ανεξάρτητα από το πραγματικό τους περιεχόμενο.

Όρια block

Ο χρονοπρογραμματιστής επιβάλλει όρια ανά block. Αν η προσθήκη μιας συναλλαγής θα υπερέβαινε οποιοδήποτε όριο, δεν συμπεριλαμβάνεται στο block.

Το SIMD-0286 προτείνει την αύξηση του MAX_BLOCK_UNITS σε 100.000.000.

Σταθερές προϋπολογισμού εκτέλεσης

Οι ακόλουθες σταθερές από το execution_budget.rs ορίζουν όρια χρόνου εκτέλεσης κατά την εκτέλεση συναλλαγών:

ΣταθεράΤιμήΠεριγραφή
MAX_COMPUTE_UNIT_LIMIT1.400.000Μέγιστο όριο CU ανά συναλλαγή
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT200.000Προεπιλεγμένα CU ανά εντολή που δεν είναι builtin
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT3.000Προεπιλεγμένα CU ανά εντολή builtin (SIMD-0170)
DEFAULT_HEAP_COST8 CUΚόστος ανά σελίδα heap 32 KiB
DEFAULT_INVOCATION_COST1.000 CUΚόστος μίας κλήσης CPI
INVOKE_UNITS_COST_SIMD_0339946 CUΚόστος κλήσης CPI με SIMD-0339
MIN_HEAP_FRAME_BYTES32.768Ελάχιστο μέγεθος heap (32 KiB)
MAX_HEAP_FRAME_BYTES262.144Μέγιστο μέγεθος heap (256 KiB)
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES67.108.864Μέγιστα φορτωμένα δεδομένα λογαριασμού ανά συναλλαγή (64 MiB)
MAX_INSTRUCTION_STACK_DEPTH5Μέγιστο βάθος στοίβας εντολών (ανώτατο επίπεδο + CPI)
MAX_INSTRUCTION_STACK_DEPTH_SIMD_02689Μέγιστο βάθος στοίβας εντολών (ανώτατο επίπεδο + CPI) με SIMD-0268
MAX_CALL_DEPTH64Μέγιστο βάθος κλήσης SBF-σε-SBF εντός προγράμματος
STACK_FRAME_SIZE4.096 bytesΜέγεθος ενός πλαισίου στοίβας SBF

Is this page helpful?

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

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