Programlar

Solana'da, akıllı sözleşmelere program denir. Bir program, yürütülebilir kod içeren durumsal olmayan bir hesaptır. Bu kod, talimat adı verilen fonksiyonlar halinde düzenlenmiştir. Kullanıcılar, bir veya daha fazla talimat içeren bir işlem göndererek bir programla etkileşime girerler. Bir işlem, birden fazla programdan talimatlar içerebilir.

Bir program dağıtıldığında, Solana, yürütülebilir ve bağlanabilir formatta derlemek için LLVM kullanır (ELF). ELF dosyası, programın Solana Bayt Kodu Formatındaki (sBPF) ikili dosyasını içerir ve yürütülebilir bir hesapta zincir üzerinde saklanır.

sBPF, Solana'nın eBPF bayt kodunun özel bir 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ştirmesi için tasarlanmış bir çerçevedir. Şablon kodları azaltmak için Rust makrolarını kullanır—bu da onu yeni başlayanlar için harika kılar.
  • Native Rust: Herhangi bir çerçeve kullanmadan Rust ile program yazın. Bu yaklaşım daha fazla esneklik sunar ancak artan karmaşıklık ile gelir.

Program güncelleme

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

Program doğrulama

Solana, kullanıcıların bir programın zincir üzerindeki kodunun açık kaynak koduyla eşleşip eşleşmediğini kontrol etmelerine olanak tanıyan doğrulanabilir derlemeleri destekler. Anchor çerçevesi, doğrulanabilir bir derleme oluşturmak için yerleşik destek sağlar.

Mevcut bir programın doğrulanıp doğrulanmadığı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'ın Solana Doğrulanabilir Derleme CLI'sini kullanabilirsiniz.

Yerleşik programlar

System Program

System Program, yeni hesaplar oluşturabilen tek hesaptır. Varsayılan olarak, tüm yeni hesaplar System Program tarafından sahiplenilir, ancak birçoğu oluşturulma sırasında yeni bir sahibine atanır. System Program aşağıdaki temel işlevleri gerçekleştirir:

İş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ın System Program tarafından oluşturulan yeni hesapların sahipliğini alması bu şekilde gerçekleşir.
SOL TransferSystem Hesaplarından diğer hesaplara lamport (SOL) transferi yapar.

System program'ın adresi 11111111111111111111111111111111'dir.

Yükleyici programlar

Her program başka bir program tarafından sahiplenilir—bu da onun yükleyicisidir. Yükleyiciler, programları dağıtmak, yeniden dağıtmak, yükseltmek veya kapatmak için kullanılır. Ayrıca bir programı sonlandırmak ve program yetkisini aktarmak için de kullanılırlar.

Yükleyici programlar bazen 'BPF Yükleyicileri' olarak da adlandırılır.

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

YükleyiciProgram IDNotlarTalimatlar Bağlantısı
nativeNativeLoader1111111111111111111111111111111Diğer dört yükleyicinin sahibidir
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 yürütülebilir 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 yetkisine bağlı olarak dağıtımdan sonra değiştirilebilir.

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ğrulama

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, bir hata döndürülür.Talimatlar

Ed25519 programı bir talimatı işler. Talimatın ilk u8 baytı, kontrol edilecek imza sayısını içerir ve ardından tek baytlık bir dolgu gelir. Bundan sonra, kontrol edilecek her imza için aşağıdaki yapı 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 kurtarma doğrulaması

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

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

Secp256k1 programı bir talimatı işler. Talimatın ilk baytı, kontrol edilecek açık anahtar sayısını içerir. Bundan sonra, her açık anahtar için aşağıdaki yapı bir kez oluşturulur, serileştirilir ve instruction data'ya 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

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