요약
명령어당 기본 200K CU, 트랜잭션당 최대 1.4M입니다. 최적화를 위해
SetComputeUnitLimit 및 SetComputeUnitPrice 명령어를 사용하세요. 우선순위
수수료는 실제 사용량이 아닌 요청된 CU를 기준으로 합니다.
컴퓨트 유닛 제한
각 명령어에는
기본적으로 200,000 CU가
할당되며, 각 트랜잭션은
1,400,000 CU로
제한됩니다. 명시적인 SetComputeUnitLimit 명령어가 없는 경우,
기본값은 명령어 유형에 따라 계산됩니다:
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 제한을 결정하려면:
- 트랜잭션을 시뮬레이션하여 CU 소비량을 측정합니다.
- 시뮬레이션된 값에 10%의 안전 마진을 추가합니다.
우선순위 수수료는 실제 사용된 컴퓨트 유닛 수가 아닌 트랜잭션에서 요청된 컴퓨트 유닛 제한에 따라 결정됩니다. 컴퓨트 유닛 제한을 너무 높게 설정하거나 기본 금액을 사용하면 사용하지 않은 컴퓨트 유닛에 대해서도 비용을 지불하게 됩니다.
컴퓨트 예산 명령어
컴퓨트 예산 프로그램
(ComputeBudget111111111111111111111111111111)은 네 가지 명령어를 가지고
있습니다.
| 변형 | 식별자 | 매개변수 | 타입 | 설명 |
|---|---|---|---|---|
RequestHeapFrame | 1 | bytes | u32 | 트랜잭션 내 각 프로그램에 대해 요청된 힙 크기(바이트) |
SetComputeUnitLimit | 2 | units | u32 | 트랜잭션이 소비할 수 있는 최대 CU |
SetComputeUnitPrice | 3 | micro_lamports | u64 | 마이크로 램포트 단위의 CU 가격 |
SetLoadedAccountsDataSizeLimit | 4 | bytes | u32 | 트랜잭션이 로드할 수 있는 계정 데이터의 최대 총 바이트 |
출처: 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)로 제한됩니다.- 인식되지 않는 데이터: 알려진 변형으로 역직렬화되지 않는 컴퓨트 예산
프로그램으로 전송된 모든 명령어는 *rs
InvalidInstructionData*로 실패합니다.
아래의 스케줄러 비용 모델은 validator 내부의 사전 실행 비용 추정을 설명합니다. 대부분의 개발자는 위의 컴퓨트 예산 명령어만 필요합니다.
스케줄러 비용 모델
validator의 스케줄러는 비용 모델을 사용하여 실행 전 트랜잭션 리소스 사용량을 추정합니다. 이러한 사전 실행 비용 추정은 트랜잭션이 블록의 남은 용량에 맞는지 여부를 결정합니다. 이는 실행 중에 발생하는 CU 측정과는 별개입니다.
총 스케줄러 비용은 다섯 가지 구성 요소의 합계입니다
(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 | 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 | SIMD-0268 적용 시 최대 명령어 스택 깊이 (최상위 + CPI) |
MAX_CALL_DEPTH | 64 | 프로그램 내 최대 SBF-to-SBF 호출 깊이 |
STACK_FRAME_SIZE | 4,096 바이트 | SBF 스택 프레임 하나의 크기 |
Is this page helpful?