ProHoster > Blog > Administrácia > Testovací klient TON (Telegram Open Network) a nový jazyk Fift pre smart kontrakty
Testovací klient TON (Telegram Open Network) a nový jazyk Fift pre smart kontrakty
Pred viac ako rokom sa dozvedeli o plánoch telegramového posla na uvoľnenie vlastnej decentralizovanej siete Otvorte telegram siete. Potom bol k dispozícii rozsiahly technický dokument, ktorý údajne napísal Nikolaj Durov a popisoval štruktúru budúcej siete. Tým, ktorým to uniklo, odporúčam prečítať si moje prerozprávanie tohto dokumentu (Časť 1, Časť 2; tretia časť, bohužiaľ, stále zbiera prach v prievane).
Odvtedy neboli až do pred pár dňami žiadne významné správy o stave vývoja TON (v jednom z neoficiálne kanály) odkaz na stránku sa nezobrazil https://test.ton.org/download.html, kde sa nachádzajú:
◦ ton-test-liteclient-full.tar.xz — zdroje svetelného klienta pre testovaciu sieť TON;
◦ ton-lite-client-test1.config.json — konfiguračný súbor na pripojenie k testovacej sieti;
◦ README — informácie o budovaní a spustení klienta;
◦ AKO — podrobné pokyny na vytvorenie inteligentnej zmluvy pomocou klienta;
◦ ton.pdf — aktualizovaný dokument (z 2. marca 2019) s technickým prehľadom siete TON;
◦ tvm.pdf — technický popis TVM (Virtuálny stroj TON, virtuálny stroj TON);
◦ tblkch.pdf — technický popis blockchainu TON;
◦ piaty základ.pdf — popis nového jazyka Fift, určeného na vytváranie smart kontraktov v TON.
Opakujem, neexistovalo žiadne oficiálne potvrdenie stránky a všetkých týchto dokumentov z Telegramu, ale objem týchto materiálov ich robí celkom hodnovernými. Spustite publikovaného klienta na vlastné riziko.
Vytvorenie testovacieho klienta
Najprv skúsme zostaviť a spustiť testovacieho klienta – našťastie, README podrobne popisuje tento jednoduchý proces. Urobím to pomocou macOS 10.14.5 ako príklad; nemôžem ručiť za úspech zostavenia na iných systémoch.
Stiahnite a rozbaľte zdrojový archív. Je dôležité stiahnuť si najnovšiu verziu, pretože v tejto fáze nie je zaručená spätná kompatibilita.
Uistite sa, že v systéme sú nainštalované najnovšie verzie make, cmake (verzia 3.0.2 alebo vyššia), OpenSSL (vrátane hlavičkových súborov C), g++ alebo clang. Nemusel som nič inštalovať, všetko bolo hneď.
Predpokladajme, že zdroje sú rozbalené do priečinka ~/lite-client. Oddelene od neho vytvorte prázdny priečinok pre zostavený projekt (napr. ~/liteclient-build), az toho (cd ~/liteclient-build) zavolajte príkazy:
Ak je všetko vykonané správne, mali by ste vidieť niečo takéto:
Ako vidíme, existuje niekoľko dostupných príkazov:
◦ help — zobraziť tento zoznam príkazov;
◦ quit - Choď von;
◦ time — zobraziť aktuálny čas na serveri;
◦ status — zobraziť stav pripojenia a lokálnej databázy;
◦ last — aktualizovať stav blockchainu (stiahnuť posledný blok). Je dôležité spustiť tento príkaz pred akýmikoľvek požiadavkami, aby ste si boli istí, že vidíte aktuálny stav siete.
◦ sendfile<filename> — nahrajte lokálny súbor do siete TON. Takto dochádza k interakcii so sieťou – vrátane napríklad vytvárania nových inteligentných zmlúv a žiadostí o prevod prostriedkov medzi účtami;
◦ getaccount<address> — zobraziť aktuálny (v čase vykonania príkazu) last) stav účtu so zadanou adresou;
◦ privkey<filename> — načítať súkromný kľúč z lokálneho súboru.
Ak pri spustení klienta do neho prenesiete priečinok pomocou voľby -D, potom do neho pridá posledný blok masterchainu:
Teraz môžeme prejsť k zaujímavejším veciam – naučiť sa jazyk Fift, skúsiť zostaviť smart kontrakt (napríklad si vytvoriť testovaciu peňaženku), nahrať ju na sieť a vyskúšať si prevod financií medzi účtami.
Jazyková piata
Z dokumentu piaty základ.pdf môžete zistiť, že tím Telegramu vytvoril nový jazyk zásobníka na vytváranie inteligentných zmlúv Päť (zrejme z čísla piaty, podobne ako Forth, jazyk, s ktorým má Fifth veľa spoločného).
Dokument je pomerne objemný, má 87 strán a jeho obsah nebudem v rámci tohto článku podrobne prepisovať (aspoň preto, že som ho sám nedočítal :). Zameriam sa na hlavné body a uvediem niekoľko príkladov kódu v tomto jazyku.
Na základnej úrovni je syntax Fift celkom jednoduchá: jej kód pozostáva z slová, zvyčajne oddelené medzerami alebo zalomením riadkov (špeciálny prípad: niektoré slová za sebou nevyžadujú oddeľovač). akýkoľvek слово je sekvencia znakov rozlišujúca veľkosť písmen, ktorá zodpovedá určitému určenie (približne, čo by mal tlmočník urobiť, keď na toto slovo narazí). Ak neexistuje žiadna definícia slova, tlmočník sa ho pokúsi analyzovať ako číslo a vložiť ho do zásobníka. Mimochodom, čísla sú tu - zrazu - 257-bitové celé čísla a neexistujú vôbec žiadne zlomky - presnejšie, okamžite sa zmenia na pár celých čísel, ktoré tvoria čitateľ a menovateľ racionálneho zlomku.
Slová majú tendenciu interagovať s hodnotami v hornej časti zásobníka. Samostatný typ slov - predpona — nepoužíva zásobník, ale nasledujúce znaky zo zdrojového súboru. Napríklad takto sú implementované reťazcové literály - znak citácie (") je predponové slovo, ktoré hľadá nasledujúci (záverečný) úvodzovky a vkladá reťazec medzi ne do zásobníka. Jednovrstvové vložky sa správajú rovnakým spôsobom (//) a viacriadkový (/*) komentáre.
Tu končí takmer celá vnútorná štruktúra jazyka. Všetko ostatné (vrátane konštruktov riadenia) je definované ako slová (buď interné, ako sú aritmetické operácie a definícia nových slov; alebo definované v "štandardnej knižnici" Fift.fif, ktorý sa nachádza v priečinku crypto/fift v zdrojoch).
Jednoduchý príklad programu v Fifte:
{ dup =: x dup * =: y } : setxy
3 setxy x . y . x y + .
7 setxy x . y . x y + .
Prvý riadok definuje nové slovo setxy (všimnite si predponu {, čím sa vytvorí blok pred uzávierkou } a predpona :, čo vlastne toto slovo definuje). setxy vezme číslo z hornej časti zásobníka, definuje (alebo predefinuje) ho ako globálne konštantnýxa druhá mocnina tohto čísla ako konštanta y (Vzhľadom na to, že hodnoty konštánt sa dajú predefinovať, skôr by som ich nazval premenné, ale riadim sa konvenciou pomenovania v jazyku).
Nasledujúce dva riadky umiestnia číslo na zásobník a dorovnajú setxy, potom sa zobrazia hodnoty konštánt x, y (slovo sa používa pre výstup .), obe konštanty sa umiestnia do zásobníka, sčítajú sa a výsledok sa tiež vytlačí. V dôsledku toho uvidíme:
3 9 12 ok
7 49 56 ok
(Riadok „ok“ vytlačí tlmočník, keď dokončí spracovanie aktuálneho riadku v režime interaktívneho vstupu)
Tento strašidelne vyzerajúci súbor je určený na vytvorenie inteligentnej zmluvy – umiestni sa do súboru new-wallet-query.boc po vykonaní. Upozorňujeme, že pre TON Virtual Machine je tu použitý iný jazyk symbolických inštrukcií (nebudem sa mu podrobne venovať), ktorého návod bude umiestnený na blockchaine.
Assembler pre TVM je teda napísaný v Fifte - zdroje tohto assembleru sú v súbore crypto/fift/Asm.fif a sú spojené na začiatku vyššie uvedeného kódu.
Čo môžem povedať, Nikolai Durov zjavne miluje vytváranie nových programovacích jazykov :)
Vytvorenie inteligentnej zmluvy a interakcia so spoločnosťou TON
Predpokladajme teda, že sme zostavili klienta TON a tlmočníka Fift podľa vyššie uvedeného popisu a oboznámili sa s jazykom. Ako teraz vytvoriť inteligentnú zmluvu? Toto je popísané v súbore AKO, priložený k prameňom.
Účty v TON
Ako som opísal v recenzia TON, táto sieť obsahuje viac ako jeden blockchain – existuje jeden spoločný, tzv. "hlavný reťazec", ako aj ľubovoľný počet ďalších "pracovných reťazcov", identifikovaných 32-bitovým číslom. Masterchain má identifikátor -1, okrem neho je možné použiť aj „základný“ pracovný reťazec s identifikátorom 0. Každý pracovný reťazec môže mať svoju konfiguráciu. Interne je každý pracovný reťazec rozdelený na shardchainy, ale toto je detail implementácie, ktorý netreba mať na pamäti.
V rámci jedného pracovného reťazca je uložených veľa účtov, ktoré majú svoje vlastné identifikátory account_id. Pre hlavný reťazec a nulový pracovný reťazec majú dĺžku 256 bitov. Identifikátor účtu sa teda zapíše napríklad takto:
Toto je „surový“ formát: najprv ID pracovného reťazca, potom dvojbodka a ID účtu v šestnástkovej sústave.
Okrem toho existuje skrátený formát - číslo pracovného reťazca a adresa účtu sú zakódované v binárnej podobe, pridá sa k nim kontrolný súčet a to všetko je zakódované v Base64:
Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb
Keď poznáme tento formát záznamu, môžeme si vyžiadať aktuálny stav účtu prostredníctvom testovacieho klienta pomocou príkazu
[ 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}
Vidíme štruktúru, ktorá je uložená v DHT zadaného pracovného reťazca. Napríklad v teréne storage.balance je stav bežného účtu, v storage.state.code - kód inteligentnej zmluvy a in storage.state.data - jeho aktuálne údaje. Upozorňujeme, že dátové úložisko TON – Bunka, bunky – je stromové, každá bunka môže mať svoje vlastné údaje aj podradené bunky. Toto je zobrazené ako odsadenie v posledných riadkoch.
Budovanie inteligentnej zmluvy
Teraz si takúto štruktúru vytvoríme sami (nazýva sa BOC - vrece buniek) pomocou piateho jazyka. Našťastie nemusíte písať inteligentnú zmluvu sami - do priečinka crypto/block existuje súbor zo zdrojového archívu new-wallet.fif, ktorý nám pomôže vytvoriť novú peňaženku. Skopírujeme ho do priečinka so zostaveným klientom (~/liteclient-build, ak ste postupovali podľa vyššie uvedených pokynov). Jeho obsah som citoval vyššie ako príklad kódu na Fift.
Tu <source-directory> musí byť nahradený cestou k rozbaleným zdrojom (symbol „~“ tu, žiaľ, nemožno použiť, je potrebná úplná cesta). Namiesto použitia kľúča -I môžete definovať premennú prostredia FIFTPATH a vložte do nej túto cestu.
Odkedy sme spustili Fift s názvom súboru new-wallet.fif, vykoná ho a ukončí sa. Ak vynecháte názov súboru, môžete sa s tlmočníkom hrať interaktívne.
Po spustení by sa v konzole malo zobraziť niečo takéto:
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 znamená, že peňaženka s ID -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (alebo čo je to isté, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) úspešne vytvorený. Príslušný kód bude v súbore new-wallet-query.boc, jeho adresa je v new-wallet.addra súkromný kľúč je vložený new-wallet.pk (pozor - opätovným spustením skriptu sa tieto súbory prepíšu).
Sieť TON o tejto peňaženke samozrejme ešte nevie, je uložená len vo forme týchto súborov. Teraz ho treba nahrať do siete. Problém je však v tom, že na vytvorenie smart kontraktu je potrebné zaplatiť províziu a zostatok na účte je stále nulový.
V pracovnom režime sa tento problém vyrieši nákupom gramov na burze (alebo prevodom z inej peňaženky). No a v aktuálnom testovacom režime vznikol špeciálny smart kontrakt, z ktorého si môžete len tak vypýtať až 20 gramov.
Generovanie požiadavky na inteligentnú zmluvu niekoho iného
Zadávame požiadavku na inteligentnú zmluvu, ktorá takto distribuuje gramy vľavo a vpravo. V tom istom priečinku crypto/block nájsť súbor 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
Uložíme ho aj do priečinka so zostaveným klientom, ale opravíme piaty riadok - pred riadkom “constant dest_addr". Nahraďte ju adresou peňaženky, ktorú ste si predtým vytvorili (plná, nie skrátená). Na začiatok nie je potrebné písať „-1:“, namiesto toho na začiatok uveďte „0x“.
Môžete tiež zmeniť riadok 6.666 Gram*/ constant amount — toto je množstvo v gramoch, ktoré požadujete (nie viac ako 20). Aj keď zadáte celé číslo, ponechajte desatinnú čiarku.
Nakoniec musíte linku opraviť 0x00000011 constant seqno. Prvé číslo je tu aktuálne poradové číslo, ktoré je uložené na účte, ktorý vydáva gramy. Odkiaľ to môžem získať? Ako je uvedené vyššie, spustite klienta a spustite:
last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d
Na samom konci budú dáta inteligentnej zmluvy obsahovať
Číslo 0000000D (vaše bude väčšie) je poradové číslo, ktoré treba nahradiť testgiver.fif.
To je všetko, uložte súbor a spustite (./crypto/fift testgiver.fif). Výstupom bude súbor wallet-query.boc. Toto je to, čo sa tvorí сообщение na inteligentnú zmluvu niekoho iného - žiadosť „preneste toľko gramov na taký a taký účet“.
Pomocou klienta ho nahráme do siete:
> 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
Ak teraz zavoláte last, a potom znova požiadať o stav účtu, z ktorého sme pýtali gramy, potom by sme mali vidieť, že jeho poradové číslo sa zvýšilo o jednotku - to znamená, že poslal peniaze na náš účet.
Zostáva posledný krok - stiahnuť si kód našej peňaženky (jej zostatok je už doplnený, ale bez kódu smart kontraktu to nezvládneme). Vykonávame sendfile new-wallet-query.boc - a je to, v sieti TON máte vlastnú peňaženku (aj keď zatiaľ len skúšobnú).
Vytváranie odchádzajúcich transakcií
Na prevod peňazí zo zostatku vytvoreného účtu existuje súbor crypto/block/wallet.fif, ktorý je tiež potrebné umiestniť do priečinka so zostaveným klientom.
Podobne ako v predchádzajúcich krokoch je potrebné upraviť sumu, ktorú prenášate, adresu príjemcu (dest_addr) a seqno vašej peňaženky (po inicializácii peňaženky sa rovná 1 a po každej odchádzajúcej transakcii sa zvýši o 1 – môžete zobrazíte ho vyžiadaním si stavu svojho účtu). Na testy môžete použiť napríklad moju peňaženku - 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.
Na začiatku (./crypto/fift wallet.fif) skript zo súborov vezme adresu vašej peňaženky (odkiaľ prenášate) a jej súkromný kľúč new-wallet.addr и new-wallet.pka prijatá správa bude zapísaná na new-wallet-query.boc.
Rovnako ako predtým, ak chcete priamo vykonať transakciu, zavolajte sendfile new-wallet-query.boc v klientovi. Potom nezabudnite aktualizovať stav blockchainu (last) a skontrolujte, či sa zmenil zostatok a seqno našej peňaženky (getaccount <account_id>).
To je všetko, teraz môžeme v TON vytvárať smart kontrakty a posielať im požiadavky. Ako vidíte, súčasná funkcionalita už postačuje napríklad na vytvorenie prívetivejšej peňaženky s grafickým rozhraním (predpokladá sa však, že už bude dostupná ako súčasť messengeru).
Do prieskumu sa môžu zapojiť iba registrovaní užívatelia. Prihlásiť saProsím.
Máte záujem pokračovať v článkoch analýzou TON, TVM, Fift?
Áno, čakám na dokončenie série článkov so všeobecným prehľadom o TON
Áno, je zaujímavé prečítať si viac o jazyku Fift
Áno, chcem sa dozvedieť viac o virtuálnom stroji TON a jeho assembleri
Nie, nič z toho nie je zaujímavé
Hlasovalo 39 užívateľov. 12 užívateľov sa zdržalo hlasovania.
Čo si myslíte o plánoch Telegramu spustiť TON?
Do tohto projektu vkladám veľké nádeje
Len so záujmom sledujem jeho vývoj.
Som skeptický a pochybujem o jeho úspechu.
Som naklonený považovať túto iniciatívu za neúspešnú a pre široké masy zbytočnú
Hlasovalo 47 užívateľov. 12 užívateľov sa zdržalo hlasovania.