Προγράμματα

Στο 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ΣημειώσειςΣύνδεσμος οδηγιών
nativeNativeLoader1111111111111111111111111111111Κατέχει τους άλλους τέσσερις φορτωτές
v1BPFLoader1111111111111111111111111111111111Οι οδηγίες διαχείρισης είναι απενεργοποιημένες, αλλά τα προγράμματα εξακολουθούν να εκτελούνται
v2BPFLoader2111111111111111111111111111111111Οι οδηγίες διαχείρισης είναι απενεργοποιημένες, αλλά τα προγράμματα εξακολουθούν να εκτελούνταιΟδηγίες
v3BPFLoaderUpgradeab1e11111111111111111111111Τα προγράμματα μπορούν να ενημερωθούν μετά την ανάπτυξη. Το εκτελέσιμο πρόγραμμα αποθηκεύεται σε ξεχωριστό λογαριασμό δεδομένων προγράμματοςΟδηγίες
v4LoaderV411111111111111111111111111111111111Υπό ανάπτυξη (δεν έχει κυκλοφορήσει)Οδηγίες

Τα προγράμματα που αναπτύσσονται με το loader-v3 ή το loader-v4 μπορεί να είναι τροποποιήσιμα μετά την ανάπτυξη, όπως καθορίζεται από την αρχή αναβάθμισής τους.

Όταν αναπτύσσεται ένα νέο πρόγραμμα, η τελευταία έκδοση του φορτωτή θα χρησιμοποιηθεί από προεπιλογή.

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

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

Επαλήθευση υπογραφής ed25519

Το πρόγραμμα ed25519 χρησιμοποιείται για την επαλήθευση μίας ή περισσότερων υπογραφών ed25519.

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

Το πρόγραμμα ed25519 επεξεργάζεται μια εντολή. Το πρώτο byte της εντολής περιέχει έναν αριθμό των υπογραφών που πρέπει να ελεγχθούν, ακολουθούμενο από ένα μόνο 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
}
Signature verification pseudocode
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

Το πρόγραμμα secp256k1 χρησιμοποιείται για την επαλήθευση λειτουργιών ανάκτησης δημόσιου κλειδιού secp256k1.

ΠρόγραμμαProgram 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
}
Recovery verification pseudocode
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
}

Αυτό επιτρέπει στον χρήστη να καθορίσει οποιαδήποτε δεδομένα εντολής στη συναλλαγή για δεδομένα υπογραφής και μηνύματος. Καθορίζοντας μια ειδική μεταβλητή συστήματος εντολών, μπορεί κανείς επίσης να λάβει δεδομένα από την ίδια τη συναλλαγή.

Το κόστος της συναλλαγής θα υπολογίσει τον αριθμό των υπογραφών προς επαλήθευση πολλαπλασιασμένο με τον πολλαπλασιαστή κόστους επαλήθευσης υπογραφής.

Το πρόγραμμα secp256r1 χρησιμοποιείται για την επαλήθευση έως και 8 υπογραφών 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
}

Οι χαμηλές τιμές S επιβάλλονται για όλες τις υπογραφές για την αποφυγή τυχαίας πλαστότητας υπογραφής.

Signature verification psuedocode
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
}

Βασικά προγράμματα

Τα προγράμματα στην παρακάτω λίστα παρέχουν τη βασική λειτουργικότητα του δικτύου.

ΠρόγραμμαΑναγνωριστικό προγράμματοςΠεριγραφήΟδηγίες
Σύστημα11111111111111111111111111111111Δημιουργία νέων λογαριασμών, κατανομή δεδομένων λογαριασμού, ανάθεση λογαριασμών σε προγράμματα ιδιοκτησίας, μεταφορά lamports από λογαριασμούς που ανήκουν στο Πρόγραμμα Συστήματος και πληρωμή τελών συναλλαγώνSystemInstruction
ΨηφοφορίαVote111111111111111111111111111111111111111Δημιουργία και διαχείριση λογαριασμών που παρακολουθούν την κατάσταση ψηφοφορίας και τις ανταμοιβές των validatorVoteInstruction
StakeStake11111111111111111111111111111111111111Δημιουργία και διαχείριση λογαριασμών που αντιπροσωπεύουν stake και ανταμοιβές για αναθέσεις σε validatorStakeInstruction
ΔιαμόρφωσηConfig1111111111111111111111111111111111111Προσθήκη δεδομένων διαμόρφωσης στην αλυσίδα, ακολουθούμενη από τη λίστα των δημόσιων κλειδιών που επιτρέπεται να την τροποποιήσουν. Σε αντίθεση με τα άλλα προγράμματα, το πρόγραμμα Διαμόρφωσης δεν ορίζει μεμονωμένες εντολές. Έχει μόνο μία σιωπηρή εντολή: "store". Τα δεδομένα εντολής του είναι ένα σύνολο κλειδιών που ελέγχουν την πρόσβαση στο λογαριασμό και τα δεδομένα που αποθηκεύονται σε αυτόνConfigInstruction
Προϋπολογισμός ΥπολογισμούComputeBudget111111111111111111111111111111Ορισμός ορίων μονάδων υπολογισμού και τιμών για συναλλαγές, επιτρέποντας στους χρήστες να ελέγχουν τους υπολογιστικούς πόρους και τα τέλη προτεραιότηταςComputeBudgetInstruction
Πίνακας Αναζήτησης ΔιευθύνσεωνAddressLookupTab1e1111111111111111111111111Διαχείριση πινάκων αναζήτησης διευθύνσεων, που επιτρέπουν στις συναλλαγές να αναφέρονται σε περισσότερους λογαριασμούς από όσους θα χωρούσαν διαφορετικά στη λίστα λογαριασμών της συναλλαγήςProgramInstruction
Απόδειξη ZK ElGamalZkE1Gama1Proof11111111111111111111111111111Παρέχει επαλήθευση απόδειξης μηδενικής γνώσης για κρυπτογραφημένα δεδομένα ElGamal

Is this page helpful?

Διαχειρίζεται από

© 2025 Ίδρυμα Solana.
Με επιφύλαξη παντός δικαιώματος.