வாடிக்கையாளர் டன் (டெலிகிராம் ஓப்பன் நெட்வொர்க்) மற்றும் ஸ்மார்ட் ஒப்பந்தங்களுக்கான புதிய ஃபிஃப்ட் மொழியை சோதிக்கவும்

ஒரு வருடத்திற்கு முன்பு, டெலிகிராம் மெசஞ்சர் அதன் சொந்த பரவலாக்கப்பட்ட நெட்வொர்க்கை வெளியிடுவதற்கான திட்டங்களைப் பற்றி அறியப்பட்டது. நெட்வொர்க் தந்தி திறக்க. பின்னர் ஒரு பெரிய தொழில்நுட்ப ஆவணம் கிடைத்தது, இது நிகோலாய் துரோவ் எழுதியதாகக் கூறப்படுகிறது மற்றும் எதிர்கால நெட்வொர்க்கின் கட்டமைப்பை விவரித்தது. தவறவிட்டவர்கள், இந்த ஆவணத்தின் எனது மறுபரிசீலனையைப் படிக்குமாறு பரிந்துரைக்கிறேன் (1 பகுதியாக, 2 பகுதியாக; மூன்றாவது பகுதி, ஐயோ, இன்னும் வரைவுகளில் தூசி சேகரிக்கிறது).

அப்போதிருந்து, இரண்டு நாட்களுக்கு முன்பு வரை டன் வளர்ச்சியின் நிலை குறித்து குறிப்பிடத்தக்க செய்தி எதுவும் இல்லை (ஒன்றில் அதிகாரப்பூர்வமற்ற சேனல்கள்) பக்கத்திற்கான இணைப்பு தோன்றவில்லை https://test.ton.org/download.html, அமைந்துள்ள இடம்:
ton-test-liteclient-full.tar.xz - டன் சோதனை நெட்வொர்க்கிற்கான ஒளி கிளையண்டின் ஆதாரங்கள்;
ton-lite-client-test1.config.json - சோதனை நெட்வொர்க்குடன் இணைப்பதற்கான கட்டமைப்பு கோப்பு;
என்னை தெரிந்து கொள் - வாடிக்கையாளரை உருவாக்குவது மற்றும் தொடங்குவது பற்றிய தகவல்கள்;
எப்படி - வாடிக்கையாளரைப் பயன்படுத்தி ஸ்மார்ட் ஒப்பந்தத்தை உருவாக்குவதற்கான படிப்படியான வழிமுறைகள்;
ton.pdf - TON நெட்வொர்க்கின் தொழில்நுட்ப கண்ணோட்டத்துடன் புதுப்பிக்கப்பட்ட ஆவணம் (மார்ச் 2, 2019 தேதியிட்டது);
tvm.pdf — TVM இன் தொழில்நுட்ப விளக்கம் (TON மெய்நிகர் இயந்திரம், டன் மெய்நிகர் இயந்திரம்);
tblkch.pdf - டன் பிளாக்செயினின் தொழில்நுட்ப விளக்கம்;
fifthbase.pdf - புதிய ஃபிஃப்ட் மொழியின் விளக்கம், TON இல் ஸ்மார்ட் ஒப்பந்தங்களை உருவாக்க வடிவமைக்கப்பட்டுள்ளது.

நான் மீண்டும் சொல்கிறேன், டெலிகிராமிலிருந்து பக்கத்தின் அதிகாரப்பூர்வ உறுதிப்படுத்தல் மற்றும் இந்த ஆவணங்கள் அனைத்தும் இல்லை, ஆனால் இந்த பொருட்களின் அளவு அவற்றை மிகவும் நம்பத்தகுந்ததாக ஆக்குகிறது. வெளியிடப்பட்ட கிளையண்டைத் தொடங்கவும் ஒருவரின் சொந்த ஆபத்தில்.

ஒரு சோதனை வாடிக்கையாளரை உருவாக்குதல்

முதலில், ஒரு சோதனை கிளையண்டை உருவாக்கி இயக்க முயற்சிப்போம் - அதிர்ஷ்டவசமாக, என்னை தெரிந்து கொள் இந்த எளிய செயல்முறையை விரிவாக விவரிக்கிறது. உதாரணத்திற்கு MacOS 10.14.5 ஐப் பயன்படுத்தி இதைச் செய்வேன்; மற்ற கணினிகளில் உருவாக்கத்தின் வெற்றிக்கு என்னால் உறுதியளிக்க முடியாது.

  1. பதிவிறக்கம் செய்து திறக்கவும் மூல காப்பகம். இந்த கட்டத்தில் பின்தங்கிய இணக்கத்தன்மைக்கு உத்தரவாதம் இல்லை என்பதால் சமீபத்திய பதிப்பைப் பதிவிறக்குவது முக்கியம்.

  2. மேக், 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

    வாடிக்கையாளர் டன் (டெலிகிராம் ஓப்பன் நெட்வொர்க்) மற்றும் ஸ்மார்ட் ஒப்பந்தங்களுக்கான புதிய ஃபிஃப்ட் மொழியை சோதிக்கவும்

    ஸ்மார்ட் ஒப்பந்தங்களுக்கான ஃபிஃப்ட் மொழி மொழிபெயர்ப்பாளரை உருவாக்க (அதைப் பற்றி மேலும் கீழே), நாங்கள் அழைக்கிறோம்

    cmake --build . --target fift

  4. தற்போதையதைப் பதிவிறக்கவும் கட்டமைப்பு கோப்பு சோதனை நெட்வொர்க்குடன் இணைக்க மற்றும் கூடியிருந்த கிளையண்டுடன் கோப்புறையில் வைக்கவும்.

  5. முடிந்தது, நீங்கள் கிளையண்டைத் தொடங்கலாம்:

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

எல்லாவற்றையும் சரியாகச் செய்தால், நீங்கள் இதைப் பார்க்க வேண்டும்:

வாடிக்கையாளர் டன் (டெலிகிராம் ஓப்பன் நெட்வொர்க்) மற்றும் ஸ்மார்ட் ஒப்பந்தங்களுக்கான புதிய ஃபிஃப்ட் மொழியை சோதிக்கவும்

நாம் பார்க்க முடியும் என, சில கட்டளைகள் உள்ளன:
help - இந்த கட்டளைகளின் பட்டியலைக் காட்டு;
quit - வெளியே போ;
time - சேவையகத்தில் தற்போதைய நேரத்தைக் காட்டு;
status - இணைப்பு மற்றும் உள்ளூர் தரவுத்தள நிலையைக் காட்டு;
last — பிளாக்செயினின் நிலையைப் புதுப்பிக்கவும் (கடைசித் தொகுதியைப் பதிவிறக்கவும்). நெட்வொர்க்கின் தற்போதைய நிலையை நீங்கள் பார்க்கிறீர்கள் என்பதை உறுதிப்படுத்த எந்த கோரிக்கைக்கும் முன் இந்த கட்டளையை இயக்குவது முக்கியம்.
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 ஸ்மார்ட் ஒப்பந்தங்களை உருவாக்க டெலிகிராம் குழு புதிய அடுக்கு மொழியை உருவாக்கியுள்ளது என்பதை நீங்கள் கண்டறியலாம் ஐந்து (வெளிப்படையாக எண்ணிலிருந்து ஐந்தாவது, ஃபோர்த் போலவே, ஐந்தாவது மொழிக்கும் பொதுவானது).

ஆவணம் மிகவும் பெரியது, 87 பக்கங்கள், மற்றும் இந்த கட்டுரையின் கட்டமைப்பிற்குள் அதன் உள்ளடக்கங்களை நான் விரிவாக மீண்டும் கூறமாட்டேன் (குறைந்தபட்சம் நான் அதை படித்து முடிக்கவில்லை என்பதால் :). நான் முக்கிய புள்ளிகளில் கவனம் செலுத்துகிறேன் மற்றும் இந்த மொழியில் இரண்டு குறியீடு உதாரணங்களை தருகிறேன்.

அடிப்படை மட்டத்தில், ஃபிஃப்ட்டின் தொடரியல் மிகவும் எளிமையானது: அதன் குறியீடு கொண்டுள்ளது வார்த்தைகள், பொதுவாக இடைவெளிகள் அல்லது வரி முறிவுகளால் பிரிக்கப்படும் (சிறப்பு வழக்கு: சில சொற்களுக்குப் பிறகு பிரிப்பான் தேவையில்லை). ஏதேனும் சொல் ஒரு குறிப்பிட்ட எழுத்துகளுக்கு ஒத்திருக்கும் கேஸ்-சென்சிட்டிவ் வரிசை உறுதிப்பாடு (தோராயமாக, மொழிபெயர்ப்பாளர் இந்த வார்த்தையை எதிர்கொள்ளும்போது என்ன செய்ய வேண்டும்). ஒரு வார்த்தையின் வரையறை இல்லை என்றால், மொழிபெயர்ப்பாளர் அதை ஒரு எண்ணாக அலசவும், அதை அடுக்கி வைக்கவும் முயற்சிப்பார். மூலம், இங்குள்ள எண்கள் - திடீரென்று - 257-பிட் முழு எண்கள், மற்றும் பின்னங்கள் எதுவும் இல்லை - இன்னும் துல்லியமாக, அவை உடனடியாக ஒரு ஜோடி முழு எண்களாக மாறி, ஒரு பகுத்தறிவு பின்னத்தின் எண் மற்றும் வகுப்பினை உருவாக்குகின்றன.

வார்த்தைகள் அடுக்கின் மேல் உள்ள மதிப்புகளுடன் தொடர்பு கொள்கின்றன. ஒரு தனி வகை வார்த்தைகள் - முன்னொட்டு — ஸ்டாக்கைப் பயன்படுத்துவதில்லை, ஆனால் மூலக் கோப்பில் இருந்து வரும் எழுத்துக்கள். எடுத்துக்காட்டாக, சரம் எழுத்துக்கள் இவ்வாறு செயல்படுத்தப்படுகின்றன - மேற்கோள் எழுத்து (") என்பது அடுத்த (மூடுதல்) மேற்கோளைத் தேடும் முன்னொட்டுச் சொல்லாகும், மேலும் அவற்றுக்கிடையே உள்ள சரத்தை அடுக்கின் மீது தள்ளும். ஒன்-லைனர்கள் அதே வழியில் நடந்து கொள்கிறார்கள் (//) மற்றும் மல்டிலைன் (/*) கருத்துகள்.

மொழியின் முழு உள் அமைப்பும் இங்குதான் முடிகிறது. மற்ற அனைத்தும் (கட்டுப்பாட்டு கட்டமைப்புகள் உட்பட) சொற்களாக வரையறுக்கப்படுகின்றன (எண்கணித செயல்பாடுகள் மற்றும் புதிய சொற்களின் வரையறை போன்ற அகம்; அல்லது "நிலையான நூலகத்தில்" வரையறுக்கப்பட்டுள்ளது. Fift.fif, இது கோப்புறையில் உள்ளது crypto/fift ஆதாரங்களில்).

ஐந்தில் ஒரு எளிய எடுத்துக்காட்டு நிரல்:

{ 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

(இன்டராக்டிவ் இன்புட் பயன்முறையில் நடப்பு வரியை செயலாக்கும் போது "சரி" என்ற வரி மொழிபெயர்ப்பாளரால் அச்சிடப்படுகிறது)

சரி, ஒரு முழு குறியீடு உதாரணம்:

"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 இல் கணக்குகள்

நான் விவரித்தபடி டன் மதிப்பாய்வு, இந்த நெட்வொர்க்கில் ஒன்றுக்கு மேற்பட்ட பிளாக்செயின் உள்ளது - ஒன்று பொதுவான ஒன்று உள்ளது, என்று அழைக்கப்படும். "மாஸ்டர் செயின்", அத்துடன் 32-பிட் எண்ணால் அடையாளம் காணப்பட்ட கூடுதல் "வேலைச் சங்கிலிகளின்" தன்னிச்சையான எண். மாஸ்டர்செயினில் -1 இன் அடையாளங்காட்டி உள்ளது; அதைத் தவிர, 0 இன் அடையாளங்காட்டியுடன் கூடிய "அடிப்படை" பணிச்சங்கிலியும் பயன்படுத்தப்படலாம். ஒவ்வொரு பணிச்செயினுக்கும் அதன் சொந்த உள்ளமைவு இருக்கும். உள்நாட்டில், ஒவ்வொரு வொர்க்செயினும் ஷார்ட்செயின்களாகப் பிரிக்கப்படுகின்றன, ஆனால் இது ஒரு செயல்படுத்தல் விவரம், அதை மனதில் கொள்ள வேண்டிய அவசியமில்லை.

ஒரு வொர்க்செயினுக்குள், பல கணக்குகள் தங்களுடைய சொந்த கணக்கு_ஐடி அடையாளங்காட்டிகளைக் கொண்டுள்ளன. மாஸ்டர் செயின் மற்றும் ஜீரோ ஒர்க் செயினுக்கு, அவை 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 தற்போதைய கணக்கு இருப்பு, இல் storage.state.code - ஸ்மார்ட் ஒப்பந்தக் குறியீடு, மற்றும் இன் storage.state.data - அதன் தற்போதைய தரவு. TON தரவு சேமிப்பகம் - செல், செல்கள் - மரம் போன்றது, ஒவ்வொரு கலமும் அதன் சொந்த தரவு மற்றும் குழந்தை செல்கள் இரண்டையும் கொண்டிருக்கலாம். இது கடைசி வரிகளில் உள்தள்ளலாகக் காட்டப்பட்டுள்ளது.

ஒரு ஸ்மார்ட் ஒப்பந்தத்தை உருவாக்குதல்

இப்போது அத்தகைய கட்டமைப்பை நாமே உருவாக்குவோம் (இது BOC என்று அழைக்கப்படுகிறது - செல்கள் பை) ஐந்தாவது மொழியைப் பயன்படுத்துதல். அதிர்ஷ்டவசமாக, நீங்கள் ஒரு ஸ்மார்ட் ஒப்பந்தத்தை நீங்களே எழுத வேண்டியதில்லை - கோப்புறையில் 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 (கவனமாக இருங்கள் - ஸ்கிரிப்டை மீண்டும் இயக்கினால் இந்தக் கோப்புகள் மேலெழுதப்படும்).

நிச்சயமாக, டன் நெட்வொர்க் இந்த பணப்பையைப் பற்றி இன்னும் அறியவில்லை; இது இந்த கோப்புகளின் வடிவத்தில் மட்டுமே சேமிக்கப்படுகிறது. இப்போது அதை நெட்வொர்க்கில் பதிவேற்ற வேண்டும். இருப்பினும், சிக்கல் என்னவென்றால், ஒரு ஸ்மார்ட் ஒப்பந்தத்தை உருவாக்க நீங்கள் கமிஷன் செலுத்த வேண்டும், மேலும் உங்கள் கணக்கு இருப்பு இன்னும் பூஜ்ஜியமாக உள்ளது.

வேலை பயன்முறையில், பரிமாற்றத்தில் கிராம் வாங்குவதன் மூலம் (அல்லது மற்றொரு பணப்பையிலிருந்து மாற்றுவதன் மூலம்) இந்த சிக்கல் தீர்க்கப்படும். சரி, தற்போதைய சோதனை முறையில், ஒரு சிறப்பு ஸ்மார்ட் ஒப்பந்தம் உருவாக்கப்பட்டது, அதில் இருந்து நீங்கள் 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 கிளையண்டில். இதற்குப் பிறகு, பிளாக்செயினின் நிலையைப் புதுப்பிக்க மறக்காதீர்கள் (last) மற்றும் எங்கள் பணப்பையின் இருப்பு மற்றும் சீக்னோ மாறியுள்ளதா என சரிபார்க்கவும் (getaccount <account_id>).

வாடிக்கையாளர் டன் (டெலிகிராம் ஓப்பன் நெட்வொர்க்) மற்றும் ஸ்மார்ட் ஒப்பந்தங்களுக்கான புதிய ஃபிஃப்ட் மொழியை சோதிக்கவும்

அவ்வளவுதான், இப்போது நாம் TON இல் ஸ்மார்ட் ஒப்பந்தங்களை உருவாக்கி அவர்களுக்கு கோரிக்கைகளை அனுப்பலாம். நீங்கள் பார்க்க முடியும் என, தற்போதைய செயல்பாடு ஏற்கனவே போதுமானதாக உள்ளது, எடுத்துக்காட்டாக, வரைகலை இடைமுகத்துடன் மிகவும் நட்பு பணப்பையை உருவாக்க (இருப்பினும், இது ஏற்கனவே தூதரின் ஒரு பகுதியாக கிடைக்கும் என்று எதிர்பார்க்கப்படுகிறது).

பதிவு செய்த பயனர்கள் மட்டுமே கணக்கெடுப்பில் பங்கேற்க முடியும். உள்நுழையவும், தயவு செய்து.

TON, TVM, Fif ஆகியவற்றின் பகுப்பாய்வுடன் கட்டுரைகளைத் தொடர ஆர்வமாக உள்ளீர்களா?

  • ஆம், TON இன் பொதுவான கண்ணோட்டத்துடன் தொடர் கட்டுரைகள் முடிவடையும் வரை காத்திருக்கிறேன்

  • ஆம், ஐந்தின் மொழியைப் பற்றி மேலும் படிக்க ஆர்வமாக உள்ளது

  • ஆம், டன் விர்ச்சுவல் மெஷின் மற்றும் அதற்கான அசெம்பிளர் பற்றி மேலும் அறிய விரும்புகிறேன்

  • இல்லை, இவை எதுவும் சுவாரஸ்யமாக இல்லை

39 பயனர்கள் வாக்களித்தனர். 12 பயனர்கள் வாக்களிக்கவில்லை.

TON ஐ அறிமுகப்படுத்த டெலிகிராமின் திட்டங்களைப் பற்றி நீங்கள் என்ன நினைக்கிறீர்கள்?

  • இந்த திட்டத்தில் எனக்கு அதிக நம்பிக்கை உள்ளது

  • நான் அதன் வளர்ச்சியை ஆர்வத்துடன் பின்பற்றுகிறேன்.

  • அதன் வெற்றியில் எனக்கு சந்தேகமும் சந்தேகமும் உள்ளது.

  • இம்முயற்சி தோல்வியுற்றதாகவும், பரந்த மக்களுக்குத் தேவையற்றதாகவும் கருதுவதற்கு நான் முனைகிறேன்

47 பயனர்கள் வாக்களித்தனர். 12 பயனர்கள் வாக்களிக்கவில்லை.

ஆதாரம்: www.habr.com

கருத்தைச் சேர்