Testni klijent TON (Telegram Open Network) i novi jezik Fift za pametne ugovore

Prije više od godinu dana saznalo se za planove Telegram glasnika da pusti vlastitu decentraliziranu mrežu Telegram otvorene mreže. Tada je postao dostupan obiman tehnički dokument, koji je, pretpostavlja se, napisao Nikolaj Durov i opisao strukturu buduće mreže. Za one koji su propustili, preporučujem da pročitaju moje prepričavanje ovog dokumenta (deo 1-a, deo 2-a; treći dio, nažalost, još skuplja prašinu na propuhu).

Od tada nije bilo značajnijih vijesti o statusu razvoja TON-a, sve do prije par dana (u jednom od nezvaničnim kanalima) link do stranice se nije pojavio https://test.ton.org/download.htmlgdje se nalaze:
ton-test-liteclient-full.tar.xz — svjetlosni klijentski izvori za TON testnu mrežu;
ton-lite-client-test1.config.json — konfiguracijski fajl za povezivanje na testnu mrežu;
README - informacije o montaži i pokretanju klijenta;
KAKO — uputstva korak po korak kako kreirati pametni ugovor koristeći klijenta;
ton.pdf — ažuriran dokument (od 2.) sa tehničkim pregledom TON mreže;
tvm.pdf — tehnički opis TVM-a (TON virtuelna mašina, TON virtuelna mašina);
tblkch.pdf — tehnički opis TON blockchaina;
fifthbase.pdf — opis novog jezika Fift, dizajniranog za kreiranje pametnih ugovora u TON-u.

Ponavljam, nije bilo službene potvrde stranice i svih ovih dokumenata iz Telegrama, ali obim ovih materijala ih čini prilično vjerojatnim. Pokrenite objavljeni klijent na vlastitu odgovornost.

Izgradnja testnog klijenta

Za početak, pokušajmo napraviti i pokrenuti testnog klijenta - dobro, README detaljno opisuje ovaj jednostavan proces. Ovo ću učiniti koristeći primjer macOS-a 10.14.5, ne mogu jamčiti za uspjeh sklapanja na drugim sistemima.

  1. Preuzimanje i raspakivanje izvorna arhiva. Važno je preuzeti najnoviju verziju jer kompatibilnost unatrag nije zajamčena u ovoj fazi.

  2. Uvjerite se da imate najnovije verzije make, cmake (verzija 3.0.2 ili novija), OpenSSL (uključujući C zaglavlja), g++ ili clang instalirane na vašem sistemu. Nisam morao ništa da instaliram, sve se odmah složilo.

  3. Pretpostavimo da su izvori raspakovani u fasciklu ~/lite-client. Odvojeno od njega kreiramo praznu fasciklu za sastavljeni projekat (na primer, ~/liteclient-build), a iz njega (cd ~/liteclient-build) pozovite komande:

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

    Testni klijent TON (Telegram Open Network) i novi jezik Fift za pametne ugovore

    Da bismo napravili tumač za jezik Fift za pametne ugovore (opisano u nastavku), također pozivamo

    cmake --build . --target fift

  4. Preuzimanje trenutnog konfiguracijski fajl da se povežete na testnu mrežu i stavite u fasciklu sa sastavljenim klijentom.

  5. Gotovo, možete pokrenuti klijenta:

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

Ako je sve urađeno kako treba, trebali biste vidjeti nešto poput ovoga:

Testni klijent TON (Telegram Open Network) i novi jezik Fift za pametne ugovore

Kao što vidite, postoji nekoliko dostupnih komandi:
help - prikazati ovu listu naredbi;
quit - izači;
time — prikaz trenutnog vremena na serveru;
status - prikazati status veze i lokalne baze podataka;
last — ažuriranje stanja blockchaina (preuzmite posljednji blok). Važno je pokrenuti ovu naredbu prije bilo kakvih upita kako biste bili sigurni da vidite stvarno stanje mreže.
sendfile <filename> — otpremite lokalni fajl na TON mrežu. Na taj način dolazi do interakcije sa mrežom, uključujući, na primjer, kreiranje novih pametnih ugovora i zahtjeve za prijenos sredstava između računa;
getaccount <address> — prikazati trenutni (u trenutku izvršenja naredbe last) status računa sa navedenom adresom;
privkey <filename> — učitajte privatni ključ iz lokalne datoteke.

Ako, prilikom pokretanja klijenta, prosledite mu fasciklu koristeći opciju -D, tada će dodati posljednji blok masterchaina u njega:

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

Sada možemo prijeći na zanimljivije stvari - naučite jezik Fift, pokušajte sastaviti pametni ugovor (na primjer, kreirati probni novčanik), prenijeti ga na mrežu i pokušati prebaciti sredstva između računa.

Pet jezika

Iz dokumenta fifthbase.pdf možete saznati da je Telegram tim kreirao novi steck jezik za kreiranje pametnih ugovora Peto (očigledno iz broja peti, slično Forthu, jeziku s kojim Fift ima mnogo zajedničkog).

Dokument je prilično obiman, ima 87 stranica i neću ga detaljno prepričavati u okviru ovog članka (barem zato što sam ga još nisam pročitao do kraja :). Zadržat ću se na glavnim točkama i dati nekoliko primjera koda na ovom jeziku.

Na osnovnom nivou, Fiftova sintaksa je prilično jednostavna: njegov kod se sastoji od riječi, obično odvojene razmacima ili novim redovima (poseban slučaj: neke riječi ne zahtijevaju separator iza sebe). Bilo koji riječ je niz znakova osjetljiv na velika i mala slova koji odgovara nekima određivanje (grubo govoreći, šta prevodilac treba da uradi kada naiđe na ovu reč). Ako nema definicije riječi, interpretator pokušava da je raščlani kao broj i gurne u stog. Inače, brojevi su ovdje - odjednom - 257-bitni cijeli brojevi, a razlomaka uopće nema - tačnije, odmah se pretvaraju u par cijelih brojeva koji čine brojnik i nazivnik racionalnog razlomka.

Riječi obično stupaju u interakciju s vrijednostima na vrhu hrpe. Odvojena vrsta riječi - prefiks - ne koristi stek, već znakove koji ih prate iz izvorne datoteke. Na primjer, ovako se implementiraju literali niza - znak navodnika (") je riječ prefiksa koja traži sljedeći (završni) navodnik i gura niz između njih na stog. One-lines se ponašaju na sličan način (//) i višelinijski (/*) komentari.

Tu se završava gotovo cjelokupna unutrašnja struktura jezika. Sve ostalo (uključujući kontrolne konstrukcije) je definirano kao riječi (bilo interne, kao što su aritmetičke operacije i definiranje novih riječi; ili definirano u "standardnoj biblioteci" Fift.fif, koji se nalazi u folderu crypto/fift u izvorima).

Jednostavan primjer programa Fift:

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

Prvi red definira novu riječ setxy (obratite pažnju na prefiks {, koji stvara blok prije zatvaranja } i prefiks :, što zapravo definira riječ). setxy uzima broj sa vrha steka, definiše ga (ili redefiniše) kao globalni konstantan x, i kvadrat ovog broja kao konstanta y (s obzirom da se vrijednosti konstanti mogu redefinirati, radije bih ih nazvao varijablama, ali pratim imenovanje u jeziku).

Sljedeća dva reda guraju broj u stog, call setxy, tada se prikazuju vrijednosti konstanti x, y (izlaz koristi riječ .), obje konstante se guraju u stek, sumiraju i rezultat se također prikazuje. Kao rezultat, vidjet ćemo:

3 9 12 ok
7 49 56 ok

(Red "ok" izlazi od strane tumača kada završi obradu tekuće linije u interaktivnom načinu unosa)

A evo i kompletnog primjera koda:

"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

Ova datoteka zastrašujućeg izgleda služi za kreiranje pametnog ugovora - bit će smještena u datoteku new-wallet-query.boc nakon izvršenja. Imajte na umu da se ovdje koristi drugi asemblerski jezik za TON virtuelnu mašinu (neću se detaljnije zadržavati na tome), čije će upute biti postavljene na blockchain.

Dakle, asembler za TVM je napisan u Fift-u - izvorni kod za ovaj asembler je u datoteci crypto/fift/Asm.fif i povezani su na početku gornjeg dijela koda.

Šta da kažem, očigledno, Nikolaj Durov jednostavno voli da stvara nove programske jezike 🙂

Kreiranje pametnog ugovora i interakcija sa TON-om

Dakle, recimo da smo napravili TON klijent i Fift interpreter kao što je gore opisano i upoznali jezik. Kako sada kreirati pametni ugovor? Ovo je opisano u datoteci. KAKOvezano za izvor.

Računi u TON

Kao što sam opisao u TON Review, ova mreža sadrži više od jednog blockchaina - postoji jedan zajednički, tzv. „glavni lanac“, kao i proizvoljan broj dodatnih „radnih lanaca“, identifikovanih 32-bitnim brojem. Glavni lanac ima identifikator -1, pored njega može se koristiti i “osnovni” radni lanac sa identifikatorom 0. Svaki radni lanac može imati svoju konfiguraciju. Interno, svaki radni lanac je podijeljen na shardchain, ali ovo je detalj implementacije koji nije potrebno imati na umu.

Unutar jednog radnog lanca pohranjeni su mnogi računi koji imaju svoje identifikatore account_id. Za masterchain i null workchain, oni su dugi 256 bita. Dakle, ID računa se piše, na primjer, ovako:

-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Ovo je sirovi format: prvo ID radnog lanca, zatim dvotočka i ID računa u heksadecimalnoj notaciji.

Osim toga, postoji skraćeni format - broj radnog lanca i adresa računa su kodirani u binarnom obliku, dodaje im se kontrolni zbroj, a sve je to kodirano u Base64:

Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb

Poznavajući ovaj format zapisa, možemo zatražiti trenutno stanje nekog naloga preko testnog klijenta koristeći naredbu

getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Dobijamo ovakav odgovor:

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

Vidimo strukturu koja je pohranjena u DHT specificiranog radnog lanca. Na primjer, na terenu storage.balance je trenutno stanje računa, u storage.state.code je kod pametnog ugovora, a u storage.state.data - njegove trenutne podatke. Imajte na umu da je skladište podataka TON - Cell, ćelije - nalik na stablo, svaka ćelija može imati i svoje podatke i podređene ćelije. Ovo je prikazano kao uvlačenje na zadnjim redovima.

Izgradnja pametnog ugovora

Sada napravimo takvu strukturu sami (zove se BOC - vreća ćelija) koristeći jezik Fift. Srećom, ne morate sami da pišete pametni ugovor - u folderu crypto/block iz izvorne arhive postoji datoteka new-wallet.fif, koji će nam pomoći da kreiramo novi novčanik. Kopirajte ga u fasciklu sa sastavljenim klijentom (~/liteclient-buildako ste slijedili gornja uputstva). Gore sam citirao njen sadržaj kao primjer koda u Fiftu.

Ovu datoteku izvršavamo na sljedeći način:

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

to je <source-directory> mora se zamijeniti putanjom do raspakovanih izvora (simbol “~” se ovdje ne može koristiti, nažalost, potrebna je puna putanja). Umjesto korištenja ključa -I možete definirati varijablu okruženja FIFTPATH i stavi ovaj put u njega.

Od kada smo pokrenuli Fift sa imenom datoteke new-wallet.fif, to će izvršiti i izaći. Ako izostavite naziv datoteke, možete igrati s interpretatorom interaktivno.

Nakon izvršenja, nešto poput ovoga bi se trebalo pojaviti na konzoli:

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)

To znači da je novčanik sa ID-om -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (ili, što je isto, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) je uspješno kreiran. Odgovarajući kod će biti u datoteci new-wallet-query.boc, njegova adresa je u new-wallet.addr, a privatni ključ je unutra new-wallet.pk (budite oprezni - ponovno pokretanje skripte će prepisati ove datoteke).

Naravno, mreža TON još ne zna za ovaj novčanik, on je pohranjen samo u obliku ovih datoteka. Sada ga treba učitati na mrežu. Istina, problem je u tome što za kreiranje pametnog ugovora morate platiti proviziju, a stanje na vašem računu je i dalje nula.

U radnom režimu, ovaj problem će se rešiti kupovinom grama na berzi (ili prebacivanjem iz drugog novčanika). Pa, u trenutnom test modu, pokrenut je poseban pametni ugovor od kojeg možete samo tako tražiti do 20 grama.

Formiranje zahtjeva za tuđi pametni ugovor

Zahtjev za pametni ugovor koji dijeli grame lijevo i desno, mi to radimo. U istom folderu crypto/block pronađi datoteku 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

Takođe ćemo ga sačuvati u fasciklu sa sastavljenim klijentom, ali ćemo ispraviti peti red - ispred reda “constant dest_addr". Zamenimo je adresom novčanika koji ste prethodno kreirali (puna, a ne skraćena). "-1:" ne treba pisati na početku, umjesto toga stavite "0x" na početak.

Također možete promijeniti liniju 6.666 Gram*/ constant amount je količina u gramima koju tražite (ne više od 20). Čak i ako navedete cijeli broj, ostavite decimalni zarez.

Konačno, moramo ispraviti liniju 0x00000011 constant seqno. Prvi broj ovdje je trenutni redni broj, koji je pohranjen na računu za izdavanje grama. Gdje ga nabaviti? Kao što je gore spomenuto, pokrenite klijenta i pokrenite:

last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Na samom kraju, podaci o pametnom ugovoru će sadržavati

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

Broj 0000000D (imat ćete više) i postoji redni broj koji se mora zamijeniti testgiver.fif.

To je to, sačuvajte fajl i pokrenite (./crypto/fift testgiver.fif). Izlaz će biti datoteka wallet-query.boc. Ovo je formirano poruka na tuđi pametni ugovor - zahtjev "prebaciti toliko grama na taj i taj račun."

Pomoću klijenta, otpremite ga na mrežu:

> 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

Ako sada pozovite last, a zatim ponovo zatražimo status računa sa kojeg smo tražili grame, onda bismo trebali vidjeti da mu se redni broj povećao za jedan - to znači da je poslao novac na naš račun.

Posljednji korak koji je preostao je učitavanje koda našeg novčanika (njegovo stanje je već dopunjeno, ali nećemo moći njime upravljati bez koda pametnog ugovora). Izvodimo sendfile new-wallet-query.boc - i to je to, imate svoj novčanik u TON mreži (iako za sada samo testni).

Kreirajte izlazne transakcije

Za prijenos novca sa stanja kreiranog računa postoji datoteka crypto/block/wallet.fif, koji takođe treba staviti u fasciklu sa sastavljenim klijentom.

Slično kao u prethodnim koracima, potrebno je da ispravite iznos koji prenosite, adresu primaoca (dest_addr) i seqno vašeg novčanika (jednako je 1 nakon inicijalizacije novčanika i povećava se za 1 nakon svake odlazne transakcije - možete ga vidjeti po ispitivanje statusa vašeg naloga). Za testove možete koristiti, na primjer, moj novčanik - 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.

Prilikom pokretanja (./crypto/fift wallet.fif) skripta će uzeti adresu vašeg novčanika (iz kojeg vršite transfer) i njegov privatni ključ iz datoteka new-wallet.addr и new-wallet.pk, a primljena poruka će biti napisana na new-wallet-query.boc.

Kao i ranije, za direktno izvršenje transakcije, pozivamo sendfile new-wallet-query.boc u klijentu. Nakon toga, ne zaboravite ažurirati stanje blockchaina (last) i provjerite da li su se stanje i seqno našeg novčanika promijenili (getaccount <account_id>).

Testni klijent TON (Telegram Open Network) i novi jezik Fift za pametne ugovore

To je sve, sada možemo kreirati pametne ugovore u TON-u i slati im zahtjeve. Kao što vidite, trenutna funkcionalnost je već dovoljna da se, na primjer, napravi ugodniji novčanik sa grafičkim sučeljem (međutim, očekuje se da će ionako postati dostupan kao dio messengera).

Samo registrovani korisnici mogu učestvovati u anketi. Prijavite semolim.

Da li ste zainteresovani za nastavak članaka sa analizom TON, TVM, Fift?

  • Da, čekam završetak serije članaka sa opštim pregledom TON-a

  • Da, zanimljivo je pročitati više o jeziku Fift

  • Da, želim da naučim više o TON virtuelnoj mašini i asembleru za nju

  • Ne, ništa od ovoga me ne zanima.

Glasalo je 39 korisnika. Uzdržano je bilo 12 korisnika.

Šta mislite o Telegramovim planovima da pokrene TON?

  • Polažem velike nade u ovaj projekat.

  • Samo ga pratim sa interesovanjem.

  • Skeptičan sam, sumnjam u njegov uspjeh

  • Ovu inicijativu smatram neuspjehom, nepotrebnom za široke mase

Glasalo je 47 korisnika. Uzdržano je bilo 12 korisnika.

izvor: www.habr.com

Dodajte komentar