Clientul de test TON (Rețeaua deschisă Telegram) și noul limbaj Fift pentru contracte inteligente

Cu peste un an în urmă, s-a aflat despre planurile aplicației de mesagerie Telegram de a lansa propria rețea descentralizată Telegram Open Network. Atunci a fost disponibil un document tehnic cuprinzător, care, se presupune, a fost scris de Nikolai Durov și descria structura viitoarei rețele. Pentru cei care au ratat - recomand să consulți rezumatul meu al acestui document (partea 1, partea 2; a treia parte, din păcate, încă zace în ciorne).

De atunci, nu au fost știri semnificative despre starea de dezvoltare a TON, până acum câteva zile (într-unul din canalele neoficiale) a apărut un link către pagina https://test.ton.org/download.html, unde sunt plasate:
◦ ton-test-liteclient-full.tar.xz — sursele clientului ușor pentru rețeaua de testare TON;
◦ ton-lite-client-test1.config.json — fișierul de configurare pentru conectarea la rețeaua de testare;
◦ README — informații despre compilare și rularea clientului;
◦ HOWTO — instrucțiuni pas cu pas pentru crearea unui contract inteligent folosind clientul;
◦ ton.pdf — documentul actualizat (din 2 martie 2019) cu o revizuire tehnică a rețelei TON;
◦ tvm.pdf — descrierea tehnică a TVM (TON Virtual Machine, mașina virtuală TON);
◦ tblkch.pdf — descrierea tehnică a blockchain-ului TON;
◦ fiftbase.pdf — descrierea noului limbaj Fift, destinat creării de contracte inteligente în TON.

Reiterez, nu existau confirmări oficiale ale paginii și tuturor acestor documente din partea Telegramului, dar volumul acestor materiale le face destul de plauzibile. Lansați clientul publicat pe riscul dumneavoastră.

Compilarea clientului de test

Pentru început, să încercăm să compilăm și să lansăm clientul de test - din fericire, README descrie în detaliu acest proces simplu. O voi face folosind macOS 10.14.5 ca exemplu, nu pot garanta succesul compilării pe alte sisteme.

  1. Descărcați și dezarhivați archivul cu sursele. Este important să descărcați cea mai recentă versiune, deoarece compatibilitatea inversă nu este garantată în acest stadiu.

  2. Asigurați-vă că în sistem sunt instalate cele mai recente versiuni de make, cmake (versiunile 3.0.2 sau mai recente), OpenSSL (inclusiv fișierele de antet C), g++ sau clang. Nu a fost nevoie să instalez nimic suplimentar, totul s-a compilat imediat.

  3. Să presupunem că sursele sunt dezarhivate în folderul ~\/lite-client. Separat de acesta, creați un folder gol pentru proiectul compilat (de exemplu, ~\/liteclient-build), și din acesta (cd ~\/liteclient-build) să apelăm comenzile:

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

    Clientul de test TON (Rețeaua deschisă Telegram) și noul limbaj Fift pentru contracte inteligente

    Pentru a compila interpretul limbajului Fift pentru contractele inteligente (despre care voi vorbi mai jos), de asemenea apelăm

    cmake --build . --target fift

  4. Descărcați fișierul actual de configurare pentru a vă conecta la rețeaua de test și puneți-l în folderul cu clientul compilat.

  5. Finalizat, puteți lansa clientul:

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

Dacă totul a fost făcut corect, ar trebui să vedeți ceva de genul:

Clientul de test TON (Rețeaua deschisă Telegram) și noul limbaj Fift pentru contracte inteligente

Comenzile disponibile, după cum vedem, sunt puține:
◦ help - pentru a afișa această listă de comenzi;
◦ quit - pentru a ieși;
◦ time - pentru a afișa timpul actual pe server;
◦ status - pentru a arăta starea conexiunii și a bazei de date locale;
◦ last — actualizează starea blockchain-ului (încarcă ultimul bloc). Este important să rulezi acest comandă înainte de orice cerere, pentru a te asigura că vezi exact starea actuală a rețelei.
◦ sendfile <filename> — încarcă un fișier local în rețeaua TON. Aici are loc interacțiunea cu rețeaua — inclusiv, de exemplu, crearea de noi contracte inteligente și cereri pentru transferuri de fonduri între conturi;
◦ getaccount

— arată starea curentă (la momentul executării comenzii last) a contului cu adresa specificată;
◦ privkey <filename> — încarcă cheia privată dintr-un fișier local.

Dacă, la pornirea clientului, îi transmiți un folder folosind opțiunea -D, va salva ultimul bloc al masterchain-ului în aceasta:

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

Acum putem trece la lucruri mai interesante — să studiem limbajul Fift, să încercăm să compilăm un contract inteligent (de exemplu, să creăm un portofel de test), să-l încarcăm în rețea și să încercăm transferul de fonduri între conturi.

Limbajul Fift

Din document fiftbase.pdf aflăm că, pentru a crea contracte inteligente, echipa Telegram a dezvoltat un nou limbaj stivă. Fift (probabil, de la numeralul fifth, similar cu Forth — un limbaj cu care Fift are multe în comun).

Documentul este destul de voluminos, cu 87 de pagini, și nu voi detalia conținutul său în acest articol (cel puțin, pentru că eu însumi nu am terminat de citit-l :). Mă voi opri asupra aspectelor principale și voi include câteva exemple de cod în acest limbaj.

La un nivel de bază, sintaxa Fift este destul de simplă: codul său constă din cuvinte, de obicei separate prin spații sau întreruperi de linie (caz special: unele cuvinte nu necesită un separator după ele). Orice cuvânt — este o secvență de caractere sensibilă la majuscule, corespunzătoare unui anumit definirea (pe scurt, ceea ce interpretatorul trebuie să facă atunci când întâlnește acest cuvânt). Dacă nu există o definiție a cuvântului, interpretatorul încearcă să-l parseze ca pe un număr și să-l pună pe stivă. Apropo, numerele aici sunt — surprinzător — numere întregi de 257 de biți, iar fracțiile nu există deloc — mai exact, se transformă imediat într-o pereche de întregi, formând numărătorul și numitorul unei fracții raționale.

Cuvintele interacționează, de obicei, cu valorile aflate în vârful stivei. Un tip separat de cuvinte este prefixal — folosește nu stiva, ci caracterele care vin după acestea din fișierul sursă. De exemplu, așa sunt implementate literele de tip șir — caracterul „ghilimele” (") este un cuvânt prefix care caută următoarea (ghilimea de închidere) și plasează șirul dintre ele pe stivă. În mod similar se comportă comentariile pe o linie (//) și comentariile pe mai multe linii (/*).

Aici se termină aproape tot ce ține de structura internă a limbajului. Tot restul (inclusiv structurile de control) este definit ca cuvinte (fie interne, cum ar fi operațiile aritmetice și definirea de cuvinte noi; fie definite în „biblioteca standardă” Fift.fif, care se află în folderul crypto/fift din surse).

Un exemplu simplu de program în Fift:

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

În prima linie se definește un cuvânt nou setxy (observați prefixul {, care creează un bloc până la ghilimea de închidere } și prefixul :, care definește efectiv cuvântul). setxy ia un număr de pe vârful stivei, îl definește (sau redefineste) ca constantă globală , iar pătratul acestui număr — ca constantă x(ținând cont că valorile constante pot fi redefinite, aș numi mai degrabă aceste constante variabile, dar urmez denumirea din limbaj). Stabiliți o parolă și păstrați-o în siguranță! În următoarele două linii, un număr este plasat pe stivă, este apelat

, apoi valorile constante sunt afișate setxy(pentru afișare se folosește cuvântul x, Stabiliți o parolă și păstrați-o în siguranță! ), ambele constante sunt plasate pe stivă, se adună și rezultatul este de asemenea afișat. Ca rezultat, vom vedea: .3 9 12 ok 7 49 56 ok

(Linia „ok” este afișată de interpretator atunci când termină de procesat linia curentă în modul interactiv de introducere)

Ei bine, și un exemplu complet de cod:

Acest fișier care arată puțin înfricoșător este destinat creării unui contract inteligent — va fi plasat în fișierul

"Asm.fif" include

-1 constant wc  
// creare un portofel în workchain -1 (masterchain)

// Creare un portofel simplu nou
&lt;{  SETCP0 DUP IFNOTRET INC 32 THROWIF  
// return if recv_internal, fail unless recv_external
    512 INT LDSLICEX DUP 32 PLDU   
// semnare cs cnt
    c4 PUSHCTR CTOS 32 LDU 256 LDU ENDS  
// semnare cs cnt cnt&#039; pubk
    s1 s2 XCPU            
// semnare cs cnt pubk cnt&#039; cnt
    EQUAL 33 THROWIFNOT   
// ( seqno mismatch? )
    s2 PUSH HASHSU        
// semnare cs cnt pubk hash
    s0 s4 s4 XC2PU        
// pubk cs cnt hash semnare pubk
    CHKSIGNU              
// pubk cs cnt ?
    34 THROWIFNOT         
// semnătura nu se potrivește
    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
}&gt;c
// cod
<b 0 32 u, newkeypair swap dup constant wallet_pk "new-wallet.pk" b>fișier
   B, 
b&gt; // date
// fără biblioteci
<b b{00110} s, rot ref, swap b>  // create StateInit
dup ."StateInit: " <s csr. cr
dup hash dup constant wallet_addr
."new wallet address = " wc . .": " x. cr
wc over 7 smca>$ type cr
256 u&gt;B "new-wallet.addr" B&gt;file
<b 0 32 u, b>
dup ."semnarea mesajului: " <s csr. cr
dup hash wallet_pk ed25519_sign_uint rot
<b b{1000100} s, wc 8 i, wallet_addr 256 u, b{000010} swap <s b{0} b, b>
dup ."Mesaj extern pentru inițializare este " <s csr. cr
2 boc+>B dup Bx. cr
"new-wallet-query.boc" tuck B&gt;file
."(Salvat în fișier " type .")" cr

new-wallet-query.boc după execuție. Observați că aici se folosește un alt limbaj de asamblare pentru TON Virtual Machine (nu voi intra în detalii), instrucțiunile sale vor fi plasate în blockchain. Astfel, asamblorul pentru TVM este scris în Fift — sursele acestui asamblor se află în fișierul

crypto/fift/Asm.fif și sunt incluse la începutul codului de mai sus. Ce pot să spun, aparent Nikolai Durov pur și simplu iubește să creeze noi limbaje de programare 🙂

Crearea unui contract inteligent și interacțiunea cu TON

Создание смарт-контракта и взаимодействие с TON

Deci, să presupunem că am adunat clientul TON și interpretatorul Fift, așa cum am descris mai sus, și ne-am familiarizat cu limbajul. Cum putem crea acum un smart contract? Despre aceasta se vorbește în fișierul HOWTO, atașat la surse.

Conturi în TON

Așa cum am descris în recenzia TON, această rețea conține mai mult de un blockchain — există un blockchain comun, numit „masterchain”, precum și un număr arbitrar de „workchains” suplimentare, identificate printr-un număr de 32 de biți. Masterchain-ul are un identificator de -1, iar un workchain „de bază” cu identificatorul 0 poate fi, de asemenea, utilizat. Fiecare workchain poate avea propria sa configurație. Intern, fiecare workchain este divizat în sharded chains, dar aceasta este o detaliură de implementare pe care nu este necesar să o avem în vedere.

Într-un singur workchain sunt stocate multe conturi, fiecare având propriul său identificator account_id. Pentru masterchain și workchain-ul zero, acestea au o lungime de 256 de biți. Astfel, identificatorul contului este scris, de exemplu, astfel:

-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Acesta este formatul „neprelucrat”: mai întâi identificatorul workchain-ului, apoi două puncte, și identificatorul contului în notație hexadecimală.

În plus, există un format scurtat — numărul workchain-ului și adresa contului sunt codificate binar, la care se adaugă un checksum și totul este codificat în Base64:

Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb

Cunoscând acest format de scriere, putem solicita starea curentă a unui cont prin intermediul clientului de testare cu comanda

getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Vom primi un răspuns de genul acesta:

[ 3][t 2][1558746708.815218925][test-lite-client.cpp:631][!testnode]    solicitând starea contului pentru -1:8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D
[ 3][t 2][1558746708.858564138][test-lite-client.cpp:652][!testnode]    am primit starea contului pentru -1:8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D în raport cu blocurile (-1,8000000000000000,72355):F566005749C1B97F18EDE013EBA7A054B9014961BC1AD91F475B9082919A2296:1BD5DE54333164025EE39D389ECE2E93DA2871DA616D488253953E52B50DC03F și (-1,8000000000000000,72355):F566005749C1B97F18EDE013EBA7A054B9014961BC1AD91F475B9082919A2296:1BD5DE54333164025EE39D389ECE2E93DA2871DA616D488253953E52B50DC03F
starea contului este (cont
  addr:(addr_std
    anycast:nimic workchain_id:-1 adresă:x8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D)
  storage_stat:(storage_info
    utilizat:(storage_used
      celule:(var_uint len:1 value:3)
      biți:(var_uint len:2 value:539)
      celule_publice:(var_uint len:0 value:0)) ultima_plată:0
    plată_datorată:nimic)
  storage:(account_storage last_trans_lt:74208000003
    balance:(currencies
      grame:(nanograms
        amount:(var_uint len:7 value:999928362430000))
      altele:(extra_currencies
        dict:hme_empty))
    state:(account_active
      (
        split_depth:nimic
        special:nimic
        cod:(just
          value:(raw@^Cell 
            x{}
             x{FF0020DDA4F260D31F01ED44D0D31FD166BAF2A1F80001D307D4D1821804A817C80073FB0201FB00A4C8CB1FC9ED54}
            ))
        date:(just
          value:(raw@^Cell 
            x{}
             x{0000000D}
            ))
        bibliotecă:hme_empty))))
x{CFF8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D2068086C000000000000000451C90E00DC0E35B7DB5FB8C134_}
 x{FF0020DDA4F260D31F01ED44D0D31FD166BAF2A1F80001D307D4D1821804A817C80073FB0201FB00A4C8CB1FC9ED54}
 x{0000000D}

Vedem structura care este stocată în DHT-ul lanțului de lucru specificat. De exemplu, în câmpul storage.balance se află soldul curent al contului, în storage.state.code — codul contractului inteligent, iar în storage.state.data — datele lui curente. Rețineți că stocarea datelor TON - Cell, celulele - este ierarhică, fiecare celulă poate avea atât propriile date, cât și celule fiice. Aceasta este ilustrată sub forma indentărilor în ultimele linii.

Compilarea contractului inteligent

Acum haideți să creăm singuri o astfel de structură (se numește BOC — bag of cells) folosind limbajul Fift. Din fericire, nu va trebui să scriem singuri contractul inteligent — în folderul crypto/block din arhiva cu cod sursă există un fișier new-wallet.fif, care ne va ajuta să creăm un nou portofel. Îl vom copia în folderul cu clientul compilat (~\/liteclient-build, dacă ați acționat conform instrucțiunilor de mai sus). Conținutul acestuia l-am prezentat mai sus ca exemplu de cod în Fift.

Executăm acest fișier în următorul mod:

.\/crypto\/fift -I"\/crypto\/fift" new-wallet.fif

Aici <source-directory> trebuie înlocuit cu calea către fișierele sursă despachetate (simbolul „~” aici, din păcate, nu poate fi folosit, este necesară calea completă). În loc să folosiți cheia -I puteți defini o variabilă de mediu FIFTPATH și să plasați această cale în ea.

După ce am lansat Fift cu numele fișierului new-wallet.fif, acesta îl va executa și se va încheia. Dacă numele fișierului este omis, se poate juca cu interpretul în modul interactiv.

În consolă, după execuție, ar trebui să apară ceva de genul:

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
(Salvează în fișier new-wallet-query.boc)

Aceasta înseamnă că portofelul cu identificatorul -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (sau, ceea ce este același lucru, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) a fost creat cu succes. Codul corespunzător se va găsi în fișierul după execuție. Observați că aici se folosește un alt limbaj de asamblare pentru TON Virtual Machine (nu voi intra în detalii), instrucțiunile sale vor fi plasate în blockchain., adresa sa fiind în new-wallet.addr, iar cheia privată în new-wallet.pk (fiți atenți — reluarea scriptului va suprascrie aceste fișiere).

Desigur, rețeaua TON nu știe încă despre acest portofel, el fiind stocat doar sub formă de aceste fișiere. Acum trebuie să fie încărcat în rețea. Din păcate, problema este că pentru a crea un contract inteligent trebuie să plătiți o comision, iar soldul contului dvs. este în prezent zero.

În modul de operare, această problemă se va rezolva prin achiziționarea gramelor de pe bursă (sau prin transfer de la un alt portofel). În acest mod de test, există un contract inteligent special creat, de la care se pot solicita până la 20 de grame gratuit.

Formarea unei cereri către un contract inteligent străin

Cererea către contractul inteligent care distribuie grame în stânga și în dreapta se face astfel. În aceeași folder crypto/block găsim fișierul 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+ "gift" $, b>
<b seqno 32 u, 1 8 swap ref, b>
dup ."mesaj de învăluire: " <s csr. cr
<b b{1000100} s, wc 8 i, wallet_addr 256 u, 0 gram, b{00} s,
 swap <s b>
dup ."mesaj extern rezultant: " <s csr. cr
2 boc+>B dup Bx. cr
"wallet-query.boc" B&gt;fișier

Îl vom salva și pe acesta în folderul clientului adunat, dar vom modifica a cincea linie — înainte de linia „constant dest_addr„. O vom înlocui cu adresa portofelului pe care l-ați creat anterior (completa, nu scurtată). „-1:” la început nu trebuie scris, în locul acestuia, la început se va pune „0x”.

De asemenea, se poate schimba linia 6,666 Gram* / cantitate constantă — este suma în grame pe care o solicitați (nu mai mult de 20). Chiar dacă specificați un număr întreg, lăsați punctul zecimal.

În cele din urmă, trebuie să corectăm linia 0x00000011 constant seqno. Primul număr aici este numărul de secvență curent, care este stocat în contul care emite gramele. De unde se ia? Așa cum s-a menționat mai sus, rulați clientul și executați:

last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

La final, în datele smart contractului va fi

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

Numărul 0000000D (la voi va fi mai mare) este numărul de secvență pe care trebuie să-l introduceți în testgiver.fif.

Totul, salvăm fișierul și rulăm (. /crypto/fift testgiver.fif). La ieșire vom obține fișierul wallet-query.boc. Aceasta este solicitată privind descoperirea unei vulnerabilități în versiunile mai vechi ale firmware-ului dongle-urilor USB Logitech. Aceasta permite atacatorilor cu acces fizic la dispozitive să obțină cheile de criptare ale canalului radio și să injecteze apăsările de taste (CVE-2019-13054). către un smart contract extern — cererea "transferă sumă gram pe acest cont".

Folosind clientul, îl încărcăm în rețea:

> sendfile wallet-query.boc
[ 1][t 1][1558747399.456575155][test-lite-client.cpp:577][!testnode]    trimitere cerere din fișier wallet-query.boc
[ 3][t 2][1558747399.500236034][test-lite-client.cpp:587][!query]   statusul mesajului extern este 1

Dacă acum apelăm last, iar apoi re-solicităm statutul contului de la care am cerut grame, ar trebui să vedem că numărul său de secvență a crescut cu o unitate — asta înseamnă că a trimis banii contului nostru.

Mai este un ultim pas — încărcăm codul portofelului nostru (sancțiunile au fost deja creditate, dar fără codul smart contractului nu putem gestiona). Executăm sendfile new-wallet-query.boc — și totul, aveți un portofel propriu în rețeaua TON (deși deocamdată doar test).

Crearea de tranzacții ieșitoare

Pentru a transfera bani de pe balanța contului creat, există fișierul crypto/block/wallet.fif, care trebuie, de asemenea, să fie plasat în folderul cu clientul compilat.

Similar pașilor anteriori, trebuie să corectăm suma pe care o transferați, adresa destinatarului (dest_addr) și seqno-ul portofelului dvs. (care este 1 după inițializarea portofelului și crește cu 1 după fiecare tranzacție ieșitoare — îl veți putea vedea solicitând starea contului dvs.). Pentru teste, puteți folosi, de exemplu, portofelul meu — 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.

La rulare (./crypto/fift wallet.fif) scriptul va lua adresa portofelului dvs. (de unde transferați) și cheia sa privată din fișierele new-wallet.addr și new-wallet.pk, iar mesajul obținut va fi scris în după execuție. Observați că aici se folosește un alt limbaj de asamblare pentru TON Virtual Machine (nu voi intra în detalii), instrucțiunile sale vor fi plasate în blockchain..

La fel ca înainte, pentru a executa tranzacția, apelăm sendfile new-wallet-query.boc în client. După aceea, nu uitați să actualizați starea blockchain-ului (last) și verificăm că balanța și seqno-ul portofelului nostru s-au schimbat (getaccount).

Clientul de test TON (Rețeaua deschisă Telegram) și noul limbaj Fift pentru contracte inteligente

Și asta e tot, acum știm să creăm contracte inteligente în TON și să le trimitem solicitări. După cum vedem, funcționalitatea actuală este deja suficientă pentru a face, de exemplu, un portofel mai prietenos cu o interfață grafică (Cu toate acestea, se așteaptă ca acesta să fie disponibil ca parte a mesagerului).

Numai utilizatorii înregistrați pot participa la sondaj. Conectați-vă, vă rugăm.

Sunteți interesat să continuăm articolele cu analiza TON, TVM, Fift?

  • Da, aștept finalizarea ciclului de articole cu o prezentare generală a TON

  • Da, m-ar interesa să citesc mai multe despre limbajul Fift

  • Da, vreau să aflu mai multe despre TON Virtual Machine și assemblerul pentru acesta

  • Nu, nu sunt interesat de nimic din asta

39 de utilizatori au votat. 12 utilizatori s-au abținut.

Ce părere aveți despre planurile Telegram de a lansa TON?

  • Am mari așteptări de la acest proiect

  • Pur și simplu urmăresc cu interes dezvoltarea sa

  • Sunt sceptic, mă îndoiesc de succesul său

  • Tind să consider această inițiativă ca fiind eșuată, inutilă pentru masele largi

Au votat 47 de utilizatori. S-au abținut 12 utilizatori.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster