Reglas de modificación

Resumen

Verificaciones del runtime después de cada instrucción: solo el propietario puede debitar lamports o modificar datos, los datos pueden crecer máximo 10 KiB por instrucción, los cambios de propietario requieren datos inicializados en cero, y la bandera ejecutable es irreversible.

El runtime de Solana aplica estas reglas después de que cada instrucción se ejecuta mediante los métodos BorrowedInstructionAccount. Cada regla se verifica en el punto de modificación, y la transacción se revierte si alguna verificación falla.

Reglas de lamports

ReglaAplicaciónError
Solo el propietario puede debitar lamportsset_lamports(): verifica is_owned_by_current_program() cuando lamports < currentExternalAccountLamportSpend
Las cuentas de solo lectura no pueden tener lamports modificadosset_lamports(): verifica is_writable()ReadonlyLamportChange
Cualquier programa puede acreditar lamports a una cuenta escribibleset_lamports(): la verificación de propiedad solo aplica cuando el nuevo saldo es menor que el saldo actual; la verificación de escritura aún aplicaReadonlyLamportChange
Los lamports deben balancearse a través de una instrucciónTransactionContext::pop(): verifica get_lamports_delta() == 0UnbalancedInstruction

Reglas de datos

ReglaAplicaciónError
Solo el propietario puede modificar datoscan_data_be_changed(): verifica is_owned_by_current_program()ExternalAccountDataModified
Las cuentas de solo lectura no pueden tener datos modificadoscan_data_be_changed(): verifica is_writable()ReadonlyDataModified
Solo el propietario puede redimensionar datoscan_data_be_resized(): verifica is_owned_by_current_program() cuando new_len != old_lenAccountDataSizeChanged
Tamaño máximo de datos: 10 MiBTransactionAccounts::can_data_be_resized(): verifica new_len <= MAX_ACCOUNT_DATA_LENInvalidRealloc
Crecimiento máximo por instrucción: 10 KiBDeserialización en deserialize_parameters_aligned(): verifica post_len - pre_len <= MAX_PERMITTED_DATA_INCREASEInvalidRealloc
Crecimiento máximo por transacción: 20 MiBTransactionAccounts::can_data_be_resized(): verifica resize_delta <= MAX_ACCOUNT_DATA_GROWTH_PER_TRANSACTION acumulativoMaxAccountsDataAllocationsExceeded

Reglas del propietario

ReglaAplicaciónError
Solo el propietario actual puede reasignar el propietarioset_owner(): verifica is_owned_by_current_program()ModifiedProgramId
La cuenta debe ser escribibleset_owner(): verifica is_writable()ModifiedProgramId
Los datos deben estar inicializados en ceroset_owner(): verifica is_zeroed(data)ModifiedProgramId

Reglas de bandera ejecutable

ReglaAplicaciónError
La cuenta debe estar exenta de rentset_executable(): verifica rent.is_exempt(lamports, data_len)ExecutableAccountNotRentExempt
Solo el propietario puede establecer la banderaset_executable(): verifica is_owned_by_current_program()ExecutableModified
La cuenta debe ser escribibleset_executable(): verifica is_writable()ExecutableModified

Transiciones de estado de rent

Las cuentas existen en uno de tres valores RentState: Uninitialized (0 lamports), RentPaying (por encima de 0 pero por debajo del mínimo exento de rent), y RentExempt (igual o por encima del mínimo). Las transiciones no permitidas producen TransactionError::InsufficientFundsForRent.

El runtime aplica estas reglas mediante transition_allowed():

  • Cualquier cuenta puede transicionar a Uninitialized (cerrar) o RentExempt.
  • Ninguna cuenta puede entrar en RentPaying desde Uninitialized o RentExempt. Todas las cuentas nuevas deben estar exentas de rent.

Reglas de préstamo de cuentas

Durante la ejecución de instrucciones, el runtime aplica semántica de préstamo de escritor único en las cuentas. Un programa puede obtener una referencia mutable o múltiples referencias inmutables a una cuenta, pero no ambas simultáneamente. Si un programa intenta tomar prestada una cuenta que ya está prestada de forma mutable (o prestar de forma mutable una cuenta que ya está prestada de forma inmutable), la instrucción falla con AccountBorrowFailed mediante try_borrow() y try_borrow_mut(). Si una instrucción se completa mientras un préstamo aún está pendiente, el runtime devuelve AccountBorrowOutstanding en TransactionContext::pop().

Is this page helpful?

Tabla de Contenidos

Editar Página

Gestionado por

© 2026 Fundación Solana.
Todos los derechos reservados.
Conéctate