స్మార్ట్ కాంట్రాక్టుల కోసం క్లయింట్ 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 వర్చువల్ మెషిన్, TON వర్చువల్ మెషిన్);
tblkch.pdf - TON బ్లాక్‌చెయిన్ యొక్క సాంకేతిక వివరణ;
fifthbase.pdf - కొత్త ఫిఫ్ట్ భాష యొక్క వివరణ, TONలో స్మార్ట్ ఒప్పందాలను రూపొందించడానికి రూపొందించబడింది.

నేను పునరావృతం చేస్తున్నాను, టెలిగ్రామ్ నుండి పేజీ మరియు ఈ అన్ని పత్రాల యొక్క అధికారిక నిర్ధారణ లేదు, కానీ ఈ పదార్థాల పరిమాణం వాటిని చాలా ఆమోదయోగ్యమైనదిగా చేస్తుంది. ప్రచురించబడిన క్లయింట్‌ను ప్రారంభించండి ఒకరి స్వంత పూచీతో.

టెస్ట్ క్లయింట్‌ను రూపొందించడం

ముందుగా, టెస్ట్ క్లయింట్‌ను రూపొందించడానికి మరియు అమలు చేయడానికి ప్రయత్నిద్దాం - అదృష్టవశాత్తూ, README ఈ సాధారణ ప్రక్రియను వివరంగా వివరిస్తుంది. నేను దీన్ని ఉదాహరణగా macOS 10.14.5 ఉపయోగించి చేస్తాను; ఇతర సిస్టమ్‌లలో బిల్డ్ యొక్క విజయానికి నేను హామీ ఇవ్వలేను.

  1. డౌన్‌లోడ్ చేసి అన్‌ప్యాక్ చేయండి మూల ఆర్కైవ్. ఈ దశలో వెనుకబడిన అనుకూలత హామీ ఇవ్వబడనందున తాజా సంస్కరణను డౌన్‌లోడ్ చేయడం ముఖ్యం.

  2. సిస్టమ్‌లో make, cmake (వెర్షన్ 3.0.2 లేదా అంతకంటే ఎక్కువ), OpenSSL (C హెడర్ ఫైల్‌లతో సహా), g++ లేదా క్లాంగ్ యొక్క తాజా వెర్షన్‌లు ఇన్‌స్టాల్ చేయబడిందని నిర్ధారించుకోండి. నేను దేనినీ ఇన్‌స్టాల్ చేయనవసరం లేదు, ప్రతిదీ వెంటనే కలిసి వచ్చింది.

  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 — బ్లాక్‌చెయిన్ స్థితిని నవీకరించండి (చివరి బ్లాక్‌ను డౌన్‌లోడ్ చేయండి). మీరు నెట్‌వర్క్ యొక్క ప్రస్తుత స్థితిని చూస్తున్నారని నిర్ధారించుకోవడానికి ఏదైనా అభ్యర్థనల ముందు ఈ ఆదేశాన్ని అమలు చేయడం ముఖ్యం.
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లో ఖాతాలు

నేను వివరించినట్లు TON సమీక్ష, ఈ నెట్‌వర్క్ ఒకటి కంటే ఎక్కువ బ్లాక్‌చెయిన్‌లను కలిగి ఉంది - ఒకటి సాధారణమైనది, అని పిలవబడేది. "మాస్టర్ చైన్", అలాగే 32-బిట్ నంబర్ ద్వారా గుర్తించబడిన అదనపు "వర్క్ చెయిన్స్" యొక్క ఏకపక్ష సంఖ్య. మాస్టర్‌చెయిన్‌లో -1 ఐడెంటిఫైయర్ ఉంది; దానితో పాటు, 0 ఐడెంటిఫైయర్‌తో కూడిన “బేస్” వర్క్‌చెయిన్‌ను కూడా ఉపయోగించవచ్చు. ప్రతి వర్క్‌చెయిన్ దాని స్వంత కాన్ఫిగరేషన్‌ను కలిగి ఉంటుంది. అంతర్గతంగా, ప్రతి వర్క్‌చెయిన్ షార్డ్‌చెయిన్‌లుగా విభజించబడింది, అయితే ఇది అమలు వివరాలు, ఇది గుర్తుంచుకోవలసిన అవసరం లేదు.

ఒక వర్క్‌చెయిన్‌లో, అనేక ఖాతాలు వాటి స్వంత account_id ఐడెంటిఫైయర్‌లను కలిగి ఉంటాయి. మాస్టర్ చైన్ మరియు జీరో వర్క్ చైన్ కోసం, అవి 256 బిట్‌ల పొడవు ఉంటాయి. అందువలన, ఖాతా ఐడెంటిఫైయర్ వ్రాయబడింది, ఉదాహరణకు, ఇలా:

-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

ఇది “రా” ఫార్మాట్: మొదట వర్క్‌చెయిన్ ID, తర్వాత కోలన్ మరియు హెక్సాడెసిమల్ సంజ్ఞామానంలో ఖాతా ID.

అదనంగా, సంక్షిప్త ఆకృతి ఉంది - వర్క్‌చెయిన్ నంబర్ మరియు ఖాతా చిరునామా బైనరీ రూపంలో ఎన్‌కోడ్ చేయబడ్డాయి, వాటికి చెక్‌సమ్ జోడించబడుతుంది మరియు ఇవన్నీ 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)

అంటే ID ఉన్న వాలెట్ -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) మరియు మీ వాలెట్ యొక్క సీక్నో (వాలెట్‌ను ప్రారంభించిన తర్వాత ఇది 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లో స్మార్ట్ కాంట్రాక్టులను సృష్టించవచ్చు మరియు వారికి అభ్యర్థనలను పంపవచ్చు. మీరు చూడగలిగినట్లుగా, ప్రస్తుత కార్యాచరణ ఇప్పటికే సరిపోతుంది, ఉదాహరణకు, గ్రాఫికల్ ఇంటర్‌ఫేస్‌తో మరింత స్నేహపూర్వక వాలెట్‌ను తయారు చేయడానికి (అయితే, ఇది ఇప్పటికే మెసెంజర్‌లో భాగంగా అందుబాటులోకి వస్తుందని భావిస్తున్నారు).

నమోదు చేసుకున్న వినియోగదారులు మాత్రమే సర్వేలో పాల్గొనగలరు. సైన్ ఇన్ చేయండిదయచేసి.

TON, TVM, Fifట్ విశ్లేషణతో కథనాలను కొనసాగించడానికి మీకు ఆసక్తి ఉందా?

  • అవును, నేను TON యొక్క సాధారణ అవలోకనంతో కథనాల శ్రేణిని పూర్తి చేయడానికి వేచి ఉన్నాను

  • అవును, ఐదవ భాష గురించి మరింత చదవడం ఆసక్తికరంగా ఉంది

  • అవును, నేను TON వర్చువల్ మెషీన్ మరియు దాని కోసం అసెంబ్లర్ గురించి మరింత తెలుసుకోవాలనుకుంటున్నాను

  • లేదు, ఇవేవీ ఆసక్తికరంగా లేవు

39 మంది వినియోగదారులు ఓటు వేశారు. 12 మంది వినియోగదారులు దూరంగా ఉన్నారు.

TONని ప్రారంభించే టెలిగ్రామ్ ప్రణాళికల గురించి మీరు ఏమనుకుంటున్నారు?

  • ఈ ప్రాజెక్ట్‌పై నాకు చాలా ఆశలు ఉన్నాయి

  • నేను దాని అభివృద్ధిని ఆసక్తితో అనుసరిస్తున్నాను.

  • నేను సందేహాస్పదంగా ఉన్నాను మరియు దాని విజయాన్ని అనుమానిస్తున్నాను.

  • ఈ చొరవ విఫలమైనదని మరియు విస్తృత ప్రజానీకానికి అనవసరమని నేను భావించాను

47 మంది వినియోగదారులు ఓటు వేశారు. 12 మంది వినియోగదారులు దూరంగా ఉన్నారు.

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి