Client de test TON (Telegram Open Network) et nouveau langage Fift pour les contrats intelligents

Il y a plus d'un an, on a appris les plans du messager Telegram pour lancer son propre réseau décentralisé Telegram Open Network. Ensuite, un volumineux document technique est devenu disponible, qui, vraisemblablement, a été écrit par Nikolai Durov et a décrit la structure du futur réseau. Pour ceux qui l'ont raté, je vous recommande de lire mon récit de ce document (Partie 1, Partie 2; la troisième partie, hélas, prend encore la poussière dans les brouillons).

Depuis lors, il n'y a eu aucune nouvelle significative sur l'état du développement de TON, jusqu'à il y a quelques jours (dans l'un des chaînes non officielles) le lien vers la page n'apparaissait pas https://test.ton.org/download.htmloù se trouvent :
ton-test-liteclient-full.tar.xz — sources clientes légères pour le réseau de test TON ;
ton-lite-client-test1.config.json — fichier de configuration pour la connexion au réseau de test ;
README - des informations sur l'assemblage et le lancement du client ;
COMMENT — des instructions étape par étape sur la façon de créer un contrat intelligent à l'aide du client ;
tonne.pdf — document mis à jour (daté du 2 mars 2019) avec un aperçu technique du réseau TON ;
tvm.pdf — description technique de TVM (TON Virtual Machine, machine virtuelle TON);
tblkch.pdf — description technique de la blockchain TON ;
cinquièmebase.pdf — une description du nouveau langage Fift, conçu pour créer des contrats intelligents dans TON.

Je le répète, il n'y a pas eu de confirmation officielle de la page et de tous ces documents de Telegram, mais le volume de ces documents les rend tout à fait plausibles. Exécuter le client publié à vos risques et périls.

Construire un client de test

Pour commencer, essayons de construire et d'exécuter un client de test - bien, README décrit en détail ce processus simple. Je vais le faire en utilisant l'exemple de macOS 10.14.5, je ne peux pas garantir le succès de l'assemblage sur d'autres systèmes.

  1. Téléchargement et déballage archives sources. Il est important de télécharger la dernière version car la rétrocompatibilité n'est pas garantie à ce stade.

  2. Assurez-vous que les dernières versions de make, cmake (version 3.0.2 ou supérieure), OpenSSL (y compris les en-têtes C), g++ ou clang sont installées sur votre système. Je n'ai rien eu à installer, tout s'est mis en place tout de suite.

  3. Supposons que les sources soient décompressées dans un dossier ~/lite-client. Séparément, nous créons un dossier vide pour le projet assemblé (par exemple, ~/liteclient-build), et à partir de là (cd ~/liteclient-build) appelez les commandes :

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

    Client de test TON (Telegram Open Network) et nouveau langage Fift pour les contrats intelligents

    Pour construire l'interpréteur de langage Fift pour les contrats intelligents (décrit ci-dessous), nous appelons également

    cmake --build . --target fift

  4. Téléchargement du courant fichier de configuration pour se connecter au réseau de test et le mettre dans le dossier avec le client assemblé.

  5. Se terminer, vous pouvez exécuter le client :

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

Si tout est fait correctement, vous devriez voir quelque chose comme ceci :

Client de test TON (Telegram Open Network) et nouveau langage Fift pour les contrats intelligents

Comme vous pouvez le voir, il y a peu de commandes disponibles :
help - afficher cette liste de commandes ;
quit - sortir;
time — afficher l'heure actuelle sur le serveur ;
status - afficher l'état de la connexion et de la base de données locale ;
last — mettre à jour l'état de la blockchain (télécharger le dernier bloc). Il est important d'exécuter cette commande avant toute requête pour vous assurer que vous voyez l'état réel du réseau.
sendfile <filename> — télécharger un fichier local sur le réseau TON. C'est ainsi que se produit l'interaction avec le réseau, y compris, par exemple, la création de nouveaux contrats intelligents et les demandes de transfert de fonds entre comptes ;
getaccount <address> - afficher le courant (au moment de l'exécution de la commande last) le statut du compte avec l'adresse indiquée ;
privkey <filename> — charger la clé privée à partir d'un fichier local.

Si, au démarrage du client, passez-lui un dossier à l'aide de l'option -D, puis il y ajoutera le dernier bloc de la masterchain :

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

Nous pouvons maintenant passer à des choses plus intéressantes - apprenez le langage Fift, essayez de compiler un contrat intelligent (par exemple, créez un portefeuille de test), téléchargez-le sur le réseau et essayez de transférer des fonds entre les comptes.

Cinq langues

À partir du document cinquièmebase.pdf vous pouvez découvrir que l'équipe Telegram a créé un nouveau langage de pile pour créer des contrats intelligents Cinquante (apparemment du chiffre cinquième, similaire à Forth, un langage avec lequel Fift a beaucoup en commun).

Le document est assez volumineux, 87 pages, et je ne reviendrai pas en détail sur son contenu dans le cadre de cet article (du moins, car moi-même je n'ai pas fini de le lire :). Je vais m'attarder sur les points principaux et donner quelques exemples de code dans ce langage.

Au niveau de base, la syntaxe de Fift est assez simple : son code consiste en paroles, généralement séparés par des espaces ou des retours à la ligne (cas particulier : certains mots ne nécessitent pas de séparateur après eux-mêmes). N'importe lequel mot est une séquence de caractères sensible à la casse qui correspond à certains détermination (grosso modo, ce que doit faire l'interprète lorsqu'il rencontre ce mot). S'il n'y a pas de définition de mot, l'interpréteur essaie de l'analyser comme un nombre et de le pousser sur la pile. Soit dit en passant, les nombres ici - tout d'un coup - sont des entiers de 257 bits, et il n'y en a pas du tout de fractions - plus précisément, ils se transforment immédiatement en une paire d'entiers qui forment le numérateur et le dénominateur d'une fraction rationnelle.

Les mots ont tendance à interagir avec les valeurs en haut de la pile. Type de mots séparé - préfixe - n'utilise pas la pile, mais les caractères qui les suivent depuis le fichier source. Par exemple, voici comment les littéraux de chaîne sont implémentés - le guillemet (") est un mot de préfixe qui recherche le guillemet suivant (fermant) et pousse la chaîne entre eux sur la pile. Les one-liners se comportent de la même manière (//) et multiligne (/*) commentaires.

C'est là que presque toute la structure interne de la langue se termine. Tout le reste (y compris les constructions de contrôle) est défini comme des mots (soit internes, tels que les opérations arithmétiques et la définition de nouveaux mots ; soit définis dans la "bibliothèque standard" Fift.fif, qui se trouve dans le dossier crypto/fift dans les sources).

Un exemple simple d'un programme Fift :

{ dup =: x dup * =: y } : setxy
3 setxy x . y . x y + .
7 setxy x . y . x y + .

La première ligne définit un nouveau mot setxy (notez le préfixe {, qui crée un bloc avant la fermeture } et préfixe :, qui définit en fait le mot). setxy prend un nombre du haut de la pile, le définit (ou le redéfinit) comme un nombre global constante x, et le carré de ce nombre comme une constante y (étant donné que les valeurs des constantes peuvent être redéfinies, je les appellerais plutôt des variables, mais je respecte la dénomination dans le langage).

Les deux lignes suivantes poussent un nombre sur la pile, appellent setxy, alors les valeurs des constantes sont affichées x, y (pour sortir le mot est utilisé .), les deux constantes sont poussées sur la pile, additionnées et le résultat est également affiché. En conséquence, nous verrons :

3 9 12 ok
7 49 56 ok

(La ligne "ok" est sortie par l'interpréteur lorsqu'il a fini de traiter la ligne courante en mode d'entrée interactif)

Et voici un exemple de code complet :

"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

Ce fichier effrayant sert à créer un contrat intelligent - il sera placé dans le fichier new-wallet-query.boc après exécution. Veuillez noter qu'un autre langage d'assemblage pour la machine virtuelle TON est utilisé ici (je ne m'y attarderai pas en détail), dont les instructions seront placées sur la blockchain.

Ainsi, l'assembleur pour TVM est écrit en Fift - le code source de cet assembleur se trouve dans le fichier crypto/fift/Asm.fif et sont connectés au début du morceau de code ci-dessus.

Que puis-je dire, apparemment, Nikolai Durov adore créer de nouveaux langages de programmation 🙂

Création d'un contrat intelligent et interaction avec TON

Supposons donc que nous ayons construit le client TON et l'interpréteur Fift comme décrit ci-dessus et que nous ayons appris à connaître le langage. Comment créer un contrat intelligent maintenant ? Ceci est décrit dans le dossier. COMMENTattaché à la source.

Comptes en TON

Comme je l'ai décrit dans Revue TON, ce réseau contient plus d'une blockchain - il y en a une commune, soi-disant. « masterchain », ainsi qu'un nombre arbitraire de « chaînes de travail » supplémentaires, identifiées par un nombre de 32 bits. La masterchain a un identifiant de -1, en plus de cela, une chaîne de travail "de base" avec un identifiant de 0 peut également être utilisée. Chaque chaîne de travail peut avoir sa propre configuration. En interne, chaque chaîne de travail est divisée en shardchains, mais il s'agit d'un détail d'implémentation qu'il n'est pas nécessaire de garder à l'esprit.

Au sein d'une chaîne de travail, de nombreux comptes sont stockés avec leurs propres identifiants account_id. Pour masterchain et null workchain, ils ont une longueur de 256 bits. Ainsi, l'ID de compte s'écrit, par exemple, comme ceci :

-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Il s'agit du format brut : d'abord l'ID de la chaîne de travail, puis deux points et l'ID du compte en notation hexadécimale.

De plus, il existe un format raccourci - le numéro de la chaîne de travail et l'adresse du compte sont codés sous forme binaire, une somme de contrôle leur est ajoutée et tout cela est codé en Base64 :

Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb

Connaissant ce format d'enregistrement, nous pouvons demander l'état actuel de certains comptes via le client de test à l'aide de la commande

getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Nous obtenons une réponse comme celle-ci :

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

Nous voyons la structure qui est stockée dans le DHT de la chaîne de travail spécifiée. Par exemple, dans le domaine storage.balance est le solde courant du compte, en storage.state.code est le code du contrat intelligent, et dans storage.state.data - ses données actuelles. Veuillez noter que le stockage de données TON - Cellule, cellules - est de type arborescent, chaque cellule peut avoir à la fois ses propres données et ses cellules enfants. Ceci est affiché sous forme d'indentation sur les dernières lignes.

Construire un contrat intelligent

Créons maintenant une telle structure nous-mêmes (elle s'appelle BOC - sac de cellules) en utilisant le langage Cinquième. Heureusement, vous n'avez pas à rédiger vous-même un contrat intelligent - dans le dossier crypto/block de l'archive source il y a un fichier new-wallet.fif, qui nous aidera à créer un nouveau portefeuille. Copiez-le dans le dossier avec le client assemblé (~/liteclient-buildsi vous avez suivi les instructions ci-dessus). J'ai cité son contenu ci-dessus comme exemple de code dans Fift.

Nous exécutons ce fichier comme suit :

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

il est <source-directory> doit être remplacé par le chemin vers les sources décompressées (le symbole "~" ne peut pas être utilisé ici, malheureusement, le chemin complet est nécessaire). Au lieu d'utiliser une clé -I vous pouvez définir une variable d'environnement FIFTPATH et mettez ce chemin dedans.

Depuis que nous avons lancé Fift avec un nom de fichier new-wallet.fif, il l'exécutera et sortira. Si vous omettez le nom du fichier, vous pouvez jouer avec l'interprète de manière interactive.

Après l'exécution, quelque chose comme ceci devrait apparaître dans la console :

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)

Cela signifie que le portefeuille avec l'ID -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (ou, ce qui revient au même, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) a été créé avec succès. Le code correspondant sera dans le fichier new-wallet-query.boc, son adresse est dans new-wallet.addr, et la clé privée est dans new-wallet.pk (attention - réexécuter le script écrasera ces fichiers).

Bien sûr, le réseau TON ne connaît pas encore ce portefeuille, il n'est stocké que sous la forme de ces fichiers. Maintenant, il doit être téléchargé sur le réseau. Certes, le problème est que pour créer un contrat intelligent, vous devez payer une commission et le solde de votre compte est toujours nul.

En mode de travail, ce problème sera résolu en achetant des grammes sur l'échange (ou en transférant depuis un autre portefeuille). Eh bien, dans le mode de test actuel, un contrat intelligent spécial a été lancé, à partir duquel vous pouvez demander jusqu'à 20 grammes comme ça.

Former une demande au contrat intelligent de quelqu'un d'autre

Une demande à un contrat intelligent qui distribue des grammes à gauche et à droite, nous le faisons. Dans le même dossier crypto/block trouver un fichier 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

Nous l'enregistrerons également dans le dossier avec le client assemblé, mais nous corrigerons la cinquième ligne - avant la ligne "constant dest_addr". Remplaçons-la par l'adresse du portefeuille que vous avez créé auparavant (complète, non abrégée). "-1:" n'a pas besoin d'être écrit au début, mettez plutôt "0x" au début.

Vous pouvez également modifier la ligne 6.666 Gram*/ constant amount est la quantité en grammes que vous demandez (pas plus de 20). Même si vous spécifiez un nombre entier, laissez la virgule décimale.

Enfin, nous devons fixer la ligne 0x00000011 constant seqno. Le premier numéro ici est le numéro de séquence actuel, qui est stocké dans le compte émettant des grammes. Où l'obtenir ? Comme mentionné ci-dessus, démarrez le client et exécutez :

last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

À la toute fin, les données du contrat intelligent contiendront

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

Le numéro 0000000D (vous en aurez plus) et il y a un numéro de séquence qui doit être remplacé dans testgiver.fif.

Voilà, enregistrez le fichier et exécutez (./crypto/fift testgiver.fif). La sortie sera un fichier wallet-query.boc. C'est le formé сообщение au contrat intelligent de quelqu'un d'autre - une demande "transférer autant de grammes sur tel ou tel compte".

À l'aide du client, téléchargez-le sur le réseau :

> 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

Si maintenant appelez last, puis demandez à nouveau le statut du compte auquel nous avons demandé des grammes, nous devrions alors voir que son numéro de séquence a augmenté d'un - cela signifie qu'il a envoyé de l'argent sur notre compte.

La dernière étape restante consiste à télécharger le code de notre portefeuille (son solde a déjà été reconstitué, mais nous ne pourrons pas le gérer sans le code de contrat intelligent). Nous réalisons sendfile new-wallet-query.boc - et c'est tout, vous avez votre propre portefeuille dans le réseau TON (mais seulement un test pour l'instant).

Créer des transactions sortantes

Pour transférer de l'argent du solde du compte créé, il existe un fichier crypto/block/wallet.fif, qui doit également être placé dans le dossier avec le client assemblé.

Semblable aux étapes précédentes, vous devez corriger le montant que vous transférez, l'adresse du destinataire (dest_addr) et votre portefeuille seqno (il est égal à 1 après l'initialisation du portefeuille et augmente de 1 après chaque transaction sortante - vous pouvez le voir par demander l'état de votre compte) . Pour les tests, vous pouvez utiliser, par exemple, mon portefeuille - 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.

Au démarrage (./crypto/fift wallet.fif) le script prendra l'adresse de votre portefeuille (d'où vous transférez) et sa clé privée à partir des fichiers new-wallet.addr и new-wallet.pk, et le message reçu sera écrit dans new-wallet-query.boc.

Comme précédemment, pour exécuter directement la transaction, nous appelons sendfile new-wallet-query.boc chez la cliente. Après cela, n'oubliez pas de mettre à jour l'état de la blockchain (last) et vérifier que le solde et le seqno de notre portefeuille ont changé (getaccount <account_id>).

Client de test TON (Telegram Open Network) et nouveau langage Fift pour les contrats intelligents

C'est tout, maintenant nous pouvons créer des contrats intelligents dans TON et leur envoyer des demandes. Comme vous pouvez le voir, la fonctionnalité actuelle est déjà suffisante pour, par exemple, créer un portefeuille plus convivial avec une interface graphique (cependant, on s'attend à ce qu'il devienne disponible dans le cadre du messager de toute façon).

Seuls les utilisateurs enregistrés peuvent participer à l'enquête. se connecters'il te plait.

Êtes-vous intéressé par des articles continus avec une analyse de TON, TVM, Fift ?

  • Oui, j'attends la fin d'une série d'articles avec un aperçu général de TON

  • Oui, il est intéressant d'en savoir plus sur la langue Fift

  • Oui, je veux en savoir plus sur la machine virtuelle TON et son assembleur

  • Non, rien de tout cela ne m'intéresse.

39 utilisateurs ont voté. 12 utilisateurs se sont abstenus.

Que pensez-vous des plans de Telegram pour lancer TON ?

  • J'ai de grands espoirs pour ce projet.

  • Je le suis juste avec intérêt.

  • Je suis sceptique, je doute de son succès

  • J'ai tendance à considérer cette initiative comme un échec, inutile pour les larges masses

47 utilisateurs ont voté. 12 utilisateurs se sont abstenus.

Source: habr.com

Ajouter un commentaire