Klient testues TON (Telegram Open Network) dhe gjuha e re Fift për smart contract-et

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 1, pjesa 2; 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 kanalet jozyrtare) u shfaq një lidhje në faqen https://test.ton.org/download.html, ku janë vendosur:
◩ ton-test-liteclient-full.tar.xz — burimet e klientit tĂ« lehtĂ« pĂ«r rrjetin testues TON;
◩ ton-lite-client-test1.config.json — dosja e konfigurimit pĂ«r t'u lidhur me rrjetin testues;
◩ README — informacion mbi ndĂ«rtimin dhe lançimin e klientit;
◩ HOWTO — udhĂ«zimi hap pas hapi mbi krijimin e kontratĂ«s sĂ« mençur me ndihmĂ«n e klientit;
◩ ton.pdf — dokumenti i pĂ«rditĂ«suar (nga 2 mars 2019) me njĂ« pĂ«rmbledhje teknike tĂ« rrjetit TON;
◩ tvm.pdf — pĂ«rshkrimi teknik i TVM (TON Virtual Machine, makina virtuale TON);
◩ tblkch.pdf — pĂ«rshkrimi teknik i bllokut TON;
◩ fiftbase.pdf — 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, README 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.

  1. ShkarkojmĂ« dhe çarchivejmĂ« arkivin me burimet. Ë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.

  2. 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ë.

  3. 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

    Klient testues TON (Telegram Open Network) dhe gjuha e re Fift për smart contract-et

    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ërrasim

    cmake --build . --target fift

  4. Shkarkoni të dhënat aktuale skedës së konfigurimit për t'u lidhur me rrjetin testues dhe vendoseni atë në dosjen me klientin e ndërtuar.

  5. 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ë:

Klient testues TON (Telegram Open Network) dhe gjuha e re Fift për smart contract-et

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-dir

Tani 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 fiftbase.pdf 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ë
&lt;{  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&#039; pubk
    s1 s2 XCPU            \/\/ nënshkruaj cs cnt pubk cnt&#039; 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
}&gt;c
\/\/ kod
<b 0 32 u, newkeypair swap dup constant wallet_pk "new-wallet.pk" b>file
   B, 
b&gt; \/\/ 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&gt;B "new-wallet.addr" B&gt;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&gt;file
."(Ruajtur në skedarin " tip .")" cr

Ky 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 HOWTO, i bashkëngjitur me kodin burimor.

Llogaritë në TON

Siç e pĂ«rshkrova nĂ« mbledhjen TON, 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:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Ky ë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+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb

Duke 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:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Do 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.fif

Kë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&gt;file

Po 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:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Në 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ë 1

NĂ«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).

Klient testues TON (Telegram Open Network) dhe gjuha e re Fift për smart contract-et

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ë. Hyni, 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

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster