Regras de modificação

Resumo

Verificações de tempo de execução após cada instrução: apenas o proprietário pode debitar lamports ou modificar dados, os dados podem crescer no máximo 10 KiB por instrução, mudanças de proprietário requerem dados inicializados a zero, e a flag executável é irreversível.

O tempo de execução Solana aplica estas regras após a execução de cada instrução através dos métodos BorrowedInstructionAccount. Cada regra é verificada no momento da modificação, e a transação é revertida se alguma verificação falhar.

Regras de lamports

RegraAplicaçãoErro
Apenas o proprietário pode debitar lamportsset_lamports(): verifica is_owned_by_current_program() quando lamports < currentExternalAccountLamportSpend
Contas somente leitura não podem ter lamports alteradosset_lamports(): verifica is_writable()ReadonlyLamportChange
Qualquer programa pode creditar lamports a uma conta gravávelset_lamports(): a verificação de propriedade aplica-se apenas quando o novo saldo é inferior ao saldo atual; a verificação de gravável ainda se aplicaReadonlyLamportChange
Lamports devem estar equilibrados numa instruçãoTransactionContext::pop(): verifica get_lamports_delta() == 0UnbalancedInstruction

Regras de dados

RegraAplicaçãoErro
Apenas o proprietário pode modificar dadoscan_data_be_changed(): verifica is_owned_by_current_program()ExternalAccountDataModified
Contas somente leitura não podem ter dados modificadoscan_data_be_changed(): verifica is_writable()ReadonlyDataModified
Apenas o proprietário pode redimensionar dadoscan_data_be_resized(): verifica is_owned_by_current_program() quando new_len != old_lenAccountDataSizeChanged
Tamanho máximo de dados: 10 MiBTransactionAccounts::can_data_be_resized(): verifica new_len <= MAX_ACCOUNT_DATA_LENInvalidRealloc
Crescimento máximo por instrução: 10 KiBDesserialização em deserialize_parameters_aligned(): verifica post_len - pre_len <= MAX_PERMITTED_DATA_INCREASEInvalidRealloc
Crescimento máximo por transação: 20 MiBTransactionAccounts::can_data_be_resized(): verifica resize_delta <= MAX_ACCOUNT_DATA_GROWTH_PER_TRANSACTION cumulativoMaxAccountsDataAllocationsExceeded

Regras do proprietário

RegraAplicaçãoErro
Apenas o proprietário atual pode reatribuir o proprietárioset_owner(): verifica is_owned_by_current_program()ModifiedProgramId
A conta deve ser gravávelset_owner(): verifica is_writable()ModifiedProgramId
Os dados devem estar inicializados com zeroset_owner(): verifica is_zeroed(data)ModifiedProgramId

Regras da flag executável

RegraAplicaçãoErro
A conta deve estar isenta de rentset_executable(): verifica rent.is_exempt(lamports, data_len)ExecutableAccountNotRentExempt
Apenas o proprietário pode definir a flagset_executable(): verifica is_owned_by_current_program()ExecutableModified
A conta deve ser gravávelset_executable(): verifica is_writable()ExecutableModified

Transições de estado de rent

As contas existem num de três valores RentState: Uninitialized (0 lamports), RentPaying (acima de 0 mas abaixo do mínimo de isenção de rent), e RentExempt (no mínimo ou acima). Transições não permitidas produzem TransactionError::InsufficientFundsForRent.

O runtime aplica estas regras através de transition_allowed():

  • Qualquer conta pode transitar para Uninitialized (fechar) ou RentExempt.
  • Nenhuma conta pode entrar em RentPaying a partir de Uninitialized ou RentExempt. Todas as novas contas devem estar isentas de rent.

Regras de empréstimo de contas

Durante a execução de instruções, o runtime aplica semântica de empréstimo de escritor único as contas. Um programa pode obter uma referência mutável ou múltiplas referências imutáveis a uma conta, mas não ambas simultaneamente. Se um programa tentar emprestar uma conta que já está mutavelmente emprestada (ou emprestar mutavelmente uma conta que já está imutuavelmente emprestada), a instrução falha com AccountBorrowFailed através de try_borrow() e try_borrow_mut(). Se uma instrução for concluída enquanto um empréstimo ainda estiver pendente, o runtime retorna AccountBorrowOutstanding em TransactionContext::pop().

Is this page helpful?

Índice

Editar Página

Gerenciado por

© 2026 Fundação Solana.
Todos os direitos reservados.
Conecte-se
  • Blog