컴퓨트 예산

요약

명령어당 기본 200K CU, 트랜잭션당 최대 1.4M입니다. 최적화를 위해 SetComputeUnitLimitSetComputeUnitPrice 명령어를 사용하세요. 우선순위 수수료는 실제 사용량이 아닌 요청된 CU를 기준으로 합니다.

컴퓨트 유닛 제한

각 명령어에는 기본적으로 200,000 CU가 할당되며, 각 트랜잭션은 1,400,000 CU로 제한됩니다. 명시적인 SetComputeUnitLimit 명령어가 없는 경우, 기본값은 명령어 유형에 따라 계산됩니다:

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)
  • 빌트인 명령어 (SBF로 마이그레이션되지 않은 System Program, Stake, Vote 등): 각각 MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT = 3,000 CU 할당 (SIMD-0170에 따름).
  • 비빌트인 명령어 (사용자 배포 SBF 프로그램): 각각 DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT = 200,000 CU 할당.
  • 마이그레이션 중인 빌트인 SBF로의 마이그레이션이 완료된 경우 (기능 게이트됨): 비빌트인으로 처리 (각각 200,000 CU).

결과는 MAX_COMPUTE_UNIT_LIMIT (1,400,000)로 제한됩니다.

트랜잭션에 SetComputeUnitLimit 명령어를 포함하여 이 기본값을 재정의할 수 있습니다.

적절한 CU 제한을 결정하려면:

  1. 트랜잭션을 시뮬레이션하여 CU 소비량을 측정합니다.
  2. 시뮬레이션된 값에 10%의 안전 마진을 추가합니다.

우선순위 수수료는 실제 사용된 컴퓨트 유닛 수가 아닌 트랜잭션에서 요청된 컴퓨트 유닛 제한에 따라 결정됩니다. 컴퓨트 유닛 제한을 너무 높게 설정하거나 기본 금액을 사용하면 사용하지 않은 컴퓨트 유닛에 대해서도 비용을 지불하게 됩니다.

컴퓨트 예산 명령어

컴퓨트 예산 프로그램 (ComputeBudget111111111111111111111111111111)은 네 가지 명령어를 가지고 있습니다.

변형식별자매개변수타입설명
RequestHeapFrame1bytesu32트랜잭션 내 각 프로그램에 대해 요청된 힙 크기(바이트)
SetComputeUnitLimit2unitsu32트랜잭션이 소비할 수 있는 최대 CU
SetComputeUnitPrice3micro_lamportsu64마이크로 램포트 단위의 CU 가격
SetLoadedAccountsDataSizeLimit4bytesu32트랜잭션이 로드할 수 있는 계정 데이터의 최대 총 바이트

출처: ComputeBudgetInstruction 열거형

제약 조건 및 오류 상황

컴퓨트 예산 명령어 처리 시 다음 규칙이 적용됩니다:

  • 타입당 하나: 트랜잭션당 각 명령어 변형은 하나만 허용됩니다. 중복을 포함하면 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)로 제한됩니다.
  • 인식되지 않는 데이터: 알려진 변형으로 역직렬화되지 않는 컴퓨트 예산 프로그램으로 전송된 모든 명령어는 *rsInvalidInstructionData*로 실패합니다.

아래의 스케줄러 비용 모델은 validator 내부의 사전 실행 비용 추정을 설명합니다. 대부분의 개발자는 위의 컴퓨트 예산 명령어만 필요합니다.

스케줄러 비용 모델

validator의 스케줄러비용 모델을 사용하여 실행 전 트랜잭션 리소스 사용량을 추정합니다. 이러한 사전 실행 비용 추정은 트랜잭션이 블록의 남은 용량에 맞는지 여부를 결정합니다. 이는 실행 중에 발생하는 CU 측정과는 별개입니다.

총 스케줄러 비용은 다섯 가지 구성 요소의 합계입니다 (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 CUCPI 호출 한 번당 비용
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_02689SIMD-0268 적용 시 최대 명령어 스택 깊이 (최상위 + CPI)
MAX_CALL_DEPTH64프로그램 내 최대 SBF-to-SBF 호출 깊이
STACK_FRAME_SIZE4,096 바이트SBF 스택 프레임 하나의 크기

Is this page helpful?

목차

페이지 편집

관리자

© 2026 솔라나 재단.
모든 권리 보유.
연결하기