MĂ« shumĂ« se njĂ« vit mĂ« parĂ« u njoftua pĂ«r planet e mesazhit Telegram pĂ«r tĂ« lansuar njĂ« rrjet tĂ« decentralizuar Telegram Open Network. AtĂ«herĂ« u bĂ« e disponueshme njĂ« dokument teknik i plotĂ«, i cili, supozohet, ishte shkruar nga Nikolai Durov dhe pĂ«rshkruante strukturĂ«n e rrjetit tĂ« ardhshĂ«m. PĂ«r ata qĂ« e humbĂ«n â rekomandoj tĂ« shikoni pĂ«rmbledhjen time tĂ« kĂ«tij dokumenti (, ; pjesa e tretĂ«, fatkeqĂ«sisht, ende plaket nĂ« skicat).
Që atëherë, nuk ka pasur ndonjë lajm të rëndësishëm mbi statusin e zhvillimit të TON, derisa disa ditë më parë (në një nga ) u shfaq një lidhje në faqen , ku janë vendosur:
⊠â burimet e klientit tĂ« lehtĂ« pĂ«r rrjetin testues TON;
⊠â dosja e konfigurimit pĂ«r t'u lidhur me rrjetin testues;
⊠â informacion mbi ndĂ«rtimin dhe lançimin e klientit;
⊠â udhĂ«zimi hap pas hapi mbi krijimin e kontratĂ«s sĂ« mençur me ndihmĂ«n e klientit;
⊠â dokumenti i pĂ«rditĂ«suar (nga 2 mars 2019) me njĂ« pĂ«rmbledhje teknike tĂ« rrjetit TON;
⊠â pĂ«rshkrimi teknik i TVM (TON Virtual Machine, makina virtuale TON);
⊠â pĂ«rshkrimi teknik i bllokut TON;
⊠â pĂ«rshkrimi i gjuhĂ«s sĂ« re Fift, e cila Ă«shtĂ« e destinuar pĂ«r krijimin e kontratave tĂ« mençura nĂ« TON.
Po e përsëris, nuk ka pasur konfirmime zyrtare për faqen dhe të gjithë këto dokumente nga ana e Telegramit, por volumi i këtyre materialeve i bën ato mjaft të besueshëm. Lançimi i klientit të publikuar bëhet me rrezikun tuaj.
Ndërtimi i klientit testues
Fillimisht do tĂ« pĂ«rpiqemi tĂ« ndjekim dhe lançojmĂ« klientin testues â fatmirĂ«sisht, e pĂ«rshkruan nĂ« detaje kĂ«tĂ« proces tĂ« thjeshtĂ«. UnĂ« do ta bĂ«j kĂ«tĂ« me shembuj tĂ« macOS 10.14.5, nuk mund tĂ« garantoj pĂ«r suksesin nĂ« sisteme tĂ« tjera.
ShkarkojmĂ« dhe çarchivejmĂ« . ĂshtĂ« e rĂ«ndĂ«sishme tĂ« shkarkoni versionin mĂ« tĂ« fundit, pasi pĂ«rputhshmĂ«ria e prapme nĂ« kĂ«tĂ« fazĂ« nuk Ă«shtĂ« e garantuar.
Sigurohemi që në sistem janë të instaluara versionet më të fundit të make, cmake (versionet 3.0.2 ose më të larta), OpenSSL (përfshirë skedarët e titujve C), g++ ose clang. Unë nuk kisha nevojë të instaloj asgjë tjetër, gjithçka u ndërtua menjëherë.
Le të supozojmë se burimet janë çarchive në dosjen
~\/lite-client. Pavarësisht nga ajo krijojmë një dosje të zbrazët për projektin e ndërtuar (për shembull,~\/liteclient-build), dhe për nga ajo (cd ~\/liteclient-build) thërrasim komandat:cmake ~\/lite-client cmake --build . --target test-lite-client
Për ndërtimin e interpretuesit të gjuhës Fift për kontratat e mençura (për të cilin do të flas më poshtë), gjithashtu thërrasimcmake --build . --target fiftShkarkoni të dhënat aktuale për t'u lidhur me rrjetin testues dhe vendoseni atë në dosjen me klientin e ndërtuar.
Gati, mund të lanconi klientin:
./test-lite-client -C ton-lite-client-test1.config.json
Nëse gjithçka është bërë saktë, duhet të shihni diçka të tillë:

Komandat e disponueshme, siç e shohim, janë pak:
⊠help â shfaqni kĂ«tĂ« listĂ« komandash;
⊠quit â dilni;
⊠time â tregoni kohĂ«n aktuale nĂ« server;
⊠status â tregoni gjendjen e lidhjes dhe BAZĂN lokale tĂ« tĂ« dhĂ«nave;
⊠last â pĂ«rditĂ«soni gjendjen e bllokut nĂ« blockchain (ngarko bllokun e fundit). Kjo komandĂ« Ă«shtĂ« e rĂ«ndĂ«sishme tĂ« kryhet para çdo kĂ«rkese, pĂ«r tĂ« qenĂ« tĂ« sigurt se po shihni gjendjen aktuale tĂ« rrjetit.
⊠sendfile <filename> â ngarko njĂ« skedar lokal nĂ« rrjetin TON. Kjo ndodh gjatĂ« ndĂ«rveprimit me rrjetin â pĂ«rfshirĂ«, pĂ«r shembull, krijimin e kontratave tĂ« reja smart dhe kĂ«rkesat pĂ«r transferimin e fondeve midis llogarive;
⊠getaccount â tregoni gjendjen aktuale (nĂ« momentin e ekzekutimit tĂ« komandĂ«s last) e llogarisĂ« me adresĂ«n e dhĂ«nĂ«;
⊠privkey <filename> â ngarko çelĂ«sin privat nga njĂ« skedar lokal.
Nëse gjatë nisjes së klientit i jepni atij dosjen përmes opsionit -D, ai do të vendosë bllokun e fundit të masterchain në të:
./test-lite-client -C ton-lite-client-test1.config.json -D ~/ton-db-dirTani mund tĂ« kalojmĂ« nĂ« gjĂ«ra mĂ« interesante â tĂ« studiojmĂ« gjuhĂ«n Fift, tĂ« provojmĂ« tĂ« kompilohet njĂ« kontratĂ« smart (pĂ«r shembull, tĂ« krijojmĂ« njĂ« portofol testimi), ta ngarkojmĂ« atĂ« nĂ« rrjet dhe tĂ« provojmĂ« transferimin e fondeve midis llogarive.
Gjuha Fift
Nga dokumenti mund tĂ« mĂ«soni se pĂ«r tĂ« krijuar kontrata smart, ekipi i Telegram krijoi njĂ« gjuhĂ« tĂ« re staku Fift (duket se nga numri fifth, nĂ« mĂ«nyrĂ« analogjike me Forth â njĂ« gjuhĂ« me tĂ« cilĂ«n Fift ka shumĂ« ngjashmĂ«ri).
Dokumenti është mjaft i gjerë, me 87 faqe, dhe nuk do t'i tregoj përmbajtjen e tij në detaje brenda këtij artikulli (minimisht, sepse vetë nuk e kam përfunduar leximin e tij :). Do të ndalem në pikat kryesore dhe do të jap disa shembuj kodi në këtë gjuhë.
NĂ« nivelin bazik, sintaksa e Fift Ă«shtĂ« mjaft e thjeshtĂ«: kodi i tij pĂ«rbĂ«het nga fjalĂ«, zakonisht tĂ« ndara me hapĂ«sira ose kalime linjash (rast specifik: disa fjalĂ« nuk kĂ«rkojnĂ« ndarĂ«s pas vetes). Ădo fjalĂ« Ă«shtĂ« njĂ« sekuencĂ« simbolesh qĂ« Ă«shtĂ« e ndjeshme ndaj rastit, pĂ«r tĂ« cilĂ«n korrespondon diçka pĂ«rcaktimi (thjesht, ajo qĂ« interpretuese duhet tĂ« bĂ«jĂ« kur takon kĂ«tĂ« fjalĂ«). NĂ«se pĂ«rkufizimi i fjalĂ«s nuk ekziston, interpretuese mundohet ta analizojĂ« si numĂ«r dhe ta vendosĂ« nĂ« stek. Ndryshe, numrat kĂ«tu janĂ« - befas - numra tĂ« plotĂ« 257-bitĂ«, dhe nuk ka as numra tĂ« thyeshĂ«m - mĂ« saktĂ«, ata menjĂ«herĂ« shndĂ«rrohen nĂ« njĂ« çift numrash tĂ« plotĂ« qĂ« formojnĂ« nominuesin dhe emĂ«ruesin e njĂ« shkalle tĂ« arsyeshme.
FjalĂ«t zakonisht ndĂ«rveprojnĂ« me vlerat qĂ« ndodhen nĂ« krye tĂ« stekut. NjĂ« lloj i veçantĂ« fjalĂ«sh - prefikse pĂ«rdor nuk stekun, por karakteret qĂ« vijojnĂ« pas tyre nga skedari burimor. PĂ«r shembull, kĂ«shtu realizohen literat e vargjeve - karakteri âcitatâ (") Ă«shtĂ« njĂ« fjalĂ« prefikse qĂ« kĂ«rkon citatin e ardhshĂ«m (mbyllĂ«s), dhe vendos vargun mes tyre nĂ« stek. NĂ« kĂ«tĂ« mĂ«nyrĂ« veprojnĂ« edhe komente njĂ«- (//) dhe shumĂ«-rresht (/*) komente.
KĂ«tu pĂ«rfundon pothuajse e gjithĂ« struktura e brendshme e gjuhĂ«s. Gjithçka tjetĂ«r (pĂ«rfshirĂ« strukturat kontrolluese) Ă«shtĂ« e pĂ«rcaktuar si fjalĂ« (ose tĂ« brendshme, si operacionet aritmetike dhe pĂ«rcaktimi i fjalĂ«ve tĂ« reja; ose tĂ« pĂ«rcaktuara nĂ« âbibliotekĂ«n standardeâ Fift.fif, e cila ndodhet nĂ« dosjen crypto/fift nĂ« burime.)
Një shembull i thjeshtë i një programi në Fift:
{ dup =: x dup * =: y } : setxy
3 setxy x . y . x y + .
7 setxy x . y . x y + .Në rreshtin e parë përcaktohet një fjalë e re setxy (vini re prefiksin {, i cili krijon një bllok deri në mbyllësin e } dhe prefiksin :, i cili në të vërtetë përcakton fjalën). setxy Merr një numër nga krye i stekut, e përcakton (ose e rëpërcakton) si një konstantë globale x, ndërsa katrori i këtij numri - si një konstantë y (duke marrë parasysh se vlerat e konstantave mund të rëpërcaktohen, unë do ta quanin më shumë variabël, por unë ndjek emërtimin në gjuhë).
Në dy rreshtat e ardhshëm, një numër vendoset në stek, thirret setxy, dhe pastaj vlerat e konstantave x, y (për të shfaqur përdoret fjalë .), të dy konstantat vendosen në stek, shumëzohen dhe rezultati gjithashtu shfaqet. Si rezultat, ne do të shohim:
3 9 12 ok
7 49 56 ok(Rreshti âokâ shfaqet nga interpretuese kur pĂ«rfundon pĂ«rpunimin e rreshtit aktual nĂ« modalitetin interaktiv tĂ« hyrjes)
Dhe një shembull i plotë i kodit:
"Asm.fif" përfshin
-1 konstante wc \/\/ krijo një portofol në workchain -1 (masterchain)
\/\/ Krijo një portofol të ri të thjeshtë
<{ SETCP0 DUP IFNOTRET INC 32 THROWIF \/\/ kthehu nëse recv_internal, dështim përveç nëse recv_external
512 INT LDSLICEX DUP 32 PLDU \/\/ nënshkruaj cs cnt
c4 PUSHCTR CTOS 32 LDU 256 LDU ENDS \/\/ nënshkruaj cs cnt cnt' pubk
s1 s2 XCPU \/\/ nënshkruaj cs cnt pubk cnt' cnt
EQUAL 33 THROWIFNOT \/\/ ( mospërputhje seqno? )
s2 PUSH HASHSU \/\/ nënshkruaj cs cnt pubk hash
s0 s4 s4 XC2PU \/\/ pubk cs cnt hash nënshkrim pubk
CHKSIGNU \/\/ pubk cs cnt ?
34 THROWIFNOT \/\/ mospërputhje nënshkrimi
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
\/\/ kod
<b 0 32 u, newkeypair swap dup constant wallet_pk "new-wallet.pk" b>file
B,
b> \/\/ të dhÄna
\/\/ pa biblioteka
<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>$ tip cr
256 u>B "new-wallet.addr" B>file
<b 0 32 u, b>
dup ."nënshkrimi mesazhi: " <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 ."Mesazhi i jashtëm për fillimin është " <s csr. cr
2 boc+>B dup Bx. cr
"new-wallet-query.boc" tuck B>file
."(Ruajtur në skedarin " tip .")" crKy skedar qĂ« duket pak i frikshĂ«m Ă«shtĂ« i destinuar pĂ«r tĂ« krijuar njĂ« smart-kontratĂ« - ai do tĂ« vendoset nĂ« skedarin new-wallet-query.boc pas pasjes sĂ« ekzekutimit. Kujdes, kĂ«tu pĂ«rdoret edhe njĂ« gjuhĂ« tjetĂ«r, gjuhĂ« assemblere pĂ«r TON Virtual Machine (nuk do tĂ« ndalem thellĂ« nĂ« tĂ«), instruksionet e sĂ« cilĂ«s do tĂ« vendosen nĂ« blockchain.
KĂ«shtu, assembleri pĂ«r TVM Ă«shtĂ« shkruar nĂ« Fift â kodet burimore tĂ« kĂ«tij assembleri ndodhen nĂ« skedarin crypto/fift/Asm.fif dhe lidhen nĂ« fillim tĂ« kodit tĂ« mĂ«sipĂ«rm.
ĂfarĂ« mund tĂ« them, duket se Nikolai Durov thjesht e pĂ«lqen tĂ« krijojĂ« gjuhĂ« tĂ« reja programuese đ
Krijimi i kontratave inteligjente dhe ndërveprimi me TON
Tani, le të supozojmë se kemi mbledhur klientin TON dhe interpreterin Fift, siç përmenda më parë, dhe jemi njohur me gjuhën. Si të krijojmë tani një kontratë inteligjente? Këtë e shpjegon skedari , i bashkëngjitur me kodin burimor.
Llogaritë në TON
Siç e pĂ«rshkrova nĂ« , kjo rrjet ka mĂ« shumĂ« se njĂ« blockchain â ka njĂ« tĂ« pĂ«rgjithshĂ«m, tĂ« njohur si "masterchain", si dhe njĂ« numĂ«r tĂ« pakufizuar "workchains", tĂ« identifikuar nga njĂ« numĂ«r 32-bit. Masterchain ka njĂ« identifikues -1, pĂ«rveç tij gjithashtu mund tĂ« pĂ«rdoret "workchain" bazĂ« me identifikues 0. Ădo workchain mund tĂ« ketĂ« konfigurimin e vet. Brenda secilit workchain, ndahen shardchains, por kjo Ă«shtĂ« njĂ« detaj implementimi qĂ« nuk Ă«shtĂ« e nevojshme tĂ« mbahet mend.
Brenda një workchain ruhen shumë llogari, të cilat kanë identifikuesit e tyre account_id. Për masterchain dhe workchain zero, ato kanë gjatësi 256 bit. Pra, identifikuesi i llogarisë regjistrohet, për shembull, kështu:
-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0dKy është formati "i papërpunuar": fillimisht identifikuesi i workchain, pastaj një kolonë, dhe identifikuesi i llogarisë në notimin hexadecimal.
PĂ«r mĂ« tepĂ«r, ekziston njĂ« format i shkurtuar â numri i workchain dhe adresa e llogarisĂ« kodohen nĂ« formĂ« binare, atyre iu shtohet njĂ« kontrollues dhe gjithçka kodifikohet nĂ« Base64:
Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkbDuke e ditur këtë format regjistrimi, ne mund të kërkojmë gjendjen aktuale të ndonjë llogarie përmes klientit testues me komandën
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0dDo të marrim një përgjigje të tillë:
[ 3][t 2][1558746708.815218925][test-lite-client.cpp:631][!testnode] kërkesa për gjendjen e llogarisë për -1:8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D
[ 3][t 2][1558746708.858564138][test-lite-client.cpp:652][!testnode] mori gjendjen e llogarisë për -1:8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D në lidhje me blloqet (-1,8000000000000000,72355):F566005749C1B97F18EDE013EBA7A054B9014961BC1AD91F475B9082919A2296:1BD5DE54333164025EE39D389ECE2E93DA2871DA616D488253953E52B50DC03F dhe (-1,8000000000000000,72355):F566005749C1B97F18EDE013EBA7A054B9014961BC1AD91F475B9082919A2296:1BD5DE54333164025EE39D389ECE2E93DA2871DA616D488253953E52B50DC03F
gjendja e llogarisë është (llogari
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}Ne shohim strukturĂ«n qĂ« ruhet nĂ« DHT tĂ« kĂ«saj workchain. PĂ«r shembull, nĂ« fushĂ«n storage.balance gjejmĂ« balancĂ«n aktuale tĂ« llogarisĂ«, nĂ« storage.state.code â kodi i smart kontratĂ«s, dhe nĂ« storage.state.data â tĂ« dhĂ«nat e saj aktuale. Vini re se ruajtja e tĂ« dhĂ«nave TON â Cell, Ă«shtĂ« hierarkike, ku çdo Cell mund tĂ« ketĂ« si tĂ« dhĂ«na tĂ« veta ashtu edhe Cells tĂ« fĂ«mijĂ«ve. Kjo Ă«shtĂ« e paraqitur me anĂ« tĂ« hapĂ«sirave nĂ« linjat e fundit.
Ndërtimi i smart kontratës
Tani le tĂ« krijojmĂ« njĂ« strukturĂ« tĂ« tillĂ« (quhet BOC â bag of cells) me ndihmĂ«n e gjuhĂ«s Fift. FatmirĂ«sisht, nuk do tĂ« kemi nevojĂ« tĂ« shkruajmĂ« vetĂ« smart kontratĂ«n â nĂ« dosjen crypto/block nĂ« arkivin me burimin ka njĂ« skedar new-wallet.fif, qĂ« do tĂ« na ndihmojĂ« tĂ« krijojmĂ« njĂ« portofol tĂ« ri. Do ta kopjojmĂ« atĂ« nĂ« dosjen me klientin e ndĂ«rtuar (~\/liteclient-build, nĂ«se keni vepruar sipas udhĂ«zimeve tĂ« mĂ«sipĂ«rme). PĂ«rmbajtja e saj e njĂ«jtĂ« e kam sjellĂ« mĂ« sipĂ«r si njĂ« shembull kodi nĂ« Fift.
E ekzekutojmë këtë skedar si më poshtë:
.\/crypto\/fift -I"\/crypto\/fift" new-wallet.fifKëtu <source-directory> duhet të zëvendësohet me rrugën në burimet e shkarkuara (simboli «~» këtu, fatkeqësisht, nuk mund të përdoret, është e nevojshme një rrugë e plotë). Në vend të përdorimit të çelësit -I mund të përcaktoni një variabël mjedisore FIFTPATH dhe ta vendosni këtë rrugë në të.
Duke e aktivizuar Fift me emrin e skedarit new-wallet.fif, do ta ekzekutojë dhe do të përfundojë. Nëse emri i skedarit lihet bosh, mund të luani me interpretuesin në mënyrë interaktive.
Në konsolën pas ekzekutimit duhet të shfaqet diçka e tillë:
StateInit: x{34_}
x{FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED54}
x{0000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B}
adresa e re e portofolit = -1 : 4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2
0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ
nënshkrimi i mesazhit: x{00000000}
Mesazhi i jashtëm për aktivizim është x{89FEE120E20C7E953E31546F64C23CD654002C1AA919ADD24DB12DDF85C6F3B58AE41198A28AD8DAF3B9588E7A629252BA3DB88F030D00BC1016110B2073359EAC3C13823C53245B65D056F2C070B940CDA09789585935C7ABA4D2AD4BED139281CFA1200000001_}
x{FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED54}
x{0000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B}
B5EE9C724104030100000000D60002CF89FEE120E20C7E953E31546F64C23CD654002C1AA919ADD24DB12DDF85C6F3B58AE41198A28AD8DAF3B9588E7A629252BA3DB88F030D00BC1016110B2073359EAC3C13823C53245B65D056F2C070B940CDA09789585935C7ABA4D2AD4BED139281CFA1200000001001020084FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED5400480000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B6290698B
(Saved to file new-wallet-query.boc)Kjo do të thotë se portofoli me identifikuesin -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (ose, e njëjta gjë, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) është krijuar me sukses. Kodi përkatës do të gjendet në skedarin new-wallet-query.boc, adresa e tij është në new-wallet.addr, dhe çelësi privat është në new-wallet.pk (kini kujdes - rikthimi i skenarit do të mbivendosë këta skedarë).
Sigurisht, rrjeti TON për këtë portofol ende nuk di ndonjë gjë, ai ruhet vetëm në këto skedarë. Tani duhet të ngarkohet në rrjet. Megjithatë, problemi është se për të krijuar një kontratë inteligjente duhet të paguhet një tarifë, dhe bilanci i llogarisë suaj për momentin është zero.
Në mënyrë operative kjo problem do të zgjidhet duke blerë grama në bursë (ose duke transferuar nga një portofol tjetër). Por, në këtë fazë testuese, është krijuar një kontratë intelligjente speciale, nga e cila mund të kërkoni deri në 20 gramë thjesht kështu.
Formimi i një kërkese për një kontratë inteligjente të huaj
Kërkesa për kontratën inteligjente, që shpërndan gramë majtas dhe djathtas, bëhet kështu. Në atë të njëjtin dosje crypto/block gjeni skedarin 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 ."mesazhi përfshirës: " <s csr. cr
<b b{1000100} s, wc 8 i, wallet_addr 256 u, 0 gram, b{00} s,
swap <s b>
dup ."mesazhi rezultues të jashtëm: " <s csr. cr
2 boc+>B dup Bx. cr
"wallet-query.boc" B>filePo ashtu do ta ruajmë në dosjen me klientin e grumbulluar, por do ta rregullojmë rreshtin e katërt - para rreshtit "constant dest_addr". E zëvendësojmë atë me adresën e atij portofoli, që e krijuat më parë (e plotë, e pa shkurtuar). "-1:" në fillim nuk duhet të shkruhet, në vend të kësaj në fillim vendosni "0x".
Po ashtu mund tĂ« ndryshoni rreshtin 6.666 Gram*\/ sasi konstant â Ă«shtĂ« shuma nĂ« gramĂ« qĂ« po kĂ«rkoni (jo mĂ« shumĂ« se 20). Edhe nĂ«se jepni njĂ« numĂ«r tĂ« plotĂ«, lĂ«reni pikĂ«n decimale.
Në fund, duhet të korrigjoni rreshtin 0x00000011 numri konstant seqno. Numri i parë këtu është numri aktual i sekuencës, i cili ruhet në llogarinë që lëshon gramët. Nga e merrni atë? Siç u përmend më sipër, ndizni klientin dhe ekzekutoni:
last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0dNë fund të të dhënave të kontratës së zgjuar do të jetë
...
x{FF0020DDA4F260D31F01ED44D0D31FD166BAF2A1F80001D307D4D1821804A817C80073FB0201FB00A4C8CB1FC9ED54}
x{0000000D}Numri 0000000D (ju do të keni më shumë) është numri i sekuencës që duhen vendosur në testgiver.fif.
Kaq, ruajmĂ« skedarin dhe e çojmĂ« nĂ« ekzekutim (.\/crypto\/fift testgiver.fif). NĂ« daljen do tĂ« marrim skedarin wallet-query.boc. Ky Ă«shtĂ« formati i krijuar njĂ« mesazh pĂ«r njĂ« kontratĂ« tĂ« zgjuar tĂ« huaj â kĂ«rkesa "kthe njĂ« numĂ«r gramĂ«sh nĂ« njĂ« llogari tĂ« caktuar".
Me ndihmën e klientit, e ngarkojmë atë në rrjet:
> sendfile wallet-query.boc
[ 1][t 1][1558747399.456575155][test-lite-client.cpp:577][!testnode] dërgimi i kërkesës nga skedari wallet-query.boc
[ 3][t 2][1558747399.500236034][test-lite-client.cpp:587][!query] statusi i mesazhit tĂ« jashtĂ«m Ă«shtĂ« 1NĂ«se tani thĂ«rrasim last, e mĂ« pas kĂ«rkojmĂ« pĂ«rsĂ«ri statusin e llogarisĂ«, pĂ«r tĂ« cilin kĂ«rkuam gramĂ«, duhet tĂ« shohim se numri i tij i sekuencĂ«s Ă«shtĂ« rritur me njĂ« â kjo do tĂ« thotĂ« se ai dĂ«rgoi paratĂ« nĂ« llogarinĂ« tonĂ«.
Ka mbetur hapi i fundit â ngarko kodin e portofolit tonĂ« (bilanci i tij tashmĂ« Ă«shtĂ« i mbushur, por pa kodin e kontratĂ«s sĂ« zgjuar nuk do tĂ« mund ta menaxhojmĂ«). EkzekutojmĂ« sendfile new-wallet-query.boc â dhe gjithçka, keni njĂ« portofol tĂ« vetĂ«n nĂ« rrjetin TON (edhe pse pĂ«rmomentin vetĂ«m nĂ« test).
Krijimi i transaksioneve të daljes
Për të transferuar para nga bilancet e llogarisë së krijuar, ka skedarin crypto\/block\/wallet.fif, i cili gjithashtu duhet të vendoset në dosjen me klientin e mbledhur.
NjĂ«soj si hapat e mĂ«parshĂ«m, nĂ« tĂ« duhet tĂ« korrigjoni shumĂ«n qĂ« po dĂ«rgoni, adresĂ«n e marrĂ«sit (dest_addr), dhe seqno-nĂ« e portofolit tuaj (ajo Ă«shtĂ« 1 pas fillimit tĂ« portofolit dhe rritet me 1 pas çdo transaksioni tĂ« daljes â do tĂ« mund ta shihni duke kĂ«rkuar statusin e llogarisĂ« tuaj). PĂ«r testim mund tĂ« pĂ«rdorni, pĂ«r shembull, portofolin tim â 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.
Kur e çoni në ekzekutim (.\/crypto\/fift wallet.fif) skripti do të marrë adresën e portofolit tuaj (nga ku po dërgoni) dhe çelësin e tij privat nga skedarët new-wallet.addr dhe new-wallet.pk, dhe do të regjistrojë mesazhin e marrë në new-wallet-query.boc.
Si dhe më parë, për të ekzekutuar drejtpërdrejt transaksionin, thërrasim sendfile new-wallet-query.boc në klient. Pas kësaj, mos harroni të përditësoni gjendjen e blockchain-it (last) dhe kontrolloni që balanca dhe seqno e portofolit tonë ndryshuan (getaccount).

Këtu është, tani ne dimë të krijojmë kontrata inteligjente në TON dhe të dërgojmë kërkesa për to. Siç mund ta shohim, funksionaliteti aktual është mjaft i mjaftueshëm për të bërë, për shembull, një portofol më miqësor me një ndërfaqe grafike (mënyra se si pritet që ai të jetë në dispozicion si pjesë e mesazhit).
Vetëm përdoruesit e regjistruar mund të marrin pjesë në anketë. , ju lutem.
A jeni të interesuar për vazhdimin e artikujve që analizojnë TON, TVM, Fift?
Po, po pres përfundimin e ciklit të artikujve me një përmbledhje të përgjithshme mbi TON
Po, është interesante të lexoj më shumë rreth gjuhës Fift
Po, dëshiroj të di më shumë rreth TON Virtual Machine dhe assembler-it për të
Jo, nuk jam i interesuar për asgjë nga kjo
Kanë votuar 39 përdorues. Përmbahen 12 përdorues.
Si e shihni planin e Telegram për të lançar TON?
Kam shpresat e mëdha për këtë projekt
Thjesht po ndjek me interes zhvillimin e tij
Jam skeptik, dyshoj për suksesin e tij
E mendoj këtë iniciativë si një dështim, e panevojshme për masat e gjera
Kanë votuar 47 përdorues. Përmbahen 12 përdorues.
Burimi: habr.com

