Änderungsregeln

Zusammenfassung

Laufzeitprüfungen nach jeder Anweisung: Nur der Eigentümer kann Lamports abbuchen oder Daten ändern, Daten können maximal 10 KiB pro Anweisung wachsen, Eigentümerwechsel erfordern nullinitialisierte Daten, und das ausführbare Flag ist irreversibel.

Die Solana-Laufzeitumgebung setzt diese Regeln nach jeder Anweisungsausführung über BorrowedInstructionAccount Methoden durch. Jede Regel wird zum Zeitpunkt der Änderung geprüft, und die Transaktion wird zurückgesetzt, wenn eine Prüfung fehlschlägt.

Lamports-Regeln

RegelDurchsetzungFehler
Nur der Eigentümer kann Lamports abbuchenset_lamports(): prüft is_owned_by_current_program() wenn lamports < currentExternalAccountLamportSpend
Schreibgeschützte Konten können keine Lamports-Änderungen habenset_lamports(): prüft is_writable()ReadonlyLamportChange
Jedes Programm kann Lamports einem beschreibbaren Konto gutschreibenset_lamports(): die Eigentümerprüfung gilt nur, wenn der neue Saldo kleiner als der aktuelle Saldo ist; die Beschreibbarkeitsprüfung gilt weiterhinReadonlyLamportChange
Lamports müssen über eine Anweisung hinweg ausgeglichen seinTransactionContext::pop(): verifiziert get_lamports_delta() == 0UnbalancedInstruction

Datenregeln

RegelDurchsetzungFehler
Nur der Eigentümer kann Daten änderncan_data_be_changed(): prüft is_owned_by_current_program()ExternalAccountDataModified
Schreibgeschützte Konten können keine Datenänderungen habencan_data_be_changed(): prüft is_writable()ReadonlyDataModified
Nur der Eigentümer kann die Datengröße änderncan_data_be_resized(): prüft is_owned_by_current_program() wenn new_len != old_lenAccountDataSizeChanged
Maximale Datengröße: 10 MiBTransactionAccounts::can_data_be_resized(): prüft new_len <= MAX_ACCOUNT_DATA_LENInvalidRealloc
Maximales Wachstum pro Anweisung: 10 KiBDeserialisierung in deserialize_parameters_aligned(): prüft post_len - pre_len <= MAX_PERMITTED_DATA_INCREASEInvalidRealloc
Maximales Wachstum pro Transaktion: 20 MiBTransactionAccounts::can_data_be_resized(): prüft kumulatives resize_delta <= MAX_ACCOUNT_DATA_GROWTH_PER_TRANSACTIONMaxAccountsDataAllocationsExceeded

Eigentümerregeln

RegelDurchsetzungFehler
Nur der aktuelle Eigentümer kann den Eigentümer neu zuweisenset_owner(): prüft is_owned_by_current_program()ModifiedProgramId
Konto muss beschreibbar seinset_owner(): prüft is_writable()ModifiedProgramId
Daten müssen nullinitialisiert seinset_owner(): prüft is_zeroed(data)ModifiedProgramId

Regeln für ausführbare Flags

RegelDurchsetzungFehler
Konto muss mietbefreit seinset_executable(): prüft rent.is_exempt(lamports, data_len)ExecutableAccountNotRentExempt
Nur der Eigentümer kann das Flag setzenset_executable(): prüft is_owned_by_current_program()ExecutableModified
Konto muss beschreibbar seinset_executable(): prüft is_writable()ExecutableModified

Mietstatusübergänge

Konten existieren in einem von drei RentState Werten: Uninitialized (0 Lamports), RentPaying (über 0, aber unter dem Mietbefreiungsminimum) und RentExempt (am oder über dem Minimum). Nicht zulässige Übergänge erzeugen TransactionError::InsufficientFundsForRent.

Die Runtime setzt diese Regeln über transition_allowed() durch:

  • Jedes Konto kann zu Uninitialized (schließen) oder RentExempt übergehen.
  • Kein Konto kann von Uninitialized oder RentExempt in RentPaying eintreten. Alle neuen Konten müssen mietbefreit sein.

Regeln für Kontoausleihe

Während der Anweisungsausführung setzt die Runtime Single-Writer-Ausleihsemantik für Konten durch. Ein Programm kann entweder eine veränderbare Referenz oder mehrere unveränderbare Referenzen auf ein Konto erhalten, aber nicht beides gleichzeitig. Wenn ein Programm versucht, ein Konto auszuleihen, das bereits veränderbar ausgeliehen ist (oder veränderbar ein Konto auszuleihen, das bereits unveränderbar ausgeliehen ist), schlägt die Anweisung mit AccountBorrowFailed über try_borrow() und try_borrow_mut() fehl. Wenn eine Anweisung abgeschlossen wird, während eine Ausleihe noch aussteht, gibt die Runtime AccountBorrowOutstanding in TransactionContext::pop() zurück.

Is this page helpful?

Inhaltsverzeichnis

Seite bearbeiten

Verwaltet von

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