Test klient TON (Telegram Open Network) og nyt Fift-sprog til smarte kontrakter

For mere end et år siden blev det kendt om planerne fra Telegram Messenger om at frigive sit eget decentrale netværk Telegram Open Network. Derefter blev et omfangsrigt teknisk dokument tilgængeligt, som angiveligt blev skrevet af Nikolai Durov og beskrev strukturen af ​​det fremtidige netværk. For dem, der gik glip af det, anbefaler jeg, at du læser min genfortælling af dette dokument (Part 1, Part 2; den tredje del, desværre, samler stadig støv i træk).

Siden da har der ikke været væsentlige nyheder om status for TON-udvikling indtil for et par dage siden (i en af uofficielle kanaler) linket til siden dukkede ikke op https://test.ton.org/download.html, hvor er placeret:
ton-test-liteclient-full.tar.xz — kilder til en lysklient til TON-testnetværket;
ton-lite-client-test1.config.json — konfigurationsfil til tilslutning til testnetværket;
README — oplysninger om opbygning og lancering af klienten;
HVORDAN — trinvise instruktioner om oprettelse af en smart kontrakt med en klient;
ton.pdf — opdateret dokument (dateret 2. marts 2019) med en teknisk oversigt over TON-netværket;
tvm.pdf — teknisk beskrivelse af TVM (TON Virtual Machine, TON virtual machine);
tblkch.pdf — teknisk beskrivelse af TON blockchain;
fifthbase.pdf — beskrivelse af det nye Fift-sprog, designet til at skabe smarte kontrakter i TON.

Jeg gentager, der var ingen officiel bekræftelse af siden og alle disse dokumenter fra Telegram, men mængden af ​​disse materialer gør dem ret plausible. Start den offentliggjorte klient på egen risiko.

Opbygning af en testklient

Lad os først prøve at bygge og køre en testklient - heldigvis, README beskriver denne enkle proces i detaljer. Jeg vil gøre dette ved at bruge macOS 10.14.5 som et eksempel; Jeg kan ikke stå inde for succesen med bygningen på andre systemer.

  1. Download og pak ud kildearkiv. Det er vigtigt at downloade den seneste version, da bagudkompatibilitet ikke er garanteret på dette stadium.

  2. Sørg for, at de seneste versioner af make, cmake (version 3.0.2 eller nyere), OpenSSL (inklusive C-header-filer), g++ eller clang er installeret på systemet. Jeg behøvede ikke at installere noget, alt kom sammen med det samme.

  3. Lad os antage, at kilderne er pakket ud i en mappe ~/lite-client. Separat fra det skal du oprette en tom mappe til det samlede projekt (f.eks. ~/liteclient-build), og fra det (cd ~/liteclient-build) kalder kommandoerne:

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

    Test klient TON (Telegram Open Network) og nyt Fift-sprog til smarte kontrakter

    For at bygge Fift-sprogtolken til smarte kontrakter (mere om det nedenfor), ringer vi også

    cmake --build . --target fift

  4. Download den nuværende konfigurationsfil at oprette forbindelse til testnetværket og lægge det i mappen med den samlede klient.

  5. Afslut, kan du starte klienten:

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

Hvis alt er gjort korrekt, bør du se noget som dette:

Test klient TON (Telegram Open Network) og nyt Fift-sprog til smarte kontrakter

Som vi kan se, er der få tilgængelige kommandoer:
help — vis denne liste over kommandoer;
quit - gå ud;
time — vis den aktuelle tid på serveren;
status — Vis forbindelsen og den lokale databasestatus;
last — opdater tilstanden for blockchain (download den sidste blok). Det er vigtigt at køre denne kommando før enhver anmodning for at være sikker på, at du kan se netværkets aktuelle tilstand.
sendfile <filename> — upload en lokal fil til TON-netværket. Sådan opstår interaktion med netværket – herunder for eksempel oprettelse af nye smarte kontrakter og anmodninger om at overføre midler mellem konti;
getaccount <address> — vis den aktuelle (på det tidspunkt, hvor kommandoen blev udført) last) status for kontoen med den angivne adresse;
privkey <filename> — indlæs den private nøgle fra en lokal fil.

Hvis du, når du starter klienten, overfører en mappe til den ved hjælp af muligheden -D, så tilføjer han den sidste blok af masterchain til den:

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

Nu kan vi gå videre til mere interessante ting - lær Fift-sproget, prøv at kompilere en smart kontrakt (opret for eksempel en testpung), upload den til netværket og prøv at overføre penge mellem konti.

Sprog Fift

Fra dokumentet fifthbase.pdf du kan finde ud af, at Telegram-teamet har oprettet et nyt stak-sprog for at skabe smarte kontrakter Femte (tilsyneladende ud fra tallet femte, i lighed med Forth, et sprog, som femte har meget til fælles).

Dokumentet er ret omfangsrigt, 87 sider, og jeg vil ikke genfortælle dets indhold i detaljer inden for rammerne af denne artikel (i hvert fald fordi jeg ikke selv har læst det færdigt :)). Jeg vil fokusere på hovedpunkterne og give et par kodeeksempler på dette sprog.

På et grundlæggende niveau er Fifts syntaks ret simpel: dens kode består af ord, normalt adskilt af mellemrum eller linjeskift (specielt tilfælde: nogle ord kræver ikke en separator efter sig selv). Nogen слово er en sekvens, der skelner mellem store og små bogstaver, af tegn, der svarer til en bestemt bestemmelse af (omtrent hvad tolken skal gøre, når den støder på dette ord). Hvis der ikke er nogen definition af et ord, forsøger tolken at parse det som et tal og lægge det på stakken. I øvrigt er tallene her - pludselig - 257-bit heltal, og der er ingen brøker overhovedet - mere præcist bliver de straks til et par heltal, der danner tælleren og nævneren for en rationel brøk.

Ord har en tendens til at interagere med værdier i toppen af ​​stakken. En separat type ord - præfiks — bruger ikke stakken, men de efterfølgende tegn fra kildefilen. For eksempel er dette, hvordan strengliteraler implementeres - citattegn (") er et præfiksord, der leder efter det næste (afsluttende) citat og skubber strengen mellem dem på stakken. One-liners opfører sig på samme måde (//) og multiline (/*) kommentarer.

Det er her næsten hele sprogets indre struktur ender. Alt andet (inklusive kontrolkonstruktioner) er defineret som ord (enten interne, såsom aritmetiske operationer og definitionen af ​​nye ord; eller defineret i "standardbiblioteket" Fift.fif, som ligger i mappen crypto/fift i kilderne).

Et simpelt eksempelprogram i Fift:

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

Den første linje definerer et nyt ord setxy (bemærk præfikset {, som opretter en blok før den afsluttende } og præfiks :, som faktisk definerer ordet). setxy tager et tal fra toppen af ​​stakken, definerer (eller omdefinerer) det som globalt konstant x, og kvadratet af dette tal som en konstant y (I betragtning af at værdierne af konstanter kan omdefineres, vil jeg hellere kalde dem variabler, men jeg følger navnekonventionen i sproget).

De næste to linjer lægger et nummer på stakken og ringer setxy, så vises værdierne af konstanterne x, y (ordet bruges til output .), placeres begge konstanter på stakken, summeres, og resultatet udskrives også. Som et resultat vil vi se:

3 9 12 ok
7 49 56 ok

(Linjen "ok" udskrives af tolken, når den er færdig med at behandle den aktuelle linje i interaktiv inputtilstand)

Nå, et komplet kodeeksempel:

"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

Denne skræmmende udseende fil er til at oprette en smart kontrakt - den vil blive placeret i en fil new-wallet-query.boc efter henrettelse. Bemærk venligst, at et andet assemblersprog bruges her til TON Virtual Machine (jeg vil ikke dvæle ved det i detaljer), hvis instruktioner vil blive placeret på blockchain.

Således er assembleren til TVM skrevet i Fift - kilderne til denne assembler er i filen crypto/fift/Asm.fif og er forbundet i begyndelsen af ​​ovenstående kodestykke.

Hvad kan jeg sige, tilsyneladende elsker Nikolai Durov bare at skabe nye programmeringssprog:)

Oprettelse af en smart kontrakt og interaktion med TON

Så lad os antage, at vi har samlet TON-klienten og Fift-tolken som beskrevet ovenfor og er blevet fortrolige med sproget. Hvordan opretter man en smart kontrakt nu? Dette er beskrevet i filen HVORDAN, vedhæftet kilderne.

Konti i TON

Som jeg beskrev i TON anmeldelse, dette netværk indeholder mere end én blockchain - der er én fælles, den såkaldte. "masterkæde", samt et vilkårligt antal yderligere "arbejdskæder", identificeret med et 32-bit nummer. Masterkæden har en identifikator på -1, derudover kan der også bruges en "base" arbejdskæde med en identifikator på 0. Hver arbejdskæde kan have sin egen konfiguration. Internt er hver arbejdskæde opdelt i shardchains, men dette er en implementeringsdetalje, der ikke skal huskes på.

Inden for én arbejdskæde er der lagret mange konti, der har deres egne account_id identifikatorer. For masterkæden og nul arbejdskæden er de 256 bit lange. Således skrives konto-id'et for eksempel sådan:

-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Dette er det "rå" format: først arbejdskæde-id'et, derefter et kolon og konto-id'et i hexadecimal notation.

Derudover er der et forkortet format - arbejdskædenummeret og kontoadressen er kodet i binær form, en kontrolsum tilføjes til dem, og alt dette er kodet i Base64:

Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb

Når vi kender dette registreringsformat, kan vi anmode om den aktuelle tilstand for en konto gennem en testklient ved hjælp af kommandoen

getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Vi får noget som dette:

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

Vi ser den struktur, der er gemt i DHT for den angivne arbejdskæde. For eksempel i marken storage.balance er den løbende kontosaldo, i storage.state.code - smart kontraktkode, og ind storage.state.data - dets aktuelle data. Bemærk venligst, at TON-datalageret - Celle, celler - er træ-lignende, hver celle kan have både sine egne data og underordnede celler. Dette er vist som indrykning i de sidste linjer.

Opbygning af en smart kontrakt

Lad os nu selv skabe sådan en struktur (den hedder BOC - pose med celler) ved at bruge Fift-sproget. Heldigvis behøver du ikke selv at skrive en smart kontrakt - i mappen crypto/block der er en fil fra kildearkivet new-wallet.fif, som vil hjælpe os med at skabe en ny tegnebog. Lad os kopiere det til mappen med den samlede klient (~/liteclient-build, hvis du fulgte instruktionerne ovenfor). Jeg citerede dets indhold ovenfor som et eksempel på kode på Fift.

Udfør denne fil som følger:

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

Her <source-directory> skal erstattes med stien til de udpakkede kilder (“~”-symbolet kan desværre ikke bruges her, den fulde sti er nødvendig). I stedet for at bruge en nøgle -I du kan definere en miljøvariabel FIFTPATH og læg denne vej ind i den.

Siden vi lancerede Fift med filnavnet new-wallet.fif, vil den udføre det og afslutte. Hvis du udelader filnavnet, kan du spille med tolken interaktivt.

Efter udførelse skal noget som dette vises i konsollen:

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)

Det betyder, at tegnebogen med ID -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (eller hvad er det samme, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) oprettet. Den tilsvarende kode vil være i filen new-wallet-query.boc, hans adresse er i new-wallet.addr, og den private nøgle er i new-wallet.pk (vær forsigtig - at køre scriptet igen vil overskrive disse filer).

Selvfølgelig kender TON-netværket endnu ikke til denne tegnebog; den gemmes kun i form af disse filer. Nu skal den uploades til netværket. Men problemet er, at for at oprette en smart kontrakt skal du betale en kommission, og din kontosaldo er stadig nul.

I arbejdstilstand vil dette problem blive løst ved at købe gram på børsen (eller overføre fra en anden tegnebog). Nå, i den nuværende testtilstand er der lavet en særlig smart kontrakt, hvorfra man bare sådan kan bede om op til 20 gram.

Generering af en anmodning til en andens smarte kontrakt

Vi laver en anmodning til en smart kontrakt, der fordeler gram til venstre og højre på denne måde. I samme mappe crypto/block find fil 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

Vi gemmer det også i mappen med den samlede klient, men vi retter den femte linje - før linjen "constant dest_addr". Lad os erstatte den med adressen på den tegnebog, du oprettede før (fuld, ikke forkortet). Der er ingen grund til at skrive "-1:" i begyndelsen, i stedet skal du sætte "0x" i begyndelsen.

Du kan også ændre linjen 6.666 Gram*/ constant amount — dette er mængden i gram, som du anmoder om (ikke mere end 20). Selvom du angiver et helt tal, skal du lade decimaltegnet stå.

Til sidst skal du rette linjen 0x00000011 constant seqno. Det første nummer her er det aktuelle sekvensnummer, som er gemt i kontoen, der udsteder gram. Hvor kan jeg få det fra? Som nævnt ovenfor, start klienten og kør:

last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Til allersidst vil de smarte kontraktdata indeholde

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

Tallet 0000000D (din bliver større) er sekvensnummeret, der skal erstattes med testgiver.fif.

Det er det, gem filen og kør (./crypto/fift testgiver.fif). Outputtet vil være en fil wallet-query.boc. Dette er hvad der dannes сообщение til en andens smarte kontrakt - en anmodning "overfør så mange gram til sådan en konto."

Ved hjælp af klienten uploader vi den til netværket:

> 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

Hvis du nu ringer last, og så igen anmode om status for den konto, som vi bad om gram fra, så skulle vi se, at dens sekvensnummer er steget med én - det betyder, at den sendte penge til vores konto.

Det sidste trin forbliver - download koden til vores tegnebog (dens saldo er allerede blevet genopfyldt, men uden den smarte kontraktkode vil vi ikke være i stand til at administrere den). Vi udfører sendfile new-wallet-query.boc - og det er det, du har din egen tegnebog i TON-netværket (selvom det kun er en test for nu).

Oprettelse af udgående transaktioner

For at overføre penge fra saldoen på den oprettede konto er der en fil crypto/block/wallet.fif, som også skal placeres i mappen med den samlede klient.

I lighed med de foregående trin skal du justere det beløb, du overfører, modtagerens adresse (dest_addr) og seqno for din tegnebog (det er lig med 1 efter initialisering af tegnebogen og øges med 1 efter hver udgående transaktion - du kan se den ved at anmode om status for din konto). Til test kan du f.eks. bruge min pung - 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.

Ved opstart (./crypto/fift wallet.fif) scriptet tager adressen på din tegnebog (hvorfra du overfører) og dens private nøgle fra filerne new-wallet.addr и new-wallet.pk, og den modtagne besked vil blive skrevet til new-wallet-query.boc.

Som før, for direkte at udføre transaktionen, ring sendfile new-wallet-query.boc i klienten. Efter dette, glem ikke at opdatere status for blockchain (last) og kontroller, at saldoen og rækkefølgen på vores tegnebog er ændret (getaccount <account_id>).

Test klient TON (Telegram Open Network) og nyt Fift-sprog til smarte kontrakter

Det er alt, nu kan vi oprette smarte kontrakter i TON og sende anmodninger til dem. Som du kan se, er den nuværende funktionalitet allerede nok til for eksempel at lave en mere venlig pung med en grafisk grænseflade (det forventes dog, at den allerede bliver tilgængelig som en del af messengeren).

Kun registrerede brugere kan deltage i undersøgelsen. Log ind, Vær venlig.

Er du interesseret i at fortsætte artiklerne med analyse af TON, TVM, Fift?

  • Ja, jeg venter på færdiggørelsen af ​​serien af ​​artikler med en generel oversigt over TON

  • Ja, det er interessant at læse mere om Fift-sproget

  • Ja, jeg vil gerne lære mere om TON Virtual Machine og assembleren til den

  • Nej, intet af dette er interessant

39 brugere stemte. 12 brugere undlod at stemme.

Hvad synes du om Telegrams planer om at lancere TON?

  • Jeg har store forhåbninger til dette projekt

  • Jeg følger bare dens udvikling med interesse.

  • Jeg er skeptisk og tvivler på dens succes.

  • Jeg er tilbøjelig til at betragte dette initiativ som en fiasko og unødvendig for de brede masser

47 brugere stemte. 12 brugere undlod at stemme.

Kilde: www.habr.com

Tilføj en kommentar