Testklient TON (Telegram Open Network) ja uus Fifti keel nutikate lepingute jaoks

Rohkem kui aasta tagasi sai teatavaks Telegram Messengeri plaanid vabastada oma detsentraliseeritud võrk Avatud võrgu telegramm. Siis sai kättesaadavaks mahukas tehniline dokument, mille kirjutas väidetavalt Nikolai Durov ja kirjeldas tulevase võrgu struktuuri. Neil, kes sellest ilma jäid, soovitan lugeda minu ümberjutustust sellest dokumendist (Osa 1, Osa 2; kolmas osa kogub paraku endiselt mustandites tolmu).

Sellest ajast peale pole TONi arenduse seisu kohta olulisi uudiseid olnud kuni paar päeva tagasi (ühes mitteametlikud kanalid) linki lehele ei ilmunud https://test.ton.org/download.html, kus asuvad:
ton-test-liteclient-full.tar.xz — TON-i testvõrgu valguskliendi allikad;
ton-lite-client-test1.config.json — konfiguratsioonifail testvõrguga ühenduse loomiseks;
README — teave kliendi loomise ja käivitamise kohta;
KUIDAS — samm-sammult juhised nutika lepingu loomisel kliendi abil;
tonn.pdf — uuendatud dokument (kuupäev 2) tehnilise ülevaatega TON võrgust;
tvm.pdf — TVM (TON Virtual Machine, TON virtuaalmasin) tehniline kirjeldus;
tblkch.pdf — TON plokiahela tehniline kirjeldus;
fivebase.pdf — uue Fifti keele kirjeldus, mis on mõeldud nutikate lepingute loomiseks TONis.

Kordan, ametlikku kinnitust lehele ja kõikidele nendele dokumentidele Telegramist ei saanud, kuid nende materjalide maht teeb need üsna usutavaks. Käivitage avaldatud klient omal vastutusel.

Testkliendi loomine

Esmalt proovime luua ja käivitada testkliendi – õnneks README kirjeldab seda lihtsat protsessi üksikasjalikult. Ma teen seda näitena macOS 10.14.5 abil; ma ei saa garanteerida teiste süsteemide ehitamise edukuse eest.

  1. Laadige alla ja pakkige lahti allika arhiiv. Oluline on alla laadida uusim versioon, kuna tagasiühilduvus pole praeguses etapis garanteeritud.

  2. Veenduge, et süsteemi on installitud uusimad versioonid make, cmake (versioon 3.0.2 või uuem), OpenSSL (sh C-päisefailid), g++ või clang. Ma ei pidanud midagi installima, kõik tuli kohe kokku.

  3. Oletame, et allikad on kausta lahti pakitud ~/lite-client. Looge sellest eraldi kokkupandud projekti jaoks tühi kaust (näiteks ~/liteclient-build) ja sellest (cd ~/liteclient-build) kutsuge käske:

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

    Testklient TON (Telegram Open Network) ja uus Fifti keel nutikate lepingute jaoks

    Nutikate lepingute jaoks mõeldud Fifti keeletõlgi loomiseks (selle kohta lähemalt allpool) helistame ka

    cmake --build . --target fift

  4. Laadige alla praegune konfiguratsioonifail testvõrguga ühenduse loomiseks ja asetage see koostatud kliendiga kausta.

  5. Lõpetama, saate käivitada kliendi:

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

Kui kõik on õigesti tehtud, peaksite nägema midagi sellist:

Testklient TON (Telegram Open Network) ja uus Fifti keel nutikate lepingute jaoks

Nagu näeme, on saadaval vähe käske:
help — kuvage see käskude loend;
quit - mine välja;
time — näidata serveris praegust kellaaega;
status — näidata ühenduse ja kohaliku andmebaasi olekut;
last - värskendage plokiahela olekut (laadige alla viimane plokk). See käsk on oluline käivitada enne mis tahes päringuid, et olla kindel, et näete võrgu praegust olekut.
sendfile <filename> — laadige kohalik fail TON-võrku. Nii toimub suhtlus võrguga - sealhulgas näiteks uute nutikate lepingute loomine ja kontodevahelise rahaülekande taotlused;
getaccount <address> - näidata praegust (käsu täitmise ajal) last) määratud aadressiga konto olek;
privkey <filename> — laadige privaatvõti kohalikust failist.

Kui kliendi käivitamisel teisaldate sellesse kausta, kasutades valikut -D, siis lisab ta sellesse põhiahela viimase ploki:

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

Nüüd saame liikuda huvitavamate asjade juurde – õppida Fifti keelt, proovida koostada nutikat lepingut (näiteks luua testrahakott), laadida see võrku ja proovida raha kontode vahel üle kanda.

Keel Viies

Dokumendist fivebase.pdf saate teada, et Telegrami meeskond on nutikate lepingute loomiseks loonud uue pinu keele Viies (ilmselt numbrist viies, mis on sarnane Forthiga, keelega, millega viiendal on palju ühist).

Dokument on üsna mahukas, 87 lehekülge ja selle sisu ma selle artikli raames üksikasjalikult ümber ei jutusta (vähemalt seetõttu, et ma pole seda ise veel lugenud :). Keskendun põhipunktidele ja toon paar koodinäidet selles keeles.

Põhitasemel on Fifti süntaks üsna lihtne: selle kood koosneb sõnad, eraldatakse tavaliselt tühikute või reavahedega (erijuhtum: mõned sõnad ei nõua enda järel eraldajat). Ükskõik milline sõna on tõstutundlik märgijada, mis vastab kindlale määramine (umbes, mida tõlk peaks seda sõna kohates tegema). Kui sõna definitsioon puudub, proovib tõlk selle arvuna sõeluda ja virna panna. Muide, siin on - äkki - 257-bitised täisarvud ja murde pole üldse - täpsemalt muutuvad need kohe täisarvude paariks, moodustades ratsionaalse murru lugeja ja nimetaja.

Sõnad kipuvad suhtlema virna ülaosas olevate väärtustega. Eraldi sõnade tüüp - eesliide — ei kasuta virna, vaid järgnevaid märke lähtefailist. Näiteks nii rakendatakse stringi literaale - jutumärk (") on eesliide, mis otsib järgmist (sulgevat) tsitaati ja lükkab nendevahelise stringi virna. Ühekihilised käituvad samamoodi (//) ja mitmerealine (/*) kommentaarid.

Siin lõpeb peaaegu kogu keele sisemine struktuur. Kõik muu (kaasa arvatud juhtkonstruktsioonid) on määratletud sõnadena (kas sisemine, näiteks aritmeetilised toimingud ja uute sõnade määratlus; või määratletud "standardteegis"). Fift.fif, mis on kaustas crypto/fift allikates).

Lihtne näidisprogramm Fiftis:

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

Esimene rida määratleb uue sõna setxy (pange tähele eesliidet {, mis loob ploki enne sulgevat } ja eesliide :, mis tegelikult sõna defineerib). setxy võtab arvu virna ülaosast, määratleb (või defineerib ümber) selle globaalseks konstantne x, ja selle arvu ruut konstantina y (Arvestades, et konstantide väärtusi saab uuesti määratleda, nimetaksin neid pigem muutujateks, kuid järgin keeles kehtivat nimetamistava).

Järgmised kaks rida panevad virnale numbri ja helistavad setxy, siis kuvatakse konstantide väärtused x, y (sõna kasutatakse väljundiks .), asetatakse mõlemad konstandid virna, summeeritakse ja tulemus ka trükitakse. Selle tulemusena näeme:

3 9 12 ok
7 49 56 ok

(Rea "ok" prindib tõlk, kui see lõpetab aktiivse rea töötlemise interaktiivses sisestusrežiimis)

Noh, täielik koodinäide:

"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

See hirmutava välimusega fail on mõeldud nutika lepingu loomiseks – see paigutatakse faili new-wallet-query.boc pärast hukkamist. Pange tähele, et TON Virtual Machine jaoks on siin kasutusel mõni teine ​​assemblerkeel (ma ei hakka sellel pikemalt peatuma), mille juhised paigutatakse plokiahelasse.

Seega on TVM-i assembler kirjutatud Fiftis - selle assembleri allikad on failis crypto/fift/Asm.fif ja on ühendatud ülaltoodud koodilõigu alguses.

Mis ma oskan öelda, ilmselt Nikolai Durov lihtsalt armastab uute programmeerimiskeelte loomist :)

Nutika lepingu loomine ja TON-iga suhtlemine

