TON-testklient (Telegram Open Network) og det nye sprog Fift til smart contracts

For mere et år siden blev der offentliggjort planer for messaging-tjenesten Telegram om at lancere sit eget decentrale netværk Telegram Open Network. På det tidspunkt blev et omfattende teknisk dokument tilgængeligt, som formodentlig blev skrevet af Nikolai Durov og beskrev strukturen af det fremtidige netværk. For dem, der gik glip af det - jeg anbefaler at se mit resume af dette dokument (del 1, del 2; den tredje del ligger desværre stadig i udkast).

Siden da har der ikke været nogen væsentlige nyheder om status på udviklingen af TON, indtil for et par dage siden (i et af de uofficielle kanaler) dukkede der et link op til siden https://test.ton.org/download.html, hvor der ligger:
◦ ton-test-liteclient-full.tar.xz — kildekode til den lette klient til TON testnet;
◦ ton-lite-client-test1.config.json — konfigurationsfil til at forbinde til testnet;
◦ README — information om opbygning og kørsel af klienten;
◦ HOWTO — trin-for-trin vejledning til oprettelse af smarte kontrakter ved hjælp af klienten;
◦ ton.pdf — et opdateret dokument (fra den 2. marts 2019) med en teknisk oversigt over TON-netværket;
◦ tvm.pdf — teknisk beskrivelse af TVM (TON Virtual Machine, den virtuelle maskine TON);
◦ tblkch.pdf — teknisk beskrivelse af TON blockchain;
◦ fiftbase.pdf — beskrivelse af det nye sprog Fift, der er designet til at oprette smarte kontrakter i TON.

Jeg gentager, der har ikke været officielle bekræftelser på siden og alle disse dokumenter fra Telegram, men mængden af disse materialer gør dem temmelig troværdige. Udgivelsen af den publicerede klient foretages på eget ansvar.

Bygning af testklienten

Lad os starte med at prøve at samle og køre testklienten - for så vidt README det detaljeret beskriver denne enkle proces. Jeg vil gøre dette med macOS 10.14.5 som eksempel, jeg kan ikke garantere for succes på andre systemer.

  1. Hent og udpak arkivet med kildekoderne. Det er vigtigt at hente den nyeste version, da bagudkompatibilitet ikke er garanteret på dette stadium.

  2. Sørg for, at de nyeste versioner af make, cmake (version 3.0.2 eller højere), OpenSSL (inklusive C-headerfiler), g++ eller clang er installeret på systemet. Jeg skulle ikke installere noget ekstra, alt blev samlet med det samme.

  3. Lad os antage, at kildekoderne er udpakket i mappen \lite-client. Opret en tom mappe adskilt fra den til det samlede projekt (f.eks. \liteclient-build), og fra den (cd \liteclient-build) kalder vi kommandoerne:

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

    TON-testklient (Telegram Open Network) og det nye sprog Fift til smart contracts

    For at bygge fortolkeren til sproget Fift til smart-kontrakter (mere om det nedenfor), kalder vi også

    cmake --build . --target fift

  4. Hent den aktuelle konfigurationsfilen til at oprette forbindelse til testnetværket og læg den i mappen med den samlede klient.

  5. Færdig, kan klienten startes:

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

Hvis alt er gjort korrekt, skal du se noget som dette:

TON-testklient (Telegram Open Network) og det nye sprog Fift til smart contracts

Tilgængelige kommandoer, som vi kan se, er ikke mange:
◦ help — udskriv denne liste over kommandoer;
◦ quit — afslut;
◦ time — vis den aktuelle tid på serveren;
◦ status — vis forbindelsens tilstand og den lokale database;
◦ sidste — opdatere blockchain-tilstanden (hente den nyeste blok). Det er vigtigt at udføre denne kommando før nogen forespørgsler for at være sikker på, at du ser den mest aktuelle tilstand af netværket.
◦ sendfile <filename> — uploade en lokal fil til TON-netværket. Dette er interaktionen med netværket — herunder for eksempel oprettelse af nye smartkontrakter og anmodninger om overførsel af midler mellem konti;
◦ getaccount

— vise den nuværende (på tidspunktet for udførelse af kommandoen sidste) status for kontoen med den angivne adresse;
◦ privkey <filename> — uploade den private nøgle fra en lokal fil.

Hvis der ved opstart af klienten gives en mappe med indstillingen -D, vil den gemme den nyeste blok af masterchain i den:

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

Nu kan vi gå videre til mere interessante emner — lære Fift-sproget, prøve at kompilere en smartkontrakt (for eksempel oprette en testtegnebog), uploade den til netværket og prøve at overføre midler mellem konti.

Fift-sproget

Fra dokumentet fiftbase.pdf kan man lære, at Telegram-teamet har skabt et nyt stak-sprog til oprettelse af smartkontrakter Fift (tilsyneladende fra tallet fifth, i analogi med Forth — et sprog, som Fift har meget til fælles med).

Dokumentet er ret omfattende, 87 sider, og jeg vil ikke gå i detaljer med dets indhold i denne artikel (i det mindste fordi jeg selv ikke er færdig med at læse det :). Jeg vil fokusere på de vigtigste punkter og give et par eksempler på kode i dette sprog.

På grundlæggende niveau er Fifts syntaks ret enkel: dens kode består af ord, som regel adskilt af mellemrum eller linjeskift (et særligt tilfælde: nogle ord kræver ikke en separator efter dem). Ethvert ‘replica’ (for eksempel blev funktionen snd_ctl_add_slave() ændret til snd_ctl_add_replica()), hvilket førte til — er en case-sensitiv sekvens af tegn, der svarer til en bestemt definition (groft talt, hvad fortolkeren skal gøre, når den støder på dette ord). Hvis der ikke er nogen definition for ordet, forsøger fortolkeren at parse det som et tal og placere det på stakken. Forresten, tal her er — overraskende — 257-bit heltal, og der er slet ingen brøker — de bliver med det samme omdannet til et par heltal, der danner tæller og nævner af en rationel brøk.

Ord interagerer som regel med værdierne, der ligger øverst på stakken. En særlig type ord er præfikser — bruger ikke stak, men de følgende tegn fra kildefilen. For eksempel er det sådan, at strenglitteraler implementeres — tegnet "anførselsestegn" (") er et præfiksord, der søger efter det næste (lukkende) anførselsestegn, og placerer strengen imellem dem på stakken. På samme måde opfører sig enlinje (//) og flerlinje (/*) kommentarer.

Her slutter næsten hele den interne struktur for sproget. Alt andet (inklusive kontrolstrukturer) er defineret som ord (enten interne, såsom aritmetiske operationer og definition af nye ord; eller defineret i "standardbiblioteket" Fift.fif, som ligger i mappen crypto/fift i kildekode).

Et simpelt eksempel på et program i Fift:

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

I den første linje defineres et nyt ord setxy (bemærk præfikset {, der skaber en blok indtil det lukkende } og præfikset :, som faktisk definerer ordet). setxy tager et tal fra toppen af stakken, definerer (eller redefinerer) det som en global konstant x, og kvadratet af dette tal — som konstant y (da værdierne for konstanter kan redefineres, ville jeg hellere kalde dem variabler, men jeg følger navngivningen i sproget).

I de næste to linjer lægges et tal på stakken, kaldes setxy, hvorefter værdierne af konstanterne vises x, y (til udskrivning anvendes ordet .), begge konstanter placeres på stakken, summeres og resultatet udskrives også. Resultatet vil være:

3 9 12 ok
7 49 56 ok

(Linjen "ok" udskrives af fortolkeren, når den afslutter behandlingen af den aktuelle linje i interaktiv indgangstilstand)

Og her er et fuldt udgangspunkt kode:

"Asm.fif" inkludere

-1 konstant wc  \/\/ opret en wallet i workchain -1 (masterchain)

\/\/ Opret ny simpel wallet
&lt;{  SETCP0 DUP IFNOTRET INC 32 THROWIF  \/\/ returner, hvis recv_internal, mislykkes medmindre recv_external
    512 INT LDSLICEX DUP 32 PLDU   \/\/ sign cs cnt
    c4 PUSHCTR CTOS 32 LDU 256 LDU ENDS  \/\/ sign cs cnt cnt&#039; pubk
    s1 s2 XCPU            \/\/ sign cs cnt pubk cnt&#039; cnt
    EQUAL 33 THROWIFNOT   \/\/ ( sekvensnummer 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         \/\/ signatur 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
}&gt;c
\/\/ kode
<b 0 32 u, newkeypair swap dup constant wallet_pk "new-wallet.pk" b>fil
   B, 
b&gt;  \/\/ data
\/\/ ingen biblioteker
<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;fil
<b 0 32 u, b>
dup ."signering besked: " <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 ."Ekstern besked til initialization er " <s csr. cr
2 boc+>B dup Bx. cr
"new-wallet-query.boc" tuck B&gt;fil
."(Gem til fil " type .")" cr

Denne lidt skræmmende fil er beregnet til at oprette en smart kontrakt — den vil blive placeret i filen new-wallet-query.boc efter udførelsen. Bemærk, at der her bruges endnu et assembliesprog til TON Virtual Machine (jeg vil ikke gå i detaljer med det), hvis instruktioner vil blive placeret i blockchainen.

Dermed er assemblersproget for TVM skrevet i Fift — kilden til dette assembleringsprogram findes i filen crypto/fift/Asm.fif og inkluderes i begyndelsen af den nævnte kodeblok.

Hvad kan jeg sige, Nikolaj Durov ser ud til at elske at skabe nye programmeringssprog 🙂

Oprettelse af en smart kontrakt og interaktion med TON

Lad os antage, at vi har samlet klienten TON og Fift-tolkeren som beskrevet ovenfor, og er blevet bekendt med sproget. Hvordan opretter vi nu en smart kontrakt? Det beskrives i filen HOWTO, der er vedhæftet kildekoderne.

Konti i TON

Som jeg beskrev i TON-oversigten, indeholder dette netværk mere end én blockchain - der er en fælles, den såkaldte "masterchain", samt et vilkårligt antal ekstra "workchains", identificeret med et 32-bit nummer. Masterchain har identifikatoren -1, og der kan også anvendes en "grundlæggende" workchain med identifikatoren 0. Hver workchain kan have sin egen konfiguration. Inden for hver workchain opdeles hver workchain internt i shardchains, men det er en implementeringsdetalje, som man ikke nødvendigvis skal holde i tankerne.

Inden for en workchain opbevares mange konti, som har deres egne identifikatorer account_id. For masterchain og den nul workchain er de 256 bit lange. Således skrives identifikatoren for en konto eksempelvis således:

-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Dette er et "råt" format: først identifikatoren for workchainen, derefter et kolon, og til sidst kontoen identificeret i hexadecimal.

Derudover findes der et forkortet format - workchain-nummeret og kontoadressen kodes i binær, tilføjes en kontrolsum, og alt dette kodes i Base64:

Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb

Med kendskab til dette format kan vi anmode om den nuværende tilstand af en hvilken som helst konto via klienten med kommandoen

getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Vi får et svar, der ligner følgende:

[ 3][t 2][1558746708.815218925][test-lite-client.cpp:631][!testnode]    anmoderer konto status for -1:8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D
[ 3][t 2][1558746708.858564138][test-lite-client.cpp:652][!testnode]    fik konto status for -1:8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D i forhold til blokke (-1,8000000000000000,72355):F566005749C1B97F18EDE013EBA7A054B9014961BC1AD91F475B9082919A2296:1BD5DE54333164025EE39D389ECE2E93DA2871DA616D488253953E52B50DC03F og (-1,8000000000000000,72355):F566005749C1B97F18EDE013EBA7A054B9014961BC1AD91F475B9082919A2296:1BD5DE54333164025EE39D389ECE2E93DA2871DA616D488253953E52B50DC03F
konto status er (konto
  addr:(addr_std
    anycast:nothing workchain_id:-1 adresse: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:(konto_storage sidste_trans_lt:74208000003
    balance:(valutaer
      grams:(nanograms
        amount:(var_uint len:7 value:999928362430000))
      other:(ekstra_valutaer
        dict:hme_empty))
    state:(konto_aktiv
      (
        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 strukturen, der opbevares i DHT for den angivne arbejdskæde. For eksempel er i feltet storage.balance den nuværende saldo for kontoen, i storage.state.code — koden for smartkontrakten, og i storage.state.data — dens nuværende data. Bemærk, at datalageret TON — Cell, cellerne — er hierarkisk, hver celle kan have både sine egne data og datterceller. Dette er vist med indrykninger i de sidste linjer.

Bygning af smartkontrakten

Lad os nu skabe en sådan struktur (den kaldes BOC — bag of cells) ved hjælp af Fift-sproget. Heldigvis behøver vi ikke at skrive smartkontrakten selv — i mappen crypto/block fra arkivet med kildekoden er der en fil new-wallet.fif, som vil hjælpe os med at oprette en ny tegnebog. Lad os kopiere den til mappen med den samlede klient (\liteclient-build, hvis du har fulgt instruktionerne ovenfor). Indholdet af den samme fil har jeg nævnt ovenfor som et eksempel på kode i Fift.

Vi udfører denne fil på følgende måde:

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

Her <source-directory> skal erstattes med stien til de udpakkede kilder (symbolet „~“ kan desværre ikke bruges her, der kræves en fuld sti). I stedet for at bruge nøglens -I kan du definere en miljøvariabel FIFTPATH og placere denne sti i den.

Da Fift startede vi med filnavnet new-wallet.fif, vil den udføre det og afslutte. Hvis filnavnet udelades, kan man lege med fortolker i interaktiv tilstand.

I konsollen efter udførelsen skal der komme noget som dette:

StateInit: x{34_}
 x{FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED54}
 x{0000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B}

ny tegneadresse = -1 : 4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 
0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ
signering besked: x{00000000}

Ekstern besked til initialisering er x{89FEE120E20C7E953E31546F64C23CD654002C1AA919ADD24DB12DDF85C6F3B58AE41198A28AD8DAF3B9588E7A629252BA3DB88F030D00BC1016110B2073359EAC3C13823C53245B65D056F2C070B940CDA09789585935C7ABA4D2AD4BED139281CFA1200000001_}
 x{FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED54}
 x{0000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B}

B5EE9C724104030100000000D60002CF89FEE120E20C7E953E31546F64C23CD654002C1AA919ADD24DB12DDF85C6F3B58AE41198A28AD8DAF3B9588E7A629252BA3DB88F030D00BC1016110B2073359EAC3C13823C53245B65D056F2C070B940CDA09789585935C7ABA4D2AD4BED139281CFA1200000001001020084FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED5400480000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B6290698B
(Gem til fil new-wallet-query.boc)

Dette betyder, at tegnebogen med identifikatoren -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (eller, for den sags skyld, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) er blevet oprettet. Den tilsvarende kode vil være i filen new-wallet-query.boc, dens adresse er i new-wallet.addr, og den private nøgle er i new-wallet.pk (vær forsigtig - genstart af scriptet vil overskrive disse filer).

Selvfølgelig ved TON-netværket endnu ikke om denne tegnebog, den eksisterer kun i form af disse filer. Nu skal den indlæses i netværket. Problemet er, at man skal betale et gebyr for at oprette en smart kontrakt, og din kontos balance er endnu nul.

I driftsmode vil dette problem blive løst ved at købe gram på børsen (eller overføre fra en anden tegnebog). Men i den nuværende testtilstand er der oprettet en speciel smart kontrakt, som man kan anmode om op til 20 gram gratis.

Oprettelse af anmodning til en anden smart kontrakt

Anmodningen til smart kontrakten, der giver gram til højre og venstre, laves således. I den samme mappe crypto/block finder vi filen 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 ."omsluttende besked: " <s csr. cr
<b b{1000100} s, wc 8 i, wallet_addr 256 u, 0 gram, b{00} s,
 swap <s b>
dup ."resulterende ekstern besked: " <s csr. cr
2 boc+>B dup Bx. cr
"wallet-query.boc" B&gt;fil

Den gemmer vi også i mappen med den samlede klient, men retter den femte linje - før linjen "constant dest_addr". Erstat den med adressen på den tegnebog, du oprettede tidligere (fuld, ikke forkortet). "-1:" skal ikke skrives i starten, i stedet skal du sætte "0x" i begyndelsen.

Man kan også ændre linjen 6.666 Gram* / konstant beløb — det er den mængde i gram, du anmoder om (ikke mere end 20). Selv hvis du angiver et helt tal, så efterlad decimalpunktet.

Til sidst skal vi justere linjen 0x00000011 konstant seqno. Det første nummer her er det nuværende sequence number, som opbevares i kontoen, der uddeler gram. Hvor får man det fra? Som nævnt før, start klienten og udfør:

last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Til sidst i oplysningerne om smart-kontrakten vil der være

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

Tallet 0000000D (det vil være større for dig) er sequence number, som skal indsættes i testgiver.fif.

Det er det, gem filen og kør (./crypto/fift testgiver.fif). Som output får vi filen wallet-query.boc. Det er den dannede en meddelelse til en anden smart-kontrakt — anmodning "overfør så meget gram til denne konto".

Vi uploader den i netværket ved hjælp af klienten:

> sendfile wallet-query.boc
[ 1][t 1][1558747399.456575155][test-lite-client.cpp:577][!testnode]    sender forespørgsel fra fil wallet-query.boc
[ 3][t 2][1558747399.500236034][test-lite-client.cpp:587][!query]   ekstern beskedstatus er 1

Hvis vi nu kalder sidste, og derefter anmoder om statusen af kontoen, hvor vi bad om gram, bør vi se, at dens sequence number er steget med én — det betyder, at den har sendt penge til vores konto.

Der er et sidste skridt - upload koden til vores tegnebog (dens balance er allerede blevet fyldt op, men uden smart-kontraktens kode kan vi ikke administrere den). Udfør sendfile new-wallet-query.boc — og det er det, du har din egen tegnebog i TON-netværket (selv om det kun er testnet).

Oprettelse af udgående transaktioner

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

Som før skal vi på samme måde justere beløbet, du overfører, modtagerens adresse (dest_addr) og seqno for din tegnebog (den er lig med 1 efter oprettelsen af tegnebogen og stiger 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 tegnebog — 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.

Ved kørsel (./crypto/fift wallet.fif) vil scriptet tage adressen på din tegnebog (hvorfra du overfører) og dens private nøgle fra filerne new-wallet.addr og new-wallet.pk, og den modtagne meddelelse vil blive gemt i new-wallet-query.boc.

Som før, for at udføre transaktionen direkte, kalder vi sendfile new-wallet-query.boc i klienten. Husk derefter at opdatere tilstanden af blockchainen (sidste) og kontroller, at saldoen og seqno for vores tegnebog er ændret (getaccount).

TON-testklient (Telegram Open Network) og det nye sprog Fift til smart contracts

Og det er det, nu kan vi oprette smart contracts på TON og sende forespørgsler til dem. Som vi kan se, er den nuværende funktionalitet allerede tilstrækkelig til for eksempel at lave en mere brugervenlig tegnebog med grafisk interface (dog forventes det, at dette også bliver tilgængeligt som en del af messaging-tjenesten).

Kun registrerede brugere kan deltage i undersøgelsen. Log ind, please.

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

  • Ja, jeg venter på afslutningen af artikelcyklussen med overordnet gennemgang af TON

  • Ja, jeg vil gerne læse mere om Fift-sproget

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

  • Nej, jeg er ikke interesseret i noget af dette

39 brugere har stemt. 12 brugere har undladt at stemme.

Hvad mener du om Telegrams planer om at lancere TON?

  • Jeg har store forhåbninger til dette projekt

  • Jeg følger blot interessen for dets udvikling

  • Jeg er skeptisk og tvivler på dets succes

  • Jeg betragter denne initiativ som mislykket, unødvendig for bredere masser

47 brugere har stemt. 12 brugere har undladt at tage stilling.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster