ProHoster > Blog > διαχείριση > Δοκιμάστε τον πελάτη TON (Telegram Open Network) και τη νέα γλώσσα Fift για έξυπνες συμβάσεις
Δοκιμάστε τον πελάτη TON (Telegram Open Network) και τη νέα γλώσσα Fift για έξυπνες συμβάσεις
Πριν από περισσότερο από ένα χρόνο, έγινε γνωστό για τα σχέδια του messenger Telegram να κυκλοφορήσει το δικό του αποκεντρωμένο δίκτυο Τηλεγράφημα Ανοικτό Δίκτυο. Στη συνέχεια έγινε διαθέσιμο ένα ογκώδες τεχνικό έγγραφο, το οποίο φέρεται να γράφτηκε από τον Nikolai Durov και περιέγραφε τη δομή του μελλοντικού δικτύου. Για όσους το έχασαν, συνιστώ να διαβάσετε την επανάληψη αυτού του εγγράφου (Μέρος 1, Μέρος 2; το τρίτο μέρος, δυστυχώς, εξακολουθεί να μαζεύει σκόνη σε ρεύματα).
Έκτοτε, δεν υπάρχουν σημαντικές ειδήσεις σχετικά με την κατάσταση της ανάπτυξης TON μέχρι πριν από μερικές ημέρες (σε ένα από ανεπίσημα κανάλια) ο σύνδεσμος προς τη σελίδα δεν εμφανίστηκε https://test.ton.org/download.htmlπου βρίσκονται:
◦ ton-test-liteclient-full.tar.xz — πηγές πελάτη φωτός για το δίκτυο δοκιμών TON·
◦ ton-lite-client-test1.config.json — αρχείο διαμόρφωσης για σύνδεση στο δοκιμαστικό δίκτυο·
◦ README - πληροφορίες σχετικά με τη συναρμολόγηση και την εκκίνηση του πελάτη.
◦ ΠΩΣ ΝΑ — οδηγίες βήμα προς βήμα για το πώς να δημιουργήσετε ένα έξυπνο συμβόλαιο χρησιμοποιώντας τον πελάτη.
◦ τον.pdf — ενημερωμένο έγγραφο (ημερομηνία 2 Μαρτίου 2019) με τεχνική επισκόπηση του δικτύου TON·
◦ tvm.pdf — τεχνική περιγραφή του TVM (Εικονική μηχανή TON, εικονική μηχανή TON)·
◦ tblkch.pdf — τεχνική περιγραφή του blockchain TON·
◦ fifthbase.pdf — μια περιγραφή της νέας γλώσσας Fift, που έχει σχεδιαστεί για τη δημιουργία έξυπνων συμβολαίων στο TON.
Επαναλαμβάνω, δεν υπήρξε επίσημη επιβεβαίωση της σελίδας και όλων αυτών των εγγράφων από το Telegram, αλλά ο όγκος αυτών των υλικών τα καθιστά αρκετά εύλογα. Εκκινήστε το δημοσιευμένο πρόγραμμα-πελάτη με δική του ευθύνη.
Δημιουργία δοκιμαστικού πελάτη
Αρχικά, ας προσπαθήσουμε να δημιουργήσουμε και να εκτελέσουμε έναν δοκιμαστικό πελάτη - ευτυχώς, README περιγράφει λεπτομερώς αυτή την απλή διαδικασία. Θα το κάνω χρησιμοποιώντας το macOS 10.14.5 ως παράδειγμα. Δεν μπορώ να εγγυηθώ για την επιτυχία της κατασκευής σε άλλα συστήματα.
Λήψη και αποσυσκευασία αρχείο πηγής. Είναι σημαντικό να κάνετε λήψη της πιο πρόσφατης έκδοσης, καθώς η συμβατότητα προς τα πίσω δεν είναι εγγυημένη σε αυτό το στάδιο.
Βεβαιωθείτε ότι οι πιο πρόσφατες εκδόσεις του make, cmake (έκδοση 3.0.2 ή νεότερη), OpenSSL (συμπεριλαμβανομένων των αρχείων κεφαλίδας C), g++ ή clang είναι εγκατεστημένες στο σύστημα. Δεν χρειάστηκε να εγκαταστήσω τίποτα, όλα συνήλθαν αμέσως.
Ας υποθέσουμε ότι οι πηγές είναι αποσυσκευασμένες σε έναν φάκελο ~/lite-client. Ξεχωριστά από αυτό, δημιουργήστε έναν κενό φάκελο για το συναρμολογημένο έργο (για παράδειγμα, ~/liteclient-build), και από αυτό (cd ~/liteclient-build) καλέστε τις εντολές:
Εάν όλα γίνονται σωστά, θα πρέπει να δείτε κάτι σαν αυτό:
Όπως μπορούμε να δούμε, υπάρχουν λίγες διαθέσιμες εντολές:
◦ help — εμφάνιση αυτής της λίστας εντολών.
◦ quit - πήγαινε έξω;
◦ time — εμφάνιση της τρέχουσας ώρας στον διακομιστή.
◦ status — εμφάνιση της κατάστασης σύνδεσης και τοπικής βάσης δεδομένων.
◦ last — ενημερώστε την κατάσταση του blockchain (κατεβάστε το τελευταίο μπλοκ). Είναι σημαντικό να εκτελέσετε αυτήν την εντολή πριν από οποιαδήποτε αιτήματα για να βεβαιωθείτε ότι βλέπετε την τρέχουσα κατάσταση του δικτύου.
◦ sendfile<filename> — μεταφορτώστε ένα τοπικό αρχείο στο δίκτυο TON. Αυτός είναι ο τρόπος με τον οποίο συμβαίνει η αλληλεπίδραση με το δίκτυο - συμπεριλαμβανομένης, για παράδειγμα, της δημιουργίας νέων έξυπνων συμβάσεων και των αιτημάτων για μεταφορά κεφαλαίων μεταξύ λογαριασμών.
◦ getaccount<address> — εμφάνιση του ρεύματος (τη στιγμή που εκτελέστηκε η εντολή) last) την κατάσταση του λογαριασμού με την καθορισμένη διεύθυνση·
◦ privkey<filename> — φόρτωση του ιδιωτικού κλειδιού από ένα τοπικό αρχείο.
Εάν, κατά την εκκίνηση του προγράμματος-πελάτη, μεταφέρετε έναν φάκελο σε αυτόν χρησιμοποιώντας την επιλογή -D, τότε θα προσθέσει το τελευταίο μπλοκ του masterchain σε αυτό:
Τώρα μπορούμε να προχωρήσουμε σε πιο ενδιαφέροντα πράγματα - μάθετε τη γλώσσα Fift, προσπαθήστε να συντάξετε ένα έξυπνο συμβόλαιο (για παράδειγμα, δημιουργήστε ένα δοκιμαστικό πορτοφόλι), να το ανεβάσετε στο δίκτυο και να δοκιμάσετε να μεταφέρετε χρήματα μεταξύ λογαριασμών.
Γλώσσα Πέμπτη
Από έγγραφο fifthbase.pdf μπορείτε να μάθετε ότι η ομάδα του Telegram έχει δημιουργήσει μια νέα γλώσσα στοίβας για τη δημιουργία έξυπνων συμβολαίων Πέντε (προφανώς από τον αριθμό πέμπτος, παρόμοια με την Forth, μια γλώσσα με την οποία η Fifth έχει πολλά κοινά).
Το έγγραφο είναι αρκετά ογκώδες, 87 σελίδων, και δεν θα επαναλάβω το περιεχόμενό του λεπτομερώς στο πλαίσιο αυτού του άρθρου (τουλάχιστον επειδή δεν έχω τελειώσει να το διαβάσω ο ίδιος :). Θα εστιάσω στα κύρια σημεία και θα δώσω μερικά παραδείγματα κώδικα σε αυτή τη γλώσσα.
Σε βασικό επίπεδο, η σύνταξη του Fift είναι αρκετά απλή: ο κώδικάς του αποτελείται από λέξεις, που συνήθως διαχωρίζονται με κενά ή διαλείμματα γραμμής (ειδική περίπτωση: ορισμένες λέξεις δεν απαιτούν διαχωριστικό μετά τον εαυτό τους). Οποιος λέω είναι μια ακολουθία χαρακτήρων με διάκριση πεζών-κεφαλαίων που αντιστοιχεί σε ένα ορισμένο προσδιορισμός του (Χονδρικά, τι πρέπει να κάνει ο διερμηνέας όταν συναντήσει αυτή τη λέξη). Εάν δεν υπάρχει ορισμός μιας λέξης, ο διερμηνέας προσπαθεί να την αναλύσει ως αριθμό και να τη βάλει στη στοίβα. Παρεμπιπτόντως, οι αριθμοί εδώ είναι - ξαφνικά - ακέραιοι 257-bit και δεν υπάρχουν καθόλου κλάσματα - πιο συγκεκριμένα, μετατρέπονται αμέσως σε ένα ζεύγος ακεραίων, σχηματίζοντας τον αριθμητή και τον παρονομαστή ενός ορθολογικού κλάσματος.
Οι λέξεις τείνουν να αλληλεπιδρούν με τιμές στην κορυφή της στοίβας. Ένας ξεχωριστός τύπος λέξεων - πρόθεμα — δεν χρησιμοποιεί τη στοίβα, αλλά τους επόμενους χαρακτήρες από το αρχείο προέλευσης. Για παράδειγμα, αυτός είναι ο τρόπος με τον οποίο υλοποιούνται οι κυριολεκτικές συμβολοσειρές - ο χαρακτήρας εισαγωγικού (") είναι μια λέξη πρόθεμα που αναζητά το επόμενο απόσπασμα (κλείσιμο) και σπρώχνει τη συμβολοσειρά μεταξύ τους στη στοίβα. Τα one-liners συμπεριφέρονται με τον ίδιο τρόπο (//) και πολλαπλών γραμμών (/*) σχόλια.
Εδώ τελειώνει σχεδόν ολόκληρη η εσωτερική δομή της γλώσσας. Όλα τα άλλα (συμπεριλαμβανομένων των κατασκευών ελέγχου) ορίζονται ως λέξεις (είτε εσωτερικές, όπως αριθμητικές πράξεις και ορισμός νέων λέξεων, είτε ορίζονται στην "τυπική βιβλιοθήκη" Fift.fif, που βρίσκεται στο φάκελο crypto/fift στις πηγές).
Ένα απλό παράδειγμα προγράμματος στο Fift:
{ dup =: x dup * =: y } : setxy
3 setxy x . y . x y + .
7 setxy x . y . x y + .
Η πρώτη γραμμή ορίζει μια νέα λέξη setxy (προσέξτε το πρόθεμα {, το οποίο δημιουργεί ένα μπλοκ πριν από το κλείσιμο } και πρόθεμα :, που στην πραγματικότητα ορίζει τη λέξη). setxy παίρνει έναν αριθμό από την κορυφή της στοίβας, τον ορίζει (ή τον επαναπροσδιορίζει) ως καθολικό συνεχήςx, και το τετράγωνο αυτού του αριθμού ως σταθερά y (Δεδομένου ότι οι τιμές των σταθερών μπορούν να επαναπροσδιοριστούν, θα προτιμούσα να τις ονομάζω μεταβλητές, αλλά ακολουθώ τη σύμβαση ονομασίας στη γλώσσα).
Οι επόμενες δύο γραμμές βάζουν έναν αριθμό στη στοίβα και καλούν setxy, τότε εμφανίζονται οι τιμές των σταθερών x, y (η λέξη χρησιμοποιείται για έξοδο .), και οι δύο σταθερές τοποθετούνται στη στοίβα, αθροίζονται και το αποτέλεσμα εκτυπώνεται επίσης. Ως αποτέλεσμα θα δούμε:
3 9 12 ok
7 49 56 ok
(Η γραμμή "ok" εκτυπώνεται από τον διερμηνέα όταν ολοκληρώσει την επεξεργασία της τρέχουσας γραμμής σε λειτουργία διαδραστικής εισαγωγής)
Αυτό το τρομακτικό αρχείο προορίζεται για τη δημιουργία ενός έξυπνου συμβολαίου - θα τοποθετηθεί σε ένα αρχείο new-wallet-query.boc μετά την εκτέλεση. Λάβετε υπόψη ότι μια άλλη γλώσσα συναρμολόγησης χρησιμοποιείται εδώ για την Εικονική Μηχανή TON (δεν θα σταθώ λεπτομερώς σε αυτήν), οι οδηγίες της οποίας θα τοποθετηθούν στο blockchain.
Έτσι, το assembler για το TVM είναι γραμμένο στο Fift - οι πηγές αυτού του assembler βρίσκονται στο αρχείο crypto/fift/Asm.fif και συνδέονται στην αρχή του παραπάνω κομματιού κώδικα.
Τι μπορώ να πω, προφανώς ο Nikolai Durov λατρεύει να δημιουργεί νέες γλώσσες προγραμματισμού :)
Δημιουργία έξυπνου συμβολαίου και αλληλεπίδραση με την TON
Λοιπόν, ας υποθέσουμε ότι έχουμε συναρμολογήσει τον πελάτη TON και τον διερμηνέα Fift όπως περιγράφεται παραπάνω και εξοικειωθήκαμε με τη γλώσσα. Πώς να δημιουργήσετε ένα έξυπνο συμβόλαιο τώρα; Αυτό περιγράφεται στο αρχείο ΠΩΣ ΝΑ, επισυνάπτεται στις πηγές.
Λογαριασμοί σε TON
Όπως περιέγραψα στο κριτική TON, αυτό το δίκτυο περιέχει περισσότερα από ένα blockchain - υπάρχει ένα κοινό, το λεγόμενο. "κύρια αλυσίδα", καθώς και ένας αυθαίρετος αριθμός πρόσθετων "αλυσίδων εργασίας", που προσδιορίζονται από έναν αριθμό 32 bit. Η κύρια αλυσίδα έχει ένα αναγνωριστικό -1, εκτός από αυτό, μπορεί να χρησιμοποιηθεί και μια αλυσίδα εργασίας «βάσης» με αναγνωριστικό 0. Κάθε αλυσίδα εργασίας μπορεί να έχει τη δική της διαμόρφωση. Εσωτερικά, κάθε αλυσίδα εργασίας χωρίζεται σε αλυσίδες, αλλά αυτή είναι μια λεπτομέρεια υλοποίησης που δεν χρειάζεται να λαμβάνεται υπόψη.
Μέσα σε μία αλυσίδα εργασίας, αποθηκεύονται πολλοί λογαριασμοί που έχουν τα δικά τους αναγνωριστικά account_id. Για την κύρια αλυσίδα και την αλυσίδα εργασίας μηδέν, έχουν μήκος 256 bit. Έτσι, το αναγνωριστικό λογαριασμού γράφεται, για παράδειγμα, ως εξής:
Αυτή είναι η "ακατέργαστη" μορφή: πρώτα το αναγνωριστικό της αλυσίδας εργασίας, μετά μια άνω και κάτω τελεία και το αναγνωριστικό λογαριασμού με δεκαεξαδικό συμβολισμό.
Επιπλέον, υπάρχει μια συντομευμένη μορφή - ο αριθμός της αλυσίδας εργασίας και η διεύθυνση λογαριασμού κωδικοποιούνται σε δυαδική μορφή, προστίθεται ένα άθροισμα ελέγχου και όλα αυτά κωδικοποιούνται στο Base64:
Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb
Γνωρίζοντας αυτή τη μορφή εγγραφής, μπορούμε να ζητήσουμε την τρέχουσα κατάσταση ενός λογαριασμού μέσω ενός δοκιμαστικού πελάτη χρησιμοποιώντας την εντολή
[ 3][t 2][1558746708.815218925][test-lite-client.cpp:631][!testnode] requesting account state for -1:8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D
[ 3][t 2][1558746708.858564138][test-lite-client.cpp:652][!testnode] got account state for -1:8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D with respect to blocks (-1,8000000000000000,72355):F566005749C1B97F18EDE013EBA7A054B9014961BC1AD91F475B9082919A2296:1BD5DE54333164025EE39D389ECE2E93DA2871DA616D488253953E52B50DC03F and (-1,8000000000000000,72355):F566005749C1B97F18EDE013EBA7A054B9014961BC1AD91F475B9082919A2296:1BD5DE54333164025EE39D389ECE2E93DA2871DA616D488253953E52B50DC03F
account state is (account
addr:(addr_std
anycast:nothing workchain_id:-1 address:x8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D)
storage_stat:(storage_info
used:(storage_used
cells:(var_uint len:1 value:3)
bits:(var_uint len:2 value:539)
public_cells:(var_uint len:0 value:0)) last_paid:0
due_payment:nothing)
storage:(account_storage last_trans_lt:74208000003
balance:(currencies
grams:(nanograms
amount:(var_uint len:7 value:999928362430000))
other:(extra_currencies
dict:hme_empty))
state:(account_active
(
split_depth:nothing
special:nothing
code:(just
value:(raw@^Cell
x{}
x{FF0020DDA4F260D31F01ED44D0D31FD166BAF2A1F80001D307D4D1821804A817C80073FB0201FB00A4C8CB1FC9ED54}
))
data:(just
value:(raw@^Cell
x{}
x{0000000D}
))
library:hme_empty))))
x{CFF8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D2068086C000000000000000451C90E00DC0E35B7DB5FB8C134_}
x{FF0020DDA4F260D31F01ED44D0D31FD166BAF2A1F80001D307D4D1821804A817C80073FB0201FB00A4C8CB1FC9ED54}
x{0000000D}
Βλέπουμε τη δομή που είναι αποθηκευμένη στο DHT της καθορισμένης αλυσίδας εργασίας. Για παράδειγμα, στο χωράφι storage.balance είναι το υπόλοιπο του τρεχούμενου λογαριασμού, σε storage.state.code - κωδικός έξυπνου συμβολαίου και σε storage.state.data - τα τρέχοντα δεδομένα του. Λάβετε υπόψη ότι η αποθήκευση δεδομένων TON - Κυψέλη, κελιά - μοιάζει με δέντρο, κάθε κελί μπορεί να έχει τόσο τα δικά του δεδομένα όσο και τα θυγατρικά κελιά. Αυτό εμφανίζεται ως εσοχή στις τελευταίες γραμμές.
Χτίζοντας ένα έξυπνο συμβόλαιο
Τώρα ας δημιουργήσουμε μια τέτοια δομή μόνοι μας (λέγεται BOC - σακούλα με κύτταρα) χρησιμοποιώντας τη γλώσσα Fift. Ευτυχώς, δεν χρειάζεται να γράψετε μόνοι σας ένα έξυπνο συμβόλαιο - στον φάκελο crypto/block υπάρχει ένα αρχείο από το αρχείο προέλευσης new-wallet.fif, που θα μας βοηθήσει να δημιουργήσουμε ένα νέο πορτοφόλι. Ας το αντιγράψουμε στο φάκελο με τον συναρμολογημένο πελάτη (~/liteclient-build, εάν ακολουθήσατε τις παραπάνω οδηγίες). Ανέθεσα το περιεχόμενό του παραπάνω ως παράδειγμα κώδικα στο Fift.
Εδώ <source-directory> πρέπει να αντικατασταθεί με τη διαδρομή προς τις μη συσκευασμένες πηγές (το σύμβολο "~", δυστυχώς, δεν μπορεί να χρησιμοποιηθεί εδώ, απαιτείται η πλήρης διαδρομή). Αντί να χρησιμοποιήσετε κλειδί -I μπορείτε να ορίσετε μια μεταβλητή περιβάλλοντος FIFTPATH και βάλε αυτό το μονοπάτι σε αυτό.
Από τότε που ξεκινήσαμε το Fift με το όνομα αρχείου new-wallet.fif, θα το εκτελέσει και θα βγει. Εάν παραλείψετε το όνομα του αρχείου, μπορείτε να παίξετε με τον διερμηνέα διαδραστικά.
Μετά την εκτέλεση, κάτι τέτοιο θα πρέπει να εμφανίζεται στην κονσόλα:
StateInit: x{34_}
x{FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED54}
x{0000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B}
new wallet address = -1 : 4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2
0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ
signing message: x{00000000}
External message for initialization is x{89FEE120E20C7E953E31546F64C23CD654002C1AA919ADD24DB12DDF85C6F3B58AE41198A28AD8DAF3B9588E7A629252BA3DB88F030D00BC1016110B2073359EAC3C13823C53245B65D056F2C070B940CDA09789585935C7ABA4D2AD4BED139281CFA1200000001_}
x{FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED54}
x{0000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B}
B5EE9C724104030100000000D60002CF89FEE120E20C7E953E31546F64C23CD654002C1AA919ADD24DB12DDF85C6F3B58AE41198A28AD8DAF3B9588E7A629252BA3DB88F030D00BC1016110B2073359EAC3C13823C53245B65D056F2C070B940CDA09789585935C7ABA4D2AD4BED139281CFA1200000001001020084FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED5400480000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B6290698B
(Saved to file new-wallet-query.boc)
Αυτό σημαίνει ότι το πορτοφόλι με την ταυτότητα -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (ή, τι είναι το ίδιο, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) δημιουργήθηκε με επιτυχία. Ο αντίστοιχος κωδικός θα βρίσκεται στο αρχείο new-wallet-query.boc, η διεύθυνσή του είναι μέσα new-wallet.addr, και το ιδιωτικό κλειδί είναι μέσα new-wallet.pk (προσέξτε - η εκ νέου εκτέλεση του σεναρίου θα αντικαταστήσει αυτά τα αρχεία).
Φυσικά, το δίκτυο TON δεν γνωρίζει ακόμη για αυτό το πορτοφόλι· αποθηκεύεται μόνο με τη μορφή αυτών των αρχείων. Τώρα πρέπει να μεταφορτωθεί στο δίκτυο. Ωστόσο, το πρόβλημα είναι ότι για να δημιουργήσετε ένα έξυπνο συμβόλαιο πρέπει να πληρώσετε μια προμήθεια και το υπόλοιπο του λογαριασμού σας εξακολουθεί να είναι μηδενικό.
Σε κατάσταση λειτουργίας, αυτό το πρόβλημα θα λυθεί με την αγορά γραμμαρίων στο ανταλλακτήριο (ή τη μεταφορά από άλλο πορτοφόλι). Λοιπόν, στην τρέχουσα λειτουργία δοκιμής, έχει δημιουργηθεί ένα ειδικό έξυπνο συμβόλαιο, από το οποίο μπορείτε να ζητήσετε έως και 20 γραμμάρια ακριβώς έτσι.
Δημιουργία αιτήματος στο έξυπνο συμβόλαιο κάποιου άλλου
Κάνουμε ένα αίτημα σε ένα έξυπνο συμβόλαιο που διανέμει γραμμάρια αριστερά και δεξιά έτσι. Στον ίδιο φάκελο crypto/block εύρεση αρχείου testgiver.fif:
// "testgiver.addr" file>B 256 B>u@
0x8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d
dup constant wallet_addr ."Test giver address = " x. cr
0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2
constant dest_addr
-1 constant wc
0x00000011 constant seqno
1000000000 constant Gram
{ Gram swap */ } : Gram*/
6.666 Gram*/ constant amount
// b x --> b' ( serializes a Gram amount )
{ -1 { 1+ 2dup 8 * ufits } until
rot over 4 u, -rot 8 * u, } : Gram,
// create a message (NB: 01b00.., b = bounce)
<b b{010000100} s, wc 8 i, dest_addr 256 u, amount Gram, 0 9 64 32 + + 1+ 1+ u, "GIFT" $, b>
<b seqno 32 u, 1 8 u, swap ref, b>
dup ."enveloping message: " <s csr. cr
<b b{1000100} s, wc 8 i, wallet_addr 256 u, 0 Gram, b{00} s,
swap <s s, b>
dup ."resulting external message: " <s csr. cr
2 boc+>B dup Bx. cr
"wallet-query.boc" B>file
Θα το αποθηκεύσουμε επίσης στο φάκελο με τον συναρμολογημένο πελάτη, αλλά θα διορθώσουμε την πέμπτη γραμμή - πριν από τη γραμμή "constant dest_addr". Ας το αντικαταστήσουμε με τη διεύθυνση του πορτοφολιού που δημιουργήσατε πριν (γεμάτο, όχι συντομευμένο). Δεν χρειάζεται να γράψετε "-1:" στην αρχή, αντί να βάλετε "0x" στην αρχή.
Μπορείτε επίσης να αλλάξετε τη γραμμή 6.666 Gram*/ constant amount — αυτό είναι το ποσό σε γραμμάρια που ζητάτε (όχι περισσότερο από 20). Ακόμα κι αν καθορίσετε έναν ακέραιο αριθμό, αφήστε την υποδιαστολή.
Τέλος, πρέπει να διορθώσετε τη γραμμή 0x00000011 constant seqno. Ο πρώτος αριθμός εδώ είναι ο τρέχων αύξων αριθμός, ο οποίος αποθηκεύεται στα γραμμάρια του λογαριασμού έκδοσης. Από πού μπορώ να το πάρω; Όπως αναφέρθηκε παραπάνω, ξεκινήστε τον πελάτη και εκτελέστε:
last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d
Στο τέλος, τα δεδομένα έξυπνης σύμβασης θα περιέχουν
Ο αριθμός 0000000D (ο δικός σας θα είναι μεγαλύτερος) είναι ο αριθμός σειράς που πρέπει να αντικατασταθεί σε testgiver.fif.
Αυτό είναι όλο, αποθηκεύστε το αρχείο και εκτελέστε (./crypto/fift testgiver.fif). Η έξοδος θα είναι ένα αρχείο wallet-query.boc. Αυτό είναι που σχηματίζεται μήνυμα στο έξυπνο συμβόλαιο κάποιου άλλου - ένα αίτημα "μεταφορά τόσα πολλά γραμμάρια σε αυτόν και τον άλλον λογαριασμό".
Χρησιμοποιώντας τον πελάτη, το ανεβάζουμε στο δίκτυο:
> sendfile wallet-query.boc
[ 1][t 1][1558747399.456575155][test-lite-client.cpp:577][!testnode] sending query from file wallet-query.boc
[ 3][t 2][1558747399.500236034][test-lite-client.cpp:587][!query] external message status is 1
Αν τώρα τηλεφωνήσεις last, και μετά ζητήστε ξανά την κατάσταση του λογαριασμού από τον οποίο ζητήσαμε γραμμάρια, τότε θα πρέπει να δούμε ότι ο αριθμός σειράς του έχει αυξηθεί κατά ένα - αυτό σημαίνει ότι έστειλε χρήματα στον λογαριασμό μας.
Απομένει το τελευταίο βήμα - κατεβάστε τον κωδικό του πορτοφολιού μας (το υπόλοιπό του έχει ήδη αναπληρωθεί, αλλά χωρίς τον κωδικό έξυπνου συμβολαίου δεν θα μπορούμε να το διαχειριστούμε). πραγματοποιούμε sendfile new-wallet-query.boc - και αυτό είναι όλο, έχετε το δικό σας πορτοφόλι στο δίκτυο TON (ακόμα και αν είναι μόνο δοκιμαστικό προς το παρόν).
Δημιουργία εξερχόμενων συναλλαγών
Για μεταφορά χρημάτων από το υπόλοιπο του λογαριασμού που δημιουργήθηκε, υπάρχει αρχείο crypto/block/wallet.fif, το οποίο πρέπει επίσης να τοποθετηθεί στο φάκελο με τον συναρμολογημένο πελάτη.
Παρόμοια με τα προηγούμενα βήματα, πρέπει να προσαρμόσετε το ποσό που μεταφέρετε, τη διεύθυνση του παραλήπτη (dest_addr) και τη σειρά του πορτοφολιού σας (ισούται με 1 μετά την προετοιμασία του πορτοφολιού και αυξάνεται κατά 1 μετά από κάθε εξερχόμενη συναλλαγή - μπορείτε δείτε το ζητώντας την κατάσταση του λογαριασμού σας) . Για δοκιμές, μπορείτε να χρησιμοποιήσετε, για παράδειγμα, το πορτοφόλι μου - 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.
Κατά την εκκίνηση (./crypto/fift wallet.fif) το σενάριο θα πάρει τη διεύθυνση του πορτοφολιού σας (από όπου μεταφέρετε) και το ιδιωτικό του κλειδί από τα αρχεία new-wallet.addr и new-wallet.pk, και το ληφθέν μήνυμα θα γραφτεί new-wallet-query.boc.
Όπως και πριν, για να πραγματοποιήσετε απευθείας τη συναλλαγή, καλέστε sendfile new-wallet-query.boc στον πελάτη. Μετά από αυτό, μην ξεχάσετε να ενημερώσετε την κατάσταση του blockchain (last) και ελέγξτε ότι το υπόλοιπο και η συνέχεια του πορτοφολιού μας έχουν αλλάξει (getaccount <account_id>).
Αυτό είναι όλο, τώρα μπορούμε να δημιουργήσουμε έξυπνα συμβόλαια στο TON και να τους στείλουμε αιτήματα. Όπως μπορείτε να δείτε, η τρέχουσα λειτουργικότητα είναι ήδη αρκετή για, για παράδειγμα, να φτιάξετε ένα πιο φιλικό πορτοφόλι με γραφική διεπαφή (ωστόσο, αναμένεται ότι θα είναι ήδη διαθέσιμο ως μέρος του messenger).
Μόνο εγγεγραμμένοι χρήστες μπορούν να συμμετάσχουν στην έρευνα. Συνδεθείτε, Σας παρακαλούμε.
Ενδιαφέρεστε να συνεχίσετε τα άρθρα με ανάλυση TON, TVM, Fift;
Ναι, περιμένω την ολοκλήρωση της σειράς άρθρων με μια γενική επισκόπηση του TON
Ναι, είναι ενδιαφέρον να διαβάσετε περισσότερα για τη γλώσσα Fift
Ναι, θέλω να μάθω περισσότερα για το TON Virtual Machine και το assembler για αυτό
Όχι, τίποτα από αυτά δεν είναι ενδιαφέρον
Ψήφισαν 39 χρήστες. 12 χρήστες απείχαν.
Τι πιστεύετε για τα σχέδια της Telegram να κυκλοφορήσει το TON;
Έχω μεγάλες ελπίδες για αυτό το έργο
Απλώς παρακολουθώ με ενδιαφέρον την εξέλιξή του.
Είμαι δύσπιστος και αμφιβάλλω για την επιτυχία του.
Έχω την τάση να θεωρώ αυτή την πρωτοβουλία αποτυχημένη και περιττή για τις πλατιές μάζες