Zusammenfassung
Standard 200K CUs pro Anweisung, maximal 1,4M pro Transaktion. Verwenden Sie
SetComputeUnitLimit und SetComputeUnitPrice Anweisungen zur Optimierung.
Die Priority Fee basiert auf den angeforderten CUs, nicht auf der
tatsächlichen Nutzung.
Compute-Unit-Limit
Jede Anweisung erhält standardmäßig
200.000 CUs,
und jede Transaktion ist auf
1.400.000 CUs
begrenzt. Wenn keine explizite SetComputeUnitLimit Anweisung vorhanden
ist, wird
der Standardwert berechnet
basierend auf dem Anweisungstyp:
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)
- Builtin-Anweisungen (System Program, Stake, Vote usw., die noch nicht zu
SBF migriert wurden): jeweils
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT= 3.000 CUs (gemäß SIMD-0170). - Nicht-Builtin-Anweisungen (vom Benutzer bereitgestellte SBF-Programme):
jeweils
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT= 200.000 CUs. - Migrierende Builtins, die die Migration zu SBF abgeschlossen haben (Feature-gesteuert): werden als Nicht-Builtin behandelt (jeweils 200.000 CUs).
Das Ergebnis wird auf MAX_COMPUTE_UNIT_LIMIT (1.400.000) begrenzt.
Sie können diesen Standardwert überschreiben, indem Sie eine
SetComputeUnitLimit
Anweisung in Ihre Transaktion einfügen.
Um das geeignete CU-Limit zu bestimmen:
- Simulieren Sie die Transaktion, um den CU-Verbrauch zu messen.
- Fügen Sie dem simulierten Wert eine Sicherheitsmarge von 10 % hinzu.
Die Priority Fee wird durch das angeforderte Compute-Unit-Limit der Transaktion bestimmt, nicht durch die tatsächlich verwendete Anzahl an Compute Units. Wenn Sie ein Compute-Unit-Limit festlegen, das zu hoch ist, oder den Standardwert verwenden, zahlen Sie für ungenutzte Compute Units.
Anweisungen für das Rechenbudget
Das
Compute Budget Program
(ComputeBudget111111111111111111111111111111) verfügt über vier Anweisungen.
| Variante | Diskriminator | Parameter | Typ | Beschreibung |
|---|---|---|---|---|
RequestHeapFrame | 1 | bytes | u32 | Angeforderte Heap-Größe in Bytes für jedes Programm in der Transaktion |
SetComputeUnitLimit | 2 | units | u32 | Maximale CUs, die die Transaktion verbrauchen darf |
SetComputeUnitPrice | 3 | micro_lamports | u64 | CU-Preis in Mikro-Lamports |
SetLoadedAccountsDataSizeLimit | 4 | bytes | u32 | Maximale Gesamtbytes an Kontodaten, die die Transaktion laden darf |
Quelle: ComputeBudgetInstruction enum
Einschränkungen und Fehlerbedingungen
Die folgenden Regeln gelten bei der Verarbeitung von Compute-Budget-Anweisungen:
- Eine pro Typ: nur eine Anweisung jeder Variante ist pro Transaktion
zulässig. Das Einbeziehen von Duplikaten verursacht einen
DuplicateInstruction-Fehler (die gesamte Transaktion schlägt fehl). RequestHeapFrame: der Wert muss zwischenMIN_HEAP_FRAME_BYTES(32 KiB) undMAX_HEAP_FRAME_BYTES(256 KiB) liegen und muss ein Vielfaches von 1.024 sein. Andernfalls schlägt die Transaktion mitInvalidInstructionDatafehl. Die Heap-Größe gilt für jedes in der Transaktion aufgerufene Programm (einschließlich CPIs).SetComputeUnitLimit: jederu32-Wert wird akzeptiert. Das effektive Limit wird aufMAX_COMPUTE_UNIT_LIMIT(1.400.000) begrenzt.SetComputeUnitPrice: jederu64-Wert wird akzeptiert (0 bisu64::MAX).SetLoadedAccountsDataSizeLimit: der Wert muss größer als 0 sein (NonZeroU32). Ein Wert von 0 verursachtInvalidLoadedAccountsDataSizeLimit. Das effektive Limit wird aufMAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES(64 MiB) begrenzt.- Nicht erkannte Daten: jede Anweisung, die an das Compute Budget Program
gesendet wird und nicht in eine bekannte Variante deserialisiert werden kann,
schlägt mit
InvalidInstructionDatafehl.
Das unten beschriebene Scheduler-Kostenmodell beschreibt die validator-interne Kostenschätzung vor der Ausführung. Die meisten Entwickler benötigen nur die oben genannten Compute-Budget-Anweisungen.
Scheduler-Kostenmodell
Der Scheduler des Validators verwendet ein Kostenmodell, um die Ressourcennutzung von Transaktionen vor der Ausführung zu schätzen. Diese Kostenschätzungen vor der Ausführung bestimmen, ob eine Transaktion in die verbleibende Kapazität des Blocks passt. Sie sind getrennt von der CU-Messung, die während der Ausführung erfolgt.
Die Gesamtkosten des Schedulers sind die Summe von fünf Komponenten
(UsageCostDetails::sum):
total_cost = signature_cost+ write_lock_cost+ data_bytes_cost+ programs_execution_cost+ loaded_accounts_data_size_cost
Kostenkomponenten
| Komponente | Beschreibung |
|---|---|
| Signaturkosten | Kosten pro Signatur für jeden Signaturtyp |
| Write-Lock-Kosten | Pro beschreibbarem Konto |
| Anweisungsdatenkosten | Basierend auf der Gesamtzahl der Anweisungsdaten-Bytes |
| Programmausführungskosten | CU-Limit aus Compute-Budget oder Standard |
| Geladene Kontendatenkosten | Basierend auf der Gesamtgröße der geladenen Kontendaten |
Alle Werte sind in Compute-Units angegeben.
Scheduler-Kostenkonstanten
| Konstante | Wert |
|---|---|
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 |
Vote-Transaktionskosten
Vote-Transaktionen verwenden statische Kosten von 3.428 CUs, unabhängig von ihrem tatsächlichen Inhalt.
Block-Limits
Der Scheduler erzwingt Limits pro Block. Wenn das Hinzufügen einer Transaktion ein Limit überschreiten würde, wird sie nicht in den Block aufgenommen.
| Limit | Wert |
|---|---|
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
schlägt vor, MAX_BLOCK_UNITS auf 100.000.000 zu erhöhen.
Konstanten für das Ausführungsbudget
Die folgenden Konstanten aus
execution_budget.rs
definieren Laufzeitlimits während der Transaktionsausführung:
| Konstante | Wert | Beschreibung |
|---|---|---|
MAX_COMPUTE_UNIT_LIMIT | 1.400.000 | Maximales CU-Limit pro Transaktion |
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT | 200.000 | Standard-CUs pro Nicht-Builtin-Anweisung |
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT | 3.000 | Standard-CUs pro Builtin-Anweisung (SIMD-0170) |
DEFAULT_HEAP_COST | 8 CUs | Kosten pro 32 KiB Heap-Seite |
DEFAULT_INVOCATION_COST | 1.000 CUs | Kosten eines CPI-Aufrufs |
INVOKE_UNITS_COST_SIMD_0339 | 946 CUs | CPI-Aufrufkosten mit SIMD-0339 |
MIN_HEAP_FRAME_BYTES | 32.768 | Minimale Heap-Größe (32 KiB) |
MAX_HEAP_FRAME_BYTES | 262.144 | Maximale Heap-Größe (256 KiB) |
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES | 67.108.864 | Maximal geladene Kontodaten pro Transaktion (64 MiB) |
MAX_INSTRUCTION_STACK_DEPTH | 5 | Maximale Anweisungs-Stack-Tiefe (Top-Level + CPIs) |
MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 | 9 | Maximale Anweisungs-Stack-Tiefe (Top-Level + CPIs) mit SIMD-0268 |
MAX_CALL_DEPTH | 64 | Maximale SBF-zu-SBF-Aufruftiefe innerhalb eines Programms |
STACK_FRAME_SIZE | 4.096 Bytes | Größe eines SBF-Stack-Frames |
Is this page helpful?