変更ルール

概要

各命令実行後のランタイムチェック: 所有者のみがlamportsを引き落としたりデータを変更でき、データは命令ごとに最大10 KiB成長可能、所有者変更にはゼロ初期化されたデータが必要、実行可能フラグは不可逆です。

Solanaランタイムは、BorrowedInstructionAccountメソッドを介して、各命令実行後にこれらのルールを強制します。各ルールは変更時点でチェックされ、いずれかのチェックが失敗するとトランザクションはロールバックされます。

Lamportsルール

ルール強制エラー
所有者のみがlamportsを引き落とし可能set_lamports(): lamports < currentの場合にis_owned_by_current_program()をチェックExternalAccountLamportSpend
読み取り専用アカウントはlamportsを変更不可set_lamports(): is_writable()をチェックReadonlyLamportChange
任意のプログラムが書き込み可能アカウントにlamportsを入金可能set_lamports(): 所有権チェックは新しい残高が現在の残高より少ない場合のみ適用され、書き込み可能チェックは引き続き適用されますReadonlyLamportChange
Lamportsは命令全体でバランスする必要があるTransactionContext::pop(): get_lamports_delta() == 0を検証UnbalancedInstruction

データルール

ルール強制エラー
所有者のみがデータを変更可能can_data_be_changed(): is_owned_by_current_program()をチェックExternalAccountDataModified
読み取り専用アカウントはデータを変更不可can_data_be_changed(): is_writable()をチェックReadonlyDataModified
所有者のみがデータをリサイズ可能can_data_be_resized(): new_len != old_lenの場合にis_owned_by_current_program()をチェックAccountDataSizeChanged
最大データサイズ: 10 MiBTransactionAccounts::can_data_be_resized(): new_len <= MAX_ACCOUNT_DATA_LENをチェックInvalidRealloc
命令ごとの最大成長量: 10 KiBdeserialize_parameters_aligned()でのデシリアライゼーション: post_len - pre_len <= MAX_PERMITTED_DATA_INCREASEをチェックInvalidRealloc
トランザクションごとの最大成長量: 20 MiBTransactionAccounts::can_data_be_resized(): 累積resize_delta <= MAX_ACCOUNT_DATA_GROWTH_PER_TRANSACTIONをチェックMaxAccountsDataAllocationsExceeded

オーナールール

ルール実施エラー
現在のオーナーのみがオーナーを再割り当てできるset_owner(): is_owned_by_current_program()をチェックModifiedProgramId
アカウントは書き込み可能である必要があるset_owner(): is_writable()をチェックModifiedProgramId
データはゼロ初期化されている必要があるset_owner(): is_zeroed(data)をチェックModifiedProgramId

実行可能フラグルール

ルール実施エラー
アカウントはrent免除である必要があるset_executable(): rent.is_exempt(lamports, data_len)をチェックExecutableAccountNotRentExempt
オーナーのみがフラグを設定できるset_executable(): is_owned_by_current_program()をチェックExecutableModified
アカウントは書き込み可能である必要があるset_executable(): is_writable()をチェックExecutableModified

Rent状態遷移

アカウントは3つの RentState 値のいずれかに存在します:Uninitialized(0 lamports)、RentPaying(0より大きいがrent免除最小値未満)、およびRentExempt(最小値以上)。許可されていない遷移は*rsTransactionError::InsufficientFundsForRent*を生成します。

ランタイムは transition_allowed() を介してこれらのルールを実施します:

  • すべてのアカウントはUninitialized(クローズ)または*rsRentExempt*に遷移できます。
  • *rsUninitializedまたはrsRentExemptからrsRentPaying*に入ることはできません。すべての新しいアカウントはrent免除である必要があります。

アカウント借用ルール

命令実行中、ランタイムはアカウントに対してシングルライター借用セマンティクスを実施します。プログラムは、アカウントに対して1つの可変参照または複数の不変参照のいずれかを取得できますが、両方を同時に取得することはできません。プログラムがすでに可変借用されているアカウントを借用しようとした場合(またはすでに不変借用されているアカウントを可変借用しようとした場合)、命令は try_borrow() および try_borrow_mut() を介して*rsAccountBorrowFailedで失敗します。借用がまだ未解決のまま命令が完了した場合、ランタイムは TransactionContext::pop()rsAccountBorrowOutstanding*を返します。

Is this page helpful?

目次

ページを編集

管理運営

© 2026 Solana Foundation.
無断転載を禁じます。
つながろう