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:
| İşlev | Açıklama |
|---|---|
| Yeni Hesap Oluşturma | Yalnızca System Program yeni hesaplar oluşturabilir. |
| Alan Tahsisi | Her hesabın veri alanı için bayt kapasitesini belirler. |
| Program Sahipliği Atama | System 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 Transfer | System 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ükleyici | Program ID | Notlar | Talimatlar Bağlantısı |
|---|---|---|---|
| native | NativeLoader1111111111111111111111111111111 | Diğer dört yükleyicinin sahibidir | — |
| v1 | BPFLoader1111111111111111111111111111111111 | Yönetim talimatları devre dışı bırakılmıştır, ancak programlar hala çalışır | — |
| v2 | BPFLoader2111111111111111111111111111111111 | Yönetim talimatları devre dışı bırakılmıştır, ancak programlar hala çalışır | Talimatlar |
| v3 | BPFLoaderUpgradeab1e11111111111111111111111 | Programlar dağıtımdan sonra güncellenebilir. Program yürütülebilir dosyası ayrı bir program veri hesabında saklanır | Talimatlar |
| v4 | LoaderV411111111111111111111111111111111111 | Geliş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.
| Program | Program ID | Açıklama | Talimatlar |
|---|---|---|---|
| Ed25519 Program | Ed25519SigVerify111111111111111111111111111 | Ed25519 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.
struct Ed25519SignatureOffsets {signature_offset: u16, // offset to ed25519 signature of 64 bytessignature_instruction_index: u16, // instruction index to find signaturepublic_key_offset: u16, // offset to public key of 32 bytespublic_key_instruction_index: u16, // instruction index to find public keymessage_data_offset: u16, // offset to start of message datamessage_data_size: u16, // size of message datamessage_instruction_index: u16, // index of instruction data to get message data}
process_instruction() {for i in 0..count {// i'th index values referenced:instructions = &transaction.message().instructionsinstruction_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.
| Program | Program ID | Açıklama | Talimatlar |
|---|---|---|---|
| Secp256k1 Program | KeccakSecp256k11111111111111111111111111111 | Secp256k1 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.
struct Secp256k1SignatureOffsets {secp_signature_offset: u16, // offset to [signature,recovery_id] of 64+1 bytessecp_signature_instruction_index: u8, // instruction index to find signaturesecp_pubkey_offset: u16, // offset to ethereum_address pubkey of 20 bytessecp_pubkey_instruction_index: u8, // instruction index to find pubkeysecp_message_data_offset: u16, // offset to start of message datasecp_message_data_size: u16, // size of message datasecp_message_instruction_index: u8, // instruction index to find message data}
process_instruction() {for i in 0..count {// i'th index values referenced:instructions = &transaction.message().instructionssignature = 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.
| Program | Program ID | Açıklama | Talimatlar |
|---|---|---|---|
| Secp256r1 Program | Secp256r1SigVerify1111111111111111111111111 | 8 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.
struct Secp256r1SignatureOffsets {signature_offset: u16, // offset to compact secp256r1 signature of 64 bytessignature_instruction_index: u16, // instruction index to find signaturepublic_key_offset: u16, // offset to compressed public key of 33 bytespublic_key_instruction_index: u16, // instruction index to find public keymessage_data_offset: u16, // offset to start of message datamessage_data_size: u16, // size of message datamessage_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.
process_instruction() {if data.len() < SIGNATURE_OFFSETS_START {return Error}num_signatures = data[0] as usizeif num_signatures == 0 || num_signatures > 8 {return Error}expected_data_size = num_signatures * SIGNATURE_OFFSETS_SERIALIZED_SIZE + SIGNATURE_OFFSETS_STARTif 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.
| Program | Program ID | Açıklama | Talimatlar |
|---|---|---|---|
| System | 11111111111111111111111111111111 | Yeni hesaplar oluşturma, hesap verilerini tahsis etme, hesapları sahip programlara atama, System Program'a ait hesaplardan lamport transferi yapma ve işlem ücretlerini ödeme | SystemInstruction |
| Vote | Vote111111111111111111111111111111111111111 | validator oylama durumunu ve ödüllerini takip eden hesaplar oluşturma ve yönetme | VoteInstruction |
| Stake | Stake11111111111111111111111111111111111111 | Validatorlara yapılan delegasyonlar için stake ve ödülleri temsil eden hesaplar oluşturma ve yönetme | StakeInstruction |
| Config | Config1111111111111111111111111111111111111 | Zincire 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ümesidir | ConfigInstruction |
| Compute Budget | ComputeBudget111111111111111111111111111111 | İşlemler için hesaplama birimi limitlerini ve fiyatlarını ayarlama, kullanıcıların hesaplama kaynaklarını ve önceliklendirme ücretlerini kontrol etmesine olanak tanıma | ComputeBudgetInstruction |
| Address Lookup Table | AddressLookupTab1e1111111111111111111111111 | Adres arama tablolarını yönetme, işlemlerin hesap listesine normalde sığabilecek olandan daha fazla hesaba başvurmasına olanak tanıma | ProgramInstruction |
| ZK ElGamal Proof | ZkE1Gama1Proof11111111111111111111111111111 | ElGamal ile şifrelenmiş veriler için sıfır bilgi kanıtı doğrulaması sağlama | — |
Is this page helpful?