Μετάβαση στο κύριο περιεχόμενο
Change page

Γλώσσες προγραμματισμού Έξυπνων Συμβολαίων

Ένα μεγάλο πλεονέκτημα του Ethereum είναι ότι τα έξυπνα συμβόλαια μπορούν να δημιουργηθούν με φιλικές στη χρήση γλώσσες προγραμματισμού. Εάν έχετε εμπειρία με την Python ή παρόμοια γλώσσα(opens in a new tab), μπορείτε να βρείτε μια γλώσσα με οικεία προς εσάς σύνταξη.

Οι δύο κεντρικές και ενεργές γλώσσες είναι:

  • Solidity
  • Vyper

Το Remix IDE παρέχει ένα ολοκληρωμένο περιβάλλον ανάπτυξης για τη δημιουργία και τη δοκιμή συμβολαίων τόσο στο Solidity όσο και στο Vyper. Δοκιμάστε το Remix IDE του προγράμματος περιήγησης(opens in a new tab) για να ξεκινήσετε την κωδικοποίηση.

Οι πιο έμπειροι προγραμματιστές μπορούν να χρησιμοποιήσουν τη Yul, μια ενδιάμεση γλώσσα για την εικονική μηχανή Ethereum, ή τη Yul+ μια επέκταση της Yul.

Αν είστε περίεργοι και σας αρέσει να βοηθάτε με τη δοκιμή νέων γλωσσών που είναι ακόμα υπό ανάπτυξη, μπορείτε να πειραματιστείτε με την Fe, μια νέα γλώσσα για έξυπνα συμβόλαια η οποία είναι ακόμα στα σπάργανα.

Προαπαιτούμενα

Τυχών προηγούμενη εμπειρία με γλώσσες προγραμματισμού, ειδικά με τις JavaScript ή Python, μπορεί να σας βοηθήσει σημαντικά στον προγραμματισμό των έξυπνων συμβολαίων. Σας συνιστούμε επίσης να κατανοήσετε τα έξυπνα συμβόλαια ως έννοια πριν ξεκινήσετε με τη σύγκριση γλωσσών. Εισαγωγή στα έξυπνα συμβόλαια.

Η Solidity

  • Αντικειμενοστραφής, υψηλού επιπέδου γλώσσα προγραμματισμού για την υλοποίηση έξυπνων συμβολαίων.
  • Γλώσσα Curly-bracket βαθιά επηρεασμένη από την C++.
  • Στατική πληκτρολόγηση (ο τύπος μια μεταβλητής γνωστοποιείται μετά τη μεταγλώττιση).
  • Υποστήριξη:
    • Κληρονομικότητα (μπορείτε να επεκτείνετε άλλα συμβόλαια).
    • Βιβλιοθήκες (μπορείτε να δημιουργήσετε επαναχρησιμοποιήσιμο κώδικα που μπορείτε να καλέσετε από διαφορετικά συμβόλαια – όπως κάποιες στατικές λειτουργίες σε μια στατική κλάση σε αντικείμενο άλλης γλώσσας προγραμματισμού).
    • Σύνθετοι τύποι καθορισμένοι από τον χρήστη.

Παράδειγμα συμβολαίου

1// Αναγνωριστικό-Άδεια-SPDX: GPL-3.0
2pragma solidity >= 0.7.0;
3
4contract Coin {
5 // Η λέξη-κλειδί "public" δημιουργεί μεταβλητές
6 // αποδεκτές από άλλα συμβόλαια
7 address public minter;
8 mapping (address => uint) public balances;
9
10 // Τα γεγονότα επιτρέπουν στου πελάτες να αντιδράσει σε συγκεκριμένες
11 // αλλαγές συμβολαίων που δηλώνετε
12 event Sent(address from, address to, uint amount);
13
14 // Ο κώδικας κατασκευαστή εκτελείτε μόνο όταν το συμβόλαιο
15 // δημιουργείτε
16 constructor() {
17 minter = msg.sender;
18 }
19
20 // Αποστολή νέων κρυπτονομισμάτων σε μια διεύθυνση
21 // Μπορεί να κληθεί μόνο από τον συντάκτη του συμβολαίου
22 function mint(address receiver, uint amount) public {
23 require(msg.sender == minter);
24 require(amount < 1e60);
25 balances[receiver] += amount;
26 }
27
28 // Αποστολή υπαρχόντων κρυπτονομσμάτων
29 // από οποιονδήποτε επικαλεστεί τη διεύθυνση
30 function send(address receiver, uint amount) public {
31 require(amount <= balances[msg.sender], "Insufficient balance.");
32 balances[msg.sender] -= amount;
33 balances[receiver] += amount;
34 emit Sent(msg.sender, receiver, amount);
35 }
36}
Εμφάνιση όλων
Αντιγραφή

Αυτό το παράδειγμα θα σας δώσει ένα δείγμα σύνταξης συμβολαίου με τη Solidity. Για περισσότερη λεπτομερή περιγραφή των λειτουργιών και των μεταβλητών, δείτε την τεκμηρίωση(opens in a new tab).

Η Vyper

  • Κοινά χαρακτηριστικά με τη Python
  • Ισχυρή τυποποίηση
  • Μικρός και κατανοητός κώδικας μεταγλώττισης
  • Αποτελεσματική παραγωγή bytecode
  • Έχει εσκεμμένα λιγότερα χαρακτηριστικά από τη Solidity με στόχο να καταστήσει τα συμβόλαια ασφαλέστερα και ευκολότερα στον έλεγχο. Η Vyper δεν υποστηρίζει:
    • Τροποποιητές
    • Κληρονομικότητα
    • Ενσωματωμένο συναρμολογητή
    • Υπερφόρτωση μεθόδων
    • Υπερφόρτωση τελεστών
    • Επανάληψη κλήσεων
    • Επανάληψη βρόγχων χωρίς όριο
    • Δυαδικά καθορισμένα σημεία

Για περισσότερες πληροφορίες, διαβάστε το σκεπτικό της Vyper(opens in a new tab).

Παράδειγμα

1# Ανοιχτή δημοπρασία
2
3# Παράμετροι δημοπρασίας
4# Ο δικαιούχος λαμβάνει χρήματα από τον υψηλότερο πλειοδότη
5beneficiary: public(address)
6auctionStart: public(uint256)
7auctionEnd: public(uint256)
8
9# Τρέχουσα κατάσταση δημοπρασίας
10highestBidder: public(address)
11highestBid: public(uint256)
12
13# Εάν οριστεί σε αληθές (true) στο τέλος, δεν επιτρέπει αλλαγές
14ended: public(bool)
15
16# Παρακολουθήστε τις επιστροφές των προσφορών, ώστε να ακολουθήσουμε το μοτίβο ανάληψης
17pendingReturns: public(HashMap[address, uint256])
18
19# Δημιουργία απλού πλειστηριασμού με `_bidding_time`
20# χρόνος υποβολής προσφορών για λογαριασμό της
21# διεύθυνσης δικαιούχου `_beneficiary`.
22@external
23def __init__(_beneficiary: address, _bidding_time: uint256):
24 self.beneficiary = _beneficiary
25 self.auctionStart = block.timestamp
26 self.auctionEnd = self.auctionStart + _bidding_time
27
28# Υποβολή προσφορών στη δημοπρασία με αποστολή της αξίας
29# μαζί με τη συναλλαγή.
30# Το ποσό θα επιστραφεί μόνο εάν
31# δεν κερδηθεί η δημοπρασία.
32@external
33@payable
34def bid():
35 # Έλεγχος εάν έληξε ο χρόνος υποβολής προσφοράς.
36 assert block.timestamp < self.auctionEnd
37 # Έλεγχος εάν η προσφορά είναι αρκετή
38 assert msg.value > self.highestBid
39 # Παρακολούθηση της επιστροφής της προηγούμενης υψηλής προσφοράς
40 self.pendingReturns[self.highestBidder] += self.highestBid
41 # Παρακολούθηση νέας υψηλότερης προσφοράς
42 self.highestBidder = msg.sender
43 self.highestBid = msg.value
44
45# Ανάληψη προηγούμενης επιστρεφόμενης προσφοράς. Το μοτίβο ανάληψης
46# χρησιμοποιείται για αποφυγή σφαλμάτων ασφαλείας. Εάν οι επιστροφές έγιναν απευθείας και
47# στάλθηκαν ως μέρος της προσφοράς(), ένα κακόβουλο συμβόλαιο μπορεί να
48# εμποδίσει αυτές τις επιστροφές και τα κομμάτια να ολοκληρωθούν.
49@external
50def withdraw():
51 pending_amount: uint256 = self.pendingReturns[msg.sender]
52 self.pendingReturns[msg.sender] = 0
53 send(msg.sender, pending_amount)
54
55# Ολοκλήρωση της δημοπρασίας και αποστολή της
56# υψηλότερης προσφοράς στο δικαιούχο.
57@external
58def endAuction():
59 # Ένας καλός οδηγός κατασκευής μεταβλητών που αλληλεπιδρούν
60 # με άλλα συμβόλαια (π.χ. κλήση μεταβλητών ή μεταφορά ether)
61 # να χωρίζεται σε τρεις φάσεις:
62 # 1. έλεγχος συνθηκών
63 # 2. εκτέλεση ενεργειών (πιθανές αλλαγές συνθηκών)
64 # 3. αλληλεπίδραση με άλλα συμβόλαια
65 # Εάν οι φάσεις αναμειγνύονται, το άλλο συμβόλαιο μπορεί να καλέσει
66 # πίσω στο τρέχων συμβόλαιο και να τροποποιήσει την κατάσταση που
67 # προκάλεσε το θέμα (πληρωμή ether) για να εκτελεστεί πολλές φορές.
68 # Εάν οι εσωτερικές μεταβλητές περιλαμβάνουν σχέση με εξωτερικά
69 # συμβόλαια, πρέπει να ληφθούν ως αλληλεπίδραση με
70 # εξωτερικά συμβόλαια.
71
72 # 1. Προϋποθέσεις
73 # Ελέγξτε το χρόνο λήξης της δημοπρασίας
74 assert block.timestamp >= self.auctionEnd
75 # Ελέγξτε εάν αυτή η μεταβλητή έχει ήδη κληθεί
76 assert not self.ended
77
78 # 2. Επηρεασμοί
79 self.ended = True
80
81 # 3. Αλληλεπίδραση
82 send(self.beneficiary, self.highestBid)
Εμφάνιση όλων
Αντιγραφή

Αυτό το παράδειγμα θα σας δώσει ένα δείγμα σύνταξης συμβολαίου με τη Vyper. Για περισσότερη λεπτομερή περιγραφή των λειτουργιών και των μεταβλητών, δείτε την τεκμηρίωση(opens in a new tab).

Yul και Yul+

Αν είστε καινούργιοι στο Ethereum και δεν έχετε χρησιμοποιήσει τις γλώσσες έξυπνων συμβολαίων ακόμα, σας συνιστούμε να ξεκινήσετε με την Solidity ή τη Vyper. Ξεκινήστε με τις Yul ή Yul+ και μόλις εξοικειωθείτε με τις βέλτιστες πρακτικές ασφάλειας έξυπνων συμβολαίων και τις ιδιαιτερότητες της αλληλεπίδρασης με το EVM.

Yul

  • Μια μέση γλώσσα προγραμματισμού για το Ethereum.
  • Υποστηρίζει το EVM και το Ewasm(opens in a new tab), ένα Ethereum με στοιχεία WebAssembly και σχεδιασμό να λειτουργεί ως κοινός παρονομαστής μεταξύ των δύο πλατφορμών.
  • Ένας καλός στόχος για υψηλού επιπέδου στάδια βελτιστοποίησης που μπορούν να ωφελήσουν εξίσου τις πλατφόρμες EVM και eWASM.

Yul+

  • Μια χαμηλού επιπέδου και ιδιαίτερα αποτελεσματική επέκταση της Yul.
  • Αρχικά σχεδιασμένη για συμβόλαια optimistic rollup.
  • Η Yul+ μπορεί να εξεταστεί ως μια πειραματική πρόταση αναβάθμισης της Yul, προσθέτοντας νέα χαρακτηριστικά.

Παράδειγμα συμβολαίου

Το παρακάτω απλό παράδειγμα υλοποιεί μια λειτουργία ισχύος. Μπορεί να μεταγλωττιστεί με χρήση του solc --strict-assembly --bin input.yul. Το παράδειγμα θα πρέπει να αποθηκευθεί στο αρχείο input.yul.

1{
2 function power(base, exponent) -> result
3 {
4 switch exponent
5 case 0 { result := 1 }
6 case 1 { result := base }
7 default
8 {
9 result := power(mul(base, base), div(exponent, 2))
10 if mod(exponent, 2) { result := mul(base, result) }
11 }
12 }
13 let res := power(calldataload(0), calldataload(32))
14 mstore(0, res)
15 return(0, 32)
16}
Εμφάνιση όλων

Αν είστε ήδη εξοικειωμένοι με τα έξυπνα συμβόλαια, μια πλήρης εφαρμογή ERC20 με τη Yul μπορεί να βρεθεί εδώ(opens in a new tab).

Fe

  • Στατική γλώσσα για την Εικονική Μηχανή του Ethereum (EVM).
  • Εμπνευσμένη από την Python και τη Rust.
  • Στοχεύει στην εύκολη εκμάθηση -- ακόμα και για προγραμματιστές που είναι νέοι στο οικοσύστημα του Ethereum.
  • Η ανάπτυξη της Fe είναι ακόμα στα αρχικά της στάδια, η γλώσσα δημοσίευσε την άλφα έκδοσή της τον Ιανουάριο του 2021.

Παράδειγμα συμβολαίου

Δείτε παρακάτω ένα απλό συμβόλαιο γραμμένο με τη FE.

1type BookMsg = bytes[100]
2
3contract GuestBook:
4 pub guest_book: map<address, BookMsg>
5
6 event Signed:
7 book_msg: BookMsg
8
9 pub def sign(book_msg: BookMsg):
10 self.guest_book[msg.sender] = book_msg
11
12 emit Signed(book_msg=book_msg)
13
14 pub def get_msg(addr: address) -> BookMsg:
15 return self.guest_book[addr].to_mem()
16
Εμφάνιση όλων

Πώς να επιλέξετε

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

Δείτε παρακάτω μερικά στοιχεία προς εξέταση εάν δεν έχετε δοκιμάσει ακόμη καμία από τις γλώσσες:

Τι κάνει σπουδαία τη Solidity;

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

Τι κάνει σπουδαία τη Vyper;

  • Εξαιρετικός τρόπος για να ξεκινήσετε προγραμματισμό με τη Python στη σύνταξη έξυπνων συμβολαίων.
  • Η Vyper έχει μικρότερο αριθμό χαρακτηριστικών που το καθιστά σημαντικό στη γρήγορη πρωτοτυποποίηση ιδεών.
  • Η Vyper στοχεύει να γίνει εύκολη στον έλεγχο και μέγιστα αναγνώσιμη από τον άνθρωπο.

Τι κάνει σπουδαίες τις Yul και Yul+;

  • Απλουστευμένη και λειτουργική γλώσσα χαμηλού επιπέδου.
  • Επιτρέπει να πλησιάσετε πολύ περισσότερο την επεξεργασία του EVM, όπου μπορεί να βοηθήσει στη βελτιστοποίηση του κόστους χρήσης των συμβολαίων.

Συγκρίσεις γλωσσών

Για συγκρίσεις της βασικής σύνταξης, του κύκλου ζωής των συμβολαίων, διεπαφές, χειριστές, των δομών δεδομένων, των λειτουργιών, της ροής ελέγχου και άλλα περισσότερα ελέγξτε το φύλλο σημειώσεων από Auditless(opens in a new tab)

Περισσότερες πληροφορίες

Ήταν χρήσιμο αυτό το άρθρο;