Wijzigingsregels

Samenvatting

Runtime controles na elke instructie: alleen de eigenaar kan lamports debiteren of data wijzigen, data kan maximaal 10 KiB per instructie groeien, eigenaar wijzigingen vereisen zero-initialized data, en de executable flag is onomkeerbaar.

De Solana runtime dwingt deze regels af na elke instructie via BorrowedInstructionAccount methoden. Elke regel wordt gecontroleerd op het moment van wijziging, en de transactie wordt teruggedraaid als een controle faalt.

Lamports regels

RegelAfdwingingFout
Alleen de eigenaar kan lamports debiterenset_lamports(): controleert is_owned_by_current_program() wanneer lamports < currentExternalAccountLamportSpend
Read-only accounts kunnen geen lamports wijzigingen hebbenset_lamports(): controleert is_writable()ReadonlyLamportChange
Elk programma kan lamports crediteren naar een schrijfbaar accountset_lamports(): de eigendomscontrole geldt alleen wanneer het nieuwe saldo lager is dan het huidige saldo; de schrijfbaarheidscontrole geldt nog steedsReadonlyLamportChange
Lamports moeten in balans zijn over een instructieTransactionContext::pop(): verifieert get_lamports_delta() == 0UnbalancedInstruction

Data regels

RegelAfdwingingFout
Alleen de eigenaar kan data wijzigencan_data_be_changed(): controleert is_owned_by_current_program()ExternalAccountDataModified
Read-only accounts kunnen geen data wijzigingen hebbencan_data_be_changed(): controleert is_writable()ReadonlyDataModified
Alleen de eigenaar kan data resizencan_data_be_resized(): controleert is_owned_by_current_program() wanneer new_len != old_lenAccountDataSizeChanged
Max data grootte: 10 MiBTransactionAccounts::can_data_be_resized(): controleert new_len <= MAX_ACCOUNT_DATA_LENInvalidRealloc
Max groei per instructie: 10 KiBDeserialisatie in deserialize_parameters_aligned(): controleert post_len - pre_len <= MAX_PERMITTED_DATA_INCREASEInvalidRealloc
Max groei per transactie: 20 MiBTransactionAccounts::can_data_be_resized(): controleert cumulatieve resize_delta <= MAX_ACCOUNT_DATA_GROWTH_PER_TRANSACTIONMaxAccountsDataAllocationsExceeded

Eigenaarregels

RegelHandhavingFout
Alleen de huidige eigenaar kan de eigenaar opnieuw toewijzenset_owner(): controleert is_owned_by_current_program()ModifiedProgramId
Account moet schrijfbaar zijnset_owner(): controleert is_writable()ModifiedProgramId
Data moet zero-initialized zijnset_owner(): controleert is_zeroed(data)ModifiedProgramId

Executable flag-regels

RegelHandhavingFout
Account moet rent-exempt zijnset_executable(): controleert rent.is_exempt(lamports, data_len)ExecutableAccountNotRentExempt
Alleen de eigenaar kan de flag instellenset_executable(): controleert is_owned_by_current_program()ExecutableModified
Account moet schrijfbaar zijnset_executable(): controleert is_writable()ExecutableModified

Rent state-overgangen

Accounts bestaan in een van drie RentState waarden: Uninitialized (0 lamports), RentPaying (boven 0 maar onder het rent-exempt minimum), en RentExempt (op of boven het minimum). Niet-toegestane overgangen produceren TransactionError::InsufficientFundsForRent.

De runtime handhaaft deze regels via transition_allowed():

  • Elk account kan overgaan naar Uninitialized (sluiten) of RentExempt.
  • Geen enkel account kan RentPaying binnengaan vanuit Uninitialized of RentExempt. Alle nieuwe accounts moeten rent-exempt zijn.

Account borrow-regels

Tijdens instructie-uitvoering handhaaft de runtime single-writer borrow semantics op accounts. Een programma kan ofwel één muteerbare referentie of meerdere onveranderlijke referenties naar een account verkrijgen, maar niet beide tegelijkertijd. Als een programma probeert een account te lenen dat al muteerbaar geleend is (of muteerbaar een account probeert te lenen dat al onveranderlijk geleend is), mislukt de instructie met AccountBorrowFailed via try_borrow() en try_borrow_mut(). Als een instructie voltooid wordt terwijl een borrow nog uitstaat, retourneert de runtime AccountBorrowOutstanding in TransactionContext::pop().

Is this page helpful?

Inhoudsopgave

Pagina Bewerken

Beheerd door

© 2026 Solana Foundation.
Alle rechten voorbehouden.
Blijf Verbonden