Oletame, et oleme ülalkirjeldatud viisil kokku pannud TON-kliendi ja Fifti tõlgi ning tutvunud keelega. Kuidas nüüd nutikat lepingut luua? Seda on failis kirjeldatud KUIDAS, mis on lisatud allikatele.

Kontod TON-is

Nagu ma kirjeldasin TON ülevaade, see võrk sisaldab rohkem kui ühte plokiahelat – on üks levinud, nn. "peaahel", samuti suvaline arv täiendavaid "tööahelaid", mis on identifitseeritud 32-bitise numbriga. Masterchainil on identifikaator -1, lisaks sellele saab kasutada ka “baas” tööahelat, mille identifikaator on 0. Igal tööahelal võib olla oma konfiguratsioon. Sisemiselt on iga tööahel jagatud ahelateks, kuid see on juurutamise detail, mida ei pea meeles pidama.

Ühes tööahelas on salvestatud palju kontosid, millel on oma account_id identifikaatorid. Peaahela ja nulltööahela jaoks on need 256 bitti pikad. Seega kirjutatakse konto identifikaator näiteks järgmiselt:

-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

See on "toores" vorming: kõigepealt tööahela ID, seejärel koolon ja konto ID kuueteistkümnendsüsteemis.

Lisaks on lühendatud vorming - tööahela number ja konto aadress on kodeeritud binaarses vormis, neile lisatakse kontrollsumma ja kõik see on kodeeritud Base64-sse:

Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb

Seda kirjevormingut teades saame käsuga testkliendi kaudu küsida konto hetkeolekut

getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Saame midagi sellist:

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

Näeme struktuuri, mis on salvestatud määratud tööahela DHT-sse. Näiteks põllul storage.balance on arvelduskonto saldo, in storage.state.code - nutikas lepingukood ja sisse storage.state.data - selle praegused andmed. Pange tähele, et TON-andmete salvestusruum - Cell, cell - on puutaoline, igas lahtris võivad olla nii oma andmed kui ka alamrakud. Seda näidatakse viimastel ridadel taandena.

Nutika lepingu koostamine

Nüüd loome ise sellise struktuuri (seda nimetatakse BOC-ks - kott rakke) kasutades Fifti keelt. Õnneks ei pea te ise nutikat lepingut kirjutama - kausta crypto/block lähtearhiivist on fail new-wallet.fif, mis aitab meil luua uue rahakoti. Kopeerime selle kokkupandud kliendiga kausta (~/liteclient-build, kui järgisite ülaltoodud juhiseid). Tsiteerisin selle sisu ülalpool Fifti koodi näitena.

Käivitage see fail järgmiselt:

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

see on <source-directory> tuleb asendada lahtipakkitud allikate teega (sümbolit “~” siin kahjuks kasutada ei saa, vaja on täielikku teed). Võtme kasutamise asemel -I saate määratleda keskkonnamuutuja FIFTPATH ja pane see tee sinna sisse.

Kuna käivitasime Fifti failinimega new-wallet.fif, käivitab see selle ja väljub. Kui jätate failinime välja, saate interaktiivselt tõlgiga mängida.

Pärast täitmist peaks konsoolis kuvama midagi sellist:

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)

See tähendab, et rahakott ID-ga -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (või mis on sama, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) edukalt loodud. Vastav kood on failis new-wallet-query.boc, tema aadress on kirjas new-wallet.addrja privaatvõti on sees new-wallet.pk (olge ettevaatlik – skripti uuesti käivitamine kirjutab need failid üle).

Loomulikult ei tea TON-võrk sellest rahakotist veel, see on salvestatud ainult nende failide kujul. Nüüd tuleb see võrku üles laadida. Probleem on aga selles, et nutika lepingu sõlmimiseks tuleb maksta vahendustasu ja kontojääk on endiselt null.

Töörežiimis lahendatakse see probleem börsilt grammide ostmisega (või teisest rahakotist ülekandmisega). No praeguses testirežiimis on loodud spetsiaalne nutileping, millest saab niisama kuni 20 grammi küsida.

Päringu loomine kellegi teise nutikale lepingule

Teeme päringu nutikale lepingule, mis jagab niimoodi gramme vasakule ja paremale. Samas kaustas crypto/block faili leidmine 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

Salvestame selle ka kokkupandud kliendiga kausta, kuid parandame viienda rea ​​- enne rida "constant dest_addr". Asendame selle teie varem loodud rahakoti aadressiga (täis, mitte lühendatud). Algusesse pole vaja kirjutada "-1:", selle asemel pange algusesse "0x".

Samuti saate rida muuta 6.666 Gram*/ constant amount — see on teie taotletav kogus grammides (mitte rohkem kui 20). Isegi kui määrate täisarvu, jätke koma.

Lõpuks peate joont parandama 0x00000011 constant seqno. Esimene number siin on praegune järjekorranumber, mis salvestatakse grammides väljastavale kontole. Kust ma seda saan? Nagu ülalpool öeldud, käivitage klient ja käivitage:

last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Päris lõpus sisaldavad nutika lepingu andmed

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

Arv 0000000D (teie oma on suurem) on järjekorranumber, mis tuleb asendada testgiver.fif.

See on kõik, salvestage fail ja käivitage (./crypto/fift testgiver.fif). Väljund on fail wallet-query.boc. See on see, mis moodustub Teade kellegi teise nutikale lepingule - taotlus "kandke nii palju gramme sellisele ja sellisele kontole".

Klienti kasutades laadime selle võrku üles:

> 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

Kui nüüd helistate last, ja seejärel uuesti küsida selle konto olekut, millelt gramme küsisime, siis peaksime nägema, et selle järjekorranumber on ühe võrra suurenenud – see tähendab, et see saatis meie kontole raha.

Jääb viimane samm - laadige alla meie rahakoti kood (selle saldo on juba täiendatud, kuid ilma nutika lepingu koodita ei saa me seda hallata). Teostame sendfile new-wallet-query.boc - ja kõik, teil on TON-võrgus oma rahakott (isegi kui see on praegu vaid test).

Väljaminevate tehingute loomine

Raha ülekandmiseks loodud konto jäägilt on fail crypto/block/wallet.fif, mis tuleb ka kokkupandud kliendiga kausta panna.

Sarnaselt eelmiste sammudega peate kohandama ülekantavat summat, saaja aadressi (dest_addr) ja oma rahakoti järgu (see võrdub 1-ga pärast rahakoti lähtestamist ja suureneb 1 võrra pärast iga väljaminevat tehingut - saate vaadake seda, küsides oma konto olekut) . Testide jaoks saate kasutada näiteks minu rahakotti - 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.

Alglaadimisel (./crypto/fift wallet.fif) võtab skript failidest teie rahakoti aadressi (kust edastate) ja selle privaatvõtme new-wallet.addr и new-wallet.pkja saabunud sõnum kirjutatakse aadressile new-wallet-query.boc.

Nagu varemgi, helistage otse tehingu tegemiseks sendfile new-wallet-query.boc kliendis. Pärast seda ärge unustage värskendada plokiahela olekut (last) ja kontrollige, kas meie rahakoti saldo ja järjekord on muutunud (getaccount <account_id>).

Testklient TON (Telegram Open Network) ja uus Fifti keel nutikate lepingute jaoks

See on kõik, nüüd saame luua TONis nutikaid lepinguid ja saata neile päringuid. Nagu näha, siis praegusest funktsionaalsusest juba piisab, et teha näiteks graafilise liidesega sõbralikum rahakott (samas on oodata, et see saab juba messengeri osana kättesaadavaks).

Küsitluses saavad osaleda ainult registreerunud kasutajad. Logi sissepalun.

Kas olete huvitatud artiklite jätkamisest TONi, TVM-i, Fifti analüüsiga?

  • Jah, ma ootan TONi üldise ülevaatega artikliseeria valmimist

  • Jah, huvitav on Fifti keele kohta rohkem lugeda

  • Jah, ma tahan TON Virtual Machine'i ja selle monteerija kohta rohkem teada saada

  • Ei, see pole huvitav

39 kasutajat hääletas. 12 kasutajat jäi erapooletuks.

Mida arvate Telegrami plaanidest käivitada TON?

  • Mul on sellele projektile suured lootused

  • Ma lihtsalt jälgin selle arengut huviga.

  • Olen skeptiline ja kahtlen selle õnnestumises.

  • Kaldun seda algatust pidama läbikukkunuks ja laiade masside jaoks tarbetuks

47 kasutajat hääletas. 12 kasutajat jäi erapooletuks.

Allikas: www.habr.com

Lisa kommentaar