ProHoster > Blog > Adminisztráció > Tesztelje a TON klienst (Telegram Open Network) és az új Fift nyelvet az intelligens szerződésekhez
Tesztelje a TON klienst (Telegram Open Network) és az új Fift nyelvet az intelligens szerződésekhez
Több mint egy éve vált ismertté a Telegram messenger terve, hogy kiadja saját decentralizált hálózatát. Nyissa meg a hálózati táviratot. Aztán elérhetővé vált egy terjedelmes műszaki dokumentum, amelyet állítólag Nyikolaj Durov írt, és leírta a jövőbeli hálózat felépítését. Aki lemaradt róla, annak javaslom, hogy olvassa el erről a dokumentumról szóló átbeszélésemet (Part 1, Part 2; a harmadik rész sajnos még mindig huzatban gyűjti a port).
Azóta nem érkezett jelentős hír a TON fejlesztésének helyzetéről egészen pár napja (az egyikben nem hivatalos csatornák) az oldalra mutató hivatkozás nem jelent meg https://test.ton.org/download.html, hol találhatók:
◦ ton-test-liteclient-full.tar.xz — egy könnyű kliens forrásai a TON teszthálózathoz;
◦ ton-lite-client-test1.config.json — konfigurációs fájl a teszthálózathoz való csatlakozáshoz;
◦ README — az ügyfél felépítésével és elindításával kapcsolatos információk;
◦ HOGYAN KELL — lépésről lépésre intelligens szerződés létrehozására vonatkozó utasítások ügyfél használatával;
◦ ton.pdf — frissített dokumentum (2. március 2019-án) a TON hálózat műszaki áttekintésével;
◦ tvm.pdf — a TVM (TON Virtual Machine, TON virtuális gép) műszaki leírása;
◦ tblkch.pdf — a TON blokklánc műszaki leírása;
◦ fivebase.pdf — az új Fift nyelv leírása, amelyet intelligens szerződések létrehozására terveztek TON-ban.
Ismétlem, a Telegram oldaláról és ezekről a dokumentumokról nem érkezett hivatalos megerősítés, de ezeknek az anyagoknak a terjedelme meglehetősen hihetővé teszi őket. Indítsa el a közzétett klienst saját felelősségére.
Tesztkliens felépítése
Először próbáljunk meg felépíteni és futtatni egy tesztklienst – szerencsére README részletesen leírja ezt az egyszerű folyamatot. Példaként a macOS 10.14.5-tel fogom megtenni; nem garantálhatom a más rendszerekre való felépítés sikerét.
Töltse le és csomagolja ki forrás archívum. Fontos, hogy töltse le a legújabb verziót, mivel a visszamenőleges kompatibilitás ebben a szakaszban nem garantált.
Győződjön meg arról, hogy a make, cmake (3.0.2 vagy újabb verzió), OpenSSL (beleértve a C fejlécfájlokat), g++ vagy clang legújabb verziói telepítve vannak a rendszeren. Nem kellett semmit telepítenem, minden egyből összejött.
Tegyük fel, hogy a források egy mappába vannak kicsomagolva ~/lite-client. Ettől külön hozzon létre egy üres mappát az összeállított projekt számára (például ~/liteclient-build), és abból (cd ~/liteclient-build) hívja a parancsokat:
Ha mindent helyesen csinált, akkor valami ilyesmit kell látnia:
Amint látjuk, kevés parancs áll rendelkezésre:
◦ help — jelenítse meg a parancsok listáját;
◦ quit - eljár szórakozni;
◦ time — az aktuális idő megjelenítése a szerveren;
◦ status — a kapcsolat és a helyi adatbázis állapotának megjelenítése;
◦ last — frissítse a blokklánc állapotát (az utolsó blokk letöltése). Fontos, hogy ezt a parancsot minden kérés előtt lefuttassa, hogy biztosan látja a hálózat aktuális állapotát.
◦ sendfile<filename> — helyi fájl feltöltése a TON hálózatra. Így történik a hálózattal való interakció – beleértve például új intelligens szerződések létrehozását és a számlák közötti pénzátutalási kérelmeket;
◦ getaccount<address> - az aktuális állapot megjelenítése (a parancs végrehajtásának időpontjában) last) a megadott címmel rendelkező számla állapota;
◦ privkey<filename> — betölti a privát kulcsot egy helyi fájlból.
Ha a kliens indításakor az opció segítségével mappát visz át rá -D, majd hozzáadja a mesterlánc utolsó blokkját:
Most továbbléphetünk az érdekesebb dolgokra - tanulja meg a Fift nyelvet, próbáljon össze egy intelligens szerződést (például hozzon létre egy tesztpénztárcát), töltse fel a hálózatra, és próbálja meg átutalni a számlák között.
Nyelv Ötödik
Dokumentumból fivebase.pdf megtudhatja, hogy a Telegram csapata új veremnyelvet hozott létre az intelligens szerződések létrehozásához Ötödik (nyilván a számból ötödik, hasonló a Forth-hoz, amely nyelvhez az ötödik sok közös jellemző).
A dokumentum meglehetősen terjedelmes, 87 oldalas, és ennek a cikknek a keretein belül nem írom le részletesen a tartalmát (legalábbis azért, mert magam sem fejeztem be az olvasást :). A főbb pontokra összpontosítok, és adok néhány kódpéldát ezen a nyelven.
Alapszinten a Fift szintaxisa meglehetősen egyszerű: kódja a következőkből áll szavak, általában szóközzel vagy sortöréssel elválasztva (speciális eset: egyes szavak nem igényelnek elválasztót maguk után). Bármi слово kis- és nagybetűket megkülönböztető karaktersorozat, amely megfelel egy bizonyosnak определение (nagyjából mit kell tennie a tolmácsnak, ha találkozik ezzel a szóval). Ha egy szónak nincs definíciója, az értelmező megpróbálja számként elemezni, és a verembe helyezni. A számok itt egyébként - hirtelen - 257 bites egészek, és törtek egyáltalán nincsenek - pontosabban azonnal egész számok párjává alakulnak, egy racionális tört számlálóját és nevezőjét alkotva.
A szavak általában kölcsönhatásba lépnek a verem tetején lévő értékekkel. Külön típusú szavak - előtag — nem a veremet használja, hanem a forrásfájl következő karaktereit. Például így valósulnak meg a string literálok - az idézőjel (") egy előtag, amely a következő (záró) idézetet keresi, és a köztük lévő karakterláncot a verembe tolja. Az egysorosok ugyanúgy viselkednek (//) és többsoros (/*) Hozzászólások.
Itt ér véget a nyelv szinte teljes belső szerkezete. Minden más (beleértve a vezérlőkonstrukciókat is) szavakként van definiálva (vagy belső, például aritmetikai műveletek és új szavak meghatározása; vagy a "szabványkönyvtár"-ban van meghatározva. Fift.fif, amely a mappában található crypto/fift a forrásokban).
Egy egyszerű példaprogram a Fiftben:
{ dup =: x dup * =: y } : setxy
3 setxy x . y . x y + .
7 setxy x . y . x y + .
Az első sor egy új szót határoz meg setxy (jegyezd meg az előtagot {, amely egy blokkot hoz létre a záró előtt } és előtag :, amely valójában meghatározza a szót). setxy átvesz egy számot a verem tetejéről, globálisként határozza meg (vagy újradefiniálja). állandóx, és ennek a számnak a négyzete állandó y (Tekintettel arra, hogy az állandók értékei újradefiniálhatók, inkább változóknak nevezném őket, de követem a nyelv elnevezési konvencióját).
A következő két sorban tegyen egy számot a verembe, és hívjon setxy, akkor megjelennek az állandók értékei x, y (a szót a kimenetre használják .), mindkét konstans a verembe kerül, összegezve, és az eredményt is kinyomtatja. Ennek eredményeként látni fogjuk:
3 9 12 ok
7 49 56 ok
(Az „ok” sort a tolmács kinyomtatja, amikor befejezi az aktuális sor feldolgozását interaktív beviteli módban)
Ez a félelmetes kinézetű fájl egy intelligens szerződés létrehozására szolgál - fájlba kerül new-wallet-query.boc a végrehajtás után. Kérjük, vegye figyelembe, hogy itt egy másik assembly nyelvet használnak a TON Virtual Machine-hez (nem részletezem), aminek az utasításai a blokkláncra kerülnek.
Így a TVM assemblerje Fiftben van írva - ennek az assemblernek a forrásai a fájlban találhatók crypto/fift/Asm.fif és a fenti kódrészlet elején kapcsolódnak össze.
Mit mondjak, úgy tűnik, Nikolai Durov csak szeret új programozási nyelveket készíteni :)
Intelligens szerződés létrehozása és interakció a TON-nal
Tehát tegyük fel, hogy a fent leírtak szerint összeállítottuk a TON klienst és a Fift tolmácsot, és megismerkedtünk a nyelvvel. Hogyan hozzunk létre okos szerződést most? Ez le van írva a fájlban HOGYAN KELL, csatolva a forrásokhoz.
Számlák TON nyelven
Ahogy leírtam ben TON áttekintés, ez a hálózat egynél több blokkláncot tartalmaz - van egy közös, az ún. „főlánc”, valamint tetszőleges számú további „munkalánc”, amelyeket egy 32 bites szám azonosít. A masterchain azonosítója -1, ezen kívül használható egy 0 azonosítójú „alap” munkalánc is, minden munkaláncnak saját konfigurációja lehet. Belsőleg minden munkalánc shardchainekre van felosztva, de ez egy olyan megvalósítási részlet, amelyet nem kell szem előtt tartani.
Egy munkaláncon belül sok fiók van tárolva, amelyek saját account_id azonosítóval rendelkeznek. A főlánc és a nulla munkalánc esetében 256 bit hosszúak. Így a számlaazonosítót például így írják:
Ez a „nyers” formátum: először a munkalánc-azonosító, majd a kettőspont, és a fiókazonosító hexadecimális jelöléssel.
Ezenkívül van egy rövidített formátum is - a munkalánc számát és a fiókcímet bináris formában kódolják, egy ellenőrző összeget adnak hozzájuk, és mindezt a Base64 kódolja:
Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb
Ennek a rekordformátumnak a ismeretében a parancs segítségével lekérhetjük egy fiók aktuális állapotát egy tesztkliensen keresztül
[ 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}
Látjuk azt a struktúrát, amely a megadott munkalánc DHT-jában van tárolva. Például terepen storage.balance a folyószámla egyenlege, in storage.state.code - intelligens szerződés kódja, és be storage.state.data - aktuális adatai. Felhívjuk figyelmét, hogy a TON adattár - Cell, cellák - faszerű, minden cellának lehetnek saját adatai és gyermekcellák. Ez behúzásként jelenik meg az utolsó sorokban.
Okos szerződés felépítése
Most hozzunk létre magunk egy ilyen struktúrát (ezt BOC-nak hívják - zsák sejt) a Fift nyelv használatával. Szerencsére nem kell magának okos szerződést írnia - a mappába crypto/block van egy fájl a forrásarchívumból new-wallet.fif, ami segít létrehozni egy új pénztárcát. Másoljuk be a mappába az összeállított klienssel (~/liteclient-build, ha követte a fenti utasításokat). Ennek tartalmát fentebb idéztem a Fift kód példájaként.
Itt <source-directory> helyére a kicsomagolt források elérési útját kell írni (a „~” szimbólum itt sajnos nem használható, a teljes elérési út szükséges). Kulcs használata helyett -I környezeti változót definiálhat FIFTPATH és tedd bele ezt az utat.
Mióta elindítottuk a Fiftet a fájlnévvel new-wallet.fif, akkor végrehajtja és kilép. Ha kihagyja a fájl nevét, interaktívan játszhat a tolmácskal.
A végrehajtás után valami ilyesminek kell megjelennie a konzolon:
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)
Ez azt jelenti, hogy a pénztárca az azonosítóval -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (vagy mi ugyanaz, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) sikeresen létrehozva. A megfelelő kód a fájlban lesz new-wallet-query.boc, a címe benne van new-wallet.addr, és a privát kulcs benne van new-wallet.pk (legyen óvatos - a szkript újra futtatása felülírja ezeket a fájlokat).
Természetesen a TON hálózat még nem tud erről a pénztárcáról, csak ezen fájlok formájában tárolja. Most fel kell tölteni a hálózatra. A probléma azonban az, hogy egy intelligens szerződés létrehozásához jutalékot kell fizetnie, és a számlaegyenleg továbbra is nulla.
Működési módban ez a probléma megoldható grammok cseréjével (vagy másik pénztárcáról történő átvitellel). Nos, a jelenlegi tesztüzemmódban egy speciális okosszerződés készült, amiből akár 20 grammot is el lehet kérni csak úgy.
Kérelem generálása valaki más intelligens szerződéséhez
Kérünk egy okos szerződést, amely így osztja el a grammokat balra és jobbra. Ugyanabban a mappában crypto/block fájl keresése 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
Elmentjük az összeállított kliens mappájába is, de az ötödik sort javítjuk - a „ sor előttconstant dest_addr". Cseréljük ki a korábban létrehozott pénztárca címére (teljes, nem rövidítve). Nem kell az elejére „-1:”-t írni, hanem a „0x”-t az elejére.
A vonalat is módosíthatja 6.666 Gram*/ constant amount — ez az Ön által kért mennyiség grammban (legfeljebb 20). Ha egész számot ad meg, hagyja meg a tizedesvesszőt.
Végül ki kell javítania a vonalat 0x00000011 constant seqno. Az első szám itt az aktuális sorszám, amely a számlát kibocsátó grammban tárolja. Honnan szerezhetem be? A fent leírtak szerint indítsa el az ügyfelet, és futtassa:
last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d
A legvégén az intelligens szerződés adatai tartalmazni fogják
A 0000000D szám (a tiéd nagyobb lesz) az a sorszám, amelyet be kell cserélni testgiver.fif.
Ennyi, mentse el a fájlt és futtassa (./crypto/fift testgiver.fif). A kimenet egy fájl lesz wallet-query.boc. Ez az, ami kialakul сообщение valaki más intelligens szerződésére - egy kérés, hogy „annyi grammot utaljon át egy ilyen és egy ilyen számlára”.
A kliens segítségével feltöltjük a hálózatra:
> 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
Ha most hívsz last, majd ismét lekérjük annak a számla állapotát, ahonnan grammot kértünk, akkor látnunk kell, hogy a sorszáma eggyel nőtt - ez azt jelenti, hogy pénzt küldött a számlánkra.
Marad az utolsó lépés - töltse le pénztárcánk kódját (egyenlege már feltöltődött, de az okosszerződés kódja nélkül nem tudjuk kezelni). végzünk sendfile new-wallet-query.boc - és ennyi, van saját pénztárcája a TON hálózatban (még akkor is, ha ez egyelőre csak teszt).
Kimenő tranzakciók létrehozása
A létrehozott számla egyenlegéről történő pénz átutalásához van egy fájl crypto/block/wallet.fif, amelyet szintén el kell helyezni a mappába az összeállított klienssel.
Az előző lépésekhez hasonlóan módosítania kell az átutalt összeget, a címzett címét (dest_addr) és a pénztárcája sorrendjét (ez egyenlő a pénztárca inicializálása után 1-gyel, és minden kimenő tranzakció után 1-gyel nő - megtekintheti fiókja állapotának lekérésével). A tesztekhez használhatja például a pénztárcámat - 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.
Indításkor (./crypto/fift wallet.fif) a szkript kiveszi a pénztárcája címét (ahonnan átviszi) és a privát kulcsát a fájlokból new-wallet.addr и new-wallet.pk, és a kapott üzenet a következő címre lesz írva new-wallet-query.boc.
Mint korábban, a tranzakció közvetlen végrehajtásához hívja sendfile new-wallet-query.boc az ügyfélben. Ezek után ne felejtse el frissíteni a blokklánc állapotát (last) és ellenőrizze, hogy megváltozott-e a pénztárcánk egyenlege és sorrendje (getaccount <account_id>).
Ez minden, most már létrehozhatunk intelligens szerződéseket a TON-ban, és kéréseket küldhetünk nekik. Mint látható, a jelenlegi funkcionalitás már elég ahhoz, hogy például grafikus felülettel barátságosabb pénztárcát készítsünk (azonban várhatóan már a messenger részeként is elérhető lesz).
A felmérésben csak regisztrált felhasználók vehetnek részt. Bejelentkezés, kérem.
Érdekli a cikkek folytatása a TON, TVM, Fift elemzésével?
Igen, várom a TON általános áttekintését tartalmazó cikksorozat befejezését
Igen, érdekes többet olvasni a Fift nyelvről
Igen, szeretnék többet megtudni a TON Virtual Machine-ről és az összeszerelőről