Règles de modification

Résumé

Vérifications du runtime après chaque instruction : seul le propriétaire peut débiter des lamports ou modifier les données, les données peuvent croître de 10 Kio maximum par instruction, les changements de propriétaire nécessitent des données initialisées à zéro, et le flag exécutable est irréversible.

Le runtime Solana applique ces règles après l'exécution de chaque instruction via les méthodes BorrowedInstructionAccount. Chaque règle est vérifiée au moment de la modification, et la transaction est annulée si une vérification échoue.

Règles des lamports

RègleApplicationErreur
Seul le propriétaire peut débiter des lamportsset_lamports() : vérifie is_owned_by_current_program() quand lamports < currentExternalAccountLamportSpend
Les comptes en lecture seule ne peuvent pas voir leurs lamports modifiésset_lamports() : vérifie is_writable()ReadonlyLamportChange
Tout programme peut créditer des lamports sur un compte modifiableset_lamports() : la vérification de propriété s'applique uniquement lorsque le nouveau solde est inférieur au solde actuel ; la vérification de modification s'applique toujoursReadonlyLamportChange
Les lamports doivent être équilibrés dans une instructionTransactionContext::pop() : vérifie get_lamports_delta() == 0UnbalancedInstruction

Règles des données

RègleApplicationErreur
Seul le propriétaire peut modifier les donnéescan_data_be_changed() : vérifie is_owned_by_current_program()ExternalAccountDataModified
Les comptes en lecture seule ne peuvent pas voir leurs données modifiéescan_data_be_changed() : vérifie is_writable()ReadonlyDataModified
Seul le propriétaire peut redimensionner les donnéescan_data_be_resized() : vérifie is_owned_by_current_program() quand new_len != old_lenAccountDataSizeChanged
Taille maximale des données : 10 MioTransactionAccounts::can_data_be_resized() : vérifie new_len <= MAX_ACCOUNT_DATA_LENInvalidRealloc
Croissance maximale par instruction : 10 KioDésérialisation dans deserialize_parameters_aligned() : vérifie post_len - pre_len <= MAX_PERMITTED_DATA_INCREASEInvalidRealloc
Croissance maximale par transaction : 20 MioTransactionAccounts::can_data_be_resized() : vérifie le cumul resize_delta <= MAX_ACCOUNT_DATA_GROWTH_PER_TRANSACTIONMaxAccountsDataAllocationsExceeded

Règles du propriétaire

RègleApplicationErreur
Seul le propriétaire actuel peut réassigner le propriétaireset_owner() : vérifie is_owned_by_current_program()ModifiedProgramId
Le compte doit être modifiableset_owner() : vérifie is_writable()ModifiedProgramId
Les données doivent être initialisées à zéroset_owner() : vérifie is_zeroed(data)ModifiedProgramId

Règles du drapeau exécutable

RègleApplicationErreur
Le compte doit être exempté de rentset_executable() : vérifie rent.is_exempt(lamports, data_len)ExecutableAccountNotRentExempt
Seul le propriétaire peut définir le drapeauset_executable() : vérifie is_owned_by_current_program()ExecutableModified
Le compte doit être modifiableset_executable() : vérifie is_writable()ExecutableModified

Transitions d'état de rent

Les comptes existent dans l'une des trois valeurs RentState : Uninitialized (0 lamport), RentPaying (au-dessus de 0 mais en dessous du minimum d'exemption de rent), et RentExempt (au minimum ou au-dessus). Les transitions interdites produisent TransactionError::InsufficientFundsForRent.

Le runtime applique ces règles via transition_allowed() :

  • Tout compte peut passer à Uninitialized (fermer) ou RentExempt.
  • Aucun compte ne peut entrer dans RentPaying depuis Uninitialized ou RentExempt. Tous les nouveaux comptes doivent être exemptés de rent.

Règles d'emprunt de compte

Pendant l'exécution des instructions, le runtime applique une sémantique d'emprunt à écrivain unique sur les comptes. Un programme peut obtenir soit une référence mutable, soit plusieurs références immuables à un compte, mais pas les deux simultanément. Si un programme tente d'emprunter un compte qui est déjà emprunté de manière mutable (ou d'emprunter de manière mutable un compte qui est déjà emprunté de manière immuable), l'instruction échoue avec AccountBorrowFailed via try_borrow() et try_borrow_mut(). Si une instruction se termine alors qu'un emprunt est toujours en cours, le runtime renvoie AccountBorrowOutstanding dans TransactionContext::pop().

Is this page helpful?

Table des matières

Modifier la page

Géré par

© 2026 Fondation Solana.
Tous droits réservés.
Restez connecté