Ngân sách tính toán

Tóm tắt

Mặc định 200K CU cho mỗi lệnh, tối đa 1,4M cho mỗi giao dịch. Sử dụng các lệnh SetComputeUnitLimitSetComputeUnitPrice để tối ưu hóa. Phí ưu tiên dựa trên CU được yêu cầu, không phải mức sử dụng thực tế.

Giới hạn đơn vị tính toán

Mỗi lệnh được phân bổ mặc định 200.000 CU, và mỗi giao dịch được giới hạn ở 1.400.000 CU. Khi không có lệnh SetComputeUnitLimit rõ ràng, giá trị mặc định được tính toán dựa trên loại lệnh:

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)
  • Lệnh builtin (System Program, Stake, Vote, v.v. chưa được chuyển sang SBF): mỗi lệnh được phân bổ MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT = 3.000 CU (theo SIMD-0170).
  • Lệnh non-builtin (chương trình SBF do người dùng triển khai): mỗi lệnh được phân bổ DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT = 200.000 CU.
  • Builtin đang chuyển đổi đã hoàn tất việc chuyển sang SBF (được kiểm soát bởi feature): được xử lý như non-builtin (200.000 CU cho mỗi lệnh).

Kết quả được giới hạn ở MAX_COMPUTE_UNIT_LIMIT (1.400.000).

Bạn có thể ghi đè giá trị mặc định này bằng cách thêm lệnh SetComputeUnitLimit vào giao dịch của bạn.

Để xác định giới hạn CU phù hợp:

  1. Mô phỏng giao dịch để đo lường mức tiêu thụ CU.
  2. Thêm biên an toàn 10% vào giá trị mô phỏng.

Phí ưu tiên được xác định bởi giới hạn đơn vị tính toán được yêu cầu trong giao dịch, không phải số lượng đơn vị tính toán thực sự được sử dụng. Nếu bạn đặt giới hạn đơn vị tính toán quá cao hoặc sử dụng số lượng mặc định, bạn sẽ trả tiền cho các đơn vị tính toán không được sử dụng.

Hướng dẫn về compute budget

Compute Budget Program (ComputeBudget111111111111111111111111111111) có bốn hướng dẫn.

Biến thểDiscriminatorTham sốKiểuMô tả
RequestHeapFrame1bytesu32Kích thước heap được yêu cầu tính bằng byte cho mỗi chương trình trong giao dịch
SetComputeUnitLimit2unitsu32Số CU tối đa mà giao dịch có thể tiêu thụ
SetComputeUnitPrice3micro_lamportsu64Giá CU tính bằng micro-lamport
SetLoadedAccountsDataSizeLimit4bytesu32Tổng số byte tối đa của dữ liệu tài khoản mà giao dịch có thể tải

Nguồn: enum ComputeBudgetInstruction

Ràng buộc và điều kiện lỗi

Các quy tắc sau áp dụng khi xử lý các hướng dẫn compute budget:

  • Một cho mỗi loại: chỉ cho phép một biến thể của mỗi hướng dẫn trong mỗi giao dịch. Bao gồm các bản sao trùng lặp sẽ gây ra lỗi DuplicateInstruction (toàn bộ giao dịch thất bại).
  • RequestHeapFrame: giá trị phải nằm trong khoảng từ MIN_HEAP_FRAME_BYTES (32 KiB) đến MAX_HEAP_FRAME_BYTES (256 KiB), và phải là bội số của 1.024. Nếu không, giao dịch sẽ thất bại với lỗi InvalidInstructionData. Kích thước heap áp dụng cho mọi chương trình được gọi trong giao dịch (bao gồm cả CPI).
  • SetComputeUnitLimit: mọi giá trị u32 đều được chấp nhận. Giới hạn hiệu quả được giới hạn ở MAX_COMPUTE_UNIT_LIMIT (1.400.000).
  • SetComputeUnitPrice: mọi giá trị u64 đều được chấp nhận (từ 0 đến u64::MAX).
  • SetLoadedAccountsDataSizeLimit: giá trị phải lớn hơn 0 (NonZeroU32). Giá trị 0 sẽ gây ra InvalidLoadedAccountsDataSizeLimit. Giới hạn hiệu quả được giới hạn ở MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES (64 MiB).
  • Dữ liệu không được nhận dạng: bất kỳ hướng dẫn nào được gửi đến Compute Budget Program mà không deserialize thành biến thể đã biết sẽ thất bại với lỗi InvalidInstructionData.

