計算予算

概要

デフォルトではinstructionごとに200K CU、トランザクションごとに最大1.4M CU。最適化するにはSetComputeUnitLimitおよびSetComputeUnitPriceのinstructionsを使用してください。 優先手数料は実際の使用量ではなく、リクエストされたCUに基づいて決定されます。

計算ユニット制限

各instructionには デフォルトで200,000 CUが割り当てられ、各トランザクションは 1,400,000 CUに制限されています。明示的なSetComputeUnitLimit instructionが存在しない場合、instructionタイプに基づいて デフォルトが計算されます:

Default CU limit calculation
default_cu_limit = (num_non_migratable_builtin_instructions * 3,000)
+ (num_not_migrated_builtin_instructions * 3,000)
+ (num_non_builtin_instructions * 200,000)
+ (num_migrated_builtin_instructions * 200,000)
  • ビルトインinstructions(System Program、Stake、Voteなど、SBFに移行されていないもの):それぞれ MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT = 3,000 CUが割り当てられます(SIMD-0170による)。
  • 非ビルトインinstructions(ユーザーがデプロイしたSBFプログラム):それぞれ DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT = 200,000 CUが割り当てられます。
  • 移行中のビルトインでSBFへの移行が完了したもの(機能ゲート付き): 非ビルトインとして扱われます(それぞれ200,000 CU)。

結果はMAX_COMPUTE_UNIT_LIMIT(1,400,000)にクランプされます。

トランザクションに SetComputeUnitLimit instructionを含めることで、このデフォルトを上書きできます。

適切なCU制限を決定するには:

  1. トランザクションをシミュレートしてCU消費量を測定します。
  2. シミュレート値に10%の安全マージンを追加します。

優先手数料は、実際に使用された計算ユニット数ではなく、トランザクションでリクエストされた計算ユニット制限によって決定されます。計算ユニット制限を高く設定しすぎたり、デフォルト量を使用したりすると、未使用の計算ユニットに対して料金を支払うことになります。

コンピュートバジェットinstructions

コンピュートバジェットプログラム (ComputeBudget111111111111111111111111111111)には4つのinstructionsがあります。

バリアントディスクリミネーターパラメーター説明
RequestHeapFrame1bytesu32トランザクション内の各プログラムに対して要求されるヒープサイズ(バイト単位)
SetComputeUnitLimit2unitsu32トランザクションが消費できる最大CU数
SetComputeUnitPrice3micro_lamportsu64マイクロlamports単位のCU価格
SetLoadedAccountsDataSizeLimit4bytesu32トランザクションが読み込めるアカウントデータの最大合計バイト数

ソース: ComputeBudgetInstruction enum

制約とエラー条件

コンピュートバジェットinstructionsの処理時には、以下のルールが適用されます:

  • タイプごとに1つ: 各instructionバリアントは、トランザクションごとに1つのみ許可されます。重複を含めると、*rsDuplicateInstruction*エラーが発生します(トランザクション全体が失敗します)。
  • RequestHeapFrame: 値はMIN_HEAP_FRAME_BYTES(32 KiB)からMAX_HEAP_FRAME_BYTES(256 KiB)の間で、かつ1,024の倍数である必要があります。それ以外の場合、トランザクションは*rsInvalidInstructionData*で失敗します。ヒープサイズは、トランザクション内で呼び出されるすべてのプログラム(CPIを含む)に適用されます。
  • SetComputeUnitLimit: 任意のu32値が受け入れられます。有効な制限はMAX_COMPUTE_UNIT_LIMIT(1,400,000)にクランプされます。
  • SetComputeUnitPrice: 任意のu64値が受け入れられます(0からu64::MAXまで)。
  • SetLoadedAccountsDataSizeLimit: 値は0より大きい必要があります(NonZeroU32)。値が0の場合、InvalidLoadedAccountsDataSizeLimitが発生します。有効な制限はMAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES(64 MiB)にクランプされます。
  • 認識されないデータ: コンピュートバジェットプログラムに送信されたinstructionで、既知のバリアントにデシリアライズできないものは、*rsInvalidInstructionData*で失敗します。

以下のスケジューラーコストモデルは、validator内部の実行前コスト推定について説明しています。ほとんどの開発者は、上記のコンピュートバジェットinstructionsのみを必要とします。

スケジューラーコストモデル

validatorのスケジューラーは、コストモデルを使用して、実行前にトランザクションのリソース使用量を推定します。これらの実行前コスト推定は、トランザクションがブロックの残容量に収まるかどうかを判断します。これらは実行中に発生するCU計測とは別のものです。

スケジューラーの総コストは、5つのコンポーネントの合計です(UsageCostDetails::sum):

Scheduler cost formula
total_cost = signature_cost
+ write_lock_cost
+ data_bytes_cost
+ programs_execution_cost
+ loaded_accounts_data_size_cost

コストコンポーネント

コンポーネント説明
署名コスト各署名タイプごとの署名あたりのコスト
書き込みロックコスト書き込み可能なアカウントごと
instruction dataコストinstruction dataの総バイト数に基づく
プログラム実行コストコンピュートバジェットからのCU制限またはデフォルト値
ロードされたアカウントデータコストロードされたアカウントデータの総サイズに基づく

すべての値はコンピュートユニット単位です。

スケジューラーコスト定数

投票トランザクションコスト

投票トランザクションは、実際の内容に関係なく、静的コストの3,428 CUを使用します。

ブロック制限

スケジューラーはブロックごとの制限を適用します。トランザクションを追加することでいずれかの制限を超える場合、そのトランザクションはブロックに含まれません。

SIMD-0286 は、_MAX_BLOCK_UNITS_を100,000,000に増加することを提案しています。

実行バジェット定数

execution_budget.rsの以下の定数は、トランザクション実行中のランタイム制限を定義します:

定数説明
MAX_COMPUTE_UNIT_LIMIT1,400,000トランザクションあたりの最大CU制限
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT200,000非ビルトイン命令あたりのデフォルトCU
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT3,000ビルトイン命令あたりのデフォルトCU (SIMD-0170)
DEFAULT_HEAP_COST8 CU32 KiBヒープページあたりのコスト
DEFAULT_INVOCATION_COST1,000 CU1回のCPI呼び出しのコスト
INVOKE_UNITS_COST_SIMD_0339946 CUSIMD-0339でのCPI呼び出しコスト
MIN_HEAP_FRAME_BYTES32,768最小ヒープサイズ (32 KiB)
MAX_HEAP_FRAME_BYTES262,144最大ヒープサイズ (256 KiB)
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES67,108,864トランザクションあたりの最大ロード済みアカウントデータ (64 MiB)
MAX_INSTRUCTION_STACK_DEPTH5最大命令スタック深度 (トップレベル + CPI)
MAX_INSTRUCTION_STACK_DEPTH_SIMD_02689最大命令スタック深度 (トップレベル + CPI) SIMD-0268適用時
MAX_CALL_DEPTH64プログラム内の最大SBF間呼び出し深度
STACK_FRAME_SIZE4,096バイト1つのSBFスタックフレームのサイズ

Is this page helpful?

管理運営

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