Kunder të testit TON (Telegram Open Network) dhe gjuha e re Fift për kontratat inteligjente

MĂ« shumĂ« se njĂ« vit mĂ« parĂ« u njoftua pĂ«r planet e mesazhit Telegram pĂ«r tĂ« lansuar njĂ« rrjet tĂ« decentralizuar tĂ« tijin Telegram Open Network. AtĂ«herĂ« u bĂ« i disponueshĂ«m njĂ« dokument teknikor i gjerĂ«, i cili, besohet se, ishte shkruar nga Nikolai Durov dhe pĂ«rshkruante strukturĂ«n e rrjetit tĂ« ardhshĂ«m. PĂ«r ata qĂ« e kanĂ« humbur — rekomandoj tĂ« njiheni me pĂ«rmbledhjen time tĂ« kĂ«tij dokumenti (pjesa 1, pjesa 2; pjesa e tretĂ«, me keqardhje, ende Ă«shtĂ« nĂ« skica).

Që atëherë nuk ka pasur lajme të rëndësishme për statusin e zhvillimit të TON, deri disa ditë më parë (në një nga kanalet jozyrtare) u shfaq një lidhje në faqen https://test.ton.org/download.html, ku janë publikuar:
◩ ton-test-liteclient-full.tar.xz — kodet burimore tĂ« klientit tĂ« lehtĂ« pĂ«r rrjetin testues TON;
◩ ton-lite-client-test1.config.json — skeda e konfigurimit pĂ«r lidhjen me rrjetin testues;
◩ README — informacion mbi ndĂ«rtimin dhe lancimin e klientit;
◩ HOWTO — udhĂ«zues hap pas hapi pĂ«r krijimin e njĂ« kontrate inteligjente me ndihmĂ«n e klientit;
◩ ton.pdf — dokumenti i pĂ«rditĂ«suar (nga 2 mars 2019) me njĂ« pasqyrĂ« teknike tĂ« rrjetit TON;
◩ tvm.pdf — pĂ«rshkrimi teknik i TVM (TON Virtual Machine, makina virtuale TON);
◩ tblkch.pdf — pĂ«rshkrimi teknik i blockchain-it TON;
◩ fiftbase.pdf — pĂ«rshkrimi i gjuhĂ«s sĂ« re Fift, e cila Ă«shtĂ« e destinuar pĂ«r krijimin e kontratave smart nĂ« TON.

Të theksoj, nuk ka konfirmime zyrtare të kësaj faqeje dhe të gjithë këtyre dokumenteve nga Telegrami, por sasia e këtyre materialeve i bën ato mjaft të besueshme. Kryeni publikimin e klientit të botuar në rrezikun tuaj.

Ndërtimi i klientit provues

PĂ«r fillim, do tĂ« pĂ«rpiqemi tĂ« ndĂ«rtojmĂ« dhe tĂ« kryejmĂ« testimin e klientit provues — fatmirĂ«sisht, README pĂ«rshkruan kĂ«tĂ« proces tĂ« thjeshtĂ«. Do ta bĂ«j kĂ«tĂ« duke pĂ«rdorur macOS 10.14.5 si shembull, nuk mund tĂ« garantoj pĂ«r suksesin e ndĂ«rtimit nĂ« sisteme tĂ« tjera.

  1. Shkarkoni dhe shkarkoni arkivin me burimet e kodit. ËshtĂ« e rĂ«ndĂ«sishme tĂ« shkarkoni versionin mĂ« tĂ« fundit, pasi mbĂ«shtetja e prapambetur nĂ« kĂ«tĂ« fazĂ« nuk garantohet.

  2. Sigurohuni që në sistemin tuaj janë të instaluara versionet më të fundit të make, cmake (versionet 3.0.2 ose më lart), OpenSSL (përfshirë skedarët ndihmës C), g++ ose clang. Nuk më duhej të instalonja asgjë jashtë, gjithçka u ndërtua menjëherë.

  3. Supozoni se burimet janë shkarkuar në dosjen ~/lite-client. Veçmas krijoni një dosje të zbrazët për projektin e ndërtuar (p.sh., ~/liteclient-build), dhe nga ajo (cd ~/liteclient-build) thërrisni komandat:

    cmake ~/lite-client
    cmake --build . --target test-lite-client

    Kunder të testit TON (Telegram Open Network) dhe gjuha e re Fift për kontratat inteligjente

    Për të ndërtuar interpretuesin e gjuhës Fift për smart kontratat (për të cilin flitet më poshtë), gjithashtu thërrasim

    cmake --build . --target fift

  4. Shkarkojmë skedarin aktual konfigurues për lidhjen me rrjetin testues dhe e vendosim në dosjen me klientin e ndërtuar.

  5. Gati, mund të nisim klientin:

    ./test-lite-client -C ton-lite-client-test1.config.json

Nëse gjithçka është bërë siç duhet, duhet të shihni diçka të tillë:

Kunder të testit TON (Telegram Open Network) dhe gjuha e re Fift për kontratat inteligjente

Komandat e disponueshme, siç e shohim, janë pak:
◩ help — shfaq kĂ«tĂ« listĂ« komandash;
◩ quit — dil;
◩ time — tregon kohĂ«n aktuale nĂ« server;
◩ status — tregon gjendjen e lidhjes dhe lokalizimin e DB;
◩ last — pĂ«rditĂ«son gjendjen e blockchain-it (ngarkon bllokun e fundit). Kjo komandĂ« Ă«shtĂ« e rĂ«ndĂ«sishme tĂ« ekzekutohet para çdo kĂ«rkese, pĂ«r t'u siguruar se po shihni pikĂ«risht gjendjen aktuale tĂ« rrjetit.
◩ sendfile <filename> — ngarko njĂ« skedar lokal nĂ« rrjetin TON. KĂ«shtu ndodhi ndĂ«rveprimi me rrjetin — pĂ«rfshirĂ«, pĂ«r shembull, krijimin e smart kontratave tĂ« reja dhe kĂ«rkesat pĂ«r transferimin e fondeve midis llogarive;
◩ getaccount <address> — shfaq gjendjen aktuale ( nĂ« momentin e ekzekutimit tĂ« komandĂ«s last) tĂ« llogarisĂ« me adresĂ«n e specifikuar;
◩ privkey <filename> — ngarko çelĂ«sin privat nga njĂ« skedar lokal.

Nëse gjatë nisjes së klientit i kaloni atij dosjen nëpërmjet opsionit -D, atëherë ai do të vendosë bllokun e fundit të master chain 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Ă« kompilojmĂ« njĂ« kontratĂ« smart (pĂ«r shembull, tĂ« krijojmĂ« njĂ« portofol testues), ta ngarkojmĂ« atĂ« nĂ« rrjet dhe tĂ« provojmĂ« tĂ« transferojmĂ« fonde mes llogarive.

Gjuha Fift

Nga dokumenti fiftbase.pdf mund tĂ« mĂ«sojmĂ« se pĂ«r krijimin e kontratave smart, ekipi i Telegram-it krijoi njĂ« gjuhĂ« tĂ« re stack. Fift (duhet tĂ« jetĂ« nga numri fifth, sipas analogjisĂ« me Forth — njĂ« gjuhĂ« me tĂ« cilĂ«n Fift ka shumĂ« pĂ«rbashkĂ«si).

Dokumenti është mjaft i gjërë, me 87 faqe, dhe nuk do ta përmbledh në detaje përmbajtjen e tij në këtë artikull (të paktën, sepse vetë nuk e kam përfunduar leximin :). 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 rreshta tĂ« rinj (rast i veçantĂ«: disa fjalĂ« nuk kĂ«rkojnĂ« njĂ« ndarĂ«s pas tyre). Çdo fjalĂ« Ă«shtĂ« njĂ« sekuencĂ« simbolesh e ndjeshme ndaj rastit, e cila pĂ«rfaqĂ«son njĂ« definicion (pĂ«r tĂ« thĂ«nĂ« shkurt, ajo qĂ« interpretuĂ«si duhet tĂ« bĂ«jĂ« kur takon kĂ«tĂ« fjalĂ«). NĂ«se nuk ka njĂ« definicion pĂ«r fjalĂ«n, interpretuĂ«si pĂ«rpiqet ta analizojĂ« atĂ« si njĂ« numĂ«r dhe ta vendosĂ« nĂ« stack. PĂ«r ta thĂ«nĂ« tĂ« drejtĂ«n, numrat kĂ«tu janĂ« — papritur — tĂ« gjithĂ« mbi 257-bitĂ«, dhe s'ka as numra me thyesa — nĂ« vend tĂ« kĂ«saj, ata kthehen menjĂ«herĂ« nĂ« njĂ« çift tĂ« tĂ«rĂ«sish, qĂ« formojnĂ« numeratorin dhe denominatorin e njĂ« thyesĂ« racionale.

FjalĂ«t, zakonisht, ndĂ«rveprojnĂ« me vlerat qĂ« ndodhen nĂ« majĂ« tĂ« stack-ut. NjĂ« lloj i veçantĂ« fjalĂ«sh — prefikse — nuk pĂ«rdor stack-un, por simbolin qĂ« pason nga skedari burimor. PĂ«r shembull, kĂ«shtu realizohen literalet e vargjeve — simboli "(" Ă«shtĂ« njĂ« fjalĂ« prefikse qĂ« kĂ«rkon thonjĂ«zĂ«n tjetĂ«r (mbyllĂ«se), dhe e vendos vargun mes tyre nĂ« stack. NjĂ«soj siç funksionojnĂ« komentet njĂ«rafĂ«she (") dhe ato shumĂ«rafĂ«she (//)./*KĂ«tu pĂ«rfundon pothuajse e gjithĂ« struktura e brendshme e gjuhĂ«s. Gjithçka tjetĂ«r (pĂ«rfshirĂ« strukturat drejtuese) Ă«shtĂ« 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ë dosjencrypto/fift crypto/fift në burimet).

Një shembull i thjeshtë i programit 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ë mbylljen e } dhe prefiksin :, i cili në thelb përcakton fjalën). setxy merr numrin nga maja e stack-ut, e përcakton (ose ripërcakton) si një konstante x, ndërsa katrori i këtij numri është si një konstante y (duke pasur parasysh se vlerat e konstantave mund të ripërcaktohen, unë do ta quaja më shumë si variabla, por po ndjek emërtimin në gjuhë).

Në dy rreshtat e ardhshme, numri vendoset në stack, thirret setxy, pastaj vlerat e konstantave shfaqen x, y (për shfaqjen përdoret fjala .), të dyja konstantat vendosen në stack, bashkohen dhe rezultati gjithashtu shfaqet. Si rezultat, do të shohim:

3 9 12 ok
7 49 56 ok

(Rreshti «ok» shfaqet nga interpretuësi kur mbaron të përpunojë rreshtin aktual në modin interaktiv të inputit)

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ë thjeshtë të ri
&lt;{  SETCP0 DUP IFNOTRET INC 32 THROWIF  \\ kthehu nëse recv_internal, dështoni përveç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   \\ ( mos pë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         \\ mos pë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ënat
\\ nuk ka 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>$ lloji cr
256 u&gt;B "new-wallet.addr" B&gt;file
<b 0 32 u, b>
dup ."nënshkrimi i mesazhit: " <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 inicializim është " <s csr. cr
2 boc+>B dup Bx. cr
"new-wallet-query.boc" tuck B&gt;file
."(Ruajtur në skedar " lloji .")" cr

Ky skedar i dukshĂ«m si i frikshĂ«m Ă«shtĂ« pĂ«r krijimin e njĂ« kontrate inteligjente — ai do tĂ« vendoset nĂ« skedarin new-wallet-query.boc pas pas pĂ«rfundimit. Vini re se kĂ«tu pĂ«rdoret njĂ« gjuhĂ« tjetĂ«r, gjuhĂ« assemble pĂ«r TON Virtual Machine (nuk do tĂ« ndalem nĂ« detaje), instruksionet e sĂ« cilĂ«s do tĂ« vendosen nĂ« blockchain.

KĂ«shtu, assembleri pĂ«r TVM Ă«shtĂ« shkruar nĂ« Fift — burimet e 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 i pĂ«lqen tĂ« krijojĂ« gjuhĂ« tĂ« reja programimi 🙂

Krijimi i kontratave inteligjente dhe ndërveprimi me TON

Pra, le të supozojmë se ne kemi përfunduar klientin TON dhe interpretorin Fift, siç përshkruhet më sipër, dhe njohëm gjuhën. Si të krijojmë tani një kontratë inteligjente? Kështu flitet në skedarin HOWTO, bashkëngjitur me burimet.

Këto llogari në TON

Siç e kam pĂ«rshkruar nĂ« raportin mbi TON, kjo rrjet pĂ«rmban mĂ« shumĂ« se njĂ« blockchain — ka njĂ« tĂ« pĂ«rbashkĂ«t, e njohur si «masterchain», si dhe njĂ« numĂ«r tĂ« pakufizuar tĂ« «workchain»-eve tĂ« tjera, qĂ« identifikohen nga njĂ« numĂ«r 32-bitĂ«sh. Masterchain-i ka njĂ« identifikues -1, pĂ«rveç tij gjithashtu mund tĂ« pĂ«rdoret njĂ« workchain «bazë» me identifikues 0. Çdo workchain mund tĂ« ketĂ« konfigurimin e tij. BrendĂ«sisht, çdo workchain ndahet nĂ« shardchains, por kjo Ă«shtĂ« njĂ« detaj implementimi, qĂ« nuk Ă«shtĂ« e nevojshme ta mbani mend.

Brenda një workchain-i ruhen shumë llogari, të cilat kanë identifikuesit e tyre account_id. Për masterchain-in dhe workchain-in zero, ato kanë gjatësi 256 bit. Kështu, identifikuesi i llogarisë shkruhet, për shembull, kështu:

-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Ky është formati «i papërpunuar»: së pari identifikuesi i workchain-it, pastaj dy pika, dhe identifikuesi i llogarisë në formatin hexadecimal.

PĂ«r mĂ« tepĂ«r, ka njĂ« format tĂ« shkurtuar — numri i workchain-it dhe adresa e llogarisĂ« kodohen nĂ« formĂ« binary, atyre iu shtohet njĂ« checksum dhe tĂ« gjitha kĂ«to kodohen nĂ« Base64:

Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb

Duke këtë format regjistrimi, mund të kërkojmë gjendjen aktuale të ndonjë llogarie përmes një klienti testi 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]    po kërkesës së gjendjes së 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ë (llogaria
  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}

Shfaqim strukturĂ«n qĂ« ruhet nĂ« DHT tĂ« blockchain-it tĂ« specifikuar. PĂ«r shembull, nĂ« fushĂ«n storage.balance ndodhet balanca aktuale e llogarisĂ«, nĂ« storage.state.code — kodi i kontratĂ«s sĂ« mençur, ndĂ«rsa nĂ« storage.state.data — janĂ« tĂ« dhĂ«nat e saj aktuale. Vini re se kjo strukturĂ« e tĂ« dhĂ«nave TON — Cell, qĂ« Ă«shtĂ« me hierarki, ka si tĂ« dhĂ«na tĂ« veta ashtu edhe cellet e fĂ«mijĂ«s. Kjo tregojĂ« nĂ« formĂ«n e hapĂ«sirave nĂ« rreshtat e fundit.

Ndërtimi i kontratës së mençur

Tani le tĂ« krijojmĂ« vetĂ« njĂ« strukturĂ« tĂ« tillĂ« (e cila quhet BOC — bag of cells) me ndihmĂ«n e gjuhĂ«s Fift. FatmirĂ«sisht, nuk do tĂ« duhet tĂ« shkruani me vetĂ« kontratĂ«n e mençur — nĂ« dosjen crypto/block nĂ« arkiv me burimet ka njĂ« skedĂ« new-wallet.fif, e cila do na ndihmojĂ« tĂ« krijojmĂ« njĂ« portofol tĂ« ri. Ta kopjojmĂ« atĂ« nĂ« dosjen me klientin e ndĂ«rtuar (~/liteclient-build, nĂ«se keni vepruar sipas udhĂ«zimeve mĂ« sipĂ«r). TĂ« njĂ«jtin pĂ«rmbajtje e kam sjellĂ« mĂ« sipĂ«r si shembull kodi nĂ« Fift.

E ekzekutojmë këtë skedë në këtë mënyrë:

./crypto/fift -I"/crypto/fift" new-wallet.fif

Këtu <source-directory> duhet të zëvendësohet me rrugën për burimet e shkarkuara (simboli «~» këtu, fatkeqësisht, nuk mund të përdoret, është i nevojshëm rruga e plotë). Në vend të përdorimit të çelësit -I mund të përcaktojë një variabël mjedisi FIFTPATH dhe ta vendosë këtë rrugë në të.

Pasiqë Fift e filluam me emrin e skedarit new-wallet.fif, ai do ta ekzekutojë dhe do të përfundojë. Nëse emri i skedarit është i lënë jashtë, atëherë mund të luani me interpretuesin në modin interaktiv.

Pas ekzekutimit, duhet të shfaqet diçka e tillë në konsolë:

StateInit: x{34_}
 x{FF0020DDA4F260810200D71820D70B1FED44D0D31FD3FFD15112BAF2A122F901541044F910F2A2F80001D31F3120D74A96D307D402FB00DED1A4C8CB1FCBFFC9ED54}
 x{0000000055375F730EDC2292E8CB15C42E8036EE9C25AA958EE002D2DE48A205E3A3426B}

një adresë e re portofoli = -1 : 4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 
0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ
mesazhi i nënshkrimit: x{00000000}

Mesazhi i jashtëm për inicializim ë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, qĂ« Ă«shtĂ« e njĂ«jtĂ«, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) Ă«shtĂ« krijuar me sukses. Kodi pĂ«rkatĂ«s do tĂ« gjendet nĂ« skedĂ«n new-wallet-query.boc, adresa e tij Ă«shtĂ« nĂ« new-wallet.addr, ndĂ«rsa çelĂ«si privat Ă«shtĂ« nĂ« new-wallet.pk (kujdes — njĂ« ekzecutim tjetĂ«r i skenarit do tĂ« mbulojĂ« kĂ«to skeda).

Sigurisht, rrjeti TON ende nuk e di për këtë portofol, ai ruhet vetëm në formën e këtyre skedave. Tani duhet ngarkuar në rrjet. Megjithatë, problemi është se për të krijuar një kontratë inteligjente duhet paguar një tarifë, dhe balanca e llogarisë tuaj aktualisht është zero.

Në operim normal, ky problem do të zgjidhet duke blerë gramat në treg (ose duke transferuar nga një portofol tjetër). Në këtë regjion testimi aktual, është krijuar një kontratë inteligjente speciale, nga e cila mund të kërkoni deri në 20 gram falas.

Formimi i kërkesës për një kontratë inteligjente të huaj

Kërkesa për një kontratë inteligjente, që ndan gramat në të gjitha drejtimet, bëhet kështu. Në atë të njëjtën dosje crypto/block gjejmë skedën 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 ."mesazh i përfshirë: " <s csr. cr
<b b{1000100} s, wc 8 i, wallet_addr 256 u, 0 gram, b{00} s,
 swap <s b>
dup ."mesazh përfundimtar: " <s csr. cr
2 boc+>B dup Bx. cr
"wallet-query.boc" B&gt;file

KĂ«tĂ« do ta ruajmĂ« gjithashtu nĂ« dosjen me klientin e mbledhur, por do tĂ« korektojmĂ« rreshtin e pestĂ« — para rreshtit «constant dest_addr«. Ne do ta adresin e atij portofoli qĂ« keni krijuar mĂ« parĂ« (tĂ« plotĂ«, jo tĂ« shkurtuar). «-1:» nĂ« fillim nuk Ă«shtĂ« e nevojshme, nĂ« vend tĂ« kĂ«saj vendosni «0x» nĂ« fillim.

Gjithashtu, mund tĂ« ndryshoni rreshtin 6.666 Gram*/ sasi konstante — kjo Ă«shtĂ« sasia nĂ« gram qĂ« po kĂ«rkoni (maksimumi 20). Edhe nĂ«se jepni njĂ« numĂ«r tĂ« plotĂ«, lĂ«reni pikĂ«n dekimale.

SĂ« fundi, duhet tĂ« rregulloni rreshtin 0x00000011 sasi konstante seqno. Numri i parĂ« kĂ«tu — Ă«shtĂ« numri aktual i sekuencĂ«s, i cili ruhet nĂ« llogarinĂ« qĂ« ndan gramĂ«t. Si ta merrni? Siç u tha mĂ« sipĂ«r, hapni klientin dhe ekzekutoni:

last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Në fund të të dhënave të kontratës inteligjente do të jetë

...
x{FF0020DDA4F260D31F01ED44D0D31FD166BAF2A1F80001D307D4D1821804A817C80073FB0201FB00A4C8CB1FC9ED54}
 x{0000000D}

Numri 0000000D (tek ju do të jetë më i madh) është numri i sekuencës që duhet të vendosni në testgiver.fif.

Tani, ruani skedarin dhe filloni (./crypto/fift testgiver.fif). NĂ« daljen do tĂ« marrim skedarin wallet-query.boc. Ky Ă«shtĂ« formatuar mesazhi nĂ« njĂ« kontratĂ« inteligjente tĂ« huaj — kĂ«rkesa «dĂ«rgo kaq gram nĂ« kĂ«tĂ« llogari».

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]    duke query nga skedari wallet-query.boc
[ 3][t 2][1558747399.500236034][test-lite-client.cpp:587][!query]   statusi i mesazhit të jashtme është 1

Nëse tani thërrisni last, dhe pastaj kërkoni përsëri statusin e llogarisë për të cilën kërkuam gramë, atëherë duhet të shohim se numri i sekuencës është rritur me një - kjo do të thotë se ai dërgoi para në llogarinë tonë.

Ka mbetur hapi i fundit - ngarkohet kodi i portofolit tonĂ« (balanca e tij Ă«shtĂ« tashmĂ« e rritur, por pa kodin e kontratĂ«s sĂ« smart, ne nuk mund ta menaxhojmĂ«). KryejmĂ« sendfile new-wallet-query.boc — dhe kjo Ă«shtĂ«, tani keni portofolin tuaj nĂ« rrjetin TON (edhe nĂ«se pĂ«r momentin Ă«shtĂ« vetĂ«m testues).

Krijimi i transaksioneve të jashtme

Për të transferuar para nga balanca e llogarisë së krijuar, ekziston një skedar crypto/block/wallet.fif, i cili gjithashtu duhet të vendoset në dosjen me klientin e grumbulluar.

Sikurse hapat e mëparshëm, duhet të rregulloni shifrën që po transferoni, adresën e marrësit (dest_addr), dhe seqno të portofolit tuaj (ai është 1 pas inicializimit të portofolit dhe rritet me 1 pas çdo transaksioni të jashtëm - mund ta shihni duke kërkuar statusin e llogarisë tuaj). Për teste mund të përdorni, për shembull, portofolin tim - 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.

Kur lançoni (./crypto/fift wallet.fif) skripti do të marrë adresën e portofolit tuaj (nga ku po transferoni) dhe çelësin e tij privat nga skedarët new-wallet.addr dhe new-wallet.pk, dhe mesazhi i marrë do të shkruhet në new-wallet-query.boc.

Si më parë, për të kryer transaksionin direkt, 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ë bilanci dhe seqno i portofolit tonë janë ndryshuar (getaccount).

Kunder të testit TON (Telegram Open Network) dhe gjuha e re Fift për kontratat inteligjente

Këtu e gjithë, tani dimë si të krijojmë kontrata inteligjente në TON dhe të dërgojmë kërkesa për to. Siç e shohim, funksionaliteti aktual është mjaft për të krijuar një portofol më miqësor me një ndërfaqe grafike (sidoqoftë, pritet që ai të bëhet i disponueshëm si pjesë e aplikacionit të mesazheve).

Vetëm përdoruesit e regjistruar mund të marrin pjesë në anketë. Hyni, ju lutemi.

Jeni të interesuar për vazhdimin e artikujve me analizën e TON, TVM, Fift?

  • Po, po pres pĂ«rfundimin e ciklit tĂ« artikujve me njĂ« pĂ«rmbledhje tĂ« pĂ«rgjithshme tĂ« TON

  • Po, mĂ« intereson tĂ« lexoj mĂ« shumĂ« rreth gjuhĂ«s Fift

  • Po, dua tĂ« di mĂ« shumĂ« rreth TON Virtual Machine dhe assemblerit pĂ«r tĂ«

  • Jo, nuk mĂ« intereson asgjĂ« nga kĂ«to

39 përdorues votuan. 12 përdorues abstenuan.

ÇfarĂ« mendoni pĂ«r planet e Telegramit pĂ«r tĂ« nisur TON?

  • Kam shpresat e mĂ«dha pĂ«r kĂ«tĂ« projekt

  • Thjesht po e ndjek me interes zhvillimin e tij

  • Jam i vendosur skeptik, dyshoj pĂ«r suksesin e tij

  • Mendoj se kjo iniciativĂ« Ă«shtĂ« e dĂ«shtuar, e panevojshme pĂ«r masat e gjera

Janë votuar nga 47 përdorues. Abstenuan 12 përdorues.

Burimi: habr.com

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