Programlar

Solana'da akıllı sözleşmeye program denir. Program, çalıştırılabilir kod içeren durumsuz bir hesaptır. Bu kod, instructions (talimatlar) adı verilen fonksiyonlar halinde düzenlenmiştir. Kullanıcılar bir programla bir veya daha fazla instruction içeren bir transaction göndererek etkileşime girer. Bir transaction, birden fazla programdan instruction içerebilir.

Bir program dağıtıldığında, Solana onu çalıştırılabilir ve bağlanabilir formata (ELF) derlemek için LLVM kullanır. ELF dosyası, programın binary'sini Solana Bytecode Format (sBPF) formatında içerir ve zincir üzerinde çalıştırılabilir bir hesapta saklanır.

sBPF, Solana'nın eBPF bytecode'unun özel versiyonudur.

Program yazma

Programların çoğunluğu Rust ile yazılır ve iki yaygın geliştirme yaklaşımı vardır:

  • Anchor: Anchor, hızlı ve kolay Solana geliştirme için tasarlanmış bir framework'tür. Boilerplate kodu azaltmak için Rust macro'ları kullanır—bu da onu yeni başlayanlar için harika kılar.
  • Native Rust: Herhangi bir framework kullanmadan Rust ile program yazın. Bu yaklaşım daha fazla esneklik sunar ancak artan karmaşıklıkla birlikte gelir.

Programları güncelleme

Mevcut bir programı değiştirmek için, bir hesabın upgrade authority (yükseltme yetkisi) olarak belirlenmesi gerekir. (Genellikle programı ilk dağıtan hesapla aynıdır.) Upgrade authority iptal edilir ve None olarak ayarlanırsa, program artık güncellenemez.

Programları doğrulama

Solana, kullanıcıların bir programın zincir üzerindeki kodunun genel kaynak koduyla eşleşip eşleşmediğini kontrol etmelerine olanak tanıyan doğrulanabilir build'leri destekler. Anchor framework, doğrulanabilir bir build oluşturmak için yerleşik destek sağlar.

Mevcut bir programın doğrulanmış olup olmadığını kontrol etmek için program kimliğini Solana Explorer'da arayın. Alternatif olarak, zincir üzerindeki programları bağımsız olarak doğrulamak için Ellipsis Labs Solana Verifiable Build CLI'yi kullanabilirsiniz.

Yerleşik programlar

System Program

System Program, yeni hesaplar oluşturabilen tek hesaptır. Varsayılan olarak, tüm yeni hesaplar System Program'a aittir, ancak birçoğu oluşturulduğunda yeni bir sahibine atanır. System Program aşağıdaki temel işlevleri yerine getirir:

İşlevAçıklama
Yeni hesap oluşturmaYalnızca System Program yeni hesaplar oluşturabilir.
Alan tahsisiHer hesabın veri alanı için bayt kapasitesini belirler.
Program sahipliği atamaSystem Program bir hesap oluşturduktan sonra, belirlenen program sahibini farklı bir program hesabına yeniden atayabilir. Özel programlar, System Program tarafından oluşturulan yeni hesapların sahipliğini bu şekilde alır.
SOL transferiSystem hesaplarından diğer hesaplara lamport (SOL) transfer eder.

System program'ın adresi 11111111111111111111111111111111'dir.

Loader programları

Her program bir başkasına aittir—loader'ına. Loader'lar programları dağıtmak, yeniden dağıtmak, yükseltmek veya kapatmak için kullanılır. Ayrıca bir programı sonlandırmak ve program yetkisini devretmek için de kullanılırlar.

Loader programlarına bazen 'BPF Loader'lar denir.

Şu anda aşağıdaki tabloda gösterildiği gibi beş loader programı bulunmaktadır.

LoaderProgram kimliğiNotlarTalimatlar bağlantısı
nativeNativeLoader1111111111111111111111111111111Diğer dört loader'a sahiptir
v1BPFLoader1111111111111111111111111111111111Yönetim talimatları devre dışı bırakılmıştır, ancak programlar hala çalışır
v2BPFLoader2111111111111111111111111111111111Yönetim talimatları devre dışı bırakılmıştır, ancak programlar hala çalışırTalimatlar
v3BPFLoaderUpgradeab1e11111111111111111111111Programlar dağıtımdan sonra güncellenebilir. Program çalıştırılabilir dosyası ayrı bir program veri hesabında saklanırTalimatlar
v4LoaderV411111111111111111111111111111111111Geliştirme aşamasında (yayınlanmamış)Talimatlar

Loader-v3 veya loader-v4 ile dağıtılan programlar, yükseltme yetkisi tarafından belirlenen şekilde dağıtımdan sonra değiştirilebilir olabilir.

Yeni bir program dağıtıldığında, varsayılan olarak en son yükleyici sürümü kullanılacaktır.

Önceden derlenmiş programlar

Yükleyici programlarına ek olarak, Solana aşağıdaki önceden derlenmiş programları sağlar.

Ed25519 imzasını doğrula

Ed25519 programı, bir veya daha fazla ed25519 imzasını doğrulamak için kullanılır.

ProgramProgram IDAçıklamaTalimatlar
Ed25519 ProgramEd25519SigVerify111111111111111111111111111Ed25519 imzalarını doğrular. Herhangi bir imza başarısız olursa hata döndürülür.Talimatlar

Ed25519 programı bir talimatı işler. Talimatın ilk u8 kısmı, kontrol edilecek imza sayısını içerir ve ardından tek baytlık bir dolgu gelir. Bundan sonra, aşağıdaki yapı kontrol edilecek her imza için bir kez serileştirilir.

Ed25519SignatureOffsets
struct Ed25519SignatureOffsets {
signature_offset: u16, // offset to ed25519 signature of 64 bytes
signature_instruction_index: u16, // instruction index to find signature
public_key_offset: u16, // offset to public key of 32 bytes
public_key_instruction_index: u16, // instruction index to find public key
message_data_offset: u16, // offset to start of message data
message_data_size: u16, // size of message data
message_instruction_index: u16, // index of instruction data to get message data
}
Signature verification pseudocode
process_instruction() {
for i in 0..count {
// i'th index values referenced:
instructions = &transaction.message().instructions
instruction_index = ed25519_signature_instruction_index != u16::MAX ? ed25519_signature_instruction_index : current_instruction;
signature = instructions[instruction_index].data[ed25519_signature_offset..ed25519_signature_offset + 64]
instruction_index = ed25519_pubkey_instruction_index != u16::MAX ? ed25519_pubkey_instruction_index : current_instruction;
pubkey = instructions[instruction_index].data[ed25519_pubkey_offset..ed25519_pubkey_offset + 32]
instruction_index = ed25519_message_instruction_index != u16::MAX ? ed25519_message_instruction_index : current_instruction;
message = instructions[instruction_index].data[ed25519_message_data_offset..ed25519_message_data_offset + ed25519_message_data_size]
if pubkey.verify(signature, message) != Success {
return Error
}
}
return Success
}

Secp256k1 kurtarmayı doğrula

Secp256k1 programı, secp256k1 genel anahtar kurtarma işlemlerini doğrulamak için kullanılır.

ProgramProgram IDAçıklamaTalimatlar
Secp256k1 ProgramKeccakSecp256k11111111111111111111111111111Secp256k1 genel anahtar kurtarma işlemlerini (ecrecover) doğrular.Talimatlar

Secp256k1 programı bir talimatı işler. Talimatın ilk baytı, kontrol edilecek genel anahtar sayısını içerir. Bundan sonra, aşağıdaki yapı her genel anahtar için bir kez oluşturulur, ardından serileştirilir ve talimat verisine eklenir.

Secp256k1SignatureOffsets
struct Secp256k1SignatureOffsets {
secp_signature_offset: u16, // offset to [signature,recovery_id] of 64+1 bytes
secp_signature_instruction_index: u8, // instruction index to find signature
secp_pubkey_offset: u16, // offset to ethereum_address pubkey of 20 bytes
secp_pubkey_instruction_index: u8, // instruction index to find pubkey
secp_message_data_offset: u16, // offset to start of message data
secp_message_data_size: u16, // size of message data
secp_message_instruction_index: u8, // instruction index to find message data
}
Recovery verification pseudocode
process_instruction() {
for i in 0..count {
// i'th index values referenced:
instructions = &transaction.message().instructions
signature = instructions[secp_signature_instruction_index].data[secp_signature_offset..secp_signature_offset + 64]
recovery_id = instructions[secp_signature_instruction_index].data[secp_signature_offset + 64]
ref_eth_pubkey = instructions[secp_pubkey_instruction_index].data[secp_pubkey_offset..secp_pubkey_offset + 20]
message_hash = keccak256(instructions[secp_message_instruction_index].data[secp_message_data_offset..secp_message_data_offset + secp_message_data_size])
pubkey = ecrecover(signature, recovery_id, message_hash)
eth_pubkey = keccak256(pubkey[1..])[12..]
if eth_pubkey != ref_eth_pubkey {
return Error
}
}
return Success
}

Bu, kullanıcının işlemdeki imza ve mesaj verileri için herhangi bir instruction data belirtmesine olanak tanır. Özel bir talimat sysvar belirterek, işlemin kendisinden de veri alınabilir.

