Ավելի քան մեկ տարի առաջ հայտնի դարձավ Telegram մեսենջերի՝ սեփական ապակենտրոնացված ցանցը թողարկելու ծրագրերի մասին։ Բաց ցանցի հեռագիր. Այնուհետև հասանելի դարձավ մի ծավալուն տեխնիկական փաստաթուղթ, որն իբր գրել է Նիկոլայ Դուրովը և նկարագրել ապագա ցանցի կառուցվածքը։ Նրանց, ովքեր բաց են թողել, խորհուրդ եմ տալիս կարդալ այս փաստաթղթի իմ վերապատմումը (, ; երրորդ մասը, ավաղ, դեռ փոշի է հավաքում նախագծերի մեջ):
Այդ ժամանակից ի վեր, մինչև մի քանի օր առաջ TON-ի զարգացման կարգավիճակի մասին որևէ էական նորություն չկար (մեկում ) էջի հղումը չի հայտնվել , որտեղ գտնվում են.
◦ — թեթեւ հաճախորդի աղբյուրներ TON փորձարկման ցանցի համար.
◦ — թեստային ցանցին միանալու համար կազմաձևման ֆայլ;
◦ - հաճախորդի ստեղծման և գործարկման մասին տեղեկատվություն.
◦ — հաճախորդի միջոցով խելացի պայմանագիր ստեղծելու քայլ առ քայլ հրահանգներ.
◦ — թարմացված փաստաթուղթ (2 թվականի մարտի 2019-ով)՝ TON ցանցի տեխնիկական ակնարկով.
◦ — TVM-ի տեխնիկական նկարագրությունը (TON Virtual Machine, TON Virtual Machine);
◦ — TON blockchain-ի տեխնիկական նկարագրությունը.
◦ — նոր Fift լեզվի նկարագրությունը, որը նախատեսված է TON-ում խելացի պայմանագրեր ստեղծելու համար:
Կրկնում եմ, որ էջի և այս բոլոր փաստաթղթերի պաշտոնական հաստատում Telegram-ից չի եղել, բայց այդ նյութերի ծավալը դրանք բավականին հավանական է դարձնում։ Գործարկել հրապարակված հաճախորդը սեփական ռիսկով.
Փորձարկման հաճախորդի ստեղծում
Նախ, եկեք փորձենք ստեղծել և գործարկել փորձնական հաճախորդ, բարեբախտաբար, մանրամասն նկարագրում է այս պարզ գործընթացը: Ես դա կանեմ՝ օգտագործելով macOS 10.14.5 որպես օրինակ, ես չեմ կարող երաշխավորել այլ համակարգերի վրա կառուցման հաջողությունը:
Ներբեռնեք և բացեք փաթեթավորումը . Կարևոր է ներբեռնել վերջին տարբերակը, քանի որ հետամնաց համատեղելիությունն այս փուլում երաշխավորված չէ:
Համոզվեք, որ make, cmake (տարբերակ 3.0.2 կամ ավելի բարձր), OpenSSL (ներառյալ C վերնագրի ֆայլերը), g++ կամ clang-ի վերջին տարբերակները տեղադրված են համակարգում: Ես ստիպված չէի որևէ բան տեղադրել, ամեն ինչ անմիջապես հավաքվեց:
Ենթադրենք, որ աղբյուրները բացված են թղթապանակում
~/lite-client. Դրանից առանձին ստեղծեք դատարկ թղթապանակ հավաքված նախագծի համար (օրինակ.~/liteclient-build), և դրանից (cd ~/liteclient-build) կանչեք հրամանները.cmake ~/lite-client cmake --build . --target test-lite-client
Խելացի պայմանագրերի համար Fift լեզվի թարգմանիչը ստեղծելու համար (այդ մասին ավելին ստորև), մենք նաև զանգահարում ենքcmake --build . --target fiftՆերբեռնեք ընթացիկը թեստային ցանցին միանալու և այն հավաքված հաճախորդի հետ թղթապանակում տեղադրելու համար:
Finish, հաճախորդին կարող եք սկսել՝
./test-lite-client -C ton-lite-client-test1.config.json
Եթե ամեն ինչ ճիշտ է արված, դուք պետք է տեսնեք այսպիսի բան.

Ինչպես տեսնում ենք, կան մի քանի մատչելի հրամաններ.
◦ help — ցուցադրել հրամանների այս ցանկը.
◦ quit - դուրս գալ;
◦ time — ցույց տալ ընթացիկ ժամանակը սերվերում;
◦ status — ցույց տալ կապը և տեղական տվյալների բազայի կարգավիճակը.
◦ last — թարմացնել բլոկչեյնի վիճակը (ներբեռնել վերջին բլոկը): Կարևոր է գործարկել այս հրամանը ցանկացած հարցումից առաջ՝ համոզվելու համար, որ տեսնում եք ցանցի ներկայիս վիճակը:
◦ sendfile <filename> — վերբեռնեք տեղական ֆայլ TON ցանց: Այսպես է տեղի ունենում փոխգործակցությունը ցանցի հետ, ներառյալ, օրինակ, նոր խելացի պայմանագրերի ստեղծումը և հաշիվների միջև միջոցներ փոխանցելու հարցումները.
◦ getaccount <address> - ցույց տալ հոսանքը (հրամանի կատարման պահին) last) նշված հասցեով հաշվի կարգավիճակը.
◦ privkey <filename> — բեռնել մասնավոր բանալին տեղական ֆայլից:
Եթե հաճախորդը գործարկելիս թղթապանակ եք փոխանցում դրան՝ օգտագործելով տարբերակը -D, այնուհետև նա կավելացնի դրա մեջ Masterchain-ի վերջին բլոկը.
./test-lite-client -C ton-lite-client-test1.config.json -D ~/ton-db-dirԱյժմ մենք կարող ենք անցնել ավելի հետաքրքիր բաների. սովորել Fift լեզուն, փորձել խելացի պայմանագիր կազմել (օրինակ՝ ստեղծել փորձնական դրամապանակ), այն վերբեռնել ցանց և փորձել գումար փոխանցել հաշիվների միջև:
Լեզու Հինգերորդ
Փաստաթղթից կարող եք պարզել, որ Telegram-ի թիմը ստեղծել է նոր ստեկ լեզու՝ խելացի պայմանագրեր ստեղծելու համար Հինգ (ըստ երևույթին, թվից հինգերորդ, Forth-ի նման, մի լեզու, որի հետ Fifth-ը շատ ընդհանրություններ ունի):
Փաստաթուղթը բավականին ծավալուն է՝ 87 էջ, և ես դրա բովանդակությունը մանրամասն չեմ պատմի այս հոդվածի շրջանակներում (գոնե այն պատճառով, որ ես ինքս չեմ ավարտել այն կարդալը :)։ Ես կկենտրոնանամ հիմնական կետերի վրա և կբերեմ այս լեզվով մի քանի կոդի օրինակ:
Հիմնական մակարդակում Fift-ի շարահյուսությունը բավականին պարզ է. նրա կոդը բաղկացած է բառեր, սովորաբար բաժանվում են բացատներով կամ տողերով (հատուկ դեպք. որոշ բառեր իրենցից հետո բաժանարար չեն պահանջում)։ Ցանկացած բառը նիշերի տառազգայուն հաջորդականություն է, որը համապատասխանում է որոշակիին որոշումը (մոտավորապես ինչ պետք է անի թարգմանիչը, երբ հանդիպի այս բառին): Եթե բառի սահմանում չկա, թարգմանիչը փորձում է այն վերլուծել որպես թիվ և դնել բուրգի վրա: Ի դեպ, այստեղ թվերը, հանկարծ, 257 բիթանոց ամբողջ թվեր են, իսկ կոտորակներ ընդհանրապես չկան, ավելի ճիշտ՝ անմիջապես վերածվում են ամբողջ թվերի՝ կազմելով ռացիոնալ կոտորակի համարիչ և հայտարար։
Բառերը հակված են փոխազդելու բուրգի վերևում գտնվող արժեքների հետ: Առանձին տեսակի բառեր - նախածանց — չի օգտագործում կույտը, այլ սկզբնաղբյուրի ֆայլի հաջորդ նիշերը: Օրինակ, այսպես են իրականացվում լարային բառացիները՝ չակերտի նիշը (") նախածանցային բառ է, որը փնտրում է հաջորդ (փակման) մեջբերումը և մղում նրանց միջև եղած տողը դեպի բուրգ: Նույն կերպ են վարվում միակողմանիները (//) և բազմագիծ (/*) մեկնաբանություններ.
Այստեղ ավարտվում է լեզվի գրեթե ողջ ներքին կառուցվածքը։ Մնացած ամեն ինչ (ներառյալ հսկիչ կառուցվածքները) սահմանվում է որպես բառեր (կամ ներքին, օրինակ՝ թվաբանական գործողություններ և նոր բառերի սահմանում, կամ սահմանվում են «ստանդարտ գրադարանում» Fift.fif, որը գտնվում է թղթապանակում crypto/fift աղբյուրներում):
Պարզ օրինակ ծրագիր 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(«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 Virtual Machine-ի համար այստեղ օգտագործվում է մեկ այլ անսամբլի լեզու (ես դրա վրա մանրամասն չեմ անդրադառնա), որի հրահանգները կտեղադրվեն բլոկչեյնի վրա։
Այսպիսով, TVM-ի համար assembler-ը գրված է Fift-ում. այս assembler-ի աղբյուրները գտնվում են ֆայլում crypto/fift/Asm.fif և միացված են վերը նշված կոդի սկզբում:
Ինչ կարող եմ ասել, ըստ երեւույթին Նիկոլայ Դուրովը պարզապես սիրում է ստեղծել ծրագրավորման նոր լեզուներ :)
Խելացի պայմանագիր ստեղծելը և TON-ի հետ փոխգործակցությունը
Այսպիսով, ենթադրենք, որ մենք հավաքել ենք TON հաճախորդը և Fift թարգմանիչը, ինչպես նկարագրված է վերևում և ծանոթացել ենք լեզվին: Ինչպե՞ս ստեղծել խելացի պայմանագիր հիմա: Սա նկարագրված է ֆայլում , կից աղբյուրներին։
Հաշիվներ TON-ով
Ինչպես ես նկարագրել եմ , այս ցանցը պարունակում է մեկից ավելի բլոկչեյն՝ կա մեկ ընդհանուր, այսպես կոչված. «հիմնական շղթա», ինչպես նաև կամայական թվով լրացուցիչ «աշխատանքային շղթաներ», որոնք նույնականացվում են 32-բիթանոց թվով: Masterchain-ն ունի -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 - բջիջների պարկ) օգտագործելով Fift լեզուն: Բարեբախտաբար, դուք պետք չէ ինքներդ գրել խելացի պայմանագիր՝ թղթապանակում crypto/block կա ֆայլ աղբյուրի արխիվից new-wallet.fif, որը կօգնի մեզ ստեղծել նոր դրամապանակ։ Եկեք պատճենենք այն հավաքված հաճախորդի հետ թղթապանակում (~/liteclient-build, եթե հետևել եք վերը նշված հրահանգներին): Ես վերը բերեցի դրա բովանդակությունը որպես Fift-ի կոդի օրինակ:
Կատարեք այս ֆայլը հետևյալ կերպ.
./crypto/fift -I"<source-directory>/crypto/fift" new-wallet.fifԱյստեղ <source-directory> պետք է փոխարինվի դեպի չփաթեթավորված աղբյուրների ուղին («~» նշանը, ցավոք, չի կարող օգտագործվել այստեղ, անհրաժեշտ է ամբողջական ուղին): Բանալին օգտագործելու փոխարեն -I Դուք կարող եք սահմանել շրջակա միջավայրի փոփոխական FIFTPATH և դնել այս ճանապարհը դրա մեջ:
Քանի որ մենք գործարկեցինք Fift-ը ֆայլի անունով 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, TVM, Fift վերլուծություններով:
Այո, ես սպասում եմ հոդվածաշարի ավարտին TON-ի ընդհանուր ակնարկով
Այո, հետաքրքիր է ավելին կարդալ Հինգ լեզվի մասին
Այո, ես ուզում եմ ավելին իմանալ TON վիրտուալ մեքենայի և դրա համար հավաքողի մասին
Ոչ, սրանից ոչ մեկը հետաքրքիր չէ
Քվեարկել է 39 օգտատեր։ 12 օգտատեր ձեռնպահ է մնացել։
Ի՞նչ եք կարծում Telegram-ի՝ TON-ը գործարկելու ծրագրերի մասին:
Ես մեծ հույսեր եմ կապում այս նախագծի հետ
Ես ուղղակի հետաքրքրությամբ եմ հետևում դրա զարգացմանը։
Ես թերահավատ եմ և կասկածում եմ դրա հաջողությանը։
Ես հակված եմ այս նախաձեռնությունը համարել ձախողված և անհարկի լայն զանգվածների համար
Քվեարկել է 47 օգտատեր։ 12 օգտատեր ձեռնպահ է մնացել։
Source: www.habr.com

