Փորձարկեք հաճախորդը TON (Telegram Open Network) և նոր Fift լեզու խելացի պայմանագրերի համար

Ավելի քան մեկ տարի առաջ հայտնի դարձավ Telegram մեսենջերի՝ սեփական ապակենտրոնացված ցանցը թողարկելու ծրագրերի մասին։ Բաց ցանցի հեռագիր. Այնուհետև հասանելի դարձավ մի ծավալուն տեխնիկական փաստաթուղթ, որն իբր գրել է Նիկոլայ Դուրովը և նկարագրել ապագա ցանցի կառուցվածքը։ Նրանց, ովքեր բաց են թողել, խորհուրդ եմ տալիս կարդալ այս փաստաթղթի իմ վերապատմումը (մաս 1, մաս 2; երրորդ մասը, ավաղ, դեռ փոշի է հավաքում նախագծերի մեջ):

Այդ ժամանակից ի վեր, մինչև մի քանի օր առաջ TON-ի զարգացման կարգավիճակի մասին որևէ էական նորություն չկար (մեկում ոչ պաշտոնական ալիքներ) էջի հղումը չի հայտնվել https://test.ton.org/download.html, որտեղ գտնվում են.
ton-test-liteclient-full.tar.xz — թեթեւ հաճախորդի աղբյուրներ TON փորձարկման ցանցի համար.
ton-lite-client-test1.config.json — թեստային ցանցին միանալու համար կազմաձևման ֆայլ;
առաջնային - հաճախորդի ստեղծման և գործարկման մասին տեղեկատվություն.
ԻՆՉՊԵՍ — հաճախորդի միջոցով խելացի պայմանագիր ստեղծելու քայլ առ քայլ հրահանգներ.
տոննա.pdf — թարմացված փաստաթուղթ (2 թվականի մարտի 2019-ով)՝ TON ցանցի տեխնիկական ակնարկով.
tvm.pdf — TVM-ի տեխնիկական նկարագրությունը (TON Virtual Machine, TON Virtual Machine);
tblkch.pdf — TON blockchain-ի տեխնիկական նկարագրությունը.
fifthbase.pdf — նոր Fift լեզվի նկարագրությունը, որը նախատեսված է TON-ում խելացի պայմանագրեր ստեղծելու համար:

Կրկնում եմ, որ էջի և այս բոլոր փաստաթղթերի պաշտոնական հաստատում Telegram-ից չի եղել, բայց այդ նյութերի ծավալը դրանք բավականին հավանական է դարձնում։ Գործարկել հրապարակված հաճախորդը սեփական ռիսկով.

Փորձարկման հաճախորդի ստեղծում

Նախ, եկեք փորձենք ստեղծել և գործարկել փորձնական հաճախորդ, բարեբախտաբար, առաջնային մանրամասն նկարագրում է այս պարզ գործընթացը: Ես դա կանեմ՝ օգտագործելով 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 (Telegram Open Network) և նոր Fift լեզու խելացի պայմանագրերի համար

    Խելացի պայմանագրերի համար Fift լեզվի թարգմանիչը ստեղծելու համար (այդ մասին ավելին ստորև), մենք նաև զանգահարում ենք

    cmake --build . --target fift

  4. Ներբեռնեք ընթացիկը կազմաձևման ֆայլ թեստային ցանցին միանալու և այն հավաքված հաճախորդի հետ թղթապանակում տեղադրելու համար:

  5. Finish, հաճախորդին կարող եք սկսել՝

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

Եթե ​​ամեն ինչ ճիշտ է արված, դուք պետք է տեսնեք այսպիսի բան.

Փորձարկեք հաճախորդը TON (Telegram Open Network) և նոր Fift լեզու խելացի պայմանագրերի համար

Ինչպես տեսնում ենք, կան մի քանի մատչելի հրամաններ.
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 լեզուն, փորձել խելացի պայմանագիր կազմել (օրինակ՝ ստեղծել փորձնական դրամապանակ), այն վերբեռնել ցանց և փորձել գումար փոխանցել հաշիվների միջև:

Լեզու Հինգերորդ

Փաստաթղթից fifthbase.pdf կարող եք պարզել, որ 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-ով

Ինչպես ես նկարագրել եմ 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 (Telegram Open Network) և նոր Fift լեզու խելացի պայմանագրերի համար

Այսքանը, այժմ մենք կարող ենք ստեղծել խելացի պայմանագրեր TON-ում և հարցումներ ուղարկել նրանց: Ինչպես տեսնում եք, ներկայիս ֆունկցիոնալությունն արդեն բավական է, օրինակ, գրաֆիկական ինտերֆեյսով ավելի բարեկամական դրամապանակ պատրաստելու համար (սակայն, ակնկալվում է, որ այն արդեն հասանելի կդառնա որպես մեսենջերի մաս):

Հարցմանը կարող են մասնակցել միայն գրանցված օգտվողները։ Մուտք գործել, խնդրում եմ:

Հետաքրքրվա՞ծ եք հոդվածները շարունակել TON, TVM, Fift վերլուծություններով:

  • Այո, ես սպասում եմ հոդվածաշարի ավարտին TON-ի ընդհանուր ակնարկով

  • Այո, հետաքրքիր է ավելին կարդալ Հինգ լեզվի մասին

  • Այո, ես ուզում եմ ավելին իմանալ TON վիրտուալ մեքենայի և դրա համար հավաքողի մասին

  • Ոչ, սրանից ոչ մեկը հետաքրքիր չէ

Քվեարկել է 39 օգտատեր։ 12 օգտատեր ձեռնպահ է մնացել։

Ի՞նչ եք կարծում Telegram-ի՝ TON-ը գործարկելու ծրագրերի մասին:

  • Ես մեծ հույսեր եմ կապում այս նախագծի հետ

  • Ես ուղղակի հետաքրքրությամբ եմ հետևում դրա զարգացմանը։

  • Ես թերահավատ եմ և կասկածում եմ դրա հաջողությանը։

  • Ես հակված եմ այս նախաձեռնությունը համարել ձախողված և անհարկի լայն զանգվածների համար

Քվեարկել է 47 օգտատեր։ 12 օգտատեր ձեռնպահ է մնացել։

Source: www.habr.com

Добавить комментарий