Προγράμματα

Στο 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 περιέχει το δυαδικό του προγράμματος και αποθηκεύεται στην αλυσίδα σε έναν εκτελέσιμο λογαριασμό όταν το πρόγραμμα αναπτύσσεται.

Ενσωματωμένα Προγράμματα

Προγράμματα Φορτωτή

Κάθε πρόγραμμα ανήκει σε ένα άλλο πρόγραμμα, το οποίο είναι ο φορτωτής του. Επί του παρόντος, υπάρχουν πέντε προγράμματα φορτωτή:

ΦορτωτήςΑναγνωριστικό ΠρογράμματοςΣημειώσειςΣύνδεσμος Οδηγιών
native11111111111111111111111111111111Κατέχει τους άλλους τέσσερις φορτωτές
v1BPFLoader1111111111111111111111111111111111Οι οδηγίες διαχείρισης είναι απενεργοποιημένες, αλλά τα προγράμματα εξακολουθούν να εκτελούνται
v2BPFLoader2111111111111111111111111111111111Οι οδηγίες διαχείρισης είναι απενεργοποιημένες, αλλά τα προγράμματα εξακολουθούν να εκτελούνταιΟδηγίες
v3BPFLoaderUpgradeab1e11111111111111111111111Βρίσκεται σε διαδικασία κατάργησηςΟδηγίες
v4LoaderV411111111111111111111111111111111111Το v4 αναμένεται να γίνει ο τυπικός φορτωτήςΟδηγίες

Αυτοί οι φορτωτές είναι απαραίτητοι για τη δημιουργία και διαχείριση προσαρμοσμένων προγραμμάτων:

  • Ανάπτυξη νέου προγράμματος ή buffer
  • Κλείσιμο προγράμματος ή buffer
  • Επανανάπτυξη / αναβάθμιση υπάρχοντος προγράμματος
  • Μεταφορά της εξουσιοδότησης ενός προγράμματος
  • Οριστικοποίηση προγράμματος

Οι loader-v3 και loader-v4 υποστηρίζουν τροποποιήσεις στα προγράμματα μετά την αρχική τους ανάπτυξη. Η άδεια για αυτό ρυθμίζεται από την εξουσιοδότηση ενός προγράμματος επειδή η ιδιοκτησία του λογαριασμού κάθε προγράμματος ανήκει στον φορτωτή.

Προκαταρτισμένα Προγράμματα

Πρόγραμμα Ed25519

ΠρόγραμμαID ΠρογράμματοςΠεριγραφήΟδηγίες
Πρόγραμμα Ed25519Ed25519SigVerify111111111111111111111111111Επαληθεύει υπογραφές ed25519. Αν αποτύχει οποιαδήποτε υπογραφή, επιστρέφεται σφάλμα.Οδηγίες

Το πρόγραμμα ed25519 επεξεργάζεται μια εντολή. Το πρώτο u8 είναι ένας αριθμός των υπογραφών προς έλεγχο, που ακολουθείται από ένα byte γεμίσματος. Μετά από αυτό, σειριοποιείται η ακόλουθη δομή, μία για κάθε υπογραφή προς έλεγχο.

Ed25519SignatureOffsets
struct Ed25519SignatureOffsets {
signature_offset: u16, // offset to ed25519 signature of 64 bytes
signature_instruction_index: u16, // instruction index to find signature
public_key_offset: u16, // offset to public key of 32 bytes
public_key_instruction_index: u16, // instruction index to find public key
message_data_offset: u16, // offset to start of message data
message_data_size: u16, // size of message data
message_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().instructions
instruction_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 ΠρογράμματοςΠεριγραφήΟδηγίες
Πρόγραμμα Secp256k1KeccakSecp256k11111111111111111111111111111Επαληθεύει λειτουργίες ανάκτησης δημόσιου κλειδιού secp256k1 (ecrecover).Οδηγίες

Το πρόγραμμα secp256k1 επεξεργάζεται μια εντολή που λαμβάνει ως πρώτο byte έναν αριθμό της ακόλουθης δομής που σειριοποιείται στα δεδομένα εντολής:

Secp256k1SignatureOffsets
struct Secp256k1SignatureOffsets {
secp_signature_offset: u16, // offset to [signature,recovery_id] of 64+1 bytes
secp_signature_instruction_index: u8, // instruction index to find signature
secp_pubkey_offset: u16, // offset to ethereum_address pubkey of 20 bytes
secp_pubkey_instruction_index: u8, // instruction index to find pubkey
secp_message_data_offset: u16, // offset to start of message data
secp_message_data_size: u16, // size of message data
secp_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().instructions
signature = 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

ΠρόγραμμαΑναγνωριστικό προγράμματοςΠεριγραφήΟδηγίες
Πρόγραμμα Secp256r1Secp256r1SigVerify1111111111111111111111111Επαληθεύει έως και 8 υπογραφές secp256r1. Λαμβάνει μια υπογραφή, δημόσιο κλειδί και μήνυμα. Επιστρέφει σφάλμα αν κάποια αποτύχει.Οδηγίες

Το πρόγραμμα secp256r1 επεξεργάζεται μια εντολή. Το πρώτο u8 είναι ένας μετρητής του αριθμού των υπογραφών προς έλεγχο, ακολουθούμενο από ένα byte γεμίσματος. Μετά από αυτό, σειριοποιείται η ακόλουθη δομή, μία για κάθε υπογραφή προς έλεγχο:

Secp256r1SignatureOffsets
struct Secp256r1SignatureOffsets {
signature_offset: u16, // offset to compact secp256r1 signature of 64 bytes
signature_instruction_index: u16, // instruction index to find signature
public_key_offset: u16, // offset to compressed public key of 33 bytes
public_key_instruction_index: u16, // instruction index to find public key
message_data_offset: u16, // offset to start of message data
message_data_size: u16, // size of message data
message_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 usize
if num_signatures == 0 || num_signatures > 8 {
return Error
}
expected_data_size = num_signatures * SIGNATURE_OFFSETS_SERIALIZED_SIZE + SIGNATURE_OFFSETS_START
if 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
Πρόγραμμα StakeStake11111111111111111111111111111111111111Δημιουργεί και διαχειρίζεται λογαριασμούς που αντιπροσωπεύουν stake και ανταμοιβές για αναθέσεις σε validators.StakeInstruction
Πρόγραμμα διαμόρφωσηςConfig1111111111111111111111111111111111111Προσθέτει δεδομένα διαμόρφωσης στην αλυσίδα, ακολουθούμενα από τη λίστα των δημόσιων κλειδιών που επιτρέπεται να τα τροποποιήσουν. Σε αντίθεση με τα άλλα προγράμματα, το πρόγραμμα Config δεν ορίζει μεμονωμένες οδηγίες. Έχει μόνο μία σιωπηρή οδηγία: "αποθήκευση". Τα δεδομένα οδηγιών του είναι ένα σύνολο κλειδιών που ελέγχουν την πρόσβαση στο λογαριασμό και τα δεδομένα προς αποθήκευση σε αυτόν.ConfigInstruction
Πρόγραμμα προϋπολογισμού υπολογισμούComputeBudget111111111111111111111111111111Ορίζει όρια μονάδων υπολογισμού και τιμές για συναλλαγές, επιτρέποντας στους χρήστες να ελέγχουν τους υπολογιστικούς πόρους και τα τέλη προτεραιότητας.ComputeBudgetInstruction
Πρόγραμμα πίνακα αναζήτησης διευθύνσεωνAddressLookupTab1e1111111111111111111111111Διαχειρίζεται πίνακες αναζήτησης διευθύνσεων, που επιτρέπουν στις συναλλαγές να αναφέρονται σε περισσότερους λογαριασμούς από όσους θα χωρούσαν διαφορετικά στη λίστα λογαριασμών της συναλλαγής.ProgramInstruction
Πρόγραμμα απόδειξης ZK ElGamalZkE1Gama1Proof11111111111111111111111111111Παρέχει επαλήθευση απόδειξης μηδενικής γνώσης για κρυπτογραφημένα δεδομένα ElGamal.

Is this page helpful?