Dive into Move - η γλώσσα προγραμματισμού της αλυσίδας μπλοκ Libra του Facebook

Στη συνέχεια, θα εξετάσουμε λεπτομερώς τα κύρια χαρακτηριστικά της γλώσσας Move και ποιες είναι οι βασικές διαφορές της με μια άλλη, ήδη δημοφιλή γλώσσα για έξυπνα συμβόλαια - τη Solidity (στην πλατφόρμα Ethereum). Το υλικό βασίζεται σε μελέτη της διαθέσιμης διαδικτυακής λευκής βίβλου 26 σελίδων.

Εισαγωγή

Η Move είναι μια εκτελέσιμη γλώσσα bytecode που χρησιμοποιείται για την εκτέλεση συναλλαγών χρήστη και έξυπνων συμβάσεων. Σημειώστε δύο σημεία:

  1. Ενώ το Move είναι μια γλώσσα bytecode που μπορεί να εκτελεστεί απευθείας στην εικονική μηχανή Move, η Solidity (έξυπνη γλώσσα συμβολαίου Ethereum) είναι μια γλώσσα υψηλότερου επιπέδου που καταρτίζεται πρώτα σε bytecode πριν εκτελεστεί σε EVM (Ethereum Virtual Machine).
  2. Το Move μπορεί να χρησιμοποιηθεί όχι μόνο για την εφαρμογή έξυπνων συμβάσεων, αλλά και για προσαρμοσμένες συναλλαγές (περισσότερα για αυτό αργότερα), ενώ το Solidity είναι μια έξυπνη γλώσσα μόνο για συμβόλαια.


Η μετάφραση πραγματοποιήθηκε από την ομάδα έργου INDEX Protocol. Έχουμε ήδη μεταφράσει μεγάλο υλικό που περιγράφει το έργο Libra, τώρα ήρθε η ώρα να δούμε τη γλώσσα Move με λίγο περισσότερες λεπτομέρειες. Η μετάφραση πραγματοποιήθηκε από κοινού με τον Habrauser coolsiu

Ένα βασικό χαρακτηριστικό του Move είναι η δυνατότητα ορισμού προσαρμοσμένων τύπων πόρων με σημασιολογία που βασίζεται στη γραμμική λογική: ένας πόρος δεν μπορεί ποτέ να αντιγραφεί ή να διαγραφεί σιωπηρά, αλλά μόνο να μετακινηθεί. Λειτουργικά, αυτό είναι παρόμοιο με τις δυνατότητες της γλώσσας Rust. Οι τιμές στο Rust μπορούν να αντιστοιχιστούν μόνο σε ένα όνομα τη φορά. Η αντιστοίχιση μιας τιμής σε διαφορετικό όνομα την καθιστά μη διαθέσιμη με το προηγούμενο όνομα.

Dive into Move - η γλώσσα προγραμματισμού της αλυσίδας μπλοκ Libra του Facebook

Για παράδειγμα, το ακόλουθο απόσπασμα κώδικα θα εμφανίσει σφάλμα: Χρήση της μετακινημένης τιμής 'x'. Αυτό συμβαίνει επειδή δεν υπάρχει συλλογή σκουπιδιών στο Rust. Όταν οι μεταβλητές ξεφεύγουν από το πεδίο εφαρμογής, απελευθερώνεται επίσης η μνήμη στην οποία αναφέρονται. Με απλά λόγια, μπορεί να υπάρχει μόνο ένας "κάτοχος" των δεδομένων. Σε αυτό το παράδειγμα x είναι ο αρχικός ιδιοκτήτης και στη συνέχεια y γίνεται ο νέος ιδιοκτήτης. Διαβάστε περισσότερα για αυτή τη συμπεριφορά εδώ.

Αναπαράσταση ψηφιακών περιουσιακών στοιχείων σε ανοιχτά συστήματα

Υπάρχουν δύο ιδιότητες των φυσικών περιουσιακών στοιχείων που είναι δύσκολο να αναπαρασταθούν ψηφιακά:

  • Σπανιότητα (Σπανιότητα, αρχικά έλλειψη). Ο αριθμός των περιουσιακών στοιχείων (εκπομπές) στο σύστημα πρέπει να ελέγχεται. Η αντιγραφή των υπαρχόντων περιουσιακών στοιχείων πρέπει να απαγορευτεί και η δημιουργία νέων είναι μια προνομιακή λειτουργία.
  • Έλεγχος πρόσβασης... Ο συμμετέχων στο σύστημα πρέπει να είναι σε θέση να προστατεύει τα στοιχεία χρησιμοποιώντας πολιτικές ελέγχου πρόσβασης.

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

Για να εξηγήσουμε πώς φτάσαμε σε αυτές τις δύο ιδιότητες, ας ξεκινήσουμε με τις ακόλουθες προτάσεις:

Πρόταση # 1: Ο πιο απλός κανόνας χωρίς σπανιότητα και έλεγχο πρόσβασης

Dive into Move - η γλώσσα προγραμματισμού της αλυσίδας μπλοκ Libra του Facebook

  • G [K]: = n δηλώνει μια ενημέρωση σε έναν αριθμό προσβάσιμο από ένα κλειδί К στην παγκόσμια κατάσταση του blockchain, με νέο νόημα n.
  • συναλλαγή lΑλίκη, 100⟩ σημαίνει να ορίσετε το υπόλοιπο του λογαριασμού της Alice στο 100.

Η παραπάνω λύση έχει πολλά σημαντικά προβλήματα:

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

Πρόταση # 2: Λαμβάνοντας υπόψη το έλλειμμα

Dive into Move - η γλώσσα προγραμματισμού της αλυσίδας μπλοκ Libra του Facebook

Τώρα παρακολουθούμε την κατάσταση έτσι ώστε ο αριθμός των κερμάτων Ka ήταν τουλάχιστον ίσο n πριν από τη συναλλαγή μεταβίβασης. Ωστόσο, ενώ αυτό λύνει το πρόβλημα της σπανιότητας, δεν υπάρχουν πληροφορίες σχετικά με το ποιος μπορεί να στείλει τα νομίσματα της Αλίκης (προς το παρόν, ο καθένας μπορεί να το κάνει αυτό, το κύριο πράγμα είναι να μην σπάσει ο κανόνας του περιορισμού του ποσού).

Πρόταση # 3: Συνδυασμός έλλειψης και ελέγχου πρόσβασης

Dive into Move - η γλώσσα προγραμματισμού της αλυσίδας μπλοκ Libra του Facebook

Λύνουμε αυτό το πρόβλημα με έναν μηχανισμό ψηφιακής υπογραφής verify_sig πριν ελέγξει το υπόλοιπο, πράγμα που σημαίνει ότι η Αλίκη χρησιμοποιεί το ιδιωτικό της κλειδί για να υπογράψει τη συναλλαγή και να επιβεβαιώσει ότι είναι ο κάτοχος των κερμάτων της.

Γλώσσες προγραμματισμού Blockchain

Οι υπάρχουσες γλώσσες blockchain αντιμετωπίζουν τα ακόλουθα προβλήματα (όλες λύθηκαν στο Move (σημείωση: Δυστυχώς, ο συγγραφέας του άρθρου απευθύνεται μόνο στο Ethereum στις συγκρίσεις του, οπότε αξίζει να τις λάβετε μόνο σε αυτό το πλαίσιο. Για παράδειγμα, τα περισσότερα από τα παρακάτω επιλύονται επίσης στο EOS.)):

Έμμεση αναπαράσταση περιουσιακών στοιχείων. Ένα στοιχείο κωδικοποιείται χρησιμοποιώντας έναν ακέραιο, αλλά ένας ακέραιος δεν είναι ο ίδιος με ένα στοιχείο. Στην πραγματικότητα, δεν υπάρχει τύπος ή τιμή που να αντιπροσωπεύει το Bitcoin/Ether/<Any Coin>! Αυτό καθιστά δύσκολη τη σύνταξη προγραμμάτων που χρησιμοποιούν στοιχεία και επιρρεπή σε σφάλματα. Μοτίβα όπως η μεταβίβαση στοιχείων σε/από διαδικασίες ή η αποθήκευση στοιχείων σε δομές απαιτούν ειδική υποστήριξη από τη γλώσσα.

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

Οι χρήστες εκδίδουν τα περιουσιακά τους στοιχεία, μάρκες ERC-20, χρησιμοποιώντας ακέραιους αριθμούς για να καθορίσουν τόσο την αξία όσο και τη συνολική προσφορά. Κάθε φορά που δημιουργούνται νέα μάρκες, ο έξυπνος κωδικός σύμβασης πρέπει να επαληθεύει ανεξάρτητα τη συμμόρφωση με τους κανόνες εκπομπών. Επιπλέον, η έμμεση παρουσίαση των περιουσιακών στοιχείων οδηγεί, σε ορισμένες περιπτώσεις, σε σοβαρά λάθη - επανάληψη, διπλή δαπάνη ή ακόμη και πλήρη απώλεια περιουσιακών στοιχείων.

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

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

Παρόλο που είμαι μεγάλος θαυμαστής του Ethereum, πιστεύω ότι οι ιδιότητες περιουσιακών στοιχείων θα πρέπει να υποστηρίζονται εγγενώς από τη γλώσσα για λόγους ασφαλείας. Συγκεκριμένα, η μεταφορά του Ether σε ένα έξυπνο συμβόλαιο περιλαμβάνει δυναμική αποστολή, η οποία έχει εισαγάγει μια νέα κατηγορία σφαλμάτων γνωστά ως ευπάθειες επανεισόδου. Η δυναμική αποστολή εδώ σημαίνει ότι η λογική εκτέλεσης του κώδικα θα καθοριστεί κατά το χρόνο εκτέλεσης (δυναμική) παρά στο χρόνο μεταγλώττισης (στατικός).

Έτσι, στο Solidity, όταν το συμβόλαιο Α καλεί μια συνάρτηση στο συμβόλαιο Β, το συμβόλαιο Β μπορεί να εκτελέσει κώδικα που δεν προοριζόταν από τον προγραμματιστή του συμβολαίου Α, κάτι που μπορεί να οδηγήσει σε τρωτά σημεία επανεισόδου (Το συμβόλαιο Α λειτουργεί κατά λάθος ως σύμβαση Β για ανάληψη χρημάτων πριν αφαιρεθούν πραγματικά τα υπόλοιπα του λογαριασμού).

Move Language Design Fundamentals

Πόροι πρώτης τάξης

Σε υψηλό επίπεδο, η αλληλεπίδραση μεταξύ ενοτήτων / πόρων / διαδικασιών στη γλώσσα Μετακίνηση είναι πολύ παρόμοια με τη σχέση μεταξύ κλάσεων / αντικειμένων και μεθόδων στις γλώσσες OOP.
Τα modules Move είναι παρόμοια με τα έξυπνα συμβόλαια σε άλλα blockchains. Η ενότητα δηλώνει τύπους πόρων και διαδικασίες που καθορίζουν τους κανόνες για τη δημιουργία, την καταστροφή και την ενημέρωση των δηλωμένων πόρων. Αλλά όλα αυτά είναι απλώς συμβάσεις ("ακατάληπτη γλώσσα”) Σε κίνηση. Θα επεξηγήσουμε αυτό το σημείο λίγο αργότερα.

Ευκαμψία

Το Move προσθέτει ευελιξία στο Libra μέσω του σεναρίου. Κάθε συναλλαγή στο Libra περιλαμβάνει ένα σενάριο, το οποίο είναι ουσιαστικά η βασική διαδικασία της συναλλαγής. Το σενάριο μπορεί να εκτελέσει είτε μία καθορισμένη ενέργεια, για παράδειγμα, πληρωμές σε μια καθορισμένη λίστα παραληπτών ή να επαναχρησιμοποιήσει άλλους πόρους - για παράδειγμα, καλώντας μια διαδικασία στην οποία καθορίζεται η γενική λογική. Αυτός είναι ο λόγος για τον οποίο τα σενάρια συναλλαγών Move προσφέρουν μεγαλύτερη ευελιξία. Ένα σενάριο μπορεί να χρησιμοποιεί τόσο εφάπαξ όσο και επαναλαμβανόμενες συμπεριφορές, ενώ το Ethereum μπορεί να εκτελέσει μόνο επαναλαμβανόμενα σενάρια (καλώντας μία μέθοδο σε μια μέθοδο έξυπνης σύμβασης). Ο λόγος που ονομάζεται "επαναχρησιμοποιήσιμο" είναι επειδή οι λειτουργίες ενός έξυπνου συμβολαίου μπορούν να εκτελεστούν πολλές φορές. (Σημείωση: Το θέμα εδώ είναι πολύ λεπτό. Από τη μία πλευρά, σενάρια συναλλαγών με τη μορφή ψευδο-bytecode υπάρχουν επίσης στο Bitcoin. Από την άλλη πλευρά, όπως καταλαβαίνω, το Move επεκτείνει αυτή τη γλώσσα, στην πραγματικότητα, στο επίπεδο μιας πλήρους γλώσσας έξυπνων συμβολαίων).

Ασφάλεια

Η εκτελέσιμη μορφή Move είναι bytecode, που είναι, αφενός, μια γλώσσα υψηλότερου επιπέδου από τη γλώσσα assembly, αλλά χαμηλότερο επίπεδο από τον πηγαίο κώδικα. Ο bytecode ελέγχεται σε χρόνο εκτέλεσης (on-chain) για πόρους, τύπους και ασφάλεια μνήμης χρησιμοποιώντας έναν επαληθευτή bytecode και στη συνέχεια εκτελείται από τον διερμηνέα. Αυτή η προσέγγιση επιτρέπει στο Move να παρέχει την ασφάλεια του πηγαίου κώδικα, αλλά χωρίς τη διαδικασία μεταγλώττισης και την ανάγκη προσθήκης μεταγλωττιστή στο σύστημα. Το να κάνετε το Move μια γλώσσα bytecode είναι μια πραγματικά καλή λύση. Δεν χρειάζεται να γίνει μεταγλώττιση από την πηγή, όπως συμβαίνει με το Solidity, και δεν υπάρχει λόγος ανησυχίας για πιθανές αποτυχίες ή επιθέσεις στην υποδομή του μεταγλωττιστή.

Επαλήθευση

Στόχος μας είναι να πραγματοποιούμε ελέγχους όσο το δυνατόν πιο εύκολα, αφού όλα αυτά γίνονται on-chain (σημείωση: διαδικτυακά, κατά την εκτέλεση κάθε συναλλαγής, οπότε οποιαδήποτε καθυστέρηση οδηγεί σε επιβράδυνση ολόκληρου του δικτύου), ωστόσο, αρχικά ο σχεδιασμός της γλώσσας είναι έτοιμος να χρησιμοποιήσει εργαλεία στατικής επαλήθευσης εκτός αλυσίδας. Αν και αυτό είναι πιο προτιμότερο, προς το παρόν η ανάπτυξη εργαλείων επαλήθευσης (ως ξεχωριστή εργαλειοθήκη) έχει αναβληθεί για το μέλλον και τώρα υποστηρίζεται μόνο η δυναμική επαλήθευση σε χρόνο εκτέλεσης (on-chain).

Αρθρωτότητα

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

Dive into Move - η γλώσσα προγραμματισμού της αλυσίδας μπλοκ Libra του Facebook

Μετακίνηση επισκόπησης

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

Πληρωμές από ομότιμους

Dive into Move - η γλώσσα προγραμματισμού της αλυσίδας μπλοκ Libra του Facebook

Ο αριθμός των κερμάτων που καθορίζεται σε ποσό θα μεταφερθεί από το υπόλοιπο του αποστολέα στον παραλήπτη.
Υπάρχουν μερικά νέα πράγματα εδώ (που επισημαίνονται με κόκκινο):

  • 0x0: διεύθυνση του λογαριασμού όπου είναι αποθηκευμένη η μονάδα
  • Νόμισμα: όνομα μονάδας
  • Κρυπτονόμισμα: τύπος πόρου
  • Η τιμή του νομίσματος που επιστρέφεται από τη διαδικασία είναι μια τιμή πόρου τύπου 0x0.Currency.Coin
  • μετακίνηση (): η τιμή δεν μπορεί να χρησιμοποιηθεί ξανά
  • αντίγραφο (): η τιμή μπορεί να χρησιμοποιηθεί αργότερα

Ανάλυση του κώδικα: στο πρώτο βήμα, ο αποστολέας καλεί μια διαδικασία που ονομάζεται απόσυρση_αποστολέα από μια μονάδα αποθηκευμένη στο 0x0. Νόμισμα. Στο δεύτερο βήμα, ο αποστολέας μεταφέρει χρήματα στον παραλήπτη μετακινώντας την αξία του πόρου του νομίσματος στη διαδικασία κατάθεσης της ενότητας 0x0. Νόμισμα.

Ακολουθούν τρία παραδείγματα σφαλμάτων στον κώδικα που θα απορριφθούν με ελέγχους:
Διπλότυπα κεφάλαια αλλάζοντας την κλήση κίνηση (νόμισμα) επί αντίγραφο (νόμισμα). Οι πόροι μπορούν να μετακινηθούν μόνο. Προσπάθεια αντιγραφής του ποσού ενός πόρου (για παράδειγμα, καλώντας αντίγραφο (νόμισμα) στο παραπάνω παράδειγμα) θα οδηγήσει σε σφάλμα κατά τον έλεγχο του bytecode.

Επαναχρησιμοποίηση κεφαλαίων με προσδιορισμό κίνηση (νόμισμα) δύο φορές . Προσθήκη γραμμής 0x0.Νόμισμα.κατάθεση (αντίγραφο (κάποιος_άλλος_πληρωτής), μετακίνηση (κέρμα)) για παράδειγμα, τα παραπάνω θα επιτρέψουν στον αποστολέα να «ξοδέψει» τα νομίσματα δύο φορές - την πρώτη φορά με τον δικαιούχο και τη δεύτερη με κάποιος_άλλος_πληρωτής. Αυτή είναι μια ανεπιθύμητη συμπεριφορά που δεν είναι δυνατή με ένα φυσικό περιουσιακό στοιχείο. Ευτυχώς, το Move θα απορρίψει αυτό το πρόγραμμα.

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

Μονάδα νομίσματος

Dive into Move - η γλώσσα προγραμματισμού της αλυσίδας μπλοκ Libra του Facebook

Κάθε λογαριασμός μπορεί να περιέχει 0 ή περισσότερες ενότητες (που απεικονίζονται ως πλαίσια) και μία ή περισσότερες τιμές πόρων (που απεικονίζονται ως κύλινδροι). Για παράδειγμα, ένας λογαριασμός στο 0x0 περιέχει ενότητα 0x0. Νόμισμα και την τιμή του τύπου πόρου 0x0.Νόμισμα.Κέρμα. Λογαριασμός στη διεύθυνση 0x1 έχει δύο πόρους και μία ενότητα. Λογαριασμός στη διεύθυνση 0x2 έχει δύο ενότητες και μία αξία πόρων.

Μερικές στιγμές:

  • Το σενάριο συναλλαγής είναι ατομικό - είτε εκτελείται πλήρως είτε καθόλου.
  • Μια λειτουργική μονάδα είναι ένα μακρόβιο κομμάτι κώδικα που είναι παγκοσμίως προσβάσιμο.
  • Η καθολική κατάσταση είναι δομημένη ως πίνακας κατακερματισμού, όπου το κλειδί είναι η διεύθυνση του λογαριασμού
  • Οι λογαριασμοί δεν μπορούν να περιέχουν περισσότερες από μία τιμές πόρων ενός δεδομένου τύπου και όχι περισσότερες από μία λειτουργικές μονάδες με ένα δεδομένο όνομα (λογαριασμός στο 0x0 δεν μπορεί να περιέχει πρόσθετο πόρο 0x0.Νόμισμα.Κέρμα ή άλλη ενότητα με το όνομα Νόμισμα)
  • Η διεύθυνση της δηλωμένης ενότητας είναι μέρος του τύπου (0x0.Νόμισμα.Κέρμα и 0x1.Νόμισμα.Κέρμα είναι ξεχωριστοί τύποι που δεν μπορούν να χρησιμοποιηθούν εναλλακτικά)
  • Οι προγραμματιστές μπορούν να αποθηκεύσουν πολλαπλές παρουσίες αυτού του τύπου πόρου σε έναν λογαριασμό ορίζοντας τον προσαρμοσμένο πόρο τους - (πόρος TwoCoins {c1: 0x0.Currency.Coin, c2: 0x0.Currency.Coin})
  • Μπορείτε να αναφέρετε έναν πόρο με το όνομά του χωρίς διενέξεις, για παράδειγμα μπορείτε να ανατρέξετε σε δύο πόρους χρησιμοποιώντας TwoCoins.c1 и TwoCoins.c2.

Ανακοίνωση πόρων νομισμάτων

Dive into Move - η γλώσσα προγραμματισμού της αλυσίδας μπλοκ Libra του Facebook
Ονομασία ενότητας Νόμισμα και έναν τύπο πόρου με όνομα Κρυπτονόμισμα

Μερικές στιγμές:

  • Κρυπτονόμισμα είναι μια δομή με ένα πεδίο τύπου u64 (64-bit ανυπόγραφο ακέραιος αριθμός)
  • Μόνο διαδικασίες ενότητας Νόμισμα μπορεί να δημιουργήσει ή να καταστρέψει τιμές τύπου Κρυπτονόμισμα.
  • Άλλες λειτουργικές μονάδες και σενάρια μπορούν να γράψουν ή να αναφέρουν το πεδίο τιμών μόνο μέσω δημόσιων διαδικασιών που παρέχονται από τη λειτουργική μονάδα.

Πώληση κατάθεσης

Dive into Move - η γλώσσα προγραμματισμού της αλυσίδας μπλοκ Libra του Facebook

Αυτή η διαδικασία δέχεται έναν πόρο Κρυπτονόμισμα ως είσοδο και το συνδυάζει με τον πόρο Κρυπτονόμισμααποθηκευμένο στο λογαριασμό του παραλήπτη:

  1. Καταστροφή του πόρου εισόδου Coin και καταγραφή της αξίας του.
  2. Λήψη συνδέσμου προς έναν μοναδικό πόρο Coin που είναι αποθηκευμένος στο λογαριασμό του παραλήπτη.
  3. Αλλαγή της τιμής του αριθμού των νομισμάτων με την τιμή που πέρασε στην παράμετρο κατά την κλήση της διαδικασίας.

Μερικές στιγμές:

  • Αποσυσκευάστε, BorrowGlobal - ενσωματωμένες διαδικασίες
  • Ανοίγω τις αποσκευές Αυτός είναι ο μόνος τρόπος διαγραφής ενός πόρου τύπου T. Η διαδικασία παίρνει έναν πόρο ως είσοδο, τον καταστρέφει και επιστρέφει την τιμή που σχετίζεται με τα πεδία του πόρου.
  • BorrowGlobal λαμβάνει μια διεύθυνση ως είσοδο και επιστρέφει μια αναφορά σε μια μοναδική παρουσία του T που δημοσιεύεται (που ανήκει) σε αυτήν τη διεύθυνση
  • &mut Coin αυτός είναι ένας σύνδεσμος προς τον πόρο Κρυπτονόμισμα

Υλοποίηση αποστολής_από_αποστολέα

Dive into Move - η γλώσσα προγραμματισμού της αλυσίδας μπλοκ Libra του Facebook

Αυτή η διαδικασία:

  1. Λαμβάνει έναν σύνδεσμο προς έναν μοναδικό πόρο Κρυπτονόμισμα, συνδέεται με τον λογαριασμό του αποστολέα
  2. Μειώνει την αξία ενός πόρου Κρυπτονόμισμα μέσω του συνδέσμου για το καθορισμένο ποσό
  3. Δημιουργεί και επιστρέφει έναν νέο πόρο Κρυπτονόμισμα με ενημερωμένο υπόλοιπο.

Μερικές στιγμές:

  • Κατάθεση μπορεί να προκληθεί από οποιονδήποτε, αλλά απόσυρση_αποστολέα έχει πρόσβαση μόνο στα νομίσματα του λογαριασμού κλήσης
  • GetTxnSenderAddress παρόμοιο με msg.sender στο Solidity
  • Απόρριψη Εκτός αν παρόμοιο με απαιτούν στο Solidity. Εάν αυτός ο έλεγχος αποτύχει, η συναλλαγή διακόπτεται και όλες οι αλλαγές επαναφέρονται.
  • πακέτο είναι επίσης μια ενσωματωμένη διαδικασία που δημιουργεί έναν νέο πόρο τύπου Τ.
  • Καθώς Ανοίγω τις αποσκευές, πακέτο μπορεί να κληθεί μόνο μέσα στη μονάδα όπου περιγράφεται ο πόρος T

Συμπέρασμα

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

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο