Programlar
Solana'da "akıllı sözleşmeler" program olarak adlandırılır. Programlar, programın derlenmiş yürütülebilir ikili dosyasını içeren hesaplara zincir üzerinde dağıtılır. Kullanıcılar, programa ne yapması gerektiğini söyleyen talimatlar içeren işlemler göndererek programlarla etkileşime girerler.
Önemli Noktalar
- Programlar, talimat adı verilen fonksiyonlara düzenlenmiş yürütülebilir kod içeren hesaplardır.
- Programlar durumsuz olsa da, veri depolamak için diğer hesapları oluşturan ve güncelleyen talimatlar içerebilirler.
- Bir yükseltme yetkilisi programları güncelleyebilir. Bu yetki kaldırıldığında, program değiştirilemez hale gelir.
- Kullanıcılar, zincir üzerindeki bir program hesabının verilerinin, doğrulanabilir derlemeler aracılığıyla açık kaynak koduyla eşleştiğini doğrulayabilirler.
Solana Programları Yazma
Solana programları ağırlıklı olarak Rust programlama dilinde yazılır ve geliştirme için iki yaygın yaklaşım vardır:
-
Anchor: Solana program geliştirme için tasarlanmış bir framework. Rust makrolarını kullanarak şablon kodları azaltarak, programları daha hızlı ve daha basit bir şekilde yazmanızı sağlar. Yeni başlayanlar için Anchor framework ile başlamanız önerilir.
-
Native Rust: Bu yaklaşım, herhangi bir framework kullanmadan Rust ile Solana programları yazmayı içerir. Daha fazla esneklik sunar ancak karmaşıklığı arttırır.
Solana Programlarını Güncelleme
Programları dağıtma ve yükseltme hakkında daha fazla bilgi için programları dağıtma sayfasına bakın.
Programlar, genellikle programı ilk dağıtan hesap olan "yükseltme yetkilisi"
olarak belirlenmiş bir hesap tarafından
doğrudan değiştirilebilir.
Yükseltme yetkisi
iptal edilir ve None
olarak ayarlanırsa, program değiştirilemez hale gelir ve
artık güncellenemez.
Doğrulanabilir Programlar
Doğrulanabilir derlemeler, herkesin bir programın zincir üzerindeki kodunun açık kaynak koduyla eşleşip eşleşmediğini kontrol etmesine olanak tanır, böylece kaynak ve dağıtılan sürümler arasındaki tutarsızlıkları tespit etmek mümkün olur.
Solana geliştirici topluluğu, doğrulanabilir derlemeleri desteklemek için araçlar sunmuştur. Bu araçlar, hem geliştiricilerin hem de kullanıcıların zincir üzerindeki programların kamuya açık paylaşılan kaynak kodlarını doğru bir şekilde yansıttığını doğrulamalarını sağlar.
-
Doğrulanmış Programları Arama: Kullanıcılar, doğrulanmış programları hızlıca kontrol etmek için Solana Explorer üzerinde bir program adresi arayabilirler. Doğrulanmış bir program örneğini buradan görüntüleyebilirsiniz.
-
Doğrulama Araçları: Ellipsis Labs tarafından geliştirilen Solana Verifiable Build CLI, kullanıcıların zincir üzerindeki programları yayınlanmış kaynak koduna karşı bağımsız olarak doğrulamalarını sağlar.
-
Anchor'da Doğrulanabilir Derleme Desteği: Anchor, doğrulanabilir derlemeler için yerleşik destek sunar. Ayrıntılar Anchor dokümantasyonunda bulunabilir.
Berkeley Packet Filter (BPF)
Solana, programları ELF (Executable and Linkable Format) dosyalarına derlemek için LLVM (Low Level Virtual Machine) kullanır. Bu dosyalar, "Solana Bytecode Format" (sBPF) adı verilen Solana'nın özel eBPF bayt kodu sürümünü içerir. ELF dosyası, programın ikili dosyasını içerir ve program dağıtıldığında zincir üzerinde çalıştırılabilir bir hesapta saklanır.
Yerleşik Programlar
Yükleyici Programlar
Her programın kendisi, yükleyicisi olan başka bir program tarafından sahiplenilir. Şu anda beş yükleyici program bulunmaktadır:
Yükleyici | Program ID | Notlar | Talimatlar Bağlantısı |
---|---|---|---|
native | NativeLoader1111111111111111111111111111111 | Diğer dört yükleyiciye sahiptir | — |
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 | Kullanımdan kaldırılıyor | Talimatlar |
v4 | LoaderV411111111111111111111111111111111111 | v4'ün standart yükleyici olması bekleniyor | Talimatlar |
Bu yükleyiciler, özel programlar oluşturmak ve yönetmek için gereklidir:
- Yeni bir program veya tampon dağıtma
- Bir programı veya tamponu kapatma
- Mevcut bir programı yeniden dağıtma / yükseltme
- Bir program üzerindeki yetkiyi devretme
- Bir programı sonlandırma
Loader-v3 ve loader-v4, programların ilk dağıtımlarından sonra değişiklik yapılmasını destekler. Bunu yapma izni, her programın hesap sahipliği yükleyicide olduğu için programın yetkisi tarafından düzenlenir.
Önceden Derlenmiş Programlar
Ed25519 Programı
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. İlk u8
, kontrol edilecek imza sayısını
belirtir ve ardından tek baytlık bir dolgu gelir. Bundan sonra, kontrol edilecek
her imza için aşağıdaki yapı sıralanır.
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}
İmza doğrulamasının sözde kodu:
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 Programı
Program | Program ID | Açıklama | Talimatlar |
---|---|---|---|
Secp256k1 Programı | KeccakSecp256k11111111111111111111111111111 | Secp256k1 açık anahtar kurtarma işlemlerini (ecrecover) doğrular. | Talimatlar |
Secp256k1 programı, ilk bayt olarak talimat verisinde sıralanmış aşağıdaki yapının sayısını alan bir talimatı işler:
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}
Kurtarma doğrulamasının sözde kodu:
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şlemde imza ve mesaj verileri için herhangi bir talimat verisi belirtmesine olanak tanır. Özel bir talimat sysvar belirterek, işlemin kendisinden de veri alınabilir.
İşlem maliyeti, doğrulanacak imza sayısını imza doğrulama çarpanı ile çarparak hesaplanacaktır.
Secp256r1 Programı
Program | Program ID | Açıklama | Talimatlar |
---|---|---|---|
Secp256r1 Program | Secp256r1SigVerify1111111111111111111111111 | 8 adede kadar secp256r1 imzasını doğrular. İmza, açık anahtar ve mesaj alır. Herhangi biri başarısız olursa hata döndürür. | Instructions |
Secp256r1 programı bir talimatı işler. İlk u8
kontrol edilecek imza sayısını
belirtir ve ardından tek byte dolgu gelir. Bundan sonra, kontrol edilecek her
imza için aşağıdaki yapı sırayla yerleştirilir:
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}
İmza doğrulamanın sözde kodu:
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}
Not: Kazara imza değiştirilebilirliğini önlemek için tüm imzalarda düşük S değerleri zorunlu tutulur.
Çekirdek Programlar
Solana küme oluşumu, ağ için temel işlevler sağlayan özel programların bir listesini içerir. Tarihsel olarak bunlar "yerel" programlar olarak adlandırılırdı ve validator koduyla birlikte dağıtılırlardı.
Program | Program ID | Açıklama | Talimatlar |
---|---|---|---|
System Program | 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 Program | Vote111111111111111111111111111111111111111 | Validator oylama durumunu ve ödüllerini takip eden hesapları oluşturma ve yönetme. | VoteInstruction |
Stake Program | Stake11111111111111111111111111111111111111 | Validatorlara yapılan delegasyonlar için stake ve ödülleri temsil eden hesapları oluşturma ve yönetme. | StakeInstruction |
Config Program | Config1111111111111111111111111111111111111 | Zincire yapılandırma verisi ekleme ve ardından bunu değiştirmeye izin verilen açık 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 erişimi kontrol eden anahtarlar kümesi ve içine depolanacak verilerdir. | ConfigInstruction |
Compute Budget Program | ComputeBudget111111111111111111111111111111 | İşlemler için hesaplama birimi limitlerini ve fiyatlarını ayarlayarak, kullanıcıların hesaplama kaynaklarını ve önceliklendirme ücretlerini kontrol etmelerini sağlama. | ComputeBudgetInstruction |
Address Lookup Table Program | AddressLookupTab1e1111111111111111111111111 | Adres arama tablolarını yönetme, bu tablolar işlemlerin normalde işlem hesap listesine sığabilecek olandan daha fazla hesaba referans vermesini sağlar. | ProgramInstruction |
ZK ElGamal Proof Program | ZkE1Gama1Proof11111111111111111111111111111 | ElGamal ile şifrelenmiş veriler için sıfır-bilgi kanıtı doğrulaması sağlar. | — |
Is this page helpful?