Правила модифікації

Підсумок

Перевірки середовища виконання після кожної інструкції: лише власник може списувати lamports або змінювати дані, дані можуть зростати максимум на 10 КіБ за інструкцію, зміна власника вимагає нульових даних, а прапорець executable є незворотним.

Середовище виконання Solana застосовує ці правила після виконання кожної інструкції через методи BorrowedInstructionAccount. Кожне правило перевіряється в момент модифікації, і транзакція відкочується, якщо будь-яка перевірка не вдається.

Правила lamports

ПравилоЗастосуванняПомилка
Лише власник може списувати lamportsset_lamports(): перевіряє is_owned_by_current_program(), коли lamports < currentExternalAccountLamportSpend
Облікові записи лише для читання не можуть мати змінені lamportsset_lamports(): перевіряє is_writable()ReadonlyLamportChange
Будь-яка програма може зараховувати lamports на обліковий запис для записуset_lamports(): перевірка власності застосовується лише коли новий баланс менший за поточний; перевірка можливості запису все одно застосовуєтьсяReadonlyLamportChange
Lamports мають балансуватися в межах інструкціїTransactionContext::pop(): перевіряє get_lamports_delta() == 0UnbalancedInstruction

Правила даних

ПравилоЗастосуванняПомилка
Лише власник може змінювати даніcan_data_be_changed(): перевіряє is_owned_by_current_program()ExternalAccountDataModified
Облікові записи лише для читання не можуть мати змінені даніcan_data_be_changed(): перевіряє is_writable()ReadonlyDataModified
Лише власник може змінювати розмір данихcan_data_be_resized(): перевіряє is_owned_by_current_program(), коли new_len != old_lenAccountDataSizeChanged
Максимальний розмір даних: 10 МіБTransactionAccounts::can_data_be_resized(): перевіряє new_len <= MAX_ACCOUNT_DATA_LENInvalidRealloc
Максимальне зростання за інструкцію: 10 КіБДесеріалізація в deserialize_parameters_aligned(): перевіряє post_len - pre_len <= MAX_PERMITTED_DATA_INCREASEInvalidRealloc
Максимальне зростання за транзакцію: 20 МіБTransactionAccounts::can_data_be_resized(): перевіряє кумулятивне resize_delta <= MAX_ACCOUNT_DATA_GROWTH_PER_TRANSACTIONMaxAccountsDataAllocationsExceeded

Правила власника

ПравилоЗастосуванняПомилка
Лише поточний власник може переназначити власникаset_owner(): перевіряє is_owned_by_current_program()ModifiedProgramId
Акаунт має бути доступним для записуset_owner(): перевіряє is_writable()ModifiedProgramId
Дані мають бути ініціалізовані нулямиset_owner(): перевіряє is_zeroed(data)ModifiedProgramId

Правила прапорця виконуваності

ПравилоЗастосуванняПомилка
Акаунт має бути звільнений від rentset_executable(): перевіряє rent.is_exempt(lamports, data_len)ExecutableAccountNotRentExempt
Лише власник може встановити прапорецьset_executable(): перевіряє is_owned_by_current_program()ExecutableModified
Акаунт має бути доступним для записуset_executable(): перевіряє is_writable()ExecutableModified

Переходи стану rent

Акаунти існують в одному з трьох RentState значень: Uninitialized (0 lamports), RentPaying (вище 0, але нижче мінімуму для звільнення від rent), та RentExempt (на рівні або вище мінімуму). Заборонені переходи призводять до TransactionError::InsufficientFundsForRent.

Середовище виконання застосовує ці правила через transition_allowed():

  • Будь-який акаунт може перейти до Uninitialized (закрити) або RentExempt.
  • Жоден акаунт не може перейти до RentPaying з Uninitialized або RentExempt. Усі нові акаунти мають бути звільнені від rent.

Правила запозичення акаунтів

Під час виконання інструкції середовище виконання застосовує семантику одного записувача для запозичення акаунтів. Програма може отримати або одне змінне посилання, або кілька незмінних посилань на акаунт, але не обидва одночасно. Якщо програма намагається запозичити акаунт, який уже запозичено зі зміною (або запозичити зі зміною акаунт, який уже запозичено без зміни), інструкція завершується помилкою AccountBorrowFailed через try_borrow() та try_borrow_mut(). Якщо інструкція завершується, поки запозичення все ще активне, середовище виконання повертає AccountBorrowOutstanding у TransactionContext::pop().

Is this page helpful?

Зміст

Редагувати сторінку

Керується

© 2026 Фонд Solana.
Всі права захищені.
Залишайтеся на зв'язку