Περίληψη
Προεπιλογή 200K CUs ανά εντολή, μέγιστο 1.4M ανά συναλλαγή. Χρησιμοποιήστε τις
εντολές SetComputeUnitLimit και SetComputeUnitPrice για βελτιστοποίηση. Η
χρέωση προτεραιότητας βασίζεται στις αιτούμενες CUs, όχι στην πραγματική
χρήση.
Όριο μονάδων υπολογισμού
Σε κάθε εντολή εκχωρούνται
προεπιλεγμένα 200.000 CUs,
και κάθε συναλλαγή περιορίζεται σε
1.400.000 CUs.
Όταν δεν υπάρχει ρητή εντολή SetComputeUnitLimit, η
προεπιλογή υπολογίζεται
βάσει του τύπου εντολής:
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:
- Προσομοιώστε τη συναλλαγή για να μετρήσετε την κατανάλωση CU.
- Προσθέστε ένα περιθώριο ασφαλείας 10% στην προσομοιωμένη τιμή.
Η χρέωση προτεραιότητας καθορίζεται από το αιτούμενο όριο μονάδων υπολογισμού στη συναλλαγή, όχι από τον πραγματικό αριθμό μονάδων υπολογισμού που χρησιμοποιήθηκαν. Εάν ορίσετε ένα όριο μονάδων υπολογισμού που είναι πολύ υψηλό ή χρησιμοποιήσετε την προεπιλεγμένη ποσότητα, πληρώνετε για μη χρησιμοποιούμενες μονάδες υπολογισμού.
Οδηγίες προϋπολογισμού υπολογισμού
Το
Compute Budget Program
(ComputeBudget111111111111111111111111111111) διαθέτει τέσσερις οδηγίες.
| Παραλλαγή | Διακριτικό | Παράμετρος | Τύπος | Περιγραφή |
|---|---|---|---|---|
RequestHeapFrame | 1 | bytes | u32 | Ζητούμενο μέγεθος heap σε bytes για κάθε πρόγραμμα στη συναλλαγή |
SetComputeUnitLimit | 2 | units | u32 | Μέγιστα CUs που μπορεί να καταναλώσει η συναλλαγή |
SetComputeUnitPrice | 3 | micro_lamports | u64 | Τιμή CU σε micro-lamports |
SetLoadedAccountsDataSizeLimit | 4 | bytes | u32 | Μέγιστα συνολικά 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):
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.
Σταθερές κόστους χρονοπρογραμματιστή
| Σταθερά | Τιμή |
|---|---|
COMPUTE_UNIT_TO_US_RATIO | 30 |
SIGNATURE_COST | 720 CUs |
SECP256K1_VERIFY_COST | 6.690 CUs |
ED25519_VERIFY_COST | 2.280 CUs |
ED25519_VERIFY_STRICT_COST | 2.400 CUs |
SECP256R1_VERIFY_COST | 4.800 CUs |
WRITE_LOCK_UNITS | 300 CUs |
INSTRUCTION_DATA_BYTES_COST | 4 |
Κόστος συναλλαγής ψήφου
Οι συναλλαγές ψήφου χρησιμοποιούν ένα στατικό κόστος 3.428 CUs ανεξάρτητα από το πραγματικό τους περιεχόμενο.
Όρια block
Ο χρονοπρογραμματιστής επιβάλλει όρια ανά block. Αν η προσθήκη μιας συναλλαγής θα υπερέβαινε οποιοδήποτε όριο, δεν συμπεριλαμβάνεται στο block.
| Όριο | Τιμή |
|---|---|
MAX_BLOCK_UNITS | 60.000.000 |
MAX_WRITABLE_ACCOUNT_UNITS | 12.000.000 |
MAX_VOTE_UNITS | 36.000.000 |
MAX_BLOCK_ACCOUNTS_DATA_SIZE_DELTA | 100 MB |
Το
SIMD-0286
προτείνει την αύξηση του MAX_BLOCK_UNITS σε 100.000.000.
Σταθερές προϋπολογισμού εκτέλεσης
Οι ακόλουθες σταθερές από το
execution_budget.rs
ορίζουν όρια χρόνου εκτέλεσης κατά την εκτέλεση συναλλαγών:
| Σταθερά | Τιμή | Περιγραφή |
|---|---|---|
MAX_COMPUTE_UNIT_LIMIT | 1.400.000 | Μέγιστο όριο CU ανά συναλλαγή |
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT | 200.000 | Προεπιλεγμένα CU ανά εντολή που δεν είναι builtin |
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT | 3.000 | Προεπιλεγμένα CU ανά εντολή builtin (SIMD-0170) |
DEFAULT_HEAP_COST | 8 CU | Κόστος ανά σελίδα heap 32 KiB |
DEFAULT_INVOCATION_COST | 1.000 CU | Κόστος μίας κλήσης CPI |
INVOKE_UNITS_COST_SIMD_0339 | 946 CU | Κόστος κλήσης CPI με SIMD-0339 |
MIN_HEAP_FRAME_BYTES | 32.768 | Ελάχιστο μέγεθος heap (32 KiB) |
MAX_HEAP_FRAME_BYTES | 262.144 | Μέγιστο μέγεθος heap (256 KiB) |
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES | 67.108.864 | Μέγιστα φορτωμένα δεδομένα λογαριασμού ανά συναλλαγή (64 MiB) |
MAX_INSTRUCTION_STACK_DEPTH | 5 | Μέγιστο βάθος στοίβας εντολών (ανώτατο επίπεδο + CPI) |
MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 | 9 | Μέγιστο βάθος στοίβας εντολών (ανώτατο επίπεδο + CPI) με SIMD-0268 |
MAX_CALL_DEPTH | 64 | Μέγιστο βάθος κλήσης SBF-σε-SBF εντός προγράμματος |
STACK_FRAME_SIZE | 4.096 bytes | Μέγεθος ενός πλαισίου στοίβας SBF |
Is this page helpful?