概要
デフォルトではinstructionごとに200K CU、トランザクションごとに最大1.4M
CU。最適化するにはSetComputeUnitLimitおよびSetComputeUnitPriceのinstructionsを使用してください。
優先手数料は実際の使用量ではなく、リクエストされたCUに基づいて決定されます。
計算ユニット制限
各instructionには
デフォルトで200,000 CUが割り当てられ、各トランザクションは
1,400,000 CUに制限されています。明示的なSetComputeUnitLimit
instructionが存在しない場合、instructionタイプに基づいて
デフォルトが計算されます:
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制限を決定するには:
- トランザクションをシミュレートしてCU消費量を測定します。
- シミュレート値に10%の安全マージンを追加します。
優先手数料は、実際に使用された計算ユニット数ではなく、トランザクションでリクエストされた計算ユニット制限によって決定されます。計算ユニット制限を高く設定しすぎたり、デフォルト量を使用したりすると、未使用の計算ユニットに対して料金を支払うことになります。
コンピュートバジェットinstructions
コンピュートバジェットプログラム
(ComputeBudget111111111111111111111111111111)には4つのinstructionsがあります。
| バリアント | ディスクリミネーター | パラメーター | 型 | 説明 |
|---|---|---|---|---|
RequestHeapFrame | 1 | bytes | u32 | トランザクション内の各プログラムに対して要求されるヒープサイズ(バイト単位) |
SetComputeUnitLimit | 2 | units | u32 | トランザクションが消費できる最大CU数 |
SetComputeUnitPrice | 3 | micro_lamports | u64 | マイクロlamports単位のCU価格 |
SetLoadedAccountsDataSizeLimit | 4 | bytes | u32 | トランザクションが読み込めるアカウントデータの最大合計バイト数 |
ソース: ComputeBudgetInstruction enum
制約とエラー条件
コンピュートバジェットinstructionsの処理時には、以下のルールが適用されます:
- タイプごとに1つ: 各instructionバリアントは、トランザクションごとに1つのみ許可されます。重複を含めると、*rs
DuplicateInstruction*エラーが発生します(トランザクション全体が失敗します)。 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で、既知のバリアントにデシリアライズできないものは、*rs
InvalidInstructionData*で失敗します。
以下のスケジューラーコストモデルは、validator内部の実行前コスト推定について説明しています。ほとんどの開発者は、上記のコンピュートバジェットinstructionsのみを必要とします。
スケジューラーコストモデル
validatorのスケジューラーは、コストモデルを使用して、実行前にトランザクションのリソース使用量を推定します。これらの実行前コスト推定は、トランザクションがブロックの残容量に収まるかどうかを判断します。これらは実行中に発生するCU計測とは別のものです。
スケジューラーの総コストは、5つのコンポーネントの合計です(UsageCostDetails::sum):
total_cost = signature_cost+ write_lock_cost+ data_bytes_cost+ programs_execution_cost+ loaded_accounts_data_size_cost
コストコンポーネント
| コンポーネント | 説明 |
|---|---|
| 署名コスト | 各署名タイプごとの署名あたりのコスト |
| 書き込みロックコスト | 書き込み可能なアカウントごと |
| instruction dataコスト | instruction dataの総バイト数に基づく |
| プログラム実行コスト | コンピュートバジェットからのCU制限またはデフォルト値 |
| ロードされたアカウントデータコスト | ロードされたアカウントデータの総サイズに基づく |
すべての値はコンピュートユニット単位です。
スケジューラーコスト定数
| 定数 | 値 |
|---|---|
COMPUTE_UNIT_TO_US_RATIO | 30 |
SIGNATURE_COST | 720 CU |
SECP256K1_VERIFY_COST | 6,690 CU |
ED25519_VERIFY_COST | 2,280 CU |
ED25519_VERIFY_STRICT_COST | 2,400 CU |
SECP256R1_VERIFY_COST | 4,800 CU |
WRITE_LOCK_UNITS | 300 CU |
INSTRUCTION_DATA_BYTES_COST | 4 |
投票トランザクションコスト
投票トランザクションは、実際の内容に関係なく、静的コストの3,428 CUを使用します。
ブロック制限
スケジューラーはブロックごとの制限を適用します。トランザクションを追加することでいずれかの制限を超える場合、そのトランザクションはブロックに含まれません。
| 制限 | 値 |
|---|---|
MAX_BLOCK_UNITS | 60,000,000 |
MAX_WRITABLE_ACCOUNT_UNITS | 12,000,000 |
MAX_VOTE_UNITS | 36,000,000 |
MAX_BLOCK_ACCOUNTS_DATA_SIZE_DELTA | 100 MB |
SIMD-0286
は、_MAX_BLOCK_UNITS_を100,000,000に増加することを提案しています。
実行バジェット定数
execution_budget.rsの以下の定数は、トランザクション実行中のランタイム制限を定義します:
| 定数 | 値 | 説明 |
|---|---|---|
MAX_COMPUTE_UNIT_LIMIT | 1,400,000 | トランザクションあたりの最大CU制限 |
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT | 200,000 | 非ビルトイン命令あたりのデフォルトCU |
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT | 3,000 | ビルトイン命令あたりのデフォルトCU (SIMD-0170) |
DEFAULT_HEAP_COST | 8 CU | 32 KiBヒープページあたりのコスト |
DEFAULT_INVOCATION_COST | 1,000 CU | 1回のCPI呼び出しのコスト |
INVOKE_UNITS_COST_SIMD_0339 | 946 CU | SIMD-0339でのCPI呼び出しコスト |
MIN_HEAP_FRAME_BYTES | 32,768 | 最小ヒープサイズ (32 KiB) |
MAX_HEAP_FRAME_BYTES | 262,144 | 最大ヒープサイズ (256 KiB) |
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES | 67,108,864 | トランザクションあたりの最大ロード済みアカウントデータ (64 MiB) |
MAX_INSTRUCTION_STACK_DEPTH | 5 | 最大命令スタック深度 (トップレベル + CPI) |
MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 | 9 | 最大命令スタック深度 (トップレベル + CPI) SIMD-0268適用時 |
MAX_CALL_DEPTH | 64 | プログラム内の最大SBF間呼び出し深度 |
STACK_FRAME_SIZE | 4,096バイト | 1つのSBFスタックフレームのサイズ |
Is this page helpful?