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
SetComputeUnitLimit và SetComputeUnitPrice để 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 = (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:
- Mô phỏng giao dịch để đo lường mức tiêu thụ CU.
- 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ể | Discriminator | Tham số | Kiểu | Mô tả |
|---|---|---|---|---|
RequestHeapFrame | 1 | bytes | u32 | Kí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 |
SetComputeUnitLimit | 2 | units | u32 | Số CU tối đa mà giao dịch có thể tiêu thụ |
SetComputeUnitPrice | 3 | micro_lamports | u64 | Giá CU tính bằng micro-lamport |
SetLoadedAccountsDataSizeLimit | 4 | bytes | u32 | Tổ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) đếnMAX_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ỗiInvalidInstructionData. 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 đếnu64::MAX).SetLoadedAccountsDataSizeLimit: giá trị phải lớn hơn 0 (NonZeroU32). Giá trị 0 sẽ gây raInvalidLoadedAccountsDataSizeLimit. 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):
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ần | Mô tả |
|---|---|
| Chi phí chữ ký | Chi phí cho mỗi chữ ký theo từng loại chữ ký |
| Chi phí khóa ghi | Cho mỗi tài khoản có thể ghi |
| Chi phí instruction data | Dựa trên tổng số byte instruction data |
| Chi phí thực thi chương trình | Giớ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ải | Dự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
| Hằng số | Giá trị |
|---|---|
COMPUTE_UNIT_TO_US_RATIO | 30 |
SIGNATURE_COST | 720 CUs |
SECP256K1_VERIFY_COST | 6.690 CUs |
ED25519_VERIFY_COST | 2.280 CUs |
ED25519_VERIFY_STRICT_COST | 2.400 CUs |
SECP256R1_VERIFY_COST | 4.800 CUs |
WRITE_LOCK_UNITS | 300 CUs |
INSTRUCTION_DATA_BYTES_COST | 4 |
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.
| Giới hạn | Giá trị |
|---|---|
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
đề 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_LIMIT | 1,400,000 | Giới hạn CU tối đa mỗi giao dịch |
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT | 200,000 | CU mặc định cho mỗi instruction không phải builtin |
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT | 3,000 | CU mặc định cho mỗi instruction builtin (SIMD-0170) |
DEFAULT_HEAP_COST | 8 CU | Chi phí cho mỗi trang heap 32 KiB |
DEFAULT_INVOCATION_COST | 1,000 CU | Chi phí của một lần gọi CPI |
INVOKE_UNITS_COST_SIMD_0339 | 946 CU | Chi phí gọi CPI với SIMD-0339 |
MIN_HEAP_FRAME_BYTES | 32,768 | Kích thước heap tối thiểu (32 KiB) |
MAX_HEAP_FRAME_BYTES | 262,144 | Kích thước heap tối đa (256 KiB) |
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES | 67,108,864 | Dữ liệu tài khoản được tải tối đa mỗi giao dịch (64 MiB) |
MAX_INSTRUCTION_STACK_DEPTH | 5 | Độ sâu ngăn xếp instruction tối đa (top-level + CPI) |
MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 | 9 | Độ sâu ngăn xếp instruction tối đa (top-level + CPI) với SIMD-0268 |
MAX_CALL_DEPTH | 64 | Độ sâu gọi SBF-to-SBF tối đa trong một chương trình |
STACK_FRAME_SIZE | 4,096 byte | Kích thước của một stack frame SBF |
Is this page helpful?