Προγράμματα
Στο Solana, ένα έξυπνο συμβόλαιο ονομάζεται πρόγραμμα. Ένα πρόγραμμα είναι ένας λογαριασμός χωρίς κατάσταση account που περιέχει εκτελέσιμο κώδικα. Αυτός ο κώδικας οργανώνεται σε λειτουργίες που ονομάζονται οδηγίες. Οι χρήστες αλληλεπιδρούν με ένα πρόγραμμα στέλνοντας μια συναλλαγή που περιέχει μία ή περισσότερες οδηγίες. Μια συναλλαγή μπορεί να περιλαμβάνει οδηγίες από πολλαπλά προγράμματα.
Όταν ένα πρόγραμμα αναπτύσσεται, το Solana χρησιμοποιεί το LLVM για να το μεταγλωττίσει σε εκτελέσιμη και συνδέσιμη μορφή (ELF). Το αρχείο ELF περιέχει το δυαδικό του προγράμματος σε Μορφή Bytecode Solana (sBPF) και αποθηκεύεται στην αλυσίδα σε έναν εκτελέσιμο λογαριασμό.
Το sBPF είναι η προσαρμοσμένη έκδοση του Solana για το eBPF bytecode.
Γράψτε προγράμματα
Η πλειοψηφία των προγραμμάτων γράφονται σε Rust, με δύο συνηθισμένες προσεγγίσεις ανάπτυξης:
- Anchor: Το Anchor είναι ένα πλαίσιο σχεδιασμένο για γρήγορη και εύκολη ανάπτυξη στο Solana. Χρησιμοποιεί μακροεντολές Rust για να μειώσει τον επαναλαμβανόμενο κώδικα—καθιστώντας το εξαιρετικό για αρχάριους.
- Native Rust: Γράψτε προγράμματα σε Rust χωρίς να χρησιμοποιείτε κανένα πλαίσιο. Αυτή η προσέγγιση προσφέρει περισσότερη ευελιξία αλλά έρχεται με αυξημένη πολυπλοκότητα.
Ενημερώστε προγράμματα
Για να τροποποιήσετε ένα υπάρχον πρόγραμμα, ένας λογαριασμός πρέπει να οριστεί ως αρχή αναβάθμισης. (Συνήθως ο ίδιος λογαριασμός που αρχικά ανέπτυξε το πρόγραμμα.) Εάν η αρχή αναβάθμισης ανακληθεί και οριστεί σε null, το πρόγραμμα δεν μπορεί πλέον να ενημερωθεί.
Επαληθεύστε προγράμματα
Το Solana υποστηρίζει επαληθεύσιμες κατασκευές, οι οποίες επιτρέπουν στους χρήστες να ελέγξουν εάν ο κώδικας ενός προγράμματος στην αλυσίδα ταιριάζει με τον δημόσιο πηγαίο κώδικά του. Το πλαίσιο Anchor παρέχει ενσωματωμένη υποστήριξη για τη δημιουργία μιας επαληθεύσιμης κατασκευής.
Για να ελέγξετε εάν ένα υπάρχον πρόγραμμα είναι επαληθευμένο, αναζητήστε το αναγνωριστικό του προγράμματος στον Εξερευνητή Solana. Εναλλακτικά, μπορείτε να χρησιμοποιήσετε το Solana Verifiable Build CLI της Ellipsis Labs, για να επαληθεύσετε ανεξάρτητα προγράμματα στην αλυσίδα.
Ενσωματωμένα προγράμματα
Το System Program
Το System Program είναι ο μόνος λογαριασμός που μπορεί να δημιουργήσει νέους λογαριασμούς. Από προεπιλογή, όλοι οι νέοι λογαριασμοί ανήκουν στο System Program, αν και πολλοί αποδίδονται σε νέο ιδιοκτήτη κατά τη δημιουργία τους. Το System Program εκτελεί τις ακόλουθες βασικές λειτουργίες:
| Λειτουργία | Περιγραφή |
|---|---|
| Δημιουργία νέου λογαριασμού | Μόνο το System Program μπορεί να δημιουργήσει νέους λογαριασμούς. |
| Κατανομή χώρου | Ορίζει τη χωρητικότητα σε bytes για το πεδίο δεδομένων κάθε λογαριασμού. |
| Ανάθεση ιδιοκτησίας προγράμματος | Μόλις το System Program δημιουργήσει έναν λογαριασμό, μπορεί να επαναπροσδιορίσει τον καθορισμένο ιδιοκτήτη προγράμματος σε διαφορετικό program account. Έτσι τα προσαρμοσμένα προγράμματα αποκτούν την ιδιοκτησία νέων λογαριασμών που δημιουργούνται από το System Program. |
| Μεταφορά SOL | Μεταφέρει lamports (SOL) από System Accounts σε άλλους λογαριασμούς. |
Η διεύθυνση του system program είναι 11111111111111111111111111111111.
Προγράμματα φόρτωσης
Κάθε πρόγραμμα ανήκει σε ένα άλλο—τον φορτωτή του. Οι φορτωτές χρησιμοποιούνται για την ανάπτυξη, επανανάπτυξη, αναβάθμιση ή κλείσιμο προγραμμάτων. Χρησιμοποιούνται επίσης για την οριστικοποίηση ενός προγράμματος και τη μεταφορά της εξουσιοδότησης του προγράμματος.
Τα προγράμματα φόρτωσης μερικές φορές αναφέρονται ως 'BPF Loaders'.
Υπάρχουν αυτή τη στιγμή πέντε προγράμματα φόρτωσης, όπως φαίνεται στον παρακάτω πίνακα.
| Φορτωτής | Program ID | Σημειώσεις | Σύνδεσμος οδηγιών |
|---|---|---|---|
| native | NativeLoader1111111111111111111111111111111 | Κατέχει τους άλλους τέσσερις φορτωτές | — |
| v1 | BPFLoader1111111111111111111111111111111111 | Οι οδηγίες διαχείρισης είναι απενεργοποιημένες, αλλά τα προγράμματα εξακολουθούν να εκτελούνται | — |
| v2 | BPFLoader2111111111111111111111111111111111 | Οι οδηγίες διαχείρισης είναι απενεργοποιημένες, αλλά τα προγράμματα εξακολουθούν να εκτελούνται | Οδηγίες |
| v3 | BPFLoaderUpgradeab1e11111111111111111111111 | Τα προγράμματα μπορούν να ενημερωθούν μετά την ανάπτυξη. Το εκτελέσιμο πρόγραμμα αποθηκεύεται σε ξεχωριστό λογαριασμό δεδομένων προγράμματος | Οδηγίες |
| v4 | LoaderV411111111111111111111111111111111111 | Υπό ανάπτυξη (δεν έχει κυκλοφορήσει) | Οδηγίες |
Τα προγράμματα που αναπτύσσονται με το loader-v3 ή το loader-v4 μπορεί να είναι τροποποιήσιμα μετά την ανάπτυξη, όπως καθορίζεται από την αρχή αναβάθμισής τους.
Όταν αναπτύσσεται ένα νέο πρόγραμμα, η τελευταία έκδοση του φορτωτή θα χρησιμοποιηθεί από προεπιλογή.
Προκαταρτισμένα προγράμματα
Εκτός από τα προγράμματα φόρτωσης, η Solana παρέχει τα ακόλουθα προκαταρτισμένα προγράμματα.
Επαλήθευση υπογραφής ed25519
Το πρόγραμμα ed25519 χρησιμοποιείται για την επαλήθευση μίας ή περισσότερων υπογραφών ed25519.
| Πρόγραμμα | Program ID | Περιγραφή | Οδηγίες |
|---|---|---|---|
| Πρόγραμμα Ed25519 | Ed25519SigVerify111111111111111111111111111 | Επαληθεύει υπογραφές ed25519. Αν αποτύχει οποιαδήποτε υπογραφή, επιστρέφεται σφάλμα. | Οδηγίες |
Το πρόγραμμα ed25519 επεξεργάζεται μια εντολή. Το πρώτο byte της εντολής περιέχει έναν αριθμό των υπογραφών που πρέπει να ελεγχθούν, ακολουθούμενο από ένα μόνο 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
Το πρόγραμμα secp256k1 χρησιμοποιείται για την επαλήθευση λειτουργιών ανάκτησης δημόσιου κλειδιού secp256k1.
| Πρόγραμμα | Program 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}
Αυτό επιτρέπει στον χρήστη να καθορίσει οποιαδήποτε δεδομένα εντολής στη συναλλαγή για δεδομένα υπογραφής και μηνύματος. Καθορίζοντας μια ειδική μεταβλητή συστήματος εντολών, μπορεί κανείς επίσης να λάβει δεδομένα από την ίδια τη συναλλαγή.
Το κόστος της συναλλαγής θα υπολογίσει τον αριθμό των υπογραφών προς επαλήθευση πολλαπλασιασμένο με τον πολλαπλασιαστή κόστους επαλήθευσης υπογραφής.
Το πρόγραμμα secp256r1 χρησιμοποιείται για την επαλήθευση έως και 8 υπογραφών 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}
Οι χαμηλές τιμές S επιβάλλονται για όλες τις υπογραφές για την αποφυγή τυχαίας πλαστότητας υπογραφής.
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}
Βασικά προγράμματα
Τα προγράμματα στην παρακάτω λίστα παρέχουν τη βασική λειτουργικότητα του δικτύου.
| Πρόγραμμα | Αναγνωριστικό προγράμματος | Περιγραφή | Οδηγίες |
|---|---|---|---|
| Σύστημα | 11111111111111111111111111111111 | Δημιουργία νέων λογαριασμών, κατανομή δεδομένων λογαριασμού, ανάθεση λογαριασμών σε προγράμματα ιδιοκτησίας, μεταφορά lamports από λογαριασμούς που ανήκουν στο Πρόγραμμα Συστήματος και πληρωμή τελών συναλλαγών | SystemInstruction |
| Ψηφοφορία | Vote111111111111111111111111111111111111111 | Δημιουργία και διαχείριση λογαριασμών που παρακολουθούν την κατάσταση ψηφοφορίας και τις ανταμοιβές των validator | VoteInstruction |
| Stake | Stake11111111111111111111111111111111111111 | Δημιουργία και διαχείριση λογαριασμών που αντιπροσωπεύουν stake και ανταμοιβές για αναθέσεις σε validator | StakeInstruction |
| Διαμόρφωση | Config1111111111111111111111111111111111111 | Προσθήκη δεδομένων διαμόρφωσης στην αλυσίδα, ακολουθούμενη από τη λίστα των δημόσιων κλειδιών που επιτρέπεται να την τροποποιήσουν. Σε αντίθεση με τα άλλα προγράμματα, το πρόγραμμα Διαμόρφωσης δεν ορίζει μεμονωμένες εντολές. Έχει μόνο μία σιωπηρή εντολή: "store". Τα δεδομένα εντολής του είναι ένα σύνολο κλειδιών που ελέγχουν την πρόσβαση στο λογαριασμό και τα δεδομένα που αποθηκεύονται σε αυτόν | ConfigInstruction |
| Προϋπολογισμός Υπολογισμού | ComputeBudget111111111111111111111111111111 | Ορισμός ορίων μονάδων υπολογισμού και τιμών για συναλλαγές, επιτρέποντας στους χρήστες να ελέγχουν τους υπολογιστικούς πόρους και τα τέλη προτεραιότητας | ComputeBudgetInstruction |
| Πίνακας Αναζήτησης Διευθύνσεων | AddressLookupTab1e1111111111111111111111111 | Διαχείριση πινάκων αναζήτησης διευθύνσεων, που επιτρέπουν στις συναλλαγές να αναφέρονται σε περισσότερους λογαριασμούς από όσους θα χωρούσαν διαφορετικά στη λίστα λογαριασμών της συναλλαγής | ProgramInstruction |
| Απόδειξη ZK ElGamal | ZkE1Gama1Proof11111111111111111111111111111 | Παρέχει επαλήθευση απόδειξης μηδενικής γνώσης για κρυπτογραφημένα δεδομένα ElGamal | — |
Is this page helpful?