İşlemin maliyeti, doğrulanacak imza sayısının imza maliyeti doğrulama çarpanıyla çarpılmasıyla hesaplanır.

Secp256r1 programı, 8 adede kadar secp256r1 imzasını doğrulamak için kullanılır.

ProgramProgram IDAçıklamaTalimatlar
Secp256r1 ProgramSecp256r1SigVerify11111111111111111111111118 adede kadar secp256r1 imzasını doğrular. İmza, genel anahtar ve mesaj alır. Herhangi biri başarısız olursa hata döndürür.Talimatlar

Secp256r1 programı bir talimatı işler. Talimatın ilk u8 kısmı, kontrol edilecek imza sayısını içerir ve ardından tek baytlık bir dolgu gelir. Bundan sonra, aşağıdaki yapı her imza için oluşturulur, ardından serileştirilir ve talimat verisine eklenir.

Secp256r1SignatureOffsets
struct Secp256r1SignatureOffsets {
signature_offset: u16, // offset to compact secp256r1 signature of 64 bytes
signature_instruction_index: u16, // instruction index to find signature
public_key_offset: u16, // offset to compressed public key of 33 bytes
public_key_instruction_index: u16, // instruction index to find public key
message_data_offset: u16, // offset to start of message data
message_data_size: u16, // size of message data
message_instruction_index: u16, // index of instruction data to get message data
}

Kazara imza değiştirilebilirliğini önlemek için tüm imzalarda düşük S değerleri zorunlu tutulur.

Signature verification psuedocode
process_instruction() {
if data.len() < SIGNATURE_OFFSETS_START {
return Error
}
num_signatures = data[0] as usize
if num_signatures == 0 || num_signatures > 8 {
return Error
}
expected_data_size = num_signatures * SIGNATURE_OFFSETS_SERIALIZED_SIZE + SIGNATURE_OFFSETS_START
if data.len() < expected_data_size {
return Error
}
for i in 0..num_signatures {
offsets = parse_signature_offsets(data, i)
signature = get_data_slice(data, instruction_datas, offsets.signature_instruction_index, offsets.signature_offset, SIGNATURE_SERIALIZED_SIZE)
if s > half_curve_order {
return Error
}
pubkey = get_data_slice(data, instruction_datas, offsets.public_key_instruction_index, offsets.public_key_offset, COMPRESSED_PUBKEY_SERIALIZED_SIZE)
message = get_data_slice(data, instruction_datas, offsets.message_instruction_index, offsets.message_data_offset, offsets.message_data_size)
if !verify_signature(signature, pubkey, message) {
return Error
}
}
return Success
}

Çekirdek programlar

Aşağıdaki listedeki programlar, ağın temel işlevselliğini sağlar.

ProgramProgram IDAçıklamaTalimatlar
System11111111111111111111111111111111Yeni hesaplar oluşturma, hesap verilerini tahsis etme, hesapları sahip programlara atama, System Program'a ait hesaplardan lamport transferi yapma ve işlem ücretlerini ödemeSystemInstruction
VoteVote111111111111111111111111111111111111111validator oylama durumunu ve ödüllerini takip eden hesaplar oluşturma ve yönetmeVoteInstruction
StakeStake11111111111111111111111111111111111111Validatorlara yapılan delegasyonlar için stake ve ödülleri temsil eden hesaplar oluşturma ve yönetmeStakeInstruction
ConfigConfig1111111111111111111111111111111111111Zincire yapılandırma verileri ekleme ve ardından bunları değiştirme izni olan genel anahtarların listesini belirtme. Diğer programlardan farklı olarak, Config programı herhangi bir bireysel talimat tanımlamaz. Sadece bir örtük talimatı vardır: "store". Talimat verisi, hesaba ve içinde saklanan verilere erişimi kontrol eden bir anahtar kümesidirConfigInstruction
Compute BudgetComputeBudget111111111111111111111111111111İşlemler için hesaplama birimi limitlerini ve fiyatlarını ayarlama, kullanıcıların hesaplama kaynaklarını ve önceliklendirme ücretlerini kontrol etmesine olanak tanımaComputeBudgetInstruction
Address Lookup TableAddressLookupTab1e1111111111111111111111111Adres arama tablolarını yönetme, işlemlerin hesap listesine normalde sığabilecek olandan daha fazla hesaba başvurmasına olanak tanımaProgramInstruction
ZK ElGamal ProofZkE1Gama1Proof11111111111111111111111111111ElGamal ile şifrelenmiş veriler için sıfır bilgi kanıtı doğrulaması sağlama

Is this page helpful?

İçindekiler

Sayfayı Düzenle

Yönetici

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