Regole di modifica

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

RegolaApplicazioneErrore
Solo il proprietario può addebitare lamportset_lamports(): verifica is_owned_by_current_program() quando lamports < currentExternalAccountLamportSpend
Gli account di sola lettura non possono avere lamport modificatiset_lamports(): verifica is_writable()ReadonlyLamportChange
Qualsiasi programma può accreditare lamport a un account scrivibileset_lamports(): il controllo di proprietà si applica solo quando il nuovo saldo è inferiore al saldo corrente; il controllo di scrittura si applica comunqueReadonlyLamportChange
I lamport devono bilanciarsi attraverso un'istruzioneTransactionContext::pop(): verifica get_lamports_delta() == 0UnbalancedInstruction

Regole dei dati

RegolaApplicazioneErrore
Solo il proprietario può modificare i datican_data_be_changed(): verifica is_owned_by_current_program()ExternalAccountDataModified
Gli account di sola lettura non possono avere dati modificatican_data_be_changed(): verifica is_writable()ReadonlyDataModified
Solo il proprietario può ridimensionare i datican_data_be_resized(): verifica is_owned_by_current_program() quando new_len != old_lenAccountDataSizeChanged
Dimensione massima dei dati: 10 MiBTransactionAccounts::can_data_be_resized(): verifica new_len <= MAX_ACCOUNT_DATA_LENInvalidRealloc
Crescita massima per istruzione: 10 KiBDeserializzazione in deserialize_parameters_aligned(): verifica post_len - pre_len <= MAX_PERMITTED_DATA_INCREASEInvalidRealloc
Crescita massima per transazione: 20 MiBTransactionAccounts::can_data_be_resized(): verifica resize_delta <= MAX_ACCOUNT_DATA_GROWTH_PER_TRANSACTION cumulativoMaxAccountsDataAllocationsExceeded

Regole del proprietario

RegolaApplicazioneErrore
Solo il proprietario corrente può riassegnare il proprietarioset_owner(): verifica is_owned_by_current_program()ModifiedProgramId
L'account deve essere scrivibileset_owner(): verifica is_writable()ModifiedProgramId
I dati devono essere inizializzati a zeroset_owner(): verifica is_zeroed(data)ModifiedProgramId

Regole del flag eseguibile

RegolaApplicazioneErrore
L'account deve essere esente da rentset_executable(): verifica rent.is_exempt(lamports, data_len)ExecutableAccountNotRentExempt
Solo il proprietario può impostare il flagset_executable(): verifica is_owned_by_current_program()ExecutableModified
L'account deve essere scrivibileset_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) o RentExempt.
  • Nessun account può entrare in RentPaying da Uninitialized o RentExempt. 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?

Indice dei contenuti

Modifica pagina

Gestito da

© 2026 Solana Foundation.
Tutti i diritti riservati.
Resta connesso