Riepilogo
Controlli del runtime dopo ogni istruzione: solo il proprietario può addebitare lamport o modificare i dati, i dati possono crescere al massimo di 10 KiB per istruzione, i cambi di proprietario richiedono dati inizializzati a zero e il flag eseguibile è irreversibile.
Il runtime di Solana applica queste regole dopo l'esecuzione di ogni istruzione
tramite i metodi
BorrowedInstructionAccount.
Ogni regola viene verificata al momento della modifica e la transazione viene
annullata se qualsiasi controllo fallisce.
Regole dei lamport
| Regola | Applicazione | Errore |
|---|---|---|
| Solo il proprietario può addebitare lamport | set_lamports(): verifica is_owned_by_current_program() quando lamports < current | ExternalAccountLamportSpend |
| Gli account di sola lettura non possono avere lamport modificati | set_lamports(): verifica is_writable() | ReadonlyLamportChange |
| Qualsiasi programma può accreditare lamport a un account scrivibile | set_lamports(): il controllo di proprietà si applica solo quando il nuovo saldo è inferiore al saldo corrente; il controllo di scrittura si applica comunque | ReadonlyLamportChange |
| I lamport devono bilanciarsi attraverso un'istruzione | TransactionContext::pop(): verifica get_lamports_delta() == 0 | UnbalancedInstruction |
Regole dei dati
| Regola | Applicazione | Errore |
|---|---|---|
| Solo il proprietario può modificare i dati | can_data_be_changed(): verifica is_owned_by_current_program() | ExternalAccountDataModified |
| Gli account di sola lettura non possono avere dati modificati | can_data_be_changed(): verifica is_writable() | ReadonlyDataModified |
| Solo il proprietario può ridimensionare i dati | can_data_be_resized(): verifica is_owned_by_current_program() quando new_len != old_len | AccountDataSizeChanged |
| Dimensione massima dei dati: 10 MiB | TransactionAccounts::can_data_be_resized(): verifica new_len <= MAX_ACCOUNT_DATA_LEN | InvalidRealloc |
| Crescita massima per istruzione: 10 KiB | Deserializzazione in deserialize_parameters_aligned(): verifica post_len - pre_len <= MAX_PERMITTED_DATA_INCREASE | InvalidRealloc |
| Crescita massima per transazione: 20 MiB | TransactionAccounts::can_data_be_resized(): verifica resize_delta <= MAX_ACCOUNT_DATA_GROWTH_PER_TRANSACTION cumulativo | MaxAccountsDataAllocationsExceeded |
Regole del proprietario
| Regola | Applicazione | Errore |
|---|---|---|
| Solo il proprietario corrente può riassegnare il proprietario | set_owner(): verifica is_owned_by_current_program() | ModifiedProgramId |
| L'account deve essere scrivibile | set_owner(): verifica is_writable() | ModifiedProgramId |
| I dati devono essere inizializzati a zero | set_owner(): verifica is_zeroed(data) | ModifiedProgramId |
Regole del flag eseguibile
| Regola | Applicazione | Errore |
|---|---|---|
| L'account deve essere esente da rent | set_executable(): verifica rent.is_exempt(lamports, data_len) | ExecutableAccountNotRentExempt |
| Solo il proprietario può impostare il flag | set_executable(): verifica is_owned_by_current_program() | ExecutableModified |
| L'account deve essere scrivibile | set_executable(): verifica is_writable() | ExecutableModified |
Transizioni di stato del rent
Gli account esistono in uno dei tre valori
RentState:
Uninitialized (0 lamport), RentPaying (sopra 0 ma sotto il minimo
esente da rent), e RentExempt (al minimo o sopra). Le transizioni non
consentite producono TransactionError::InsufficientFundsForRent.
Il runtime applica queste regole tramite
transition_allowed():
- Qualsiasi account può passare a
Uninitialized(chiusura) oRentExempt. - Nessun account può entrare in
RentPayingdaUninitializedoRentExempt. Tutti i nuovi account devono essere esenti da rent.
Regole di prestito degli account
Durante l'esecuzione delle istruzioni, il runtime applica la semantica di
prestito single-writer sugli account. Un programma può ottenere un riferimento
mutabile o multipli riferimenti immutabili a un account, ma non entrambi
simultaneamente. Se un programma tenta di prendere in prestito un account che è
già preso in prestito in modo mutabile (o prendere in prestito in modo mutabile
un account che è già preso in prestito in modo immutabile), l'istruzione
fallisce con AccountBorrowFailed tramite
try_borrow()
e
try_borrow_mut().
Se un'istruzione si completa mentre un prestito è ancora in sospeso, il runtime
restituisce AccountBorrowOutstanding in
TransactionContext::pop().
Is this page helpful?