Mô hình chi phí của bộ lập lịch bên dưới mô tả việc ước tính chi phí trước khi thực thi nội bộ của validator. Hầu hết các nhà phát triển chỉ cần các hướng dẫn về ngân sách tính toán ở trên.

Mô hình chi phí của bộ lập lịch

Bộ lập lịch của validator sử dụng một mô hình chi phí để ước tính mức sử dụng tài nguyên của giao dịch trước khi thực thi. Các ước tính chi phí trước khi thực thi này xác định liệu một giao dịch có phù hợp với dung lượng còn lại của khối hay không. Chúng tách biệt với việc đo lường CU diễn ra trong quá trình thực thi.

Tổng chi phí của bộ lập lịch là tổng của năm thành phần (UsageCostDetails::sum):

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

Các thành phần chi phí

Thành phầnMô tả
Chi phí chữ kýChi phí cho mỗi chữ ký theo từng loại chữ ký
Chi phí khóa ghiCho mỗi tài khoản có thể ghi
Chi phí instruction dataDựa trên tổng số byte instruction data
Chi phí thực thi chương trìnhGiới hạn CU từ ngân sách tính toán hoặc mặc định
Chi phí dữ liệu tài khoản đã tảiDựa trên tổng kích thước dữ liệu tài khoản đã tải

Tất cả các giá trị đều tính bằng đơn vị tính toán (compute units).

Các hằng số chi phí của bộ lập lịch

Chi phí giao dịch bỏ phiếu

Các giao dịch bỏ phiếu sử dụng chi phí cố định là 3.428 CUs bất kể nội dung thực tế của chúng.

Giới hạn khối

Bộ lập lịch áp dụng các giới hạn cho mỗi khối. Nếu việc thêm một giao dịch vượt quá bất kỳ giới hạn nào, nó sẽ không được đưa vào khối.

SIMD-0286 đề xuất tăng MAX_BLOCK_UNITS lên 100,000,000.

Hằng số ngân sách thực thi

Các hằng số sau từ execution_budget.rs xác định các giới hạn runtime trong quá trình thực thi giao dịch:

Hằng sốGiá trịMô tả
MAX_COMPUTE_UNIT_LIMIT1,400,000Giới hạn CU tối đa mỗi giao dịch
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT200,000CU mặc định cho mỗi instruction không phải builtin
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT3,000CU mặc định cho mỗi instruction builtin (SIMD-0170)
DEFAULT_HEAP_COST8 CUChi phí cho mỗi trang heap 32 KiB
DEFAULT_INVOCATION_COST1,000 CUChi phí của một lần gọi CPI
INVOKE_UNITS_COST_SIMD_0339946 CUChi phí gọi CPI với SIMD-0339
MIN_HEAP_FRAME_BYTES32,768Kích thước heap tối thiểu (32 KiB)
MAX_HEAP_FRAME_BYTES262,144Kích thước heap tối đa (256 KiB)
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES67,108,864Dữ liệu tài khoản được tải tối đa mỗi giao dịch (64 MiB)
MAX_INSTRUCTION_STACK_DEPTH5Độ sâu ngăn xếp instruction tối đa (top-level + CPI)
MAX_INSTRUCTION_STACK_DEPTH_SIMD_02689Độ sâu ngăn xếp instruction tối đa (top-level + CPI) với SIMD-0268
MAX_CALL_DEPTH64Độ sâu gọi SBF-to-SBF tối đa trong một chương trình
STACK_FRAME_SIZE4,096 byteKích thước của một stack frame SBF

Is this page helpful?

Quản lý bởi

© 2026 Solana Foundation.
Đã đăng ký bản quyền.
Kết nối