Program yürütme

Özet

Programlar LLVM aracılığıyla sBPF'ye derlenir ve işlem başına 1,4M CU bütçesi olan korumalı bir VM'de çalışır. Runtime, 512 adede kadar derlenmiş programı önbelleğe alır, loglama, CPI, kripto ve bellek için syscall'lar sağlar ve yeni dağıtımları 1 slot geciktirir.

Derleme

Solana, programları Solana Bytecode Format (sBPF) içeren ELF binary'lerine derlemek için LLVM kullanır. ELF binary, zincir üzerinde yürütülebilir bir hesapta saklanır.

sBPF, Solana runtime'ı için özelleştirilmiş eBPF bytecode'unun Solana'ya özgü varyantıdır. Standart eBPF değildir ve Solana'ya özgü değişiklikler içerir.

Program yazma

Solana programları öncelikli olarak iki yaklaşımdan biri kullanılarak Rust ile yazılır:

Program yürütme modeli

Bir işlem işlendiğinde, runtime her talimatı sırayla process_message() aracılığıyla yürütür. Her talimat için runtime:

  1. Talimat bağlamını hazırlar. Talimatın hesap indekslerini eşlemek, imzalayan ve yazılabilir bayraklarını ayarlamak ve TransactionContext'i yapılandırmak için prepare_next_top_level_instruction()'i çağırır.

  2. Precompile'ları kontrol eder. Program bir precompile ise, runtime process_precompile()'i çağırır, bu hala bir stack frame'i push ve pop eder (push() ve pop() aracılığıyla) ancak sBPF VM ve program önbelleği aramasını atlayarak native kodu doğrudan yürütür.

  3. Bir yığın çerçevesi iter. (3-6. adımlar InvokeContext::process_instruction() ve process_executable_chain() içinde gerçekleşir, process_message() tarafından çağrılır.) push() fonksiyonunu InvokeContext üzerinde çağırır, bu da komut yığını yüksekliğini artırır ve yeniden giriş kuralını uygular: bir program yalnızca doğrudan çağıran (komut yığınının mevcut tepesindeki program) aynı programsa kendisine yeniden girebilir. Derin öz-özyineleme (A -> A -> A) yığın derinliği sınırlarına tabi olarak izin verilir. Diğer yeniden giriş kalıpları (örneğin, A, B'yi çağırır, B, A'yı çağırır) InstructionError::ReentrancyNotAllowed döndürür.

  4. Programı çözümler. Çalışma zamanı process_executable_chain() fonksiyonunu çağırır ve yükleyiciyi belirler. Program hesabının sahibi native loader ise, program bir builtin'dir ve giriş noktası fonksiyonu doğrudan ProgramCacheForTxBatch içinden aranır. Sahip BPF yükleyicilerinden biri ise (bpf_loader_deprecated, bpf_loader, bpf_loader_upgradeable veya loader_v4), bunun yerine yükleyicinin kendi builtin giriş noktası çağrılır.

  5. BPF programını çalıştırır. BPF programları için, loader entrypoint derlenmiş çalıştırılabilir dosyayı program önbelleğinden arar. execute() fonksiyonu ardından:

    • Hesap verilerini düz bir parametre arabelleğine serileştirir
    • Yığın, heap ve bellek bölgeleriyle sBPF VM'ini oluşturur
    • Derlenmiş kodu çalıştırır, yürütme sırasında işlem birimlerini tüketir. Bütçe aşılırsa ComputationalBudgetExceeded döndürür.
    • Hesap verilerini arabellekten tekrar hesap durumuna deserileştirir
  6. Yığın çerçevesini çıkarır. pop() fonksiyonunu çağırır ve komutun çalışma zamanının muhasebe kurallarını ihlal etmediğini doğrular (lamport bakiyeleri dengelidir, salt okunur hesaplar değiştirilmemiştir, hesap veri boyutları sınırlar dahilindedir).

  7. İşlem birimlerini biriktirir. Komut tarafından tüketilen işlem birimleri, saturating_add aracılığıyla işlem toplamına eklenir.

Program önbelleği

Çalışma zamanı, doğrulanmış ve derlenmiş programları saklayan global bir ProgramCache tutmaktadır. Fork-graph farkındalığına sahiptir ve dağıtım görünürlük kurallarını, tahliye işlemlerini ve epoch sınırı yeniden derlemelerini yönetir.

Önbellek giriş türleri

Önbelleğe alınmış her programın, çalışma zamanı davranışını belirleyen bir ProgramCacheEntryType bulunmaktadır:

TürAçıklama
LoadedDoğrulanmış ve derlenmiş program, yürütmeye hazır.
BuiltinValidator binary'sine derlenmiş native program (System, Stake, Vote, vb.). Zincir üzerinde saklanmaz.
UnloadedDaha önce doğrulanmış ancak derlenmiş çalıştırılabilir dosyası alan boşaltmak için bellekten tahliye edilmiş program. Hala kullanım istatistiklerini takip eder. Yeniden doğrulama olmadan yeniden yüklenebilir.
FailedVerificationMevcut özellik seti altında sBPF doğrulayıcısını geçemeyen programlar için mezar taşı. Özellik aktivasyonları doğrulama kurallarını değiştirirse Loaded olabilir.
ClosedAçıkça kapatılmış veya hiç dağıtılmamış programlar için mezar taşı. Ayrıca bir loader'a ait olan ancak çalıştırılabilir kod içermeyen hesaplar (buffer hesapları gibi) için kullanılır.
DelayVisibilityProgramCacheForTxBatch::find() tarafından bir Loaded girişi mevcut olduğunda ancak henüz etkin olmadığında (effective_slot gelecekte olduğunda) döndürülen sentetik mezar taşı. Önbellekte asla doğrudan saklanmaz.

Görünürlük gecikmesi

Yeni dağıtılan veya yükseltilen programlar hemen etkin olmaz. DELAY_VISIBILITY_SLOT_OFFSET sabiti 1'dir, yani N slotunda dağıtılan bir program N+1 slotunda etkin hale gelir. Dağıtım slotu sırasında, yeni sürümü çağırma girişimi DelayVisibility döndürür ve çalışma zamanının "Program dağıtılmamış" bildirmesine neden olur.

Çıkarma politikası

Önbellek en fazla MAX_LOADED_ENTRY_COUNT (512) derlenmiş program girişi tutar. Limite ulaşıldığında, en az kullanılan programlar Unloaded durumuna çıkarılır. Kullanım, tx_usage_counter (bir işlem programa her referans verdiğinde artırılır) ve latest_access_slot tarafından izlenir.

Epoch sınırında yeniden derleme

Bir özellik aktivasyonu epoch sınırında ProgramRuntimeEnvironments değiştirirse, önbellekteki tüm programlar yeni ortama karşı yeniden derlenir.

Dönüş verisi

Programlar sol_set_return_data syscall'u aracılığıyla dönüş verisi ayarlayabilir. Veri, işlem düzeyinde bir TransactionReturnData struct'ında saklanır ve bu struct veri baytlarını ile syscall'u çağıran talimatın programının program_id değerini tutar. Maksimum boyut 1.024 bayttır (MAX_RETURN_DATA).

Is this page helpful?

İçindekiler

Sayfayı Düzenle

Yönetici

© 2026 Solana Vakfı.
Tüm hakları saklıdır.
Bağlanın