Πώς να γράψετε ένα έξυπνο συμβόλαιο WebAssembly στο δίκτυο Ontology; Μέρος 1: Σκουριά

Πώς να γράψετε ένα έξυπνο συμβόλαιο WebAssembly στο δίκτυο Ontology; Μέρος 1: Σκουριά

Η τεχνολογία Ontology Wasm μειώνει το κόστος της μετεγκατάστασης έξυπνων συμβολαίων dApp με πολύπλοκη επιχειρηματική λογική στο blockchain, εμπλουτίζοντας έτσι σημαντικά το οικοσύστημα dApp.

Τώρα Οντολογία Wasm Ταυτόχρονα υποστηρίζει την ανάπτυξη Rust και C++. Η γλώσσα Rust υποστηρίζει καλύτερα το Wasm και ο bytecode που δημιουργείται είναι απλούστερος, γεγονός που μπορεί να μειώσει περαιτέρω το κόστος των κλήσεων συμβολαίου. Ετσι, πώς να χρησιμοποιήσετε το Rust για να αναπτύξετε ένα συμβόλαιο στο δίκτυο Ontology;

Ανάπτυξη συμβολαίου WASM με τη Rust

Δημιουργήστε ένα συμβόλαιο

Φορτίο είναι ένα καλό εργαλείο δημιουργίας έργων και διαχείρισης πακέτων για την ανάπτυξη Rust, το οποίο βοηθά τους προγραμματιστές να οργανώσουν καλύτερα την αλληλεπίδραση κώδικα και βιβλιοθηκών τρίτων. Για να δημιουργήσετε ένα νέο συμβόλαιο Ontology Wasm, απλώς εκτελέστε την ακόλουθη εντολή:

Πώς να γράψετε ένα έξυπνο συμβόλαιο WebAssembly στο δίκτυο Ontology; Μέρος 1: Σκουριά

Η δομή του έργου που δημιουργεί:

Πώς να γράψετε ένα έξυπνο συμβόλαιο WebAssembly στο δίκτυο Ontology; Μέρος 1: Σκουριά

Το αρχείο Cargo.toml χρησιμοποιείται για τη ρύθμιση βασικών πληροφοριών έργου και εξαρτημένων πληροφοριών βιβλιοθήκης. Η ενότητα [lib] του αρχείου πρέπει να οριστεί σε crate-type = ["cdylib"]. Το αρχείο lib.rs χρησιμοποιείται για τη σύνταξη του λογικού κώδικα της σύμβασης. Επιπλέον, πρέπει να προσθέσετε παραμέτρους εξάρτησης στην ενότητα [εξαρτήσεις] του αρχείου διαμόρφωσης Cargo.toml:

Πώς να γράψετε ένα έξυπνο συμβόλαιο WebAssembly στο δίκτυο Ontology; Μέρος 1: Σκουριά

Με αυτήν την εξάρτηση, οι προγραμματιστές μπορούν να καλούν διεπαφές που αλληλεπιδρούν με το blockchain Ontology και εργαλεία όπως η παράμετρος σειριοποίησης.

Λειτουργία καταχώρησης σύμβασης

Κάθε πρόγραμμα έχει μια συνάρτηση εισόδου, όπως η κύρια συνάρτηση που συνήθως βλέπουμε, αλλά το συμβόλαιο δεν έχει κύρια λειτουργία. Όταν ένα συμβόλαιο Wasm αναπτύσσεται χρησιμοποιώντας Rust, η προεπιλεγμένη συνάρτηση κλήσης χρησιμοποιείται ως συνάρτηση εισόδου για τη χρήση του συμβολαίου. Το όνομα μιας συνάρτησης στο Rust θα είναι ασαφές κατά τη μεταγλώττιση του πηγαίου κώδικα του Rust σε bytecode που μπορεί να εκτελεστεί από μια εικονική μηχανή. Για να αποτρέψει τον μεταγλωττιστή να δημιουργήσει περιττό κώδικα και να μειώσει το μέγεθος του συμβολαίου, η συνάρτηση invoke προσθέτει τον σχολιασμό #[no_mangle].

Πώς η συνάρτηση invoke λαμβάνει παραμέτρους για την εκτέλεση μιας συναλλαγής;

Η βιβλιοθήκη ontio_std παρέχει μια συνάρτηση χρόνου εκτέλεσης::input() για να πάρει τις παραμέτρους για την εκτέλεση μιας συναλλαγής. Οι προγραμματιστές μπορούν να χρησιμοποιήσουν το ZeroCopySource για να αποσειροποιήσουν τον πίνακα byte που προκύπτει. Στην οποία ο πρώτος πίνακας byte που διαβάζεται είναι το όνομα της μεθόδου κλήσης, ακολουθούμενο από τις παραμέτρους της μεθόδου.

Πώς επιστρέφεται το αποτέλεσμα της εκτέλεσης της σύμβασης;

Η συνάρτηση runtime::ret που παρέχεται από τη βιβλιοθήκη ontio_std επιστρέφει το αποτέλεσμα της εκτέλεσης μιας μεθόδου.

Η ολοκληρωμένη συνάρτηση κλήσης μοιάζει με αυτό:

Πώς να γράψετε ένα έξυπνο συμβόλαιο WebAssembly στο δίκτυο Ontology; Μέρος 1: Σκουριά

Σειρά και αποσειριοποίηση δεδομένων συμβολαίων

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

Η βιβλιοθήκη ontio_std παρέχει διασυνδέσεις αποκωδικοποιητή και κωδικοποιητή για σειριοποίηση και αποσειριοποίηση δεδομένων. Τα πεδία μιας δομής υλοποιούν επίσης τις διεπαφές αποκωδικοποιητή και κωδικοποιητή, έτσι ώστε η δομή να μπορεί να σειριοποιηθεί και να αποσειροποιηθεί. Απαιτούνται παρουσίες της κλάσης Sink όταν σειριοποιούνται διάφοροι τύποι δεδομένων. Μια παρουσία της κλάσης Sink έχει μια buf πεδίου τύπου set που αποθηκεύει τα δεδομένα τύπου byte και όλα τα σειριακά δεδομένα αποθηκεύονται σε buf.

Για δεδομένα σταθερού μήκους (π.χ.: byte, u16, u32, u64, κ.λπ.), τα δεδομένα μετατρέπονται απευθείας σε πίνακα byte και στη συνέχεια αποθηκεύονται σε buf. για δεδομένα μη σταθερού μήκους, το μήκος πρέπει πρώτα να σειριοποιηθεί και μετά τα Ddata (για παράδειγμα, οι ανυπόγραφοι ακέραιοι άγνωστου μεγέθους, συμπεριλαμβανομένων των u16, u32 ή u64, κ.λπ.).

Η αποσειροποίηση είναι ακριβώς το αντίθετο. Για κάθε μέθοδο σειριοποίησης, υπάρχει μια αντίστοιχη μέθοδος αποσειριοποίησης. Η αποσειροποίηση απαιτεί τη χρήση παρουσιών της κλάσης Source. Αυτή η παρουσία κλάσης έχει δύο πεδία buf και pos. Το Buf χρησιμοποιείται για την αποθήκευση των δεδομένων που πρόκειται να αποσειροποιηθούν και το pos χρησιμοποιείται για την αποθήκευση της τρέχουσας θέσης ανάγνωσης. Όταν διαβάζεται ένας συγκεκριμένος τύπος δεδομένων, εάν γνωρίζετε το μήκος του, μπορείτε να το διαβάσετε απευθείας, για δεδομένα άγνωστου μήκους—διαβάστε πρώτα το μήκος και μετά διαβάστε τα περιεχόμενα.

Πρόσβαση και ενημέρωση δεδομένων στην αλυσίδα

ontology-wasm-cdt-rust - ενθυλακώθηκε μια λειτουργική μέθοδος για την εργασία με δεδομένα στην αλυσίδα, η οποία είναι βολική για τους προγραμματιστές να εφαρμόσουν λειτουργίες όπως η προσθήκη, η διαγραφή, η αλλαγή και η αναζήτηση δεδομένων στην αλυσίδα ως εξής:

  • βάση δεδομένων::get(key) - χρησιμοποιείται για να ζητήσει δεδομένα από την αλυσίδα και το κλειδί ζητά την υλοποίηση της διεπαφής AsRef.
  • βάση δεδομένων::put(κλειδί, τιμή) - χρησιμοποιείται για την αποθήκευση δεδομένων στο δίκτυο. Το Key ζητά την υλοποίηση της διεπαφής AsRef και η τιμή ζητά την υλοποίηση της διεπαφής Encoder.
  • βάση δεδομένων::delete(key) - χρησιμοποιείται για την αφαίρεση δεδομένων από την αλυσίδα και το κλειδί ζητά την υλοποίηση της διεπαφής AsRef.

Δοκιμή συμβολαίου

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

Εντοπισμός σφαλμάτων συμβολαίου

κονσόλα::debug(msg) εμφανίζει πληροφορίες εντοπισμού σφαλμάτων κατά τον εντοπισμό σφαλμάτων μιας σύμβασης. Οι πληροφορίες μηνυμάτων θα προστεθούν στο αρχείο καταγραφής κόμβου. Απαραίτητη προϋπόθεση είναι να ρυθμίσετε το επίπεδο αρχείου καταγραφής σε λειτουργία εντοπισμού σφαλμάτων όταν εκτελείται ο τοπικός κόμβος δοκιμής Οντολογίας.

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

Το άρθρο μεταφράστηκε από τους συντάκτες του Hashrate&Shares ειδικά για την OntologyRussia. κραυγή

Είστε προγραμματιστής; Γίνετε μέλος της τεχνολογικής μας κοινότητας στο Διχόνοια. Επίσης, ρίξτε μια ματιά στο Κέντρο προγραμματιστών στον ιστότοπό μας, όπου μπορείτε να βρείτε εργαλεία προγραμματιστών, τεκμηρίωση και πολλά άλλα.

Οντολογία

Πηγή: www.habr.com

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