Γλώσσες προγραμματισμού Έξυπνων Συμβολαίων
Τελευταία επεξεργασία: @mr_giorgos, 17 Ιουνίου 2024
Ένα μεγάλο πλεονέκτημα του Ethereum είναι ότι τα έξυπνα συμβόλαια μπορούν να δημιουργηθούν με φιλικές στη χρήση γλώσσες προγραμματισμού. Εάν έχετε εμπειρία με την Python ή παρόμοια γλώσσα, μπορείτε να βρείτε μια γλώσσα με οικεία προς εσάς σύνταξη.
Οι δύο κεντρικές και ενεργές γλώσσες είναι:
- Solidity
- Vyper
Το Remix IDE παρέχει ένα ολοκληρωμένο περιβάλλον ανάπτυξης για τη δημιουργία και τη δοκιμή συμβολαίων τόσο στο Solidity όσο και στο Vyper. Δοκιμάστε το Remix IDE του προγράμματος περιήγησης για να ξεκινήσετε την κωδικοποίηση.
Οι πιο έμπειροι προγραμματιστές μπορούν να χρησιμοποιήσουν τη Yul, μια ενδιάμεση γλώσσα για την εικονική μηχανή Ethereum, ή τη Yul+ μια επέκταση της Yul.
Αν είστε περίεργοι και σας αρέσει να βοηθάτε με τη δοκιμή νέων γλωσσών που είναι ακόμα υπό ανάπτυξη, μπορείτε να πειραματιστείτε με την Fe, μια νέα γλώσσα για έξυπνα συμβόλαια η οποία είναι ακόμα στα σπάργανα.
Προαπαιτούμενα
Τυχών προηγούμενη εμπειρία με γλώσσες προγραμματισμού, ειδικά με τις JavaScript ή Python, μπορεί να σας βοηθήσει σημαντικά στον προγραμματισμό των έξυπνων συμβολαίων. Σας συνιστούμε επίσης να κατανοήσετε τα έξυπνα συμβόλαια ως έννοια πριν ξεκινήσετε με τη σύγκριση γλωσσών. Εισαγωγή στα έξυπνα συμβόλαια.
Η Solidity
- Αντικειμενοστραφής, υψηλού επιπέδου γλώσσα προγραμματισμού για την υλοποίηση έξυπνων συμβολαίων.
- Γλώσσα Curly-bracket βαθιά επηρεασμένη από την C++.
- Στατική πληκτρολόγηση (ο τύπος μια μεταβλητής γνωστοποιείται μετά τη μεταγλώττιση).
- Υποστήριξη:
- Κληρονομικότητα (μπορείτε να επεκτείνετε άλλα συμβόλαια).
- Βιβλιοθήκες (μπορείτε να δημιουργήσετε επαναχρησιμοποιήσιμο κώδικα που μπορείτε να καλέσετε από διαφορετικά συμβόλαια – όπως κάποιες στατικές λειτουργίες σε μια στατική κλάση σε αντικείμενο άλλης γλώσσας προγραμματισμού).
- Σύνθετοι τύποι καθορισμένοι από τον χρήστη.
Σημαντικοί σύνδεσμοι
- Έγγραφα
- Πύλη γλώσσας Solidity
- Παραδείγματα με Solidity
- GitHub
- Το Solidity Gitter Chatroom συνδέθηκε στο Solidity Matrix Chatroom
- Φύλλο σημειώσεων
- Ιστολόγιο της Solidity
- Solidity Twitter
Παράδειγμα συμβολαίου
1// Αναγνωριστικό-Άδεια-SPDX: GPL-3.02pragma solidity >= 0.7.0;34contract Coin {5 // Η λέξη-κλειδί "public" δημιουργεί μεταβλητές6 // αποδεκτές από άλλα συμβόλαια7 address public minter;8 mapping (address => uint) public balances;910 // Τα γεγονότα επιτρέπουν στου πελάτες να αντιδράσει σε συγκεκριμένες11 // αλλαγές συμβολαίων που δηλώνετε12 event Sent(address from, address to, uint amount);1314 // Ο κώδικας κατασκευαστή εκτελείτε μόνο όταν το συμβόλαιο15 // δημιουργείτε16 constructor() {17 minter = msg.sender;18 }1920 // Αποστολή νέων κρυπτονομισμάτων σε μια διεύθυνση21 // Μπορεί να κληθεί μόνο από τον συντάκτη του συμβολαίου22 function mint(address receiver, uint amount) public {23 require(msg.sender == minter);24 require(amount < 1e60);25 balances[receiver] += amount;26 }2728 // Αποστολή υπαρχόντων κρυπτονομσμάτων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. Για περισσότερη λεπτομερή περιγραφή των λειτουργιών και των μεταβλητών, δείτε την τεκμηρίωση.
Η Vyper
- Κοινά χαρακτηριστικά με τη Python
- Ισχυρή τυποποίηση
- Μικρός και κατανοητός κώδικας μεταγλώττισης
- Αποτελεσματική παραγωγή bytecode
- Έχει εσκεμμένα λιγότερα χαρακτηριστικά από τη Solidity με στόχο να καταστήσει τα συμβόλαια ασφαλέστερα και ευκολότερα στον έλεγχο. Η Vyper δεν υποστηρίζει:
- Τροποποιητές
- Κληρονομικότητα
- Ενσωματωμένο συναρμολογητή
- Υπερφόρτωση μεθόδων
- Υπερφόρτωση τελεστών
- Επανάληψη κλήσεων
- Επανάληψη βρόγχων χωρίς όριο
- Δυαδικά καθορισμένα σημεία
Για περισσότερες πληροφορίες, διαβάστε το σκεπτικό της Vyper.
Σημαντικοί σύνδεσμοι
- Τεκμηρίωση
- Παραδείγματα Vyper
- Περισσότερη Vyper από παράδειγμα
- GitHub
- Συνομιλία στο Discord της κοινότητας Vyper
- Φύλλο σημειώσεων
- Πλαίσια και εργαλεία ανάπτυξης έξυπνων συμβολαίων για Vyper
- VyperPunk - μάθετε να ασφαλίζετε και να χακάρετε τα έξυπνα συμβόλαια Vyper
- VyperExamples - παραδείγματα ευπάθειας Vyper
- Vyper Hub για ανάπτυξη
- Παραδείγματα μεγαλύτερων επιτυχιών των έξυπνων συμβολαίων Vyper
- Καταπληκτικοί πόροι επιμελημένοι από τη Vyper
Παράδειγμα
1# Ανοιχτή δημοπρασία23# Παράμετροι δημοπρασίας4# Ο δικαιούχος λαμβάνει χρήματα από τον υψηλότερο πλειοδότη5beneficiary: public(address)6auctionStart: public(uint256)7auctionEnd: public(uint256)89# Τρέχουσα κατάσταση δημοπρασίας10highestBidder: public(address)11highestBid: public(uint256)1213# Εάν οριστεί σε αληθές (true) στο τέλος, δεν επιτρέπει αλλαγές14ended: public(bool)1516# Παρακολουθήστε τις επιστροφές των προσφορών, ώστε να ακολουθήσουμε το μοτίβο ανάληψης17pendingReturns: public(HashMap[address, uint256])1819# Δημιουργία απλού πλειστηριασμού με `_bidding_time`20# χρόνος υποβολής προσφορών για λογαριασμό της21# διεύθυνσης δικαιούχου `_beneficiary`.22@external23def __init__(_beneficiary: address, _bidding_time: uint256):24 self.beneficiary = _beneficiary25 self.auctionStart = block.timestamp26 self.auctionEnd = self.auctionStart + _bidding_time2728# Υποβολή προσφορών στη δημοπρασία με αποστολή της αξίας29# μαζί με τη συναλλαγή.30# Το ποσό θα επιστραφεί μόνο εάν31# δεν κερδηθεί η δημοπρασία.32@external33@payable34def bid():35 # Έλεγχος εάν έληξε ο χρόνος υποβολής προσφοράς.36 assert block.timestamp < self.auctionEnd37 # Έλεγχος εάν η προσφορά είναι αρκετή38 assert msg.value > self.highestBid39 # Παρακολούθηση της επιστροφής της προηγούμενης υψηλής προσφοράς40 self.pendingReturns[self.highestBidder] += self.highestBid41 # Παρακολούθηση νέας υψηλότερης προσφοράς42 self.highestBidder = msg.sender43 self.highestBid = msg.value4445# Ανάληψη προηγούμενης επιστρεφόμενης προσφοράς. Το μοτίβο ανάληψης46# χρησιμοποιείται για αποφυγή σφαλμάτων ασφαλείας. Εάν οι επιστροφές έγιναν απευθείας και47# στάλθηκαν ως μέρος της προσφοράς(), ένα κακόβουλο συμβόλαιο μπορεί να48# εμποδίσει αυτές τις επιστροφές και τα κομμάτια να ολοκληρωθούν.49@external50def withdraw():51 pending_amount: uint256 = self.pendingReturns[msg.sender]52 self.pendingReturns[msg.sender] = 053 send(msg.sender, pending_amount)5455# Ολοκλήρωση της δημοπρασίας και αποστολή της56# υψηλότερης προσφοράς στο δικαιούχο.57@external58def endAuction():59 # Ένας καλός οδηγός κατασκευής μεταβλητών που αλληλεπιδρούν60 # με άλλα συμβόλαια (π.χ. κλήση μεταβλητών ή μεταφορά ether)61 # να χωρίζεται σε τρεις φάσεις:62 # 1. έλεγχος συνθηκών63 # 2. εκτέλεση ενεργειών (πιθανές αλλαγές συνθηκών)64 # 3. αλληλεπίδραση με άλλα συμβόλαια65 # Εάν οι φάσεις αναμειγνύονται, το άλλο συμβόλαιο μπορεί να καλέσει66 # πίσω στο τρέχων συμβόλαιο και να τροποποιήσει την κατάσταση που67 # προκάλεσε το θέμα (πληρωμή ether) για να εκτελεστεί πολλές φορές.68 # Εάν οι εσωτερικές μεταβλητές περιλαμβάνουν σχέση με εξωτερικά69 # συμβόλαια, πρέπει να ληφθούν ως αλληλεπίδραση με70 # εξωτερικά συμβόλαια.7172 # 1. Προϋποθέσεις73 # Ελέγξτε το χρόνο λήξης της δημοπρασίας74 assert block.timestamp >= self.auctionEnd75 # Ελέγξτε εάν αυτή η μεταβλητή έχει ήδη κληθεί76 assert not self.ended7778 # 2. Επηρεασμοί79 self.ended = True8081 # 3. Αλληλεπίδραση82 send(self.beneficiary, self.highestBid)Εμφάνιση όλωνΑντιγραφή
Αυτό το παράδειγμα θα σας δώσει ένα δείγμα σύνταξης συμβολαίου με τη Vyper. Για περισσότερη λεπτομερή περιγραφή των λειτουργιών και των μεταβλητών, δείτε την τεκμηρίωση.
Yul και Yul+
Αν είστε καινούργιοι στο Ethereum και δεν έχετε χρησιμοποιήσει τις γλώσσες έξυπνων συμβολαίων ακόμα, σας συνιστούμε να ξεκινήσετε με την Solidity ή τη Vyper. Ξεκινήστε με τις Yul ή Yul+ και μόλις εξοικειωθείτε με τις βέλτιστες πρακτικές ασφάλειας έξυπνων συμβολαίων και τις ιδιαιτερότητες της αλληλεπίδρασης με το EVM.
Yul
- Μια μέση γλώσσα προγραμματισμού για το Ethereum.
- Υποστηρίζει το EVM και το Ewasm, ένα Ethereum με στοιχεία WebAssembly και σχεδιασμό να λειτουργεί ως κοινός παρονομαστής μεταξύ των δύο πλατφορμών.
- Ένας καλός στόχος για υψηλού επιπέδου στάδια βελτιστοποίησης που μπορούν να ωφελήσουν εξίσου τις πλατφόρμες EVM και eWASM.
Yul+
- Μια χαμηλού επιπέδου και ιδιαίτερα αποτελεσματική επέκταση της Yul.
- Αρχικά σχεδιασμένη για συμβόλαια optimistic rollup.
- Η Yul+ μπορεί να εξεταστεί ως μια πειραματική πρόταση αναβάθμισης της Yul, προσθέτοντας νέα χαρακτηριστικά.
Σημαντικοί σύνδεσμοι
Παράδειγμα συμβολαίου
Το παρακάτω απλό παράδειγμα υλοποιεί μια λειτουργία ισχύος. Μπορεί να μεταγλωττιστεί με χρήση του solc --strict-assembly --bin input.yul
. Το παράδειγμα θα πρέπει να αποθηκευθεί στο αρχείο input.yul.
1{2 function power(base, exponent) -> result3 {4 switch exponent5 case 0 { result := 1 }6 case 1 { result := base }7 default8 {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 μπορεί να βρεθεί εδώ.
Fe
- Στατική γλώσσα για την Εικονική Μηχανή του Ethereum (EVM).
- Εμπνευσμένη από την Python και τη Rust.
- Στοχεύει στην εύκολη εκμάθηση -- ακόμα και για προγραμματιστές που είναι νέοι στο οικοσύστημα του Ethereum.
- Η ανάπτυξη της Fe είναι ακόμα στα αρχικά της στάδια, η γλώσσα δημοσίευσε την άλφα έκδοσή της τον Ιανουάριο του 2021.
Σημαντικοί σύνδεσμοι
Παράδειγμα συμβολαίου
Δείτε παρακάτω ένα απλό συμβόλαιο γραμμένο με τη FE.
1type BookMsg = bytes[100]23contract GuestBook:4 pub guest_book: map<address, BookMsg>56 event Signed:7 book_msg: BookMsg89 pub def sign(book_msg: BookMsg):10 self.guest_book[msg.sender] = book_msg1112 emit Signed(book_msg=book_msg)1314 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