ස්මාර්ට් කොන්ත්‍රාත්තු සඳහා සේවාලාභියා TON (ටෙලිග්‍රාම් විවෘත ජාලය) සහ නව ෆිෆ්ට් භාෂාව පරීක්ෂා කරන්න

මීට වසරකට පෙර, ටෙලිග්‍රාම් මැසෙන්ජර් තමන්ගේම විමධ්‍යගත ජාලයක් නිකුත් කිරීමට සැලසුම් කර ඇති බව ප්‍රසිද්ධ විය. ජාල විදුලි පණිවුඩය විවෘත කරන්න. එවිට විශාල තාක්ෂණික ලේඛනයක් ලබා ගත හැකි වූ අතර එය නිකොලායි ඩුරොව් විසින් ලියා ඇති අතර අනාගත ජාලයේ ව්‍යුහය විස්තර කරන ලදී. එය මඟ හැරුණු අය සඳහා, මෙම ලේඛනයේ මගේ නැවත කියවීම කියවන ලෙස මම නිර්දේශ කරමි (1 කොටස, 2 කොටස; තෙවන කොටස, අහෝ, තවමත් කෙටුම්පත් වල දූවිලි එකතු කරයි).

එතැන් සිට, දින කිහිපයකට පෙර TON සංවර්ධනයේ තත්ත්වය පිළිබඳ සැලකිය යුතු ප්‍රවෘත්තියක් නොමැත (එකක් තුළ නිල නොවන නාලිකා) පිටුවට සබැඳිය නොපෙන්වයි https://test.ton.org/download.html, පිහිටා ඇති ස්ථාන:
ton-test-liteclient-full.tar.xz - TON පරීක්ෂණ ජාලය සඳහා සැහැල්ලු සේවාලාභියෙකුගේ මූලාශ්ර;
ton-lite-client-test1.config.json - පරීක්ෂණ ජාලයට සම්බන්ධ කිරීම සඳහා වින්යාස ගොනුව;
README - සේවාදායකයා ගොඩනැගීම සහ දියත් කිරීම පිළිබඳ තොරතුරු;
කොහොමද - සේවාදායකයෙකු භාවිතා කරමින් ස්මාර්ට් කොන්ත්රාත්තුවක් නිර්මාණය කිරීම සඳහා පියවරෙන් පියවර උපදෙස්;
ton.pdf - TON ජාලයේ තාක්ෂණික දළ විශ්ලේෂණයක් සමඟ යාවත්කාලීන කරන ලද ලේඛනය (2 මාර්තු 2019 දිනැති);
tvm.pdf - TVM හි තාක්ෂණික විස්තරය (TON Virtual Machine, TON අථත්ය යන්ත්රය);
tblkch.pdf - TON blockchain හි තාක්ෂණික විස්තරය;
fifthbase.pdf - නව ෆිෆ්ට් භාෂාවේ විස්තරය, TON හි ස්මාර්ට් ගිවිසුම් නිර්මාණය කිරීම සඳහා නිර්මාණය කර ඇත.

මම නැවත නැවතත්, ටෙලිග්‍රාම් වෙතින් පිටුව සහ මෙම සියලුම ලේඛන පිළිබඳ නිල තහවුරු කිරීමක් නොතිබුණි, නමුත් මෙම ද්‍රව්‍යවල පරිමාව ඒවා තරමක් පිළිගත හැකි ය. ප්‍රකාශිත සේවාලාභියා දියත් කරන්න තමන්ගේම අවදානමකින්.

පරීක්ෂණ සේවාලාභියෙකු ගොඩනැගීම

පළමුව, අපි පරීක්ෂණ සේවාලාභියෙකු ගොඩනඟා ධාවනය කිරීමට උත්සාහ කරමු - වාසනාවකට මෙන්, README මෙම සරල ක්රියාවලිය විස්තරාත්මකව විස්තර කරයි. මම උදාහරණයක් ලෙස macOS 10.14.5 භාවිතා කරමින් මෙය කරන්නෙමි; වෙනත් පද්ධති මත ගොඩනැගීමේ සාර්ථකත්වය සඳහා මට සහතික විය නොහැක.

  1. බාගත කර ඉවත් කරන්න මූලාශ්ර ලේඛනාගාරය. මෙම අදියරේදී පසුගාමී අනුකූලතාව සහතික නොවන බැවින් නවතම අනුවාදය බාගත කිරීම වැදගත් වේ.

  2. Make, cmake (අනුවාදය 3.0.2 හෝ ඊට වැඩි), OpenSSL (C ශීර්ෂ ගොනු ඇතුළුව), g++ හෝ clang හි නවතම අනුවාදයන් පද්ධතිය මත ස්ථාපනය කර ඇති බවට වග බලා ගන්න. මට කිසිවක් ස්ථාපනය කිරීමට සිදු නොවීය, සියල්ල වහාම එකට එකතු විය.

  3. අපි හිතමු මූලාශ්‍ර ෆෝල්ඩරයකට අසුරා ඇති බව ~/lite-client. එයින් වෙන්ව, එකලස් කරන ලද ව්‍යාපෘතිය සඳහා හිස් ෆෝල්ඩරයක් සාදන්න (උදාහරණයක් ලෙස, ~/liteclient-build), සහ එයින් (cd ~/liteclient-build) විධාන අමතන්න:

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

    ස්මාර්ට් කොන්ත්‍රාත්තු සඳහා සේවාලාභියා TON (ටෙලිග්‍රාම් විවෘත ජාලය) සහ නව ෆිෆ්ට් භාෂාව පරීක්ෂා කරන්න

    ස්මාර්ට් කොන්ත්‍රාත්තු සඳහා ෆිෆ්ට් භාෂා පරිවර්තකය තැනීමට (ඒ ගැන වැඩි විස්තර පහතින්), අපි ද අමතන්නෙමු

    cmake --build . --target fift

  4. දැනට තියෙන එක බාගන්න වින්‍යාස ගොනුව පරීක්ෂණ ජාලයට සම්බන්ධ වීමට සහ එකලස් කරන ලද සේවාදායකයා සමඟ ෆෝල්ඩරය තුළට දමන්න.

  5. සිදු විය, ඔබට සේවාදායකයා ආරම්භ කළ හැකිය:

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

සෑම දෙයක්ම නිවැරදිව සිදු කර ඇත්නම්, ඔබ මෙවැනි දෙයක් දැකිය යුතුය:

ස්මාර්ට් කොන්ත්‍රාත්තු සඳහා සේවාලාභියා TON (ටෙලිග්‍රාම් විවෘත ජාලය) සහ නව ෆිෆ්ට් භාෂාව පරීක්ෂා කරන්න

අපට පෙනෙන පරිදි, ලබා ගත හැකි විධාන කිහිපයක් තිබේ:
help - මෙම විධාන ලැයිස්තුව පෙන්වන්න;
quit - නැති වෙනවා;
time - සේවාදායකයේ වත්මන් කාලය පෙන්වන්න;
status - සම්බන්ධතාවය සහ දේශීය දත්ත සමුදා තත්ත්වය පෙන්වන්න;
last — blockchain තත්ත්වය යාවත්කාලීන කරන්න (අවසන් කොටස බාගන්න). ජාලයේ වත්මන් තත්ත්වය ඔබ දකින බවට සහතික වීමට ඕනෑම ඉල්ලීමකට පෙර මෙම විධානය ක්‍රියාත්මක කිරීම වැදගත් වේ.
sendfile <filename> - දේශීය ගොනුවක් TON ජාලයට උඩුගත කරන්න. ජාලය සමඟ අන්තර්ක්‍රියා සිදු වන්නේ මෙයයි - උදාහරණයක් ලෙස, නව ස්මාර්ට් කොන්ත්‍රාත්තු නිර්මාණය කිරීම සහ ගිණුම් අතර අරමුදල් මාරු කිරීම සඳහා ඉල්ලීම් ඇතුළුව;
getaccount <address> - ධාරාව පෙන්වන්න (විධානය ක්‍රියාත්මක කළ අවස්ථාවේ) last) නිශ්චිත ලිපිනය සහිත ගිණුමේ තත්ත්වය;
privkey <filename> — දේශීය ගොනුවකින් පුද්ගලික යතුර පූරණය කරන්න.

සේවාලාභියා ආරම්භ කරන විට, ඔබ විකල්පය භාවිතා කර එයට ෆෝල්ඩරයක් මාරු කරන්නේ නම් -D, ඉන්පසු ඔහු මාස්ටර්චේන්හි අවසාන කොටස එයට එක් කරයි:

./test-lite-client -C ton-lite-client-test1.config.json -D ~/ton-db-dir

දැන් අපට වඩාත් රසවත් දේවල් වෙත යා හැකිය - ෆිෆ්ට් භාෂාව ඉගෙන ගන්න, ස්මාර්ට් කොන්ත්රාත්තුවක් සම්පාදනය කිරීමට උත්සාහ කරන්න (උදාහරණයක් ලෙස, පරීක්ෂණ මුදල් පසුම්බියක් සාදන්න), එය ජාලයට උඩුගත කර ගිණුම් අතර අරමුදල් මාරු කිරීමට උත්සාහ කරන්න.

භාෂාව ෆිෆ්ට්

ලේඛනයෙන් fifthbase.pdf ස්මාර්ට් කොන්ත්‍රාත්තු නිර්මාණය කිරීම සඳහා ටෙලිග්‍රාම් කණ්ඩායම නව තොග භාෂාවක් නිර්මාණය කර ඇති බව ඔබට සොයා ගත හැකිය පස් (පෙනෙන විදිහට ඉලක්කම් වලින් පස්වන, Forth ට සමාන, Fifth සමග බොහෝ පොදු ඇති භාෂාවකි).

ලේඛනය තරමක් විශාල, පිටු 87 කින් යුක්ත වන අතර, මම මෙම ලිපියේ රාමුව තුළ එහි අන්තර්ගතය විස්තරාත්මකව නැවත නොකියමි (අවම වශයෙන් මම එය කියවා අවසන් කර නොමැති නිසා :). මම ප්‍රධාන කරුණු කෙරෙහි අවධානය යොමු කර මෙම භාෂාවෙන් කේත උදාහරණ කිහිපයක් දෙන්නෙමි.

මූලික මට්ටමින්, ෆිෆ්ට්ගේ වාක්‍ය ඛණ්ඩය තරමක් සරල ය: එහි කේතය සමන්විත වේ වචන වලින්, සාමාන්‍යයෙන් අවකාශ හෝ රේඛා බිඳීම් මගින් වෙන් කරනු ලැබේ (විශේෂ අවස්ථාව: සමහර වචන වලට පසුව බෙදුම්කරුවෙකු අවශ්‍ය නොවේ). ඕනෑම වචනය යනු යම් නිශ්චිතයකට අනුරූප වන අවස්ථා සංවේදී අක්ෂර අනුපිළිවෙලකි අර්ථ දැක්වීම (දළ වශයෙන්, මෙම වචනය හමු වූ විට පරිවර්තකයා කළ යුතු දේ). වචනයක අර්ථ දැක්වීමක් නොමැති නම්, පරිවර්තකයා එය අංකයක් ලෙස විග්‍රහ කර එය අට්ටිය මත තැබීමට උත්සාහ කරයි. මාර්ගය වන විට, මෙහි ඇති සංඛ්‍යා - හදිසියේම - 257-බිට් පූර්ණ සංඛ්‍යා වන අතර, කිසිසේත්ම භාග නොමැත - වඩාත් නිවැරදිව, ඒවා වහාම පූර්ණ සංඛ්‍යා යුගලයක් බවට පත්ව, තාර්කික භාගයක සංඛ්‍යාව සහ හරය සාදයි.

වචන තොගයේ මුදුනේ ඇති අගයන් සමඟ අන්තර් ක්‍රියා කිරීමට නැඹුරු වේ. වෙනම වචන වර්ගයක් - උපසර්ගය - අට්ටිය භාවිතා නොකරයි, නමුත් මූලාශ්‍ර ගොනුවෙන් පසුව ඇති අක්ෂර. උදාහරණයක් ලෙස, තන්තු වචන ක්‍රියාවට නංවන ආකාරය මෙයයි - උද්ධෘත අක්ෂරය (") යනු ඊළඟ (වසා දැමීමේ) උද්ධෘතය සොයන උපසර්ග වචනයක් වන අතර, ඒවා අතර ඇති තන්තුව තොගය මතට තල්ලු කරයි. එක පෙලට හැසිරෙන්නේ එකම ආකාරයටයි (//) සහ බහු රේඛා (/*) අදහස්.

භාෂාවේ සමස්ත අභ්‍යන්තර ව්‍යුහයම පාහේ අවසන් වන්නේ මෙහිදීය. අනෙක් සියල්ල (පාලන ඉදිකිරීම් ඇතුළුව) වචන ලෙස අර්ථ දක්වා ඇත (එක්කෝ අභ්‍යන්තර, අංක ගණිත මෙහෙයුම් සහ නව වචන අර්ථ දැක්වීම; හෝ "සම්මත පුස්තකාලය" තුළ අර්ථ දක්වා ඇත. Fift.fif, ෆෝල්ඩරයේ ඇති crypto/fift මූලාශ්රවල).

Fif හි සරල උදාහරණ වැඩසටහනක්:

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

පළමු පේළිය නව වචනයක් අර්ථ දක්වයි setxy (උපසර්ගය සටහන් කරන්න {, එය වැසීමට පෙර බ්ලොක් එකක් නිර්මාණය කරයි } සහ උපසර්ගය :, එය ඇත්ත වශයෙන්ම වචනය අර්ථ දක්වයි). setxy තොගයේ ඉහලින් අංකයක් ගනී, එය ගෝලීය ලෙස නිර්වචනය කරයි (හෝ නැවත අර්ථ දක්වයි). නියත x, සහ මෙම සංඛ්‍යාවේ වර්ගය නියතයක් ලෙස y (නියතවල අගයන් නැවත අර්ථ දැක්විය හැකි බැවින්, මම ඒවා විචල්‍ය ලෙස හඳුන්වමි, නමුත් මම භාෂාවේ නම් කිරීමේ සම්මුතිය අනුගමනය කරමි).

ඊළඟ පේළි දෙක ස්ටැක් එකට අංකයක් දමා අමතන්න setxy, එවිට නියත අගයන් පෙන්වනු ලැබේ x, y (වචනය ප්‍රතිදානය සඳහා භාවිතා වේ .), නියතයන් දෙකම තොගය මත තබා, සාරාංශ කර, ප්රතිඵලය ද මුද්රණය කර ඇත. ප්රතිඵලයක් වශයෙන් අපි දකිනු ඇත:

3 9 12 ok
7 49 56 ok

(අන්තර්ක්‍රියාකාරී ආදාන මාදිලියේ වත්මන් රේඛාව සැකසීම අවසන් වූ විට "ok" රේඛාව පරිවර්තකයා විසින් මුද්‍රණය කරනු ලැබේ)

හොඳයි, සම්පූර්ණ කේත උදාහරණයක්:

"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

මෙම භයානක පෙනුමැති ගොනුව ස්මාර්ට් කොන්ත්‍රාත්තුවක් නිර්මාණය කිරීම සඳහා වේ - එය ගොනුවක තැන්පත් කරනු ලැබේ new-wallet-query.boc ක්රියාත්මක කිරීමෙන් පසුව. TON අතථ්‍ය යන්ත්‍රය සඳහා වෙනත් එකලස් කිරීමේ භාෂාවක් මෙහි භාවිතා වන බව කරුණාවෙන් සලකන්න (මම එය විස්තරාත්මකව වාසය නොකරමි), එහි උපදෙස් බ්ලොක්චේන් මත තබනු ඇත.

මේ අනුව, TVM සඳහා එකලස් කරන්නා ෆිෆ්ට් වලින් ලියා ඇත - මෙම එකලස් කිරීමේ මූලාශ්‍ර ගොනුවේ ඇත crypto/fift/Asm.fif සහ ඉහත කේතයේ ආරම්භයේදී සම්බන්ධ කර ඇත.

මට කුමක් කිව හැකිද, පෙනෙන විදිහට නිකොලායි ඩුරොව් නව ක්‍රමලේඛන භාෂා නිර්මාණය කිරීමට ප්‍රිය කරයි :)

ස්මාර්ට් කොන්ත්රාත්තුවක් නිර්මාණය කිරීම සහ TON සමඟ අන්තර් ක්රියා කිරීම

එබැවින්, අපි ඉහත විස්තර කර ඇති පරිදි TON සේවාලාභියා සහ ෆිෆ්ට් පරිවර්තකය එකලස් කර භාෂාව සමඟ හුරුපුරුදු වී ඇතැයි සිතමු. දැන් ස්මාර්ට් කොන්ත්රාත්තුවක් සාදා ගන්නේ කෙසේද? මෙය ගොනුවේ විස්තර කර ඇත කොහොමද, මූලාශ්රවලට අමුණා ඇත.

TON හි ගිණුම්

මම විස්තර කළ පරිදි TON සමාලෝචනය, මෙම ජාලයේ බ්ලොක්චේන් එකකට වඩා අඩංගු වේ - එක් පොදු එකක් ඇත, ඊනියා. "ප්‍රධාන දාමය", මෙන්ම 32-බිට් අංකයකින් හඳුනාගෙන ඇති අතිරේක "වැඩ දාම" අත්තනෝමතික සංඛ්‍යාවක්. ප්‍රධාන දාමයට -1 හැඳුනුම්කාරකයක් ඇත; ඊට අමතරව, 0 හඳුනාගැනීමක් සහිත “පාදක” වැඩ දාමයක් ද භාවිතා කළ හැකිය. සෑම වැඩ දාමයකටම තමන්ගේම වින්‍යාසයක් තිබිය හැකිය. අභ්‍යන්තරව, සෑම වැඩ දාමයක්ම shardchains වලට බෙදී ඇත, නමුත් මෙය ක්‍රියාත්මක කිරීමේ විස්තරයක් වන අතර එය මතක තබා ගත යුතු නොවේ.

එක් වැඩ දාමය තුළ, බොහෝ ගිණුම් ගබඩා කර ඇති අතර ඒවායේම ගිණුම්_id හඳුනාගැනීම් ඇත. ප්‍රධාන දාමය සහ ශුන්‍ය වැඩ දාමය සඳහා, ඒවා බිටු 256ක් දිගයි. මේ අනුව, ගිණුම් හඳුනාගැනීම ලියා ඇත, උදාහරණයක් ලෙස, මේ වගේ:

-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

මෙය “අමු” ආකෘතියයි: පළමුව වැඩ දාම හැඳුනුම්පත, පසුව මහා බඩවැලක් සහ ෂඩාස්‍ර අංකනයේ ගිණුම් හැඳුනුම්පත.

ඊට අමතරව, කෙටි කළ ආකෘතියක් ඇත - වැඩ දාම අංකය සහ ගිණුම් ලිපිනය ද්විමය ආකාරයෙන් කේතනය කර ඇත, ඒවාට චෙක්සම් එකතු කරනු ලැබේ, සහ මේ සියල්ල Base64 හි කේතනය කර ඇත:

Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb

මෙම වාර්තා ආකෘතිය දැන ගැනීමෙන්, අපට විධානය භාවිතා කරමින් පරීක්ෂණ සේවාලාභියෙකු හරහා ගිණුමක වත්මන් තත්ත්වය ඉල්ලා සිටිය හැක

getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

අපි මේ වගේ දෙයක් ලබා ගනිමු:

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

නිශ්චිත වැඩ දාමයේ DHT හි ගබඩා කර ඇති ව්යුහය අපි දකිමු. උදාහරණයක් ලෙස, ක්ෂේත්රයේ storage.balance යනු ජංගම ගිණුමේ ශේෂය, in storage.state.code - ස්මාර්ට් කොන්ත්රාත් කේතය, සහ storage.state.data - එහි වත්මන් දත්ත. TON දත්ත ගබඩාව - සෛලය, සෛල - ගසක් වැනි බව කරුණාවෙන් සලකන්න, සෑම සෛලයකටම තමන්ගේම දත්ත සහ ළමා සෛල දෙකම තිබිය හැක. මෙය අවසාන පේළි වල indentation ලෙස දැක්වේ.

බුද්ධිමත් ගිවිසුමක් ගොඩනැගීම

දැන් අපි එවැනි ව්යුහයක් නිර්මාණය කරමු (එය BOC ලෙස හැඳින්වේ - සෛල බෑගය) Fif භාෂාව භාවිතා කිරීම. වාසනාවකට මෙන්, ඔබ විසින්ම ස්මාර්ට් කොන්ත්රාත්තුවක් ලිවිය යුතු නැත - ෆෝල්ඩරයේ crypto/block මූලාශ්‍ර ලේඛනාගාරයෙන් ගොනුවක් තිබේ new-wallet.fif, නව මුදල් පසුම්බියක් සෑදීමට අපට උපකාර වනු ඇත. අපි එය එකලස් කරන ලද සේවාදායකයා සමඟ ෆෝල්ඩරයට පිටපත් කරමු (~/liteclient-build, ඔබ ඉහත උපදෙස් අනුගමනය කළේ නම්). මම එහි අන්තර්ගතය ඉහත සඳහන් කළේ ෆිෆ්ට් හි කේතය සඳහා උදාහරණයක් ලෙස ය.

මෙම ගොනුව පහත පරිදි ක්‍රියාත්මක කරන්න:

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

එය <source-directory> ඇසුරුම් නොකළ ප්‍රභවයන් වෙත යන මාර්ගය සමඟ ප්‍රතිස්ථාපනය කළ යුතුය (“~” සංකේතය, අවාසනාවකට මෙන්, මෙහි භාවිතා කළ නොහැක, සම්පූර්ණ මාර්ගය අවශ්‍ය වේ). යතුරක් භාවිතා කරනවා වෙනුවට -I ඔබට පරිසර විචල්‍යයක් අර්ථ දැක්විය හැක FIFTPATH මෙම මාර්ගය එයට දමන්න.

අපි ගොනු නාමය සමඟ ෆිෆ්ට් දියත් කළ දා සිට new-wallet.fif, එය එය ක්රියාත්මක කර පිටව යනු ඇත. ඔබ ගොනු නාමය මඟ හැරියහොත්, ඔබට පරිවර්තකයා සමඟ අන්තර්ක්‍රියාකාරීව සෙල්ලම් කළ හැක.

ක්‍රියාත්මක කිරීමෙන් පසු, කොන්සෝලය තුළ මෙවැනි දෙයක් පෙන්විය යුතුය:

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)

මෙයින් අදහස් කරන්නේ හැඳුනුම්පත සහිත මුදල් පසුම්බියයි -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (නැතහොත්, සමාන වන්නේ කුමක්ද, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) සාර්ථකව නිර්මාණය කරන ලදී. අදාළ කේතය ගොනුවේ ඇත new-wallet-query.boc, ඔහුගේ ලිපිනය ඇත new-wallet.addr, සහ පුද්ගලික යතුර ඇත new-wallet.pk (ප්‍රවේශම් වන්න - ස්ක්‍රිප්ට් එක නැවත ධාවනය කිරීමෙන් මෙම ගොනු උඩින් ලියවේ).

ඇත්ත වශයෙන්ම, TON ජාලය මෙම මුදල් පසුම්බිය ගැන තවමත් දන්නේ නැත; එය ගබඩා කර ඇත්තේ මෙම ගොනු ආකාරයෙන් පමණි. දැන් එය ජාලයට උඩුගත කළ යුතුය. කෙසේ වෙතත්, ගැටළුව වන්නේ ස්මාර්ට් කොන්ත්රාත්තුවක් නිර්මාණය කිරීම සඳහා ඔබට කොමිස් මුදලක් ගෙවීමට අවශ්ය වන අතර, ඔබගේ ගිණුමේ ශේෂය තවමත් ශුන්ය වේ.

වැඩ කිරීමේ මාදිලියේදී, හුවමාරුව මත ග්රෑම් මිලදී ගැනීමෙන් (හෝ වෙනත් මුදල් පසුම්බියකින් මාරු කිරීම) මෙම ගැටළුව විසඳනු ඇත. හොඳයි, දැනට පවතින පරීක්ෂණ මාදිලියේදී, විශේෂ ස්මාර්ට් කොන්ත්‍රාත්තුවක් නිර්මාණය කර ඇති අතර, එයින් ඔබට ග්‍රෑම් 20 ක් දක්වා ඉල්ලුම් කළ හැකිය.

වෙනත් කෙනෙකුගේ ස්මාර්ට් කොන්ත්‍රාත්තුවක් සඳහා ඉල්ලීමක් උත්පාදනය කිරීම

අපි මේ වගේ වමට සහ දකුණට ග්‍රෑම් බෙදන ස්මාර්ට් කොන්ත්‍රාත්තුවක් සඳහා ඉල්ලීමක් කරමු. එකම ෆෝල්ඩරය තුළ crypto/block ගොනුව සොයා ගන්න 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

අපි එය එකලස් කරන ලද සේවාදායකයා සමඟ ෆෝල්ඩරයේ සුරකිමු, නමුත් අපි පස්වන පේළිය නිවැරදි කරන්නෙමු - පේළියට පෙර "constant dest_addr". ඔබ පෙර නිර්මාණය කළ පසුම්බියේ ලිපිනය සමඟ එය ප්‍රතිස්ථාපනය කරමු (සම්පූර්ණ, කෙටි නොවේ). ආරම්භයේ දී "-1:" ලිවීමට අවශ්ය නැත, ඒ වෙනුවට "0x" මුලට දමන්න.

ඔබට රේඛාව වෙනස් කිරීමටද හැකිය 6.666 Gram*/ constant amount - මෙය ඔබ ඉල්ලන ග්‍රෑම් ප්‍රමාණයයි (20 ට වඩා වැඩි නොවේ). ඔබ සම්පූර්ණ සංඛ්‍යාවක් සඳහන් කළත්, දශම ලක්ෂය තබන්න.

අවසාන වශයෙන්, ඔබ රේඛාව නිවැරදි කළ යුතුය 0x00000011 constant seqno. මෙහි පළමු අංකය වත්මන් අනුක්‍රමික අංකය වන අතර එය ග්‍රෑම් නිකුත් කරන ගිණුමේ ගබඩා කර ඇත. මට එය ලබාගත හැක්කේ කොහෙන්ද? ඉහත සඳහන් කළ පරිදි, සේවාදායකයා ආරම්භ කර ධාවනය කරන්න:

last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

අවසානයේ දී, ස්මාර්ට් කොන්ත්රාත් දත්ත අඩංගු වනු ඇත

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

0000000D අංකය (ඔබේ එක විශාල වනු ඇත) යනු ආදේශ කළ යුතු අනුක්‍රමික අංකයයි testgiver.fif.

එච්චරයි, ගොනුව සුරකින්න සහ ධාවනය කරන්න (./crypto/fift testgiver.fif) ප්රතිදානය ගොනුවක් වනු ඇත wallet-query.boc. මේක තමයි හැදෙන්නේ පණිවිඩය වෙනත් කෙනෙකුගේ ස්මාර්ට් කොන්ත්‍රාත්තුවට - ඉල්ලීමක් "එවැනි ගිණුමකට ග්‍රෑම් ගණනක් මාරු කරන්න."

සේවාදායකයා භාවිතා කරමින්, අපි එය ජාලයට උඩුගත කරමු:

> 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

ඔබ දැන් අමතන්නේ නම් last, ඉන්පසු නැවතත් අපි ග්‍රෑම් ඉල්ලූ ගිණුමේ තත්ත්වය ඉල්ලා සිටින්න, එවිට එහි අනුක්‍රමික අංකය එකකින් වැඩි වී ඇති බව අපට පෙනෙනු ඇත - මෙයින් අදහස් කරන්නේ එය අපගේ ගිණුමට මුදල් එවූ බවයි.

අවසාන පියවර ඉතිරිව ඇත - අපගේ මුදල් පසුම්බියේ කේතය බාගන්න (එහි ශේෂය දැනටමත් නැවත පුරවා ඇත, නමුත් ස්මාර්ට් කොන්ත්රාත් කේතය නොමැතිව අපට එය කළමනාකරණය කිරීමට නොහැකි වනු ඇත). අපි ඉටු කරනවා sendfile new-wallet-query.boc - එපමණයි, ඔබට TON ජාලය තුළ ඔබේම මුදල් පසුම්බියක් තිබේ (එය දැනට පරීක්ෂණයක් පමණක් වුවද).

පිටතට යන ගනුදෙනු නිර්මාණය කිරීම

සාදන ලද ගිණුමේ ශේෂයෙන් මුදල් මාරු කිරීම සඳහා, ගොනුවක් තිබේ crypto/block/wallet.fif, එකලස් කරන ලද සේවාදායකයා සමඟ ෆෝල්ඩරයේ ද තැබිය යුතුය.

පෙර පියවරවලට සමානව, ඔබ මාරු කරන මුදල, ලබන්නාගේ ලිපිනය (dest_addr) සහ ඔබේ මුදල් පසුම්බියේ seqno (එය මුදල් පසුම්බිය ආරම්භ කිරීමෙන් පසු 1 ට සමාන වන අතර එක් එක් පිටතට යන ගනුදෙනුවෙන් පසු 1 කින් වැඩි වේ - ඔබට කළ හැකිය. ඔබගේ ගිණුමේ තත්ත්වය ඉල්ලා එය බලන්න) . පරීක්ෂණ සඳහා, ඔබට භාවිතා කළ හැකිය, උදාහරණයක් ලෙස, මගේ මුදල් පසුම්බිය - 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.

ආරම්භයේදී (./crypto/fift wallet.fif) ස්ක්‍රිප්ට් ඔබගේ මුදල් පසුම්බියේ ලිපිනය (ඔබ මාරු කරන ස්ථානයෙන්) සහ එහි පුද්ගලික යතුර ගොනු වලින් ලබා ගනී new-wallet.addr и new-wallet.pk, සහ ලැබුණු පණිවිඩය ලියා ඇත new-wallet-query.boc.

පෙර පරිදිම ගණුදෙනුව කෙලින්ම සිදු කිරීමට අමතන්න sendfile new-wallet-query.boc සේවාදායකයා තුළ. මෙයින් පසු, blockchain තත්ත්වය යාවත්කාලීන කිරීමට අමතක නොකරන්න (last) සහ අපගේ මුදල් පසුම්බියේ ශේෂය සහ සීක්නෝ වෙනස් වී ඇත්දැයි පරීක්ෂා කරන්න (getaccount <account_id>).

ස්මාර්ට් කොන්ත්‍රාත්තු සඳහා සේවාලාභියා TON (ටෙලිග්‍රාම් විවෘත ජාලය) සහ නව ෆිෆ්ට් භාෂාව පරීක්ෂා කරන්න

එපමණයි, දැන් අපට TON හි ස්මාර්ට් කොන්ත්‍රාත්තු සාදා ඔවුන්ට ඉල්ලීම් යැවිය හැකිය. ඔබට පෙනෙන පරිදි, වත්මන් ක්රියාකාරිත්වය දැනටමත් ප්රමාණවත් වේ, උදාහරණයක් ලෙස, චිත්රක අතුරුමුහුණතක් සමඟ වඩාත් මිත්රශීලී මුදල් පසුම්බියක් සෑදීමට (කෙසේ වෙතත්, එය දැනටමත් පණිවිඩකරුගේ කොටසක් ලෙස ලබා ගත හැකි වනු ඇතැයි අපේක්ෂා කෙරේ).

සමීක්ෂණයට සහභාගී විය හැක්කේ ලියාපදිංචි පරිශීලකයින්ට පමණි. පුරන්නකරුණාකර.

TON, TVM, Fif පිළිබඳ විශ්ලේෂණ සමඟ ලිපි දිගටම කරගෙන යාමට ඔබ කැමතිද?

  • ඔව්, TON හි සාමාන්‍ය දළ විශ්ලේෂණයක් සහිත ලිපි මාලාව අවසන් වන තෙක් මම බලා සිටිමි

  • ඔව්, ෆිෆ්ට් භාෂාව ගැන වැඩිදුර කියවීම සිත්ගන්නා කරුණකි

  • ඔව්, මට TON Virtual Machine සහ ඒ සඳහා assembler ගැන තව දැන ගැනීමට අවශ්‍යයි

  • නැත, මේ කිසිවක් සිත්ගන්නා සුළු නොවේ

පරිශීලකයින් 39 දෙනෙක් ඡන්දය දුන්හ. පරිශීලකයින් 12 දෙනෙක් ඡන්දය දීමෙන් වැළකී සිටියහ.

TON දියත් කිරීමට Telegram හි සැලසුම් ගැන ඔබ සිතන්නේ කුමක්ද?

  • මේ ව්‍යාපෘතිය ගැන මට ලොකු බලාපොරොත්තුවක් තියෙනවා

  • මම එහි සංවර්ධනය උනන්දුවෙන් අනුගමනය කරමි.

  • මම එහි සාර්ථකත්වය ගැන සැකයෙන් සහ සැකයෙන් සිටිමි.

  • මෙම මුලපිරීම අසාර්ථක සහ පුළුල් ජනතාවට අනවශ්‍ය දෙයක් ලෙස සැලකීමට මම නැඹුරු වෙමි

පරිශීලකයින් 47 දෙනෙක් ඡන්දය දුන්හ. පරිශීලකයින් 12 දෙනෙක් ඡන්දය දීමෙන් වැළකී සිටියහ.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න