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:
| İş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, System Program tarafından oluşturulan yeni hesapların sahipliğini bu şekilde alır. |
| SOL transferi | System 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.
Şu anda aşağıdaki tabloda gösterildiği gibi beş loader programı bulunmaktadır.
| Loader | Program kimliği | Notlar | Talimatlar bağlantısı |
|---|---|---|---|
| native | NativeLoader1111111111111111111111111111111 | Diğer dört loader'a 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 | Programlar dağıtımdan sonra güncellenebilir. Program çalıştırılabilir 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 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.
| Program | Program ID | Açıklama | Talimatlar |
|---|---|---|---|
| Ed25519 Program | Ed25519SigVerify111111111111111111111111111 | Ed25519 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.
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 kurtarmayı doğrula
Secp256k1 programı, secp256k1 genel anahtar kurtarma işlemlerini doğrulamak için kullanılır.
| Program | Program ID | Açıklama | Talimatlar |
|---|---|---|---|
| Secp256k1 Program | KeccakSecp256k11111111111111111111111111111 | Secp256k1 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.
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?