Προγράμματα
Στο Solana, τα "έξυπνα συμβόλαια" ονομάζονται προγράμματα. Τα προγράμματα αναπτύσσονται στην αλυσίδα σε λογαριασμούς που περιέχουν το μεταγλωττισμένο εκτελέσιμο δυαδικό αρχείο του προγράμματος. Οι χρήστες αλληλεπιδρούν με τα προγράμματα στέλνοντας συναλλαγές που περιέχουν οδηγίες που λένε στο πρόγραμμα τι να κάνει.
Βασικά Σημεία
- Τα προγράμματα είναι λογαριασμοί που περιέχουν εκτελέσιμο κώδικα, οργανωμένο σε λειτουργίες που ονομάζονται οδηγίες.
- Ενώ τα προγράμματα είναι χωρίς κατάσταση, μπορούν να περιλαμβάνουν οδηγίες που δημιουργούν και ενημερώνουν άλλους λογαριασμούς για την αποθήκευση δεδομένων.
- Μια αρχή αναβάθμισης μπορεί να ενημερώσει τα προγράμματα. Μόλις αφαιρεθεί αυτή η αρχή, το πρόγραμμα γίνεται αμετάβλητο.
- Οι χρήστες μπορούν να επαληθεύσουν ότι τα δεδομένα ενός λογαριασμού προγράμματος στην αλυσίδα αντιστοιχούν στον δημόσιο πηγαίο κώδικα μέσω επαληθεύσιμων κατασκευών.
Γράφοντας Προγράμματα Solana
Τα προγράμματα Solana γράφονται κυρίως στη γλώσσα προγραμματισμού Rust, με δύο συνηθισμένες προσεγγίσεις για ανάπτυξη:
-
Anchor: Ένα πλαίσιο σχεδιασμένο για την ανάπτυξη προγραμμάτων Solana. Παρέχει έναν ταχύτερο και απλούστερο τρόπο για τη συγγραφή προγραμμάτων, χρησιμοποιώντας μακροεντολές Rust για τη μείωση του επαναλαμβανόμενου κώδικα. Για αρχάριους, συνιστάται να ξεκινήσουν με το πλαίσιο Anchor.
-
Native Rust: Αυτή η προσέγγιση περιλαμβάνει τη συγγραφή προγραμμάτων Solana σε Rust χωρίς τη χρήση πλαισίων. Προσφέρει μεγαλύτερη ευελιξία αλλά έρχεται με αυξημένη πολυπλοκότητα.
Ενημέρωση Προγραμμάτων Solana
Για να μάθετε περισσότερα σχετικά με την ανάπτυξη και αναβάθμιση προγραμμάτων, δείτε τη σελίδα ανάπτυξης προγραμμάτων.
Τα προγράμματα μπορούν να τροποποιηθούν άμεσα από έναν λογαριασμό που ορίζεται ως "αρχή αναβάθμισης", που είναι συνήθως ο λογαριασμός που αρχικά ανέπτυξε το πρόγραμμα. Εάν η αρχή αναβάθμισης ανακληθεί και οριστεί σε null, το πρόγραμμα γίνεται αμετάβλητο και δεν μπορεί πλέον να ενημερωθεί.
Επαληθεύσιμα Προγράμματα
Οι επαληθεύσιμες κατασκευές επιτρέπουν σε οποιονδήποτε να ελέγξει αν ο κώδικας ενός προγράμματος στην αλυσίδα αντιστοιχεί στον δημόσιο πηγαίο κώδικά του, καθιστώντας δυνατό τον εντοπισμό διαφορών μεταξύ του πηγαίου και των αναπτυγμένων εκδόσεων.
Η κοινότητα προγραμματιστών της Solana έχει εισαγάγει εργαλεία για την υποστήριξη επαληθεύσιμων κατασκευών, επιτρέποντας τόσο στους προγραμματιστές όσο και στους χρήστες να επαληθεύσουν ότι τα προγράμματα στην αλυσίδα αντικατοπτρίζουν με ακρίβεια τον δημόσια κοινοποιημένο πηγαίο κώδικά τους.
-
Αναζήτηση Επαληθευμένων Προγραμμάτων: Για να ελέγξουν γρήγορα για επαληθευμένα προγράμματα, οι χρήστες μπορούν να αναζητήσουν μια διεύθυνση προγράμματος στον Solana Explorer. Δείτε ένα παράδειγμα επαληθευμένου προγράμματος εδώ.
-
Εργαλεία Επαλήθευσης: Το Solana Verifiable Build CLI από την Ellipsis Labs επιτρέπει στους χρήστες να επαληθεύουν ανεξάρτητα προγράμματα στην αλυσίδα έναντι του δημοσιευμένου πηγαίου κώδικα.
-
Υποστήριξη για Επαληθεύσιμες Κατασκευές στο Anchor: Το Anchor παρέχει ενσωματωμένη υποστήριξη για επαληθεύσιμες κατασκευές. Λεπτομέρειες μπορείτε να βρείτε στην τεκμηρίωση του Anchor.
Berkeley Packet Filter (BPF)
Η Solana χρησιμοποιεί το LLVM (Low Level Virtual Machine) για τη μεταγλώττιση προγραμμάτων σε αρχεία ELF (Executable and Linkable Format). Αυτά τα αρχεία περιέχουν την προσαρμοσμένη έκδοση της Solana του eBPF bytecode, που ονομάζεται "Solana Bytecode Format" (sBPF). Το αρχείο ELF περιέχει το δυαδικό του προγράμματος και αποθηκεύεται στην αλυσίδα σε έναν εκτελέσιμο λογαριασμό όταν το πρόγραμμα αναπτύσσεται.
Ενσωματωμένα Προγράμματα
Προγράμματα Φορτωτή
Κάθε πρόγραμμα ανήκει σε ένα άλλο πρόγραμμα, το οποίο είναι ο φορτωτής του. Επί του παρόντος, υπάρχουν πέντε προγράμματα φορτωτή:
Φορτωτής | Αναγνωριστικό Προγράμματος | Σημειώσεις | Σύνδεσμος Οδηγιών |
---|---|---|---|
native | 11111111111111111111111111111111 | Κατέχει τους άλλους τέσσερις φορτωτές | — |
v1 | BPFLoader1111111111111111111111111111111111 | Οι οδηγίες διαχείρισης είναι απενεργοποιημένες, αλλά τα προγράμματα εξακολουθούν να εκτελούνται | — |
v2 | BPFLoader2111111111111111111111111111111111 | Οι οδηγίες διαχείρισης είναι απενεργοποιημένες, αλλά τα προγράμματα εξακολουθούν να εκτελούνται | Οδηγίες |
v3 | BPFLoaderUpgradeab1e11111111111111111111111 | Βρίσκεται σε διαδικασία κατάργησης | Οδηγίες |
v4 | LoaderV411111111111111111111111111111111111 | Το v4 αναμένεται να γίνει ο τυπικός φορτωτής | Οδηγίες |
Αυτοί οι φορτωτές είναι απαραίτητοι για τη δημιουργία και διαχείριση προσαρμοσμένων προγραμμάτων:
- Ανάπτυξη νέου προγράμματος ή buffer
- Κλείσιμο προγράμματος ή buffer
- Επανανάπτυξη / αναβάθμιση υπάρχοντος προγράμματος
- Μεταφορά της εξουσιοδότησης ενός προγράμματος
- Οριστικοποίηση προγράμματος
Οι loader-v3 και loader-v4 υποστηρίζουν τροποποιήσεις στα προγράμματα μετά την αρχική τους ανάπτυξη. Η άδεια για αυτό ρυθμίζεται από την εξουσιοδότηση ενός προγράμματος επειδή η ιδιοκτησία του λογαριασμού κάθε προγράμματος ανήκει στον φορτωτή.
Προκαταρτισμένα Προγράμματα
Πρόγραμμα Ed25519
Πρόγραμμα | ID Προγράμματος | Περιγραφή | Οδηγίες |
---|---|---|---|
Πρόγραμμα Ed25519 | Ed25519SigVerify111111111111111111111111111 | Επαληθεύει υπογραφές ed25519. Αν αποτύχει οποιαδήποτε υπογραφή, επιστρέφεται σφάλμα. | Οδηγίες |
Το πρόγραμμα ed25519 επεξεργάζεται μια εντολή. Το πρώτο u8
είναι ένας αριθμός
των υπογραφών προς έλεγχο, που ακολουθείται από ένα byte γεμίσματος. Μετά από
αυτό, σειριοποιείται η ακόλουθη δομή, μία για κάθε υπογραφή προς έλεγχο.
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
Πρόγραμμα | ID Προγράμματος | Περιγραφή | Οδηγίες |
---|---|---|---|
Πρόγραμμα Secp256k1 | KeccakSecp256k11111111111111111111111111111 | Επαληθεύει λειτουργίες ανάκτησης δημόσιου κλειδιού secp256k1 (ecrecover). | Οδηγίες |
Το πρόγραμμα secp256k1 επεξεργάζεται μια εντολή που λαμβάνει ως πρώτο byte έναν αριθμό της ακόλουθης δομής που σειριοποιείται στα δεδομένα εντολής:
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}
Αυτό επιτρέπει στον χρήστη να καθορίσει οποιαδήποτε δεδομένα εντολής στη συναλλαγή για δεδομένα υπογραφής και μηνύματος. Καθορίζοντας μια ειδική sysvar εντολών, μπορεί κανείς επίσης να λάβει δεδομένα από την ίδια τη συναλλαγή.
Το κόστος της συναλλαγής θα υπολογίσει τον αριθμό των υπογραφών προς επαλήθευση πολλαπλασιασμένο με τον πολλαπλασιαστή κόστους επαλήθευσης υπογραφής.
Πρόγραμμα Secp256r1
Πρόγραμμα | Αναγνωριστικό προγράμματος | Περιγραφή | Οδηγίες |
---|---|---|---|
Πρόγραμμα Secp256r1 | Secp256r1SigVerify1111111111111111111111111 | Επαληθεύει έως και 8 υπογραφές secp256r1. Λαμβάνει μια υπογραφή, δημόσιο κλειδί και μήνυμα. Επιστρέφει σφάλμα αν κάποια αποτύχει. | Οδηγίες |
Το πρόγραμμα secp256r1 επεξεργάζεται μια εντολή. Το πρώτο u8
είναι ένας
μετρητής του αριθμού των υπογραφών προς έλεγχο, ακολουθούμενο από ένα byte
γεμίσματος. Μετά από αυτό, σειριοποιείται η ακόλουθη δομή, μία για κάθε υπογραφή
προς έλεγχο:
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}
Ο ψευδοκώδικας της επαλήθευσης υπογραφής:
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}
Σημείωση: Οι χαμηλές τιμές S επιβάλλονται για όλες τις υπογραφές για την αποφυγή τυχαίας πλαστότητας υπογραφής.
Βασικά προγράμματα
Η γένεση του συμπλέγματος Solana περιλαμβάνει μια λίστα ειδικών προγραμμάτων που παρέχουν βασικές λειτουργίες για το δίκτυο. Ιστορικά, αυτά αναφέρονταν ως "εγγενή" προγράμματα και διανέμονταν μαζί με τον κώδικα του validator.
Πρόγραμμα | Αναγνωριστικό προγράμματος | Περιγραφή | Οδηγίες |
---|---|---|---|
Πρόγραμμα συστήματος | 11111111111111111111111111111111 | Δημιουργεί νέους λογαριασμούς, κατανέμει δεδομένα λογαριασμού, αναθέτει λογαριασμούς σε προγράμματα ιδιοκτησίας, μεταφέρει lamport από λογαριασμούς που ανήκουν στο System Program και πληρώνει τέλη συναλλαγών. | SystemInstruction |
Πρόγραμμα ψηφοφορίας | Vote111111111111111111111111111111111111111 | Δημιουργεί και διαχειρίζεται λογαριασμούς που παρακολουθούν την κατάσταση ψηφοφορίας του validator και τις ανταμοιβές. | VoteInstruction |
Πρόγραμμα Stake | Stake11111111111111111111111111111111111111 | Δημιουργεί και διαχειρίζεται λογαριασμούς που αντιπροσωπεύουν stake και ανταμοιβές για αναθέσεις σε validators. | StakeInstruction |
Πρόγραμμα διαμόρφωσης | Config1111111111111111111111111111111111111 | Προσθέτει δεδομένα διαμόρφωσης στην αλυσίδα, ακολουθούμενα από τη λίστα των δημόσιων κλειδιών που επιτρέπεται να τα τροποποιήσουν. Σε αντίθεση με τα άλλα προγράμματα, το πρόγραμμα Config δεν ορίζει μεμονωμένες οδηγίες. Έχει μόνο μία σιωπηρή οδηγία: "αποθήκευση". Τα δεδομένα οδηγιών του είναι ένα σύνολο κλειδιών που ελέγχουν την πρόσβαση στο λογαριασμό και τα δεδομένα προς αποθήκευση σε αυτόν. | ConfigInstruction |
Πρόγραμμα προϋπολογισμού υπολογισμού | ComputeBudget111111111111111111111111111111 | Ορίζει όρια μονάδων υπολογισμού και τιμές για συναλλαγές, επιτρέποντας στους χρήστες να ελέγχουν τους υπολογιστικούς πόρους και τα τέλη προτεραιότητας. | ComputeBudgetInstruction |
Πρόγραμμα πίνακα αναζήτησης διευθύνσεων | AddressLookupTab1e1111111111111111111111111 | Διαχειρίζεται πίνακες αναζήτησης διευθύνσεων, που επιτρέπουν στις συναλλαγές να αναφέρονται σε περισσότερους λογαριασμούς από όσους θα χωρούσαν διαφορετικά στη λίστα λογαριασμών της συναλλαγής. | ProgramInstruction |
Πρόγραμμα απόδειξης ZK ElGamal | ZkE1Gama1Proof11111111111111111111111111111 | Παρέχει επαλήθευση απόδειξης μηδενικής γνώσης για κρυπτογραφημένα δεδομένα ElGamal. | — |
Is this page helpful?