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
| Regel | Afdwinging | Fout |
|---|---|---|
| Alleen de eigenaar kan lamports debiteren | set_lamports(): controleert is_owned_by_current_program() wanneer lamports < current | ExternalAccountLamportSpend |
| Read-only accounts kunnen geen lamports wijzigingen hebben | set_lamports(): controleert is_writable() | ReadonlyLamportChange |
| Elk programma kan lamports crediteren naar een schrijfbaar account | set_lamports(): de eigendomscontrole geldt alleen wanneer het nieuwe saldo lager is dan het huidige saldo; de schrijfbaarheidscontrole geldt nog steeds | ReadonlyLamportChange |
| Lamports moeten in balans zijn over een instructie | TransactionContext::pop(): verifieert get_lamports_delta() == 0 | UnbalancedInstruction |
Data regels
| Regel | Afdwinging | Fout |
|---|---|---|
| Alleen de eigenaar kan data wijzigen | can_data_be_changed(): controleert is_owned_by_current_program() | ExternalAccountDataModified |
| Read-only accounts kunnen geen data wijzigingen hebben | can_data_be_changed(): controleert is_writable() | ReadonlyDataModified |
| Alleen de eigenaar kan data resizen | can_data_be_resized(): controleert is_owned_by_current_program() wanneer new_len != old_len | AccountDataSizeChanged |
| Max data grootte: 10 MiB | TransactionAccounts::can_data_be_resized(): controleert new_len <= MAX_ACCOUNT_DATA_LEN | InvalidRealloc |
| Max groei per instructie: 10 KiB | Deserialisatie in deserialize_parameters_aligned(): controleert post_len - pre_len <= MAX_PERMITTED_DATA_INCREASE | InvalidRealloc |
| Max groei per transactie: 20 MiB | TransactionAccounts::can_data_be_resized(): controleert cumulatieve resize_delta <= MAX_ACCOUNT_DATA_GROWTH_PER_TRANSACTION | MaxAccountsDataAllocationsExceeded |
Eigenaarregels
| Regel | Handhaving | Fout |
|---|---|---|
| Alleen de huidige eigenaar kan de eigenaar opnieuw toewijzen | set_owner(): controleert is_owned_by_current_program() | ModifiedProgramId |
| Account moet schrijfbaar zijn | set_owner(): controleert is_writable() | ModifiedProgramId |
| Data moet zero-initialized zijn | set_owner(): controleert is_zeroed(data) | ModifiedProgramId |
Executable flag-regels
| Regel | Handhaving | Fout |
|---|---|---|
| Account moet rent-exempt zijn | set_executable(): controleert rent.is_exempt(lamports, data_len) | ExecutableAccountNotRentExempt |
| Alleen de eigenaar kan de flag instellen | set_executable(): controleert is_owned_by_current_program() | ExecutableModified |
| Account moet schrijfbaar zijn | set_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) ofRentExempt. - Geen enkel account kan
RentPayingbinnengaan vanuitUninitializedofRentExempt. 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?