Rechenbudget

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 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)
  • 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:

  1. Simulieren Sie die Transaktion, um den CU-Verbrauch zu messen.
  2. 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.

VarianteDiskriminatorParameterTypBeschreibung
RequestHeapFrame1bytesu32Angeforderte Heap-Größe in Bytes für jedes Programm in der Transaktion
SetComputeUnitLimit2unitsu32Maximale CUs, die die Transaktion verbrauchen darf
SetComputeUnitPrice3micro_lamportsu64CU-Preis in Mikro-Lamports
SetLoadedAccountsDataSizeLimit4bytesu32Maximale 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 zwischen MIN_HEAP_FRAME_BYTES (32 KiB) und MAX_HEAP_FRAME_BYTES (256 KiB) liegen und muss ein Vielfaches von 1.024 sein. Andernfalls schlägt die Transaktion mit InvalidInstructionData fehl. Die Heap-Größe gilt für jedes in der Transaktion aufgerufene Programm (einschließlich CPIs).
  • SetComputeUnitLimit: jeder u32-Wert wird akzeptiert. Das effektive Limit wird auf MAX_COMPUTE_UNIT_LIMIT (1.400.000) begrenzt.
  • SetComputeUnitPrice: jeder u64-Wert wird akzeptiert (0 bis u64::MAX).
  • SetLoadedAccountsDataSizeLimit: der Wert muss größer als 0 sein (NonZeroU32). Ein Wert von 0 verursacht InvalidLoadedAccountsDataSizeLimit. Das effektive Limit wird auf MAX_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 InvalidInstructionData fehl.

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):

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

Kostenkomponenten

KomponenteBeschreibung
SignaturkostenKosten pro Signatur für jeden Signaturtyp
Write-Lock-KostenPro beschreibbarem Konto
AnweisungsdatenkostenBasierend auf der Gesamtzahl der Anweisungsdaten-Bytes
ProgrammausführungskostenCU-Limit aus Compute-Budget oder Standard
Geladene KontendatenkostenBasierend auf der Gesamtgröße der geladenen Kontendaten

Alle Werte sind in Compute-Units angegeben.

Scheduler-Kostenkonstanten

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.

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:

KonstanteWertBeschreibung
MAX_COMPUTE_UNIT_LIMIT1.400.000Maximales CU-Limit pro Transaktion
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT200.000Standard-CUs pro Nicht-Builtin-Anweisung
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT3.000Standard-CUs pro Builtin-Anweisung (SIMD-0170)
DEFAULT_HEAP_COST8 CUsKosten pro 32 KiB Heap-Seite
DEFAULT_INVOCATION_COST1.000 CUsKosten eines CPI-Aufrufs
INVOKE_UNITS_COST_SIMD_0339946 CUsCPI-Aufrufkosten mit SIMD-0339
MIN_HEAP_FRAME_BYTES32.768Minimale Heap-Größe (32 KiB)
MAX_HEAP_FRAME_BYTES262.144Maximale Heap-Größe (256 KiB)
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES67.108.864Maximal geladene Kontodaten pro Transaktion (64 MiB)
MAX_INSTRUCTION_STACK_DEPTH5Maximale Anweisungs-Stack-Tiefe (Top-Level + CPIs)
MAX_INSTRUCTION_STACK_DEPTH_SIMD_02689Maximale Anweisungs-Stack-Tiefe (Top-Level + CPIs) mit SIMD-0268
MAX_CALL_DEPTH64Maximale SBF-zu-SBF-Aufruftiefe innerhalb eines Programms
STACK_FRAME_SIZE4.096 BytesGröße eines SBF-Stack-Frames

Is this page helpful?

Inhaltsverzeichnis

Seite bearbeiten

Verwaltet von

© 2026 Solana Foundation.
Alle Rechte vorbehalten.
Verbinden Sie sich