Özet
Talimat başına varsayılan 200K CU, işlem başına maksimum 1,4M. Optimize etmek
için SetComputeUnitLimit ve SetComputeUnitPrice talimatlarını kullanın.
Öncelik ücreti, gerçek kullanıma değil, talep edilen CU'lara göre belirlenir.
Hesaplama birimi limiti
Her talimata
varsayılan olarak 200.000 CU
tahsis edilir ve her işlem
1.400.000 CU
ile sınırlandırılır. Açık bir SetComputeUnitLimit talimatı bulunmadığında,
varsayılan değer
talimat türüne göre hesaplanır:
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)
- Yerleşik talimatlar (SBF'ye geçirilmemiş System Program, Stake, Vote vb.):
her birine
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT= 3.000 CU tahsis edilir (SIMD-0170'e göre). - Yerleşik olmayan talimatlar (kullanıcı tarafından dağıtılan SBF
programları): her birine
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT= 200.000 CU tahsis edilir. - Geçiş yapan yerleşik programlar (SBF'ye geçişi tamamlamış, özellik kapısı ile korunan): yerleşik olmayan program olarak değerlendirilir (her biri 200.000 CU).
Sonuç, MAX_COMPUTE_UNIT_LIMIT (1.400.000) değerine sınırlandırılır.
İşleminize bir
SetComputeUnitLimit
talimatı ekleyerek bu varsayılan değeri geçersiz kılabilirsiniz.
Uygun CU limitini belirlemek için:
- CU tüketimini ölçmek için işlemi simüle edin.
- Simüle edilen değere %10 güvenlik marjı ekleyin.
Öncelik ücreti, kullanılan gerçek hesaplama birimi sayısına değil, işlem üzerinde talep edilen hesaplama birimi limitine göre belirlenir. Çok yüksek bir hesaplama birimi limiti belirlerseniz veya varsayılan miktarı kullanırsanız, kullanılmayan hesaplama birimleri için ödeme yaparsınız.
Hesaplama bütçesi talimatları
Compute Budget Program
(ComputeBudget111111111111111111111111111111) dört talimata sahiptir.
| Varyant | Ayırıcı | Parametre | Tür | Açıklama |
|---|---|---|---|---|
RequestHeapFrame | 1 | bytes | u32 | İşlemdeki her program için bayt cinsinden istenen heap boyutu |
SetComputeUnitLimit | 2 | units | u32 | İşlemin tüketebileceği maksimum CU |
SetComputeUnitPrice | 3 | micro_lamports | u64 | Mikro-lamport cinsinden CU fiyatı |
SetLoadedAccountsDataSizeLimit | 4 | bytes | u32 | İşlemin yükleyebileceği maksimum toplam hesap verisi baytı |
Kaynak: ComputeBudgetInstruction enum
Kısıtlamalar ve hata koşulları
Hesaplama bütçesi talimatları işlenirken aşağıdaki kurallar geçerlidir:
- Türden birer tane: işlem başına her talimat varyantından yalnızca bir tane
kullanılabilir. Tekrar içermesi
DuplicateInstructionhatasına neden olur (tüm işlem başarısız olur). RequestHeapFrame: değerMIN_HEAP_FRAME_BYTES(32 KiB) ileMAX_HEAP_FRAME_BYTES(256 KiB) arasında olmalı ve 1.024'ün katı olmalıdır. Aksi takdirde işlemInvalidInstructionDataile başarısız olur. Heap boyutu işlemde çağrılan her programa (CPI'lar dahil) uygulanır.SetComputeUnitLimit: herhangi biru32değeri kabul edilir. Geçerli limitMAX_COMPUTE_UNIT_LIMIT(1.400.000) değerine sınırlandırılır.SetComputeUnitPrice: herhangi biru64değeri kabul edilir (0 ileu64::MAXarası).SetLoadedAccountsDataSizeLimit: değer 0'dan büyük olmalıdır (NonZeroU32). 0 değeriInvalidLoadedAccountsDataSizeLimithatasına neden olur. Geçerli limitMAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES(64 MiB) değerine sınırlandırılır.- Tanınmayan veri: Compute Budget Program'a gönderilen ve bilinen bir
varyanta deserialize edilemeyen herhangi bir talimat
InvalidInstructionDataile başarısız olur.
Aşağıdaki zamanlayıcı maliyet modeli, validator-dahili ön yürütme maliyet tahminini açıklar. Çoğu geliştirici yalnızca yukarıdaki hesaplama bütçesi talimatlarına ihtiyaç duyar.
Zamanlayıcı maliyet modeli
Validator'ın zamanlayıcısı yürütmeden önce işlem kaynak kullanımını tahmin etmek için bir maliyet modeli kullanır. Bu ön yürütme maliyet tahminleri, bir işlemin bloğun kalan kapasitesine sığıp sığmadığını belirler. Bunlar, yürütme sırasında gerçekleşen CU ölçümünden ayrıdır.
Toplam zamanlayıcı maliyeti beş bileşenin toplamıdır
(UsageCostDetails::sum):
total_cost = signature_cost+ write_lock_cost+ data_bytes_cost+ programs_execution_cost+ loaded_accounts_data_size_cost
Maliyet bileşenleri
| Bileşen | Açıklama |
|---|---|
| İmza maliyeti | Her imza türü için imza başına maliyet |
| Yazma kilidi maliyeti | Yazılabilir hesap başına |
| Instruction data maliyeti | Toplam instruction data baytlarına göre |
| Program yürütme maliyeti | Hesaplama bütçesinden CU limiti veya varsayılan |
| Yüklenen hesap verisi maliyeti | Toplam yüklenen hesap verisi boyutuna göre |
Tüm değerler hesaplama birimi cinsindendir.
Zamanlayıcı maliyet sabitleri
| Sabit | Değer |
|---|---|
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 |
Oylama işlemi maliyeti
Oylama işlemleri, gerçek içeriklerinden bağımsız olarak 3.428 CU'luk sabit bir maliyet kullanır.
Blok limitleri
Zamanlayıcı, blok başına limitleri uygular. Bir işlemin eklenmesi herhangi bir limiti aşacaksa, bloğa dahil edilmez.
| Limit | Değer |
|---|---|
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 değerini 100,000,000'a yükseltmeyi önermektedir.
Yürütme bütçesi sabitleri
execution_budget.rs
dosyasındaki aşağıdaki sabitler, işlem yürütme sırasındaki çalışma zamanı
limitlerini tanımlar:
| Sabit | Değer | Açıklama |
|---|---|---|
MAX_COMPUTE_UNIT_LIMIT | 1,400,000 | İşlem başına maksimum CU limiti |
DEFAULT_INSTRUCTION_COMPUTE_UNIT_LIMIT | 200,000 | Yerleşik olmayan talimat başına varsayılan CU |
MAX_BUILTIN_ALLOCATION_COMPUTE_UNIT_LIMIT | 3,000 | Yerleşik talimat başına varsayılan CU (SIMD-0170) |
DEFAULT_HEAP_COST | 8 CU | 32 KiB heap sayfası başına maliyet |
DEFAULT_INVOCATION_COST | 1,000 CU | Bir CPI çağrısının maliyeti |
INVOKE_UNITS_COST_SIMD_0339 | 946 CU | SIMD-0339 ile CPI çağrı maliyeti |
MIN_HEAP_FRAME_BYTES | 32,768 | Minimum heap boyutu (32 KiB) |
MAX_HEAP_FRAME_BYTES | 262,144 | Maksimum heap boyutu (256 KiB) |
MAX_LOADED_ACCOUNTS_DATA_SIZE_BYTES | 67,108,864 | İşlem başına maksimum yüklenen hesap verisi (64 MiB) |
MAX_INSTRUCTION_STACK_DEPTH | 5 | Maksimum talimat yığın derinliği (üst seviye + CPI'lar) |
MAX_INSTRUCTION_STACK_DEPTH_SIMD_0268 | 9 | SIMD-0268 ile maksimum talimat yığın derinliği (üst seviye + CPI'lar) |
MAX_CALL_DEPTH | 64 | Bir program içinde maksimum SBF'den SBF'ye çağrı derinliği |
STACK_FRAME_SIZE | 4,096 bayt | Bir SBF yığın çerçevesinin boyutu |
Is this page helpful?