ProHoster > Blog > administrasie > TON (Telegram Open Network) toetskliënt en nuwe Fift-taal vir slim kontrakte
TON (Telegram Open Network) toetskliënt en nuwe Fift-taal vir slim kontrakte
Meer as 'n jaar gelede het dit bekend geword oor die planne van die Telegram-boodskapper om sy eie gedesentraliseerde netwerk vry te stel Open Netwerk telegram. Toe het 'n lywige tegniese dokument beskikbaar geword, wat vermoedelik deur Nikolai Durov geskryf is en die struktuur van die toekomstige netwerk beskryf. Vir diegene wat dit gemis het, beveel ek aan dat u my hervertelling van hierdie dokument lees (deel 1, deel 2; die derde deel, helaas, vergaar nog steeds stof in konsepte).
Sedertdien was daar geen noemenswaardige nuus oor die status van TON-ontwikkeling nie, tot 'n paar dae gelede (in een van nie-amptelike kanale) die skakel na die bladsy het nie verskyn nie https://test.ton.org/download.htmlwaar is geleë:
◦ ton-toets-liteclient-full.tar.xz — ligte kliëntbronne vir die TON-toetsnetwerk;
◦ ton-lite-kliënt-toets1.config.json - konfigurasielêer om aan die toetsnetwerk te koppel;
◦ README - inligting oor die samestelling en bekendstelling van die kliënt;
◦ HOE — stap-vir-stap instruksies oor hoe om 'n slim kontrak met die kliënt te skep;
◦ ton.pdf — bygewerkte dokument (gedateer 2 Maart 2019) met 'n tegniese oorsig van die TON-netwerk;
◦ tvm.pdf — tegniese beskrywing van TVM (TON Virtual Machine, TON virtuele masjien);
◦ tblkch.pdf - tegniese beskrywing van die TON-blokketting;
◦ vyfde basis.pdf — 'n beskrywing van die nuwe Fift-taal, ontwerp om slim kontrakte in TON te skep.
Ek herhaal, daar was geen amptelike bevestiging van die bladsy en al hierdie dokumente van Telegram nie, maar die volume van hierdie materiaal maak dit redelik aanneemlik. Begin die gepubliseerde kliënt op eie risiko.
Bou 'n toetskliënt
Om mee te begin, kom ons probeer om 'n toetskliënt te bou en te bestuur - goed, README beskryf hierdie eenvoudige proses in detail. Ek sal dit doen deur die voorbeeld van macOS 10.14.5 te gebruik, ek kan nie instaan vir die sukses van die samestelling op ander stelsels nie.
Laai af en pak uit bron argief. Dit is belangrik om die nuutste weergawe af te laai aangesien terugwaartse versoenbaarheid nie op hierdie stadium gewaarborg word nie.
Maak seker dat jy die nuutste weergawes van make, cmake (weergawe 3.0.2 of hoër), OpenSSL (insluitend C headers), g++ of clang op jou stelsel geïnstalleer het. Ek hoef niks te installeer nie, alles het dadelik bymekaar gekom.
Gestel die bronne word in 'n gids uitgepak ~/lite-client. Afsonderlik daarvan skep ons 'n leë gids vir die saamgestelde projek (byvoorbeeld, ~/liteclient-build), en daaruit (cd ~/liteclient-build) roep die opdragte:
As alles korrek gedoen is, moet jy iets soos volg sien:
Soos u kan sien, is daar min beskikbare opdragte:
◦ help - vertoon hierdie lys van opdragte;
◦ quit - gaan uit;
◦ time - wys die huidige tyd op die bediener;
◦ status - wys die status van die verbinding en die plaaslike databasis;
◦ last - werk die toestand van die blokketting op (laai die laaste blok af). Dit is belangrik om hierdie opdrag voor enige navrae uit te voer om seker te maak dat jy die werklike toestand van die netwerk sien.
◦ sendfile<filename> — laai 'n plaaslike lêer op na die TON-netwerk. Dit is hoe interaksie met die netwerk plaasvind, insluitend, byvoorbeeld, die skep van nuwe slim kontrakte en versoeke om fondse tussen rekeninge oor te dra;
◦ getaccount<address> - wys die huidige (ten tyde van die opdraguitvoering last) die status van die rekening met die gespesifiseerde adres;
◦ privkey<filename> - laai die private sleutel vanaf 'n plaaslike lêer.
As, wanneer u die kliënt begin, 'n gids daarheen deurgee deur die opsie te gebruik -D, dan sal dit die laaste blok van die meesterketting daarby voeg:
Nou kan ons aanbeweeg na meer interessante dinge - leer die Fift-taal, probeer om 'n slim kontrak saam te stel (skep byvoorbeeld 'n toetsbeursie), laai dit op die netwerk en probeer om fondse tussen rekeninge oor te dra.
Vyf Taal
Uit dokument vyfde basis.pdf jy kan uitvind dat die Telegram-span 'n nuwe stapeltaal geskep het om slim kontrakte te skep Vyf (blykbaar uit die syfer vyfde, soortgelyk aan Forth, 'n taal waarmee Fift baie in gemeen het).
Die dokument is redelik lywig, 87 bladsye, en ek sal nie die inhoud daarvan in detail oorvertel binne die raamwerk van hierdie artikel nie (ten minste, want ek het dit self nog nie klaar gelees nie :)). Ek sal stilstaan by die hoofpunte en 'n paar kodevoorbeelde in hierdie taal gee.
Op 'n basiese vlak is Fift se sintaksis redelik eenvoudig: sy kode bestaan uit woorde, gewoonlik geskei deur spasies of nuwe reëls (spesiale geval: sommige woorde benodig nie 'n skeiding na hulself nie). Enige слово is 'n hooflettersensitiewe volgorde van karakters wat met sommige ooreenstem definisie (Rofweg gesproke, wat die tolk moet doen wanneer hy hierdie woord teëkom). As daar geen woorddefinisie is nie, probeer die tolk om dit as 'n getal te ontleed en dit op die stapel te druk. Terloops, die getalle hier - ewe skielik - is 257-bis heelgetalle, en daar is glad nie breuke nie - meer presies, dit verander dadelik in 'n paar heelgetalle wat die teller en noemer van 'n rasionale breuk vorm.
Woorde is geneig om met die waardes aan die bokant van die stapel te reageer. Aparte tipe woorde - voorvoegsel - gebruik nie die stapel nie, maar die karakters wat hulle vanaf die bronlêer volg. Byvoorbeeld, dit is hoe string letterlike geïmplementeer word - die aanhaling karakter (") is 'n voorvoegselwoord wat na die volgende (slot)aanhaling soek, en die tou tussen hulle op die stapel druk. One-liners tree op 'n soortgelyke manier op (//) en multilyn (/*) kommentaar.
Dit is waar byna die hele interne struktuur van die taal eindig. Alles anders (insluitend beheerkonstrukte) word gedefinieer as woorde (óf intern, soos rekenkundige bewerkings en nuwe woorddefinisies; óf gedefinieer in die "standaard biblioteek" Fift.fif, wat in die gids is crypto/fift in bronne).
'n Eenvoudige voorbeeld van 'n Fift-program:
{ dup =: x dup * =: y } : setxy
3 setxy x . y . x y + .
7 setxy x . y . x y + .
Die eerste reël definieer 'n nuwe woord setxy (let op die voorvoegsel {, wat 'n blok skep voor die sluiting } en voorvoegsel :, wat eintlik die woord definieer). setxy neem 'n nommer van die bokant van die stapel, definieer (of herdefinieer) dit as 'n globale konstantx, en die kwadraat van hierdie getal as 'n konstante y (gegewe dat die waardes van konstantes herdefinieer kan word, sal ek dit eerder veranderlikes noem, maar ek volg die benaming in die taal).
Die volgende twee reëls druk 'n nommer op die stapel, bel setxy, dan word die waardes van die konstantes vertoon x, y (die uitvoer gebruik die woord .), word beide konstantes op die stapel gedruk, opgesom, en die resultaat word ook vertoon. As gevolg hiervan sal ons sien:
3 9 12 ok
7 49 56 ok
(Die reël "ok" word deur die tolk uitgevoer wanneer dit klaar is met die verwerking van die huidige reël in interaktiewe invoermodus)
Hierdie scary-soek lêer is vir die skep van 'n slim kontrak - dit sal in die lêer geplaas word new-wallet-query.boc na teregstelling. Neem asseblief kennis dat 'n ander samestellingstaal vir die TON virtuele masjien hier gebruik word (ek sal nie in detail daaroor uitwei nie), waarvan die instruksies op die blokketting geplaas sal word.
Dus, die samesteller vir TVM is in Fift geskryf - die bronkode vir hierdie samesteller is in die lêer crypto/fift/Asm.fif en word aan die begin van die bogenoemde stuk kode verbind.
Wat kan ek sê, blykbaar, Nikolai Durov hou daarvan om nuwe programmeertale te skep🙂
Skep van 'n slim kontrak en interaksie met TON
So kom ons sê ons het die TON-kliënt en Fift-tolk gebou soos hierbo beskryf en die taal leer ken. Hoe om nou 'n slim kontrak te skep? Dit word in die lêer beskryf. HOEaan die bron geheg.
Rekeninge in TON
Soos ek beskryf het in TON Review, hierdie netwerk bevat meer as een blokketting - daar is een algemene, sg. "meesterketting", sowel as 'n arbitrêre aantal bykomende "werkkettings", geïdentifiseer deur 'n 32-bis-nommer. Die meesterketting het 'n identifiseerder van -1, daarby kan 'n “basis” werkketting ook gebruik word met 'n identifiseerder van 0. Elke werkketting kan sy eie konfigurasie hê. Intern word elke werkketting in skerfkettings verdeel, maar dit is 'n implementeringsdetail wat nie nodig is om in gedagte te hou nie.
Binne een werkketting word baie rekeninge gestoor wat hul eie rekening_id identifiseerders het. Vir meesterketting en nulwerkketting is hulle 256 bisse lank. Dus, die rekening-ID word byvoorbeeld soos volg geskryf:
Dit is die rou formaat: eers die werkketting-ID, dan 'n dubbelpunt, en die rekening-ID in heksadesimale notasie.
Daarbenewens is daar 'n verkorte formaat - die werkkettingnommer en rekeningadres word in binêre vorm geënkodeer, 'n kontrolesom word daarby gevoeg, en dit alles word in Base64 geënkodeer:
Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb
As ons hierdie rekordformaat ken, kan ons die huidige toestand van een of ander rekening deur die toetskliënt versoek deur die opdrag te gebruik
[ 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}
Ons sien die struktuur wat in die DHT van die gespesifiseerde werkketting gestoor word. Byvoorbeeld, in die veld storage.balance is die huidige saldo van die rekening, in storage.state.code is die kode van die slim kontrak, en in storage.state.data - sy huidige data. Neem asseblief kennis dat die TON-databerging - Sel, selle - boomagtig is, elke sel kan beide sy eie data en kinderselle hê. Dit word as inkeping op die laaste reëls getoon.
Bou 'n slim kontrak
Kom ons skep nou self so 'n struktuur (dit word BOC genoem - sak selle) met behulp van die Fift-taal. Gelukkig hoef jy nie self 'n slim kontrak te skryf nie - in die gids crypto/block uit die bron-argief is daar 'n lêer new-wallet.fif, wat ons sal help om 'n nuwe beursie te skep. Kopieer dit na die gids met die saamgestelde kliënt (~/liteclient-buildas jy die instruksies hierbo gevolg het). Ek het die inhoud hierbo aangehaal as 'n voorbeeld van kode in Fift.
Hier <source-directory> moet vervang word met die pad na die uitgepakte bronne (die “~”-simbool kan nie hier gebruik word nie, ongelukkig is die volledige pad nodig). In plaas daarvan om 'n sleutel te gebruik -I jy kan 'n omgewingsveranderlike definieer FIFTPATH en plaas hierdie pad daarin.
Sedert ons Fift met 'n lêernaam geloods het new-wallet.fif, sal dit dit uitvoer en uitgaan. As jy die lêernaam weglaat, kan jy interaktief met die tolk speel.
Na uitvoering moet iets soos hierdie in die konsole verskyn:
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)
Dit beteken dat die beursie met die ID -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (of, wat dieselfde is, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) is suksesvol geskep. Die ooreenstemmende kode sal in die lêer wees new-wallet-query.boc, sy adres is in new-wallet.addr, en die private sleutel is in new-wallet.pk (wees versigtig - om die skrip weer te laat loop sal hierdie lêers oorskryf).
Natuurlik weet die TON-netwerk nog nie van hierdie beursie nie, dit word slegs in die vorm van hierdie lêers gestoor. Nou moet dit na die netwerk opgelaai word. Die probleem is wel dat om 'n slim kontrak te skep, jy 'n kommissie moet betaal, en jou rekeningsaldo is steeds nul.
In die werkmodus sal hierdie probleem opgelos word deur gram op die beurs te koop (of deur oor te dra van 'n ander beursie). Wel, in die huidige toetsmodus is ’n spesiale slimkontrak bekendgestel, waaruit jy net so tot 20 gram kan vra.
Vorm 'n versoek na iemand anders se slim kontrak
'n Versoek na 'n slim kontrak wat gram links en regs versprei, ons doen dit. In dieselfde gids crypto/block vind lêer 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
Ons sal dit ook in die gids met die saamgestelde kliënt stoor, maar ons sal die vyfde reël regstel - voor die reël "constant dest_addr". Kom ons vervang dit met die adres van die beursie wat jy voorheen geskep het (vol, nie afgekort nie). "-1:" hoef nie aan die begin geskryf te word nie, plaas eerder "0x" aan die begin.
Jy kan ook die lyn verander 6.666 Gram*/ constant amount is die hoeveelheid in gram wat jy versoek (nie meer as 20). Selfs as jy 'n heelgetal spesifiseer, laat die desimale punt.
Ten slotte moet ons die lyn regmaak 0x00000011 constant seqno. Die eerste nommer hier is die huidige rynommer, wat gestoor word in die rekening wat gram uitreik. Waar om dit te kry? Soos hierbo genoem, begin die kliënt en hardloop:
last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d
Die nommer 0000000D (jy sal meer hê) en daar is 'n rynommer wat vervang moet word in testgiver.fif.
Dit is dit, stoor die lêer en hardloop (./crypto/fift testgiver.fif). Die uitvoer sal 'n lêer wees wallet-query.boc. Dit is die gevormde die boodskap na iemand anders se slim kontrak - 'n versoek "dra soveel gram na so en so 'n rekening oor."
Gebruik die kliënt en laai dit op na die netwerk:
> 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
As nou bel last, en versoek dan weer die status van die rekening waaruit ons vir gram gevra het, dan moet ons sien dat sy volgordenommer met een toegeneem het - dit beteken dat dit geld na ons rekening gestuur het.
Die laaste stap wat oorbly is om die kode van ons beursie op te laai (sy balans is reeds aangevul, maar ons sal dit nie sonder die slimkontrakkode kan bestuur nie). Ons voer uit sendfile new-wallet-query.boc - en dit is dit, jy het jou eie beursie in die TON-netwerk (al is dit vir eers net 'n toets een).
Skep uitgaande transaksies
Om geld uit die saldo van die geskepde rekening oor te dra, is daar 'n lêer crypto/block/wallet.fif, wat ook in die lêergids met die saamgestelde kliënt geplaas moet word.
Soortgelyk aan die vorige stappe, moet jy die bedrag wat jy oordra, die ontvangeradres (dest_addr) en jou beursie seqno regstel (dit is gelyk aan 1 na beursie-inisialisering en verhoog met 1 na elke uitgaande transaksie - jy kan dit sien deur navraag doen oor jou rekeningstatus). Vir toetse kan jy byvoorbeeld my beursie gebruik - 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.
Met opstart (./crypto/fift wallet.fif) die skrip sal die adres van jou beursie (waar jy vandaan oorplaas) en sy private sleutel uit die lêers neem new-wallet.addr и new-wallet.pk, en die ontvangde boodskap sal na geskryf word new-wallet-query.boc.
Soos voorheen, om die transaksie direk uit te voer, bel ons sendfile new-wallet-query.boc in die kliënt. Daarna, moenie vergeet om die toestand van die blokketting op te dateer nie (last) en maak seker dat die balans en volgorde van ons beursie verander het (getaccount <account_id>).
Dis al, nou kan ons slim kontrakte in TON skep en versoeke aan hulle stuur. Soos u kan sien, is die huidige funksionaliteit reeds genoeg om byvoorbeeld 'n vriendeliker beursie met 'n grafiese koppelvlak te maak (daar word egter verwag dat dit in elk geval as deel van die boodskapper beskikbaar sal word).
Slegs geregistreerde gebruikers kan aan die opname deelneem. Meld aan, asseblief.
Stel jy belang om voort te gaan met artikels met ontleding van TON, TVM, Fift?
Ja, ek wag vir die voltooiing van 'n reeks artikels met 'n algemene oorsig van TON
Ja, dit is interessant om meer oor die Vyf-taal te lees
Ja, ek wil meer leer oor TON virtuele masjien en samesteller daarvoor
Nee, ek stel nie belang in enige hiervan nie.
39 gebruikers het gestem. 12 gebruikers het buite stemming gebly.
Hoe voel jy oor Telegram se planne om TON bekend te stel?
Ek het groot verwagtinge vir hierdie projek.
Ek volg dit net met belangstelling.
Ek is skepties, ek twyfel of dit suksesvol is
Ek is geneig om hierdie inisiatief as 'n mislukking te beskou, onnodig vir die breë massas
47 gebruikers het gestem. 12 gebruikers het buite stemming gebly.