Δοκιμάστε τον πελάτη 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 ως παράδειγμα. Δεν μπορώ να εγγυηθώ για την επιτυχία της κατασκευής σε άλλα συστήματα.

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

  2. Βεβαιωθείτε ότι οι πιο πρόσφατες εκδόσεις του make, cmake (έκδοση 3.0.2 ή νεότερη), OpenSSL (συμπεριλαμβανομένων των αρχείων κεφαλίδας C), g++ ή clang είναι εγκατεστημένες στο σύστημα. Δεν χρειάστηκε να εγκαταστήσω τίποτα, όλα συνήλθαν αμέσως.

  3. Ας υποθέσουμε ότι οι πηγές είναι αποσυσκευασμένες σε έναν φάκελο ~/lite-client. Ξεχωριστά από αυτό, δημιουργήστε έναν κενό φάκελο για το συναρμολογημένο έργο (για παράδειγμα, ~/liteclient-build), και από αυτό (cd ~/liteclient-build) καλέστε τις εντολές:

    cmake ~/lite-client
    cmake --build . --target test-lite-client

    Δοκιμάστε τον πελάτη TON (Telegram Open Network) και τη νέα γλώσσα Fift για έξυπνες συμβάσεις

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

    cmake --build . --target fift

  4. Κατεβάστε το τρέχον αρχείο ρυθμίσεων για να συνδεθείτε στο δοκιμαστικό δίκτυο και να το τοποθετήσετε στο φάκελο με τον συναρμολογημένο πελάτη.

  5. Φινίρισμα, μπορείτε να ξεκινήσετε τον πελάτη:

    ./test-lite-client -C ton-lite-client-test1.config.json

Εάν όλα γίνονται σωστά, θα πρέπει να δείτε κάτι σαν αυτό:

Δοκιμάστε τον πελάτη TON (Telegram Open Network) και τη νέα γλώσσα Fift για έξυπνες συμβάσεις

Όπως μπορούμε να δούμε, υπάρχουν λίγες διαθέσιμες εντολές:
help — εμφάνιση αυτής της λίστας εντολών.
quit - πήγαινε έξω;
time — εμφάνιση της τρέχουσας ώρας στον διακομιστή.
status — εμφάνιση της κατάστασης σύνδεσης και τοπικής βάσης δεδομένων.
last — ενημερώστε την κατάσταση του blockchain (κατεβάστε το τελευταίο μπλοκ). Είναι σημαντικό να εκτελέσετε αυτήν την εντολή πριν από οποιαδήποτε αιτήματα για να βεβαιωθείτε ότι βλέπετε την τρέχουσα κατάσταση του δικτύου.
sendfile <filename> — μεταφορτώστε ένα τοπικό αρχείο στο δίκτυο TON. Αυτός είναι ο τρόπος με τον οποίο συμβαίνει η αλληλεπίδραση με το δίκτυο - συμπεριλαμβανομένης, για παράδειγμα, της δημιουργίας νέων έξυπνων συμβάσεων και των αιτημάτων για μεταφορά κεφαλαίων μεταξύ λογαριασμών.
getaccount <address> — εμφάνιση του ρεύματος (τη στιγμή που εκτελέστηκε η εντολή) last) την κατάσταση του λογαριασμού με την καθορισμένη διεύθυνση·
privkey <filename> — φόρτωση του ιδιωτικού κλειδιού από ένα τοπικό αρχείο.

Εάν, κατά την εκκίνηση του προγράμματος-πελάτη, μεταφέρετε έναν φάκελο σε αυτόν χρησιμοποιώντας την επιλογή -D, τότε θα προσθέσει το τελευταίο μπλοκ του masterchain σε αυτό:

./test-lite-client -C ton-lite-client-test1.config.json -D ~/ton-db-dir

Τώρα μπορούμε να προχωρήσουμε σε πιο ενδιαφέροντα πράγματα - μάθετε τη γλώσσα 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" εκτυπώνεται από τον διερμηνέα όταν ολοκληρώσει την επεξεργασία της τρέχουσας γραμμής σε λειτουργία διαδραστικής εισαγωγής)

Λοιπόν, ένα πλήρες παράδειγμα κώδικα:

"Asm.fif" include

-1 constant wc  // create a wallet in workchain -1 (masterchain)

// Create new simple wallet
<{  SETCP0 DUP IFNOTRET INC 32 THROWIF  // return if recv_internal, fail unless recv_external
    512 INT LDSLICEX DUP 32 PLDU   // sign cs cnt
    c4 PUSHCTR CTOS 32 LDU 256 LDU ENDS  // sign cs cnt cnt' pubk
    s1 s2 XCPU            // sign cs cnt pubk cnt' cnt
    EQUAL 33 THROWIFNOT   // ( seqno mismatch? )
    s2 PUSH HASHSU        // sign cs cnt pubk hash
    s0 s4 s4 XC2PU        // pubk cs cnt hash sign pubk
    CHKSIGNU              // pubk cs cnt ?
    34 THROWIFNOT         // signature mismatch
    ACCEPT
    SWAP 32 LDU NIP 
    DUP SREFS IF:<{
      8 LDU LDREF         // pubk cnt mode msg cs
      s0 s2 XCHG SENDRAWMSG  // pubk cnt cs ; ( message sent )
    }>
    ENDS
    INC NEWC 32 STU 256 STU ENDC c4 POPCTR
}>c
// code
<b 0 32 u, 
   newkeypair swap dup constant wallet_pk 
   "new-wallet.pk" B>file
   B, 
b> // data
// no libraries
<b b{00110} s, rot ref, swap ref, b>  // create StateInit
dup ."StateInit: " <s csr. cr
dup hash dup constant wallet_addr
."new wallet address = " wc . .": " dup x. cr
wc over 7 smca>$ type cr
256 u>B "new-wallet.addr" B>file
<b 0 32 u, b>
dup ."signing message: " <s csr. cr
dup hash wallet_pk ed25519_sign_uint rot
<b b{1000100} s, wc 8 i, wallet_addr 256 u, b{000010} s, swap <s s, b{0} s, swap B, swap <s s, b>
dup ."External message for initialization is " <s csr. cr
2 boc+>B dup Bx. cr
"new-wallet-query.boc" tuck B>file
."(Saved to file " type .")" cr

Αυτό το τρομακτικό αρχείο προορίζεται για τη δημιουργία ενός έξυπνου συμβολαίου - θα τοποθετηθεί σε ένα αρχείο 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. Έτσι, το αναγνωριστικό λογαριασμού γράφεται, για παράδειγμα, ως εξής:

-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

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

Επιπλέον, υπάρχει μια συντομευμένη μορφή - ο αριθμός της αλυσίδας εργασίας και η διεύθυνση λογαριασμού κωδικοποιούνται σε δυαδική μορφή, προστίθεται ένα άθροισμα ελέγχου και όλα αυτά κωδικοποιούνται στο Base64:

Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb

Γνωρίζοντας αυτή τη μορφή εγγραφής, μπορούμε να ζητήσουμε την τρέχουσα κατάσταση ενός λογαριασμού μέσω ενός δοκιμαστικού πελάτη χρησιμοποιώντας την εντολή

getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Θα πάρουμε κάτι σαν αυτό:

[ 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.

Εκτελέστε αυτό το αρχείο ως εξής:

./crypto/fift -I"<source-directory>/crypto/fift" new-wallet.fif

Εδώ <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

Στο τέλος, τα δεδομένα έξυπνης σύμβασης θα περιέχουν

...
x{FF0020DDA4F260D31F01ED44D0D31FD166BAF2A1F80001D307D4D1821804A817C80073FB0201FB00A4C8CB1FC9ED54}
 x{0000000D}

Ο αριθμός 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 (Telegram Open Network) και τη νέα γλώσσα Fift για έξυπνες συμβάσεις

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

Μόνο εγγεγραμμένοι χρήστες μπορούν να συμμετάσχουν στην έρευνα. Συνδεθείτε, Σας παρακαλούμε.

Ενδιαφέρεστε να συνεχίσετε τα άρθρα με ανάλυση TON, TVM, Fift;

  • Ναι, περιμένω την ολοκλήρωση της σειράς άρθρων με μια γενική επισκόπηση του TON

  • Ναι, είναι ενδιαφέρον να διαβάσετε περισσότερα για τη γλώσσα Fift

  • Ναι, θέλω να μάθω περισσότερα για το TON Virtual Machine και το assembler για αυτό

  • Όχι, τίποτα από αυτά δεν είναι ενδιαφέρον

Ψήφισαν 39 χρήστες. 12 χρήστες απείχαν.

Τι πιστεύετε για τα σχέδια της Telegram να κυκλοφορήσει το TON;

  • Έχω μεγάλες ελπίδες για αυτό το έργο

  • Απλώς παρακολουθώ με ενδιαφέρον την εξέλιξή του.

  • Είμαι δύσπιστος και αμφιβάλλω για την επιτυχία του.

  • Έχω την τάση να θεωρώ αυτή την πρωτοβουλία αποτυχημένη και περιττή για τις πλατιές μάζες

Ψήφισαν 47 χρήστες. 12 χρήστες απείχαν.

Πηγή: www.habr.com

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