Ringkasan
Default 200K CU per instruksi, maksimal 1,4M per transaksi. Gunakan instruksi
SetComputeUnitLimit dan SetComputeUnitPrice untuk optimasi. Biaya
prioritas didasarkan pada CU yang diminta, bukan penggunaan aktual.
Batas unit komputasi
Setiap instruksi dialokasikan
default 200.000 CU,
dan setiap transaksi dibatasi pada
1.400.000 CU.
Ketika tidak ada instruksi SetComputeUnitLimit eksplisit, maka
default dihitung
berdasarkan jenis instruksi:
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)
- Instruksi builtin (System Program, Stake, Vote, dll. yang belum
dimigrasikan ke SBF): masing-masing dialokasikan
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT= 3.000 CU (sesuai SIMD-0170). - Instruksi non-builtin (program SBF yang di-deploy pengguna): masing-masing
dialokasikan
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT= 200.000 CU. - Builtin yang sedang migrasi yang telah menyelesaikan migrasi ke SBF (feature-gated): diperlakukan sebagai non-builtin (200.000 CU masing-masing).
Hasilnya dibatasi pada MAX_COMPUTE_UNIT_LIMIT (1.400.000).
Anda dapat mengganti default ini dengan menyertakan instruksi
SetComputeUnitLimit
dalam transaksi Anda.
Untuk menentukan batas CU yang sesuai:
- Simulasikan transaksi untuk mengukur konsumsi CU.
- Tambahkan margin keamanan 10% pada nilai hasil simulasi.
Biaya prioritas ditentukan oleh batas unit komputasi yang diminta pada transaksi, bukan jumlah unit komputasi yang benar-benar digunakan. Jika Anda menetapkan batas unit komputasi yang terlalu tinggi atau menggunakan jumlah default, Anda membayar untuk unit komputasi yang tidak terpakai.
Instruksi compute budget
Compute Budget Program
(ComputeBudget111111111111111111111111111111) memiliki empat instruksi.
| Varian | Diskriminator | Parameter | Tipe | Deskripsi |
|---|---|---|---|---|
RequestHeapFrame | 1 | bytes | u32 | Ukuran heap yang diminta dalam byte untuk setiap program dalam transaksi |
SetComputeUnitLimit | 2 | units | u32 | CU maksimum yang dapat dikonsumsi transaksi |
SetComputeUnitPrice | 3 | micro_lamports | u64 | Harga CU dalam micro-lamport |
SetLoadedAccountsDataSizeLimit | 4 | bytes | u32 | Total byte maksimum data akun yang dapat dimuat transaksi |
Sumber: enum ComputeBudgetInstruction
Batasan dan kondisi error
Aturan berikut berlaku saat memproses instruksi compute budget:
- Satu per tipe: hanya satu dari setiap varian instruksi yang diizinkan per
transaksi. Menyertakan duplikat menyebabkan error
DuplicateInstruction(seluruh transaksi gagal). RequestHeapFrame: nilai harus antaraMIN_HEAP_FRAME_BYTES(32 KiB) danMAX_HEAP_FRAME_BYTES(256 KiB), dan harus merupakan kelipatan 1.024. Jika tidak, transaksi gagal denganInvalidInstructionData. Ukuran heap berlaku untuk setiap program yang dipanggil dalam transaksi (termasuk CPI).SetComputeUnitLimit: nilaiu32apa pun diterima. Batas efektif dibatasi hinggaMAX_COMPUTE_UNIT_LIMIT(1.400.000).SetComputeUnitPrice: nilaiu64apa pun diterima (0 hinggau64::MAX).SetLoadedAccountsDataSizeLimit: nilai harus lebih besar dari 0 (NonZeroU32). Nilai 0 menyebabkanInvalidLoadedAccountsDataSizeLimit. Batas efektif dibatasi hinggaMAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES(64 MiB).- Data tidak dikenali: instruksi apa pun yang dikirim ke Compute Budget
Program yang tidak dapat di-deserialisasi menjadi varian yang dikenal gagal
dengan
InvalidInstructionData.
Model biaya scheduler di bawah ini menjelaskan estimasi biaya pra-eksekusi internal validator. Sebagian besar developer hanya memerlukan instruksi compute budget di atas.
Model biaya scheduler
Scheduler validator menggunakan model biaya untuk memperkirakan penggunaan sumber daya transaksi sebelum eksekusi. Estimasi biaya pra-eksekusi ini menentukan apakah suatu transaksi sesuai dengan kapasitas blok yang tersisa. Ini terpisah dari pengukuran CU yang terjadi selama eksekusi.
Total biaya scheduler adalah jumlah dari lima komponen
(UsageCostDetails::sum):
total_cost = signature_cost+ write_lock_cost+ data_bytes_cost+ programs_execution_cost+ loaded_accounts_data_size_cost
Komponen biaya
| Komponen | Deskripsi |
|---|---|
| Biaya signature | Biaya per signature untuk setiap jenis signature |
| Biaya write lock | Per akun yang dapat ditulis |
| Biaya instruction data | Berdasarkan total byte instruction data |
| Biaya eksekusi program | Batas CU dari compute budget atau default |
| Biaya loaded accounts data | Berdasarkan total ukuran loaded account data |
Semua nilai dalam compute unit.
Konstanta biaya scheduler
| Konstanta | Nilai |
|---|---|
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 |
Biaya transaksi vote
Transaksi vote menggunakan biaya statis sebesar 3.428 CU terlepas dari konten aktualnya.
Batas blok
Scheduler memberlakukan batas per blok. Jika menambahkan transaksi akan melebihi batas apa pun, transaksi tersebut tidak akan disertakan dalam blok.
| Batas | Nilai |
|---|---|
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
mengusulkan peningkatan MAX_BLOCK_UNITS menjadi 100.000.000.
Konstanta budget eksekusi
Konstanta berikut dari
execution_budget.rs
mendefinisikan batas runtime selama eksekusi transaksi:
| Konstanta | Nilai | Deskripsi |
|---|---|---|
MAX_COMPUTE_UNIT_LIMIT | 1.400.000 | Batas CU maksimum per transaksi |
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT | 200.000 | CU default per instruksi non-builtin |
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT | 3.000 | CU default per instruksi builtin (SIMD-0170) |
DEFAULT_HEAP_COST | 8 CU | Biaya per halaman heap 32 KiB |
DEFAULT_INVOCATION_COST | 1.000 CU | Biaya satu pemanggilan CPI |
INVOKE_UNITS_COST_SIMD_0339 | 946 CU | Biaya pemanggilan CPI dengan SIMD-0339 |
MIN_HEAP_FRAME_BYTES | 32.768 | Ukuran heap minimum (32 KiB) |
MAX_HEAP_FRAME_BYTES | 262.144 | Ukuran heap maksimum (256 KiB) |
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES | 67.108.864 | Data akun maksimum yang dimuat per transaksi (64 MiB) |
MAX_INSTRUCTION_STACK_DEPTH | 5 | Kedalaman stack instruksi maksimum (top-level + CPI) |
MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 | 9 | Kedalaman stack instruksi maksimum (top-level + CPI) dengan SIMD-0268 |
MAX_CALL_DEPTH | 64 | Kedalaman pemanggilan SBF-ke-SBF maksimum dalam program |
STACK_FRAME_SIZE | 4.096 byte | Ukuran satu stack frame SBF |
Is this page helpful?