Testoni klientin TON (Telegram Open Network) dhe gjuhën e re Fift për kontratat inteligjente

Më shumë se një vit më parë, u bë e ditur për planet e të dërguarit Telegram për të lëshuar rrjetin e vet të decentralizuar Telegrafi i Rrjetit të Hapur. Pastaj u bë i disponueshëm një dokument teknik voluminoz, i cili dyshohet se ishte shkruar nga Nikolai Durov dhe përshkruante strukturën e rrjetit të ardhshëm. Për ata që e humbën atë, ju rekomandoj të lexoni ritregimin tim të këtij dokumenti (Pjesa 1, Pjesa 2; pjesa e tretë, mjerisht, ende po mbledh pluhur në skica).

Që atëherë, nuk ka pasur asnjë lajm të rëndësishëm për statusin e zhvillimit të TON deri disa ditë më parë (në një prej kanale jozyrtare) lidhja për në faqe nuk u shfaq https://test.ton.org/download.html, ku ndodhen:
ton-test-liteclient-plot.tar.xz — burimet e një klienti të lehtë për rrjetin e testimit TON;
ton-lite-client-test1.config.json — skedari i konfigurimit për t'u lidhur me rrjetin e testimit;
README — informacion rreth ndërtimit dhe lëshimit të klientit;
SI TË — udhëzime hap pas hapi për krijimin e një kontrate inteligjente duke përdorur një klient;
ton.pdf — dokument i përditësuar (datë 2 mars 2019) me një pasqyrë teknike të rrjetit TON;
tvm.pdf — përshkrimi teknik i TVM-së (TON Virtual Machine, TON virtual machine);
tblkch.pdf — përshkrimi teknik i blockchain TON;
baza e pestë.pdf — përshkrimi i gjuhës së re Fift, e krijuar për krijimin e kontratave inteligjente në TON.

E përsëris, nuk kishte asnjë konfirmim zyrtar të faqes dhe të gjitha këtyre dokumenteve nga Telegram, por vëllimi i këtyre materialeve i bën ato mjaft të besueshme. Nisni klientin e publikuar me rrezikun e vet.

Ndërtimi i një klienti testimi

Së pari, le të përpiqemi të ndërtojmë dhe drejtojmë një klient testues - për fat, README përshkruan në detaje këtë proces të thjeshtë. Unë 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 shpaketoni arkivi burimor. Është e rëndësishme të shkarkoni versionin më të fundit pasi përputhshmëria e prapambetur nuk është e garantuar në këtë fazë.

  2. Sigurohuni që versionet më të fundit të make, cmake (versioni 3.0.2 ose më i lartë), OpenSSL (përfshirë skedarët e kokës C), g++ ose clang janë instaluar në sistem. Nuk më duhej të instaloja asgjë, gjithçka u bashkua menjëherë.

  3. Le të supozojmë se burimet janë zbërthyer në një dosje ~/lite-client. Më vete, krijoni një dosje bosh për projektin e mbledhur (për shembull, ~/liteclient-build), dhe prej saj (cd ~/liteclient-build) thirrni komandat:

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

    Testoni klientin TON (Telegram Open Network) dhe gjuhën e re Fift për kontratat inteligjente

    Për të ndërtuar përkthyesin e gjuhës së pestë për kontratat inteligjente (më shumë rreth tij më poshtë), ne gjithashtu telefonojmë

    cmake --build . --target fift

  4. Shkarkoni aktualin skedari i konfigurimit për t'u lidhur me rrjetin testues dhe për ta vendosur atë në dosjen me klientin e montuar.

  5. Mbaroj, mund të filloni 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 si kjo:

Testoni klientin TON (Telegram Open Network) dhe gjuhën e re Fift për kontratat inteligjente

Siç mund ta shohim, ka pak komanda të disponueshme:
help — shfaqni këtë listë komandash;
quit - dil jashtë;
time — tregoni kohën aktuale në server;
status — tregoni lidhjen dhe statusin e bazës së të dhënave lokale;
last — përditësoni gjendjen e blockchain (shkarkoni bllokun e fundit). Është e rëndësishme të ekzekutoni këtë komandë përpara çdo kërkese për t'u siguruar që e shihni gjendjen aktuale të rrjetit.
sendfile <filename> — ngarkoni një skedar lokal në rrjetin TON. Kështu ndodh ndërveprimi me rrjetin - duke përfshirë, për shembull, krijimin e kontratave të reja inteligjente dhe kërkesat për transferimin e fondeve ndërmjet llogarive;
getaccount <address> — tregoni rrymën (në momentin kur komanda u ekzekutua) last) statusin e llogarisë me adresën e specifikuar;
privkey <filename> — ngarkoni çelësin privat nga një skedar lokal.

Nëse, kur filloni klientin, transferoni një dosje në të duke përdorur opsionin -D, atëherë ai do të shtojë bllokun e fundit të zinxhirit kryesor 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ë mësojmë gjuhën Fift, të përpiqemi të përpilojmë një kontratë inteligjente (për shembull, të krijojmë një portofol provë), ta ngarkojmë atë në rrjet dhe të provojmë të transferojmë fonde midis llogarive.

Gjuha e pestë

Nga dokumenti baza e pestë.pdf mund të zbuloni se ekipi i Telegram ka krijuar një gjuhë të re stek për të krijuar kontrata inteligjente Pesë (me sa duket nga numri i pestë, e ngjashme me Forth, një gjuhë me të cilën Fifth ka shumë të përbashkëta).

Dokumenti është mjaft voluminoz, 87 faqe dhe nuk do ta ritregoj në detaje përmbajtjen e tij në kuadër të këtij artikulli (të paktën sepse nuk e kam mbaruar së lexuari vetë :). Do të përqendrohem në pikat kryesore dhe do të jap disa shembuj kodesh në këtë gjuhë.

Në një nivel bazë, sintaksa e Fift është mjaft e thjeshtë: kodi i tij përbëhet nga fjalë, zakonisht të ndara me hapësira ose ndërprerje rreshtash (rast i veçantë: disa fjalë nuk kërkojnë ndarës pas vetes). Çdo слово është një sekuencë karakteresh e ndjeshme ndaj shkronjave që korrespondon me një të caktuar përcaktim (përafërsisht çfarë duhet të bëjë përkthyesi kur ndeshet me këtë fjalë). Nëse nuk ka përkufizim të një fjale, përkthyesi përpiqet ta analizojë atë si një numër dhe ta vendosë në pirg. Nga rruga, numrat këtu janë - papritmas - numra të plotë 257-bit, dhe nuk ka fare thyesa - më saktë, ato kthehen menjëherë në një palë numrash të plotë, duke formuar numëruesin dhe emëruesin e një fraksioni racional.

Fjalët priren të ndërveprojnë me vlerat në krye të pirgut. Një lloj i veçantë fjalësh - parashtesë — nuk përdor pirgun, por karakteret pasuese nga skedari burimor. Për shembull, kjo është mënyra se si zbatohen literalet e vargjeve - karakteri i citatit (") është një fjalë parashtese që kërkon kuotën tjetër (mbyllëse) dhe e shtyn vargun midis tyre në pirg. Linjat me një linjë sillen në të njëjtën mënyrë (//) dhe me shumë rreshta (/*) komente.

Këtu përfundon pothuajse e gjithë struktura e brendshme e gjuhës. Çdo gjë tjetër (duke përfshirë konstruktet e kontrollit) përkufizohet si fjalë (qoftë të brendshme, si veprimet aritmetike dhe përkufizimi i fjalëve të reja; ose të përcaktuara në "bibliotekën standarde" Fift.fif, e cila është në dosje crypto/fift në burime).

Një shembull i thjeshtë programi në Fift:

{ dup =: x dup * =: y } : setxy
3 setxy x . y . x y + .
7 setxy x . y . x y + .

Rreshti i parë përcakton një fjalë të re setxy (vini re prefiksin {, i cili krijon një bllok përpara atij mbyllës } dhe parashtesën :, e cila në fakt përcakton fjalën). setxy merr një numër nga maja e pirgut, e përcakton (ose e ripërcakton) atë si global konstante x, dhe katrori i këtij numri si konstante y (Duke pasur parasysh se vlerat e konstanteve mund të ripërcaktohen, unë do t'i quaj më mirë variabla, por unë ndjek konventën e emërtimit në gjuhë).

Dy linjat e ardhshme vendosin një numër në pirg dhe telefononi setxy, atëherë shfaqen vlerat e konstantave x, y (fjala përdoret për dalje .), të dyja konstantat vendosen në pirg, përmblidhen dhe rezultati gjithashtu printohet. Si rezultat do të shohim:

3 9 12 ok
7 49 56 ok

(Rreshti "ok" shtypet nga përkthyesi kur përfundon përpunimin e linjës aktuale në modalitetin e hyrjes interaktive)

Epo, një shembull i plotë i kodit:

"Asm.fif" include

-1 constant wc  // create a wallet in workchain -1 (masterchain)

// Create new simple wallet
<{  SETCP0 DUP IFNOTRET INC 32 THROWIF  // return if recv_internal, fail unless recv_external
    512 INT LDSLICEX DUP 32 PLDU   // sign cs cnt
    c4 PUSHCTR CTOS 32 LDU 256 LDU ENDS  // sign cs cnt cnt' pubk
    s1 s2 XCPU            // sign cs cnt pubk cnt' cnt
    EQUAL 33 THROWIFNOT   // ( seqno mismatch? )
    s2 PUSH HASHSU        // sign cs cnt pubk hash
    s0 s4 s4 XC2PU        // pubk cs cnt hash sign pubk
    CHKSIGNU              // pubk cs cnt ?
    34 THROWIFNOT         // signature mismatch
    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
// code
<b 0 32 u, 
   newkeypair swap dup constant wallet_pk 
   "new-wallet.pk" B>file
   B, 
b> // data
// no libraries
<b b{00110} s, rot ref, swap ref, b>  // create StateInit
dup ."StateInit: " <s csr. cr
dup hash dup constant wallet_addr
."new wallet address = " wc . .": " dup x. cr
wc over 7 smca>$ type cr
256 u>B "new-wallet.addr" B>file
<b 0 32 u, b>
dup ."signing message: " <s csr. cr
dup hash wallet_pk ed25519_sign_uint rot
<b b{1000100} s, wc 8 i, wallet_addr 256 u, b{000010} s, swap <s s, b{0} s, swap B, swap <s s, b>
dup ."External message for initialization is " <s csr. cr
2 boc+>B dup Bx. cr
"new-wallet-query.boc" tuck B>file
."(Saved to file " type .")" cr

Ky skedar me pamje të frikshme është për krijimin e një kontrate inteligjente - do të vendoset në një skedar new-wallet-query.boc pas ekzekutimit. Ju lutemi vini re se një gjuhë tjetër asambleje përdoret këtu për Makinën Virtuale TON (nuk do të ndalem në të në detaje), udhëzimet e së cilës do të vendosen në blockchain.

Kështu, asembleri për TVM është shkruar në Fift - burimet e këtij asembleri janë në skedar crypto/fift/Asm.fif dhe janë të lidhura në fillim të pjesës së mësipërme të kodit.

Çfarë mund të them, me sa duket Nikolai Durov thjesht pëlqen të krijojë gjuhë të reja programimi :)

Krijimi i një kontrate të zgjuar dhe ndërveprimi me TON

Pra, le të supozojmë se kemi mbledhur klientin TON dhe përkthyesin Fift siç përshkruhet më sipër dhe jemi njohur me gjuhën. Si të krijoni një kontratë inteligjente tani? Kjo përshkruhet në dosje SI TË, bashkangjitur burimeve.

Llogaritë në TON

Siç e përshkrova në rishikim TON, ky rrjet përmban më shumë se një blockchain - ekziston një i zakonshëm, i ashtuquajturi. "zinxhiri kryesor", si dhe një numër arbitrar i "zinxhirëve të punës" shtesë, të identifikuar nga një numër 32-bit. Masterchain ka një identifikues prej -1, përveç tij, mund të përdoret edhe një zinxhir pune "bazë" me një identifikues 0. Çdo zinxhir pune mund të ketë konfigurimin e vet. Brenda, çdo zinxhir pune është i ndarë në zinxhirë të grimcuar, por ky është një detaj i zbatimit që nuk duhet mbajtur parasysh.

Brenda një zinxhiri pune, ruhen shumë llogari që kanë identifikuesit e tyre account_id. Për zinxhirin kryesor dhe zinxhirin e punës zero, ato janë 256 bit të gjatë. Kështu, identifikuesi i llogarisë shkruhet, për shembull, si kjo:

-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Ky është formati "i papërpunuar": së pari ID-ja e zinxhirit të punës, më pas një dy pika dhe ID-ja e llogarisë në shënimin heksadecimal.

Për më tepër, ekziston një format i shkurtuar - numri i zinxhirit të punës dhe adresa e llogarisë janë të koduara në formë binare, atyre u shtohet një kontroll dhe e gjithë kjo është e koduar në Base64:

Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb

Duke ditur këtë format të regjistrimit, ne mund të kërkojmë gjendjen aktuale të një llogarie përmes një klienti testues duke përdorur komandën

getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Do të marrim diçka të tillë:

[ 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}

Ne shohim strukturën që ruhet në DHT të zinxhirit të punës të specifikuar. Për shembull, në fushë storage.balance është gjendja e llogarisë rrjedhëse, në storage.state.code - kodi i kontratës inteligjente, dhe në storage.state.data - të dhënat e tij aktuale. Ju lutemi vini re se ruajtja e të dhënave TON - Qeliza, qeliza - është e ngjashme me pemën, secila qelizë mund të ketë të dhënat e veta dhe qelizat fëmijë. Kjo tregohet si dhëmbëzim në rreshtat e fundit.

Ndërtimi i një kontrate të zgjuar

Tani le ta krijojmë vetë një strukturë të tillë (quhet BOC - qese me qeliza) duke përdorur gjuhën Fift. Për fat të mirë, nuk duhet të shkruani vetë një kontratë të zgjuar - në dosje crypto/block ekziston një skedar nga arkivi burimor new-wallet.fif, e cila do të na ndihmojë të krijojmë një portofol të ri. Le ta kopjojmë atë në dosjen me klientin e montuar (~/liteclient-build, nëse keni ndjekur udhëzimet e mësipërme). Unë citova përmbajtjen e tij më lart si një shembull i kodit në Fift.

Ekzekutoni këtë skedar si më poshtë:

./crypto/fift -I"<source-directory>/crypto/fift" new-wallet.fif

Këtu <source-directory> duhet të zëvendësohet me shtegun drejt burimeve të papaketuara (simboli "~", për fat të keq, nuk mund të përdoret këtu, nevojitet shtegu i plotë). Në vend që të përdorni një çelës -I ju mund të përcaktoni një variabël mjedisi FIFTPATH dhe vendoseni këtë rrugë në të.

Që kur lançuam Fift me emrin e skedarit new-wallet.fif, do ta ekzekutojë dhe do të dalë. Nëse e hiqni emrin e skedarit, mund të luani me përkthyesin në mënyrë interaktive.

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

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)

Kjo do të thotë se portofoli me ID -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (ose, çfarë është e njëjta, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) u krijua me sukses. Kodi përkatës do të jetë në skedar new-wallet-query.boc, adresa e tij është në new-wallet.addr, dhe çelësi privat është brenda new-wallet.pk (Kini kujdes - ekzekutimi përsëri i skriptit do t'i mbishkruajë këta skedarë).

Sigurisht, rrjeti TON nuk di ende për këtë portofol; ai ruhet vetëm në formën e këtyre skedarëve. Tani duhet të ngarkohet në rrjet. Sidoqoftë, problemi është se për të krijuar një kontratë inteligjente duhet të paguani një komision dhe gjendja e llogarisë tuaj është ende zero.

Në modalitetin e punës, ky problem do të zgjidhet duke blerë gram në shkëmbim (ose duke transferuar nga një portofol tjetër). Epo, në modalitetin aktual të provës, është krijuar një kontratë speciale inteligjente, nga e cila mund të kërkoni deri në 20 gram ashtu si ajo.

Gjenerimi i një kërkese për kontratën inteligjente të dikujt tjetër

Ne bëjmë një kërkesë për një kontratë inteligjente që shpërndan gram majtas dhe djathtas si kjo. Në të njëjtën 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+ 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

Ne gjithashtu do ta ruajmë atë në dosjen me klientin e mbledhur, por do të korrigjojmë rreshtin e pestë - para rreshtit "constant dest_addr". Le ta zëvendësojmë me adresën e portofolit që keni krijuar më parë (e plotë, jo e shkurtuar). Nuk ka nevojë të shkruani "-1:" në fillim, në vend të kësaj vendosni "0x" në fillim.

Ju gjithashtu mund të ndryshoni linjën 6.666 Gram*/ constant amount — kjo është shuma në gram që kërkoni (jo më shumë se 20). Edhe nëse specifikoni një numër të plotë, lini pikën dhjetore.

Më në fund, duhet të korrigjoni vijën 0x00000011 constant seqno. Numri i parë këtu është numri aktual i sekuencës, i cili ruhet në gram që lëshon llogarinë. Nga mund ta marr? Siç u tha më lart, nisni klientin dhe ekzekutoni:

last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Në fund, të dhënat e kontratës inteligjente do të përmbajnë

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

Numri 0000000D (i juaji do të jetë më i madh) është numri i sekuencës që duhet të zëvendësohet në testgiver.fif.

Kjo është e gjitha, ruajeni skedarin dhe ekzekutoni (./crypto/fift testgiver.fif). Dalja do të jetë një skedar wallet-query.boc. Kjo është ajo që formohet сообщение në kontratën inteligjente të dikujt tjetër - një kërkesë "transferoni kaq shumë gramë në atë dhe atë llogari".

Duke përdorur klientin, ne e ngarkojmë atë në rrjet:

> 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

Nëse telefononi tani last, dhe pastaj përsëri të kërkojmë statusin e llogarisë nga e cila kemi kërkuar gram, atëherë duhet të shohim që numri i sekuencës së saj është rritur me një - kjo do të thotë se ajo dërgoi para në llogarinë tonë.

Hapi i fundit mbetet - shkarkoni kodin e portofolit tonë (balanca e tij tashmë është rimbushur, por pa kodin e kontratës inteligjente nuk do të jemi në gjendje ta menaxhojmë atë). Ne kryejmë sendfile new-wallet-query.boc - dhe kaq, ju keni portofolin tuaj në rrjetin TON (edhe nëse është vetëm një provë për momentin).

Krijimi i transaksioneve dalëse

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

Ngjashëm me hapat e mëparshëm, ju duhet të rregulloni shumën që po transferoni, adresën e marrësit (dest_addr) dhe seqno-në e portofolit tuaj (është e barabartë me 1 pas inicializimit të portofolit dhe rritet me 1 pas çdo transaksioni në dalje - mundeni shikojeni duke kërkuar statusin e llogarisë suaj). Për teste, mund të përdorni, për shembull, portofolin tim - 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.

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

Si më parë, për të kryer drejtpërdrejt transaksionin, telefononi sendfile new-wallet-query.boc në klient. Pas kësaj, mos harroni të përditësoni gjendjen e blockchain (last) dhe kontrolloni nëse bilanci dhe seqno e portofolit tonë kanë ndryshuar (getaccount <account_id>).

Testoni klientin TON (Telegram Open Network) dhe gjuhën e re Fift për kontratat inteligjente

Kjo është e gjitha, tani ne mund të krijojmë kontrata inteligjente në TON dhe t'u dërgojmë kërkesa atyre. Siç mund ta shihni, funksionaliteti aktual tashmë është i mjaftueshëm për të bërë, për shembull, një portofol më miqësor me një ndërfaqe grafike (megjithatë, pritet që ai tashmë të bëhet i disponueshëm si pjesë e mesazherit).

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

Jeni të interesuar të vazhdoni artikujt me analiza të TON, TVM, Fift?

  • Po, jam duke pritur për përfundimin e serisë së artikujve me një pasqyrë të përgjithshme të TON

  • Po, është interesante të lexosh më shumë rreth gjuhës së Pesës

  • Po, dua të mësoj më shumë rreth TON Virtual Machine dhe montuesit për të

  • Jo, asnjë nga këto nuk është interesante

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

Çfarë mendoni për planet e Telegram për të lançuar TON?

  • Unë kam shumë shpresa për këtë projekt

  • Unë thjesht po e ndjek me interes zhvillimin e saj.

  • Unë jam skeptik dhe dyshoj në suksesin e tij.

  • Unë jam i prirur ta konsideroj këtë nismë të dështuar dhe të panevojshme për masat e gjera

47 përdorues votuan. 12 përdorues abstenuan.

Burimi: www.habr.com

Shto një koment