Test klient TON (Telegram Open Network) og nytt Fift-språk for smarte kontrakter

For mer enn et år siden ble det kjent om planene til Telegram-messengeren om å frigjøre sitt eget desentraliserte nettverk Åpne nettverkstelegram. Så ble et omfangsrikt teknisk dokument tilgjengelig, som angivelig ble skrevet av Nikolai Durov og beskrev strukturen til det fremtidige nettverket. For de som gikk glipp av det, anbefaler jeg at du leser min gjenfortelling av dette dokumentet (del 1, del 2; den tredje delen, dessverre, samler fortsatt støv i trekk).

Siden den gang har det ikke vært noen vesentlige nyheter om status for TON-utvikling før for et par dager siden (i en av uoffisielle kanaler) linken til siden dukket ikke opp https://test.ton.org/download.html, hvor ligger:
tonn-test-liteclient-full.tar.xz — kilder til en lysklient for TON-testnettverket;
ton-lite-client-test1.config.json — konfigurasjonsfil for tilkobling til testnettverket;
README — informasjon om bygging og lansering av klienten;
HVORDAN — trinnvise instruksjoner om hvordan du oppretter en smart kontrakt med en klient;
tonn.pdf — oppdatert dokument (datert 2. mars 2019) med en teknisk oversikt over TON-nettverket;
tvm.pdf — teknisk beskrivelse av TVM (TON Virtual Machine, TON virtuell maskin);
tblkch.pdf — teknisk beskrivelse av TON-blokkjeden;
fifthbase.pdf — beskrivelse av det nye Fift-språket, designet for å lage smarte kontrakter i TON.

Jeg gjentar, det var ingen offisiell bekreftelse av siden og alle disse dokumentene fra Telegram, men volumet av disse materialene gjør dem ganske plausible. Start den publiserte klienten på egen risiko.

Bygge en testklient

Først, la oss prøve å bygge og kjøre en testklient – ​​heldigvis, README beskriver denne enkle prosessen i detalj. Jeg vil gjøre dette ved å bruke macOS 10.14.5 som et eksempel; jeg kan ikke gå god for suksessen til byggingen på andre systemer.

  1. Last ned og pakke ut kildearkiv. Det er viktig å laste ned den nyeste versjonen siden bakoverkompatibilitet ikke er garantert på dette stadiet.

  2. Sørg for at de nyeste versjonene av make, cmake (versjon 3.0.2 eller høyere), OpenSSL (inkludert C-header-filer), g++ eller clang er installert på systemet. Jeg trengte ikke å installere noe, alt kom sammen med en gang.

  3. La oss anta at kildene er pakket ut i en mappe ~/lite-client. Separat fra det, lag en tom mappe for det sammensatte prosjektet (for eksempel ~/liteclient-build), og fra det (cd ~/liteclient-build) kall kommandoene:

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

    Test klient TON (Telegram Open Network) og nytt Fift-språk for smarte kontrakter

    For å bygge Fift-språktolken for smarte kontrakter (mer om det nedenfor), ringer vi også

    cmake --build . --target fift

  4. Last ned den nåværende konfigurasjonsfil for å koble til testnettverket og legge det i mappen med den sammensatte klienten.

  5. Finish, kan du starte klienten:

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

Hvis alt er gjort riktig, bør du se noe slikt:

Test klient TON (Telegram Open Network) og nytt Fift-språk for smarte kontrakter

Som vi kan se, er det få tilgjengelige kommandoer:
help — vis denne listen over kommandoer;
quit - gå ut;
time — vis gjeldende tid på serveren;
status — vis tilkoblingen og lokal databasestatus;
last - oppdater tilstanden til blokkjeden (last ned den siste blokken). Det er viktig å kjøre denne kommandoen før noen forespørsler for å være sikker på at du ser gjeldende status for nettverket.
sendfile <filename> — last opp en lokal fil til TON-nettverket. Slik oppstår interaksjon med nettverket – inkludert for eksempel opprettelse av nye smarte kontrakter og forespørsler om å overføre midler mellom kontoer;
getaccount <address> — vis gjeldende (på tidspunktet kommandoen ble utført) last) statusen til kontoen med den angitte adressen;
privkey <filename> - last den private nøkkelen fra en lokal fil.

Hvis du, når du starter klienten, overfører en mappe til den ved å bruke alternativet -D, så vil han legge til den siste blokken av masterchain i den:

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

Nå kan vi gå videre til mer interessante ting - lær Fift-språket, prøv å kompilere en smart kontrakt (for eksempel lag en testlommebok), last den opp til nettverket og prøv å overføre midler mellom kontoer.

Language Fift

Fra dokumentet fifthbase.pdf du kan finne ut at Telegram-teamet har laget et nytt stabelspråk for å lage smarte kontrakter Fift (tilsynelatende fra tallet femte, lik Forth, et språk som Fifth har mye til felles med).

Dokumentet er ganske omfangsrikt, 87 sider, og jeg vil ikke gjenfortelle innholdet i detalj innenfor rammen av denne artikkelen (i hvert fall fordi jeg ikke har lest det ferdig selv :). Jeg vil fokusere på hovedpunktene og gi et par kodeeksempler på dette språket.

På et grunnleggende nivå er Fifts syntaks ganske enkel: koden består av ord, vanligvis atskilt med mellomrom eller linjeskift (spesielt tilfelle: noen ord krever ikke skilletegn etter seg selv). Noen ordet er en sekvens med store og små bokstaver som tilsvarer en viss bestemmelse av (omtrent hva tolken skal gjøre når den møter dette ordet). Hvis det ikke er noen definisjon av et ord, prøver tolken å analysere det som et tall og legge det på stabelen. Forresten, tallene her er - plutselig - 257-bits heltall, og det er ingen brøker i det hele tatt - mer presist blir de umiddelbart til et par heltall, og danner telleren og nevneren til en rasjonell brøk.

Ord har en tendens til å samhandle med verdier på toppen av stabelen. En egen type ord - prefiks — bruker ikke stabelen, men de påfølgende tegnene fra kildefilen. Dette er for eksempel hvordan strengbokstaver implementeres - anførselstegnet (") er et prefiksord som leter etter neste (avsluttende) sitat, og skyver strengen mellom dem på stabelen. One-liners oppfører seg på samme måte (//) og multiline (/*) kommentarer.

Det er her nesten hele den interne strukturen i språket slutter. Alt annet (inkludert kontrollkonstruksjoner) er definert som ord (enten interne, for eksempel aritmetiske operasjoner og definisjonen av nye ord; eller definert i "standardbiblioteket" Fift.fif, som ligger i mappen crypto/fift i kildene).

Et enkelt eksempelprogram i Fift:

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

Den første linjen definerer et nytt ord setxy (merk prefikset {, som lager en blokk før den avsluttende } og prefiks :, som faktisk definerer ordet). setxy tar et tall fra toppen av stabelen, definerer (eller omdefinerer) det som globalt konstant x, og kvadratet av dette tallet som en konstant y (Gi at verdiene til konstanter kan omdefineres, vil jeg heller kalle dem variabler, men jeg følger navnekonvensjonen i språket).

De neste to linjene legger et nummer på stabelen og ringer setxy, så vises verdiene til konstantene x, y (ordet brukes for utdata .), legges begge konstantene på stabelen, summeres, og resultatet skrives også ut. Som et resultat vil vi se:

3 9 12 ok
7 49 56 ok

(Linjen "ok" skrives ut av tolken når den er ferdig med å behandle gjeldende linje i interaktiv inndatamodus)

Vel, et fullstendig 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 skumle filen er for å lage en smart kontrakt - den vil bli plassert i en fil new-wallet-query.boc etter henrettelse. Vær oppmerksom på at et annet monteringsspråk brukes her for TON Virtual Machine (jeg vil ikke dvele ved det i detalj), instruksjonene som vil bli plassert på blokkjeden.

Dermed er assembleren for TVM skrevet i Fift - kildene til denne assembleren er i filen crypto/fift/Asm.fif og er koblet til i begynnelsen av kodestykket ovenfor.

Hva kan jeg si, tilsynelatende elsker Nikolai Durov å lage nye programmeringsspråk:)

Opprette en smart kontrakt og samhandle med TON

Så, la oss anta at vi har satt sammen TON-klienten og Fift-tolken som beskrevet ovenfor og blitt kjent med språket. Hvordan lage en smart kontrakt nå? Dette er beskrevet i filen HVORDAN, vedlagt kildene.

Kontoer i TON

Som jeg beskrev i TON anmeldelse, inneholder dette nettverket mer enn én blokkjede - det er én vanlig, den såkalte. "hovedkjede", samt et vilkårlig antall ekstra "arbeidskjeder", identifisert med et 32-bits nummer. Hovedkjeden har en identifikator på -1, i tillegg til den kan det også brukes en "base" arbeidskjede med en identifikator på 0. Hver arbeidskjede kan ha sin egen konfigurasjon. Internt er hver arbeidskjede delt inn i shardchains, men dette er en implementeringsdetalj som ikke trenger å huskes på.

Innenfor én arbeidskjede lagres mange kontoer som har sine egne account_id-identifikatorer. For masterkjeden og nullarbeidskjeden er de 256 bits lange. Dermed skrives kontoidentifikatoren for eksempel slik:

-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Dette er det "rå" formatet: først arbeidskjede-ID, deretter et kolon, og konto-ID i heksadesimal notasjon.

I tillegg er det et forkortet format - arbeidskjedenummeret og kontoadressen er kodet i binær form, en kontrollsum legges til dem, og alt dette er kodet i Base64:

Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb

Når vi kjenner til dette postformatet, kan vi be om gjeldende status for en konto gjennom en testklient ved å bruke kommandoen

getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Vi får noe sånt 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 strukturen som er lagret i DHT til den angitte arbeidskjeden. For eksempel i felten storage.balance er gjeldende kontosaldo, i storage.state.code - smart kontraktskode, og inn storage.state.data - gjeldende data. Vær oppmerksom på at TON-datalagringen - Cell, celler - er trelignende, hver celle kan ha både sine egne data og underceller. Dette vises som innrykk i de siste linjene.

Bygge en smart kontrakt

La oss nå lage en slik struktur selv (den kalles BOC - pose med celler) ved å bruke Fift-språket. Heldigvis trenger du ikke skrive en smart kontrakt selv - i mappen crypto/block det er en fil fra kildearkivet new-wallet.fif, som vil hjelpe oss med å lage en ny lommebok. La oss kopiere den til mappen med den sammensatte klienten (~/liteclient-build, hvis du fulgte instruksjonene ovenfor). Jeg siterte innholdet ovenfor som et eksempel på kode på Fift.

Kjør denne filen som følger:

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

Her <source-directory> må erstattes med banen til de utpakkede kildene («~»-symbolet kan dessverre ikke brukes her, hele banen er nødvendig). I stedet for å bruke en nøkkel -I du kan definere en miljøvariabel FIFTPATH og legge denne veien inn i den.

Siden vi lanserte Fift med filnavnet new-wallet.fif, vil den kjøre den og avslutte. Hvis du utelater filnavnet, kan du leke med tolken interaktivt.

Etter utførelse skal noe sånt 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)

Dette betyr at lommeboken med ID -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (eller, hva er det samme, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) opprettet. Den tilsvarende koden vil være i filen new-wallet-query.boc, adressen hans er i new-wallet.addr, og den private nøkkelen er inne new-wallet.pk (vær forsiktig - å kjøre skriptet på nytt vil overskrive disse filene).

Selvfølgelig vet TON-nettverket ennå ikke om denne lommeboken; den lagres bare i form av disse filene. Nå må den lastes opp til nettverket. Problemet er imidlertid at for å lage en smart kontrakt må du betale en provisjon, og kontosaldoen din er fortsatt null.

I arbeidsmodus vil dette problemet løses ved å kjøpe gram på børsen (eller overføre fra en annen lommebok). Vel, i den nåværende testmodusen er det opprettet en spesiell smartkontrakt, som du kan be om opptil 20 gram bare sånn.

Genererer en forespørsel til andres smarte kontrakt

Vi sender en forespørsel til en smart kontrakt som fordeler gram til venstre og høyre på denne måten. I samme mappe crypto/block finne 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+ 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 vil også lagre den i mappen med den sammensatte klienten, men vi vil korrigere den femte linjen - før linjen "constant dest_addr". La oss erstatte den med adressen til lommeboken du opprettet før (fullstendig, ikke forkortet). Det er ikke nødvendig å skrive "-1:" i begynnelsen, sett i stedet "0x" i begynnelsen.

Du kan også endre linjen 6.666 Gram*/ constant amount — dette er mengden i gram du ber om (ikke mer enn 20). Selv om du angir et helt tall, la desimaltegn stå.

Til slutt må du korrigere linjen 0x00000011 constant seqno. Det første tallet her er det gjeldende sekvensnummeret, som er lagret i kontoen som utsteder gram. Hvor kan jeg få det fra? Som nevnt ovenfor, start klienten og kjør:

last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Helt på slutten vil smartkontraktsdataene inneholde

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

Tallet 0000000D (din vil være større) er sekvensnummeret som må erstattes med testgiver.fif.

Det er det, lagre filen og kjør (./crypto/fift testgiver.fif). Utdataene vil være en fil wallet-query.boc. Det er dette som dannes сообщение til noen andres smarte kontrakt - en forespørsel "overfør så mange gram til en slik og en konto."

Ved å bruke klienten laster vi den opp til nettverket:

> 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 nå ringer last, og så igjen be om statusen til kontoen vi ba om gram fra, så bør vi se at sekvensnummeret har økt med én - dette betyr at den sendte penger til kontoen vår.

Det siste trinnet gjenstår - last ned koden til lommeboken vår (saldoen er allerede fylt opp, men uten den smarte kontraktskoden vil vi ikke kunne administrere den). Vi gjennomfører sendfile new-wallet-query.boc - og det er det, du har din egen lommebok i TON-nettverket (selv om det bare er en test for nå).

Opprette utgående transaksjoner

For å overføre penger fra saldoen til den opprettede kontoen, er det en fil crypto/block/wallet.fif, som også må plasseres i mappen med den sammensatte klienten.

I likhet med de foregående trinnene, må du justere beløpet du overfører, mottakerens adresse (dest_addr) og følgenummeret til lommeboken din (den er lik 1 etter initialisering av lommeboken og øker med 1 etter hver utgående transaksjon - du kan se den ved å be om statusen til kontoen din). For tester kan du for eksempel bruke lommeboken min - 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.

Ved oppstart (./crypto/fift wallet.fif) skriptet vil ta adressen til lommeboken din (der du overfører) og dens private nøkkel fra filene new-wallet.addr и new-wallet.pk, og den mottatte meldingen vil bli skrevet til new-wallet-query.boc.

Som før, for å utføre transaksjonen direkte, ring sendfile new-wallet-query.boc i klienten. Etter dette, ikke glem å oppdatere tilstanden til blokkjeden (last) og kontroller at saldoen og følgenummeret til lommeboken vår er endret (getaccount <account_id>).

Test klient TON (Telegram Open Network) og nytt Fift-språk for smarte kontrakter

Det er alt, nå kan vi lage smarte kontrakter i TON og sende forespørsler til dem. Som du kan se, er den nåværende funksjonaliteten allerede nok til for eksempel å lage en mer vennlig lommebok med et grafisk grensesnitt (det forventes imidlertid at den allerede vil bli tilgjengelig som en del av messenger).

Kun registrerte brukere kan delta i undersøkelsen. Logg inn, vær så snill.

Er du interessert i å fortsette artiklene med analyse av TON, TVM, Fift?

  • Ja, jeg venter på fullføringen av artikkelserien med en generell oversikt over TON

  • Ja, det er interessant å lese mer om Fift-språket

  • Ja, jeg vil lære mer om TON Virtual Machine og assembleren for den

  • Nei, ingenting av dette er interessant

39 brukere stemte. 12 brukere avsto.

Hva synes du om Telegrams planer om å lansere TON?

  • Jeg har store forhåpninger til dette prosjektet

  • Jeg følger bare med interesse.

  • Jeg er skeptisk og tviler på suksessen.

  • Jeg er tilbøyelig til å betrakte dette initiativet som en fiasko og unødvendig for de brede massene

47 brukere stemte. 12 brukere avsto.

Kilde: www.habr.com

Legg til en kommentar