TON (Telegram Open Network) test müştərisi və ağıllı müqavilələr üçün yeni Fift dili

Bir ildən çoxdur ki, Telegram messencerinin özünün mərkəzləşdirilməmiş şəbəkəsini buraxmaq planları haqqında məlum olub. Telegram Açıq Şəbəkə. Sonra, ehtimal ki, Nikolay Durov tərəfindən yazılmış və gələcək şəbəkənin strukturunu təsvir edən həcmli texniki sənəd əldə edildi. Onu qaçıranlar üçün bu sənədin təkrar izahını oxumağınızı tövsiyə edirəm (1 hissəsi, 2 hissəsi; üçüncü hissə, təəssüf ki, hələ də qaralamalarda toz yığır).

O vaxtdan bəri, bir neçə gün əvvələ qədər TON-un inkişafının vəziyyəti ilə bağlı əhəmiyyətli bir xəbər yoxdur (birində qeyri-rəsmi kanallar) səhifənin linki görünmədi https://test.ton.org/download.htmlharada yerləşir:
ton-test-liteclient-full.tar.xz — TON test şəbəkəsi üçün yüngül müştəri mənbələri;
ton-lite-client-test1.config.json — test şəbəkəsinə qoşulmaq üçün konfiqurasiya faylı;
README - müştərinin yığılması və işə salınması haqqında məlumat;
NECƏ — müştəridən istifadə edərək ağıllı müqavilənin yaradılmasına dair addım-addım təlimatlar;
ton.pdf — TON şəbəkəsinin texniki icmalı ilə yenilənmiş sənəd (2 mart 2019-cu il tarixli);
tvm.pdf — TVM-in texniki təsviri (TON Virtual Machine, TON virtual machine);
tblkch.pdf — TON blokçeyninin texniki təsviri;
fifthbase.pdf — TON-da ağıllı müqavilələr yaratmaq üçün nəzərdə tutulmuş yeni Fift dilinin təsviri.

Yenə deyirəm, səhifənin və bütün bu sənədlərin Telegram-dan rəsmi təsdiqi yox idi, lakin bu materialların həcmi onları kifayət qədər inandırıcı edir. Dərc edilmiş müştərini işə salın öz riski ilə.

Test müştərisinin yaradılması

Başlamaq üçün test müştərisini qurmağa və işə salmağa çalışaq - yaxşı, README bu sadə prosesi ətraflı təsvir edir. Mən bunu macOS 10.14.5 nümunəsindən istifadə edərək edəcəm, digər sistemlərdə montajın uğuruna zəmanət verə bilmərəm.

  1. Yükləyin və paketdən çıxarın mənbə arxivi. Ən son versiyanı yükləmək vacibdir, çünki bu mərhələdə geriyə uyğunluq təmin edilmir.

  2. Sisteminizdə make, cmake (versiya 3.0.2 və ya daha yüksək), OpenSSL (o cümlədən C başlıqları), g++ və ya clang-ın ən son versiyalarının quraşdırıldığına əmin olun. Heç bir şey quraşdırmalı deyildim, hər şey dərhal birləşdi.

  3. Mənbələrin bir qovluğa açıldığını düşünək ~/lite-client. Bundan ayrıca, yığılmış layihə üçün boş bir qovluq yaradırıq (məsələn, ~/liteclient-build), və ondan (cd ~/liteclient-build) əmrləri çağırın:

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

    TON (Telegram Open Network) test müştərisi və ağıllı müqavilələr üçün yeni Fift dili

    Ağıllı müqavilələr üçün Fift dil tərcüməçisini yaratmaq üçün (aşağıda təsvir edilmişdir), biz də zəng edirik

    cmake --build . --target fift

  4. Carisini yükləyin konfiqurasiya faylı test şəbəkəsinə qoşulmaq və yığılmış müştəri ilə qovluğa qoymaq.

  5. Bitirmək, siz müştərini işlədə bilərsiniz:

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

Hər şey düzgün aparılırsa, belə bir şey görməlisiniz:

TON (Telegram Open Network) test müştərisi və ağıllı müqavilələr üçün yeni Fift dili

Gördüyünüz kimi, bir neçə mövcud əmr var:
help - bu əmrlərin siyahısını göstərin;
quit - çölə çıxmaq;
time — serverdə cari vaxtı göstərmək;
status - əlaqənin vəziyyətini və yerli məlumat bazasını göstərmək;
last — blokçeynin vəziyyətini yeniləyin (sonuncu bloku endirin). Şəbəkənin faktiki vəziyyətini gördüyünüzə əmin olmaq üçün hər hansı sorğudan əvvəl bu əmri yerinə yetirmək vacibdir.
sendfile <filename> — TON şəbəkəsinə yerli fayl yükləyin. Şəbəkə ilə qarşılıqlı əlaqə belə baş verir, məsələn, yeni ağıllı müqavilələrin yaradılması və hesablar arasında pul köçürmə sorğuları;
getaccount <address> — cari göstərin (əmr icrası zamanı last) göstərilən ünvanla hesabın vəziyyəti;
privkey <filename> — şəxsi açarı yerli fayldan yükləyin.

Müştərini işə salarkən, seçimdən istifadə edərək qovluğu ona ötürün -D, sonra masterchain-in son blokunu ona əlavə edəcək:

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

İndi daha maraqlı şeylərə keçə bilərik - Fift dilini öyrənin, ağıllı müqavilə tərtib etməyə çalışın (məsələn, test cüzdanı yaradın), onu şəbəkəyə yükləyin və hesablar arasında vəsait köçürməyə cəhd edin.

Beş dil

Sənəddən fifthbase.pdf Telegram komandasının ağıllı müqavilələr yaratmaq üçün yeni bir yığın dili yaratdığını öyrənə bilərsiniz beş (görünür rəqəmdən beşinci, Beşincinin çox ortaq cəhətləri olan Forth dilinə bənzəyir).

Sənəd kifayət qədər həcmlidir, 87 səhifədir və bu məqalə çərçivəsində onun məzmununu təfərrüatlı şəkildə təkrarlamayacağam (ən azı, çünki özüm oxuyub bitirməmişəm :). Əsas məqamlar üzərində dayanacağam və bu dildə bir neçə kod nümunəsi verəcəyəm.

Əsas səviyyədə Fift-in sintaksisi olduqca sadədir: onun kodu aşağıdakılardan ibarətdir sözlər, adətən boşluq və ya sətir fasilələri ilə ayrılır (xüsusi hal: bəzi sözlər özlərindən sonra ayırıcı tələb etmir). Hər hansı söz bəzilərinə uyğun gələn simvolların hərf-həssas ardıcıllığıdır müəyyənləşdirilməsi (kobud desək, tərcüməçi bu sözlə qarşılaşdıqda nə etməlidir). Əgər sözün tərifi yoxdursa, tərcüməçi onu ədəd kimi təhlil etməyə və yığının üzərinə itələməyə çalışır. Yeri gəlmişkən, buradakı rəqəmlər - birdən-birə - 257 bitlik tam ədədlərdir və kəsrlər ümumiyyətlə yoxdur - daha dəqiq desək, onlar dərhal rasional kəsrin payını və məxrəcini təşkil edən bir cüt tam ədədə çevrilirlər.

Sözlər yığının yuxarısındakı dəyərlərlə qarşılıqlı əlaqədə olur. Sözlərin ayrı növü - prefiks - yığından deyil, mənbə faylından onları izləyən simvollardan istifadə edir. Məsələn, sətir literalları belə həyata keçirilir - sitat simvolu (") növbəti (bağlama) sitatı axtaran və aralarındakı sətiri yığının üzərinə itələyən prefiks sözdür. Tək laynerlər eyni şəkildə davranırlar (//) və çoxsətirli (/*) şərhlər.

Dilin demək olar ki, bütün daxili quruluşu burada sona çatır. Qalan hər şey (nəzarət konstruksiyaları daxil olmaqla) sözlər kimi müəyyən edilir (yaxud daxili, məsələn hesab əməliyyatları və yeni sözlərin müəyyən edilməsi; və ya "standart kitabxanada" müəyyən edilir. Fift.fifqovluğunda olan crypto/fift mənbələrdə).

Fift proqramının sadə nümunəsi:

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

Birinci sətir yeni sözü müəyyən edir setxy (prefiksə diqqət yetirin {, bağlanmadan əvvəl blok yaradır } və prefiks :, əslində sözü müəyyən edir). setxy yığının yuxarı hissəsindən bir ədəd götürür, onu qlobal olaraq təyin edir (və ya yenidən təyin edir). Sabit x, və sabit olaraq bu ədədin kvadratı y (Sabitlərin dəyərlərinin yenidən təyin oluna biləcəyini nəzərə alsaq, mən onları dəyişən adlandırmaq istərdim, amma dildə adlandırma konvensiyasına əməl edirəm).

Növbəti iki sətir bir nömrəni yığının üzərinə itələyir, zəng edin setxy, sonra sabitlərin dəyərləri göstərilir x, y (çıxış sözündən istifadə edir .), hər iki sabit yığının üzərinə itələnir, yekunlaşdırılır və nəticə də göstərilir. Nəticədə görəcəyik:

3 9 12 ok
7 49 56 ok

("OK" xətti interaktiv giriş rejimində cari xəttin işlənməsini bitirdikdə tərcüməçi tərəfindən çıxarılır)

Və burada tam kod nümunəsi:

"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

Bu qorxulu görünüşlü fayl ağıllı müqavilə yaratmaq üçündür - o, fayla yerləşdiriləcək new-wallet-query.boc edamdan sonra. Nəzərə alın ki, burada TON Virtual Maşın üçün başqa bir montaj dili istifadə olunur (bu barədə ətraflı danışmayacağam), təlimatları blokçeyndə yerləşdiriləcək.

Beləliklə, TVM üçün assembler Fift-də yazılmışdır - bu assembler üçün mənbə kodu fayldadır crypto/fift/Asm.fif və yuxarıdakı kod parçasının əvvəlində birləşdirilir.

Nə deyə bilərəm ki, Nikolay Durov sadəcə yeni proqramlaşdırma dilləri yaratmağı sevir 🙂

Ağıllı müqavilənin yaradılması və TON ilə qarşılıqlı əlaqə

Beləliklə, fərz edək ki, TON müştərisini və Fift tərcüməçisini yuxarıda təsvir olunduğu kimi yığdıq və dillə tanış olduq. İndi ağıllı müqaviləni necə yaratmaq olar? Bu faylda təsvir edilmişdir NECƏmənbəyə əlavə olunur.

TON-da hesablar

-də təsvir etdiyim kimi TON baxışı, bu şəbəkə birdən çox blockchain ehtiva edir - bir ümumi, sözdə var. “masterchain”, həmçinin 32 bitlik nömrə ilə müəyyən edilmiş ixtiyari sayda əlavə “iş zəncirləri”. Masterchain -1 identifikatoruna malikdir, ona əlavə olaraq 0 identifikatoru olan “baza” iş zəncirindən də istifadə edilə bilər.Hər bir işçi zəncirinin öz konfiqurasiyası ola bilər. Daxili olaraq, hər bir işçi zəncir zəncirinə bölünür, lakin bu, yadda saxlamaq lazım olmayan bir icra detalıdır.

Bir iş zəncirində öz account_id identifikatorları olan bir çox hesab saxlanılır. Masterchain və null workchain üçün onlar 256 bit uzunluğundadır. Beləliklə, hesab ID-si, məsələn, belə yazılır:

-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Bu, "xam" formatdır: əvvəlcə işçi zəncirinin identifikatoru, sonra iki nöqtə və hexadecimal notationda hesab ID-si.

Bundan əlavə, qısaldılmış bir format var - iş zəncirinin nömrəsi və hesab ünvanı ikili formada kodlanır, onlara yoxlama məbləği əlavə olunur və bütün bunlar Base64-də kodlanır:

Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb

Bu qeyd formatını bilərək, komandadan istifadə edərək test müştərisi vasitəsilə bəzi hesabın cari vəziyyətini sorğulaya bilərik

getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Belə bir cavab alırıq:

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

Göstərilən iş zəncirinin DHT-də saxlanılan strukturu görürük. Məsələn, sahədə storage.balance hesabın cari qalığıdır, in storage.state.code - ağıllı müqavilə kodu və daxil storage.state.data - onun cari məlumatları. Nəzərə alın ki, TON məlumat yaddaşı - Hüceyrə, hüceyrələr - ağaca bənzəyir, hər bir xananın həm öz verilənləri, həm də uşaq hüceyrələri ola bilər. Bu, son sətirlərdə girinti kimi göstərilir.

Ağıllı müqavilə qurmaq

İndi özümüz belə bir struktur yaradaq (buna BOC deyilir - hüceyrə çantası) Fift dilindən istifadə etməklə. Xoşbəxtlikdən, özünüz ağıllı bir müqavilə yazmağa ehtiyac yoxdur - qovluqda crypto/block mənbə arxivindən bir fayl var new-wallet.fif, bu bizə yeni pul kisəsi yaratmağa kömək edəcək. Gəlin onu yığılmış müştəri ilə qovluğa kopyalayaq (~/liteclient-build, yuxarıdakı təlimatlara əməl etmisinizsə). Mən onun məzmununu Fift-də kod nümunəsi kimi yuxarıda qeyd etdim.

Bu faylı aşağıdakı kimi icra edirik:

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

Burada <source-directory> qablaşdırılmamış mənbələrə gedən yol ilə əvəz edilməlidir (burada “~” simvolu istifadə edilə bilməz, təəssüf ki, tam yol lazımdır). Açardan istifadə etmək əvəzinə -I mühit dəyişənini təyin edə bilərsiniz FIFTPATH və bu yolu ona daxil edin.

Fift-i fayl adı ilə işə saldığımızdan new-wallet.fif, onu icra edəcək və çıxacaq. Fayl adını buraxsanız, tərcüməçi ilə interaktiv şəkildə oynaya bilərsiniz.

İcradan sonra konsolda belə bir şey görünməlidir:

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)

Bu o deməkdir ki, pul kisəsi şəxsiyyət vəsiqəsi ilə -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (və ya eyni olan, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) uğurla yaradılmışdır. Müvafiq kod faylda olacaq new-wallet-query.boc, onun ünvanı var new-wallet.addr, və şəxsi açar içəridədir new-wallet.pk (ehtiyatlı olun - skriptin yenidən işə salınması bu faylların üzərinə yazılacaq).

Əlbəttə ki, TON şəbəkəsi hələ bu pul kisəsi haqqında bilmir, o, yalnız bu fayllar şəklində saxlanılır. İndi onu şəbəkəyə yükləmək lazımdır. Düzdür, problem ondadır ki, ağıllı müqavilə yaratmaq üçün komissiya ödəməlisən və hesab balansı hələ də sıfırdır.

İş rejimində bu problem birjada qram almaqla (və ya başqa cüzdandan köçürməklə) həll olunacaq. Yaxşı, indiki test rejimində xüsusi ağıllı müqavilə işə salınıb, ondan 20 qrama qədər istəyə bilərsiniz.

Başqasının ağıllı müqaviləsinə sorğunun formalaşdırılması

Qramları sola və sağa paylayan ağıllı bir müqavilə tələbi, biz bunu edirik. Eyni qovluqda crypto/block faylı tapın 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

Biz də onu yığılmış müştəri ilə qovluğa saxlayacağıq, lakin beşinci sətri düzəldəcəyik - xəttdən əvvəl "constant dest_addr". Gəlin onu əvvəllər yaratdığınız pul kisəsinin ünvanı ilə əvəz edək (tam, qısaldılmış deyil). "-1:" əvvəlində yazmaq lazım deyil, əvəzinə əvvəlində "0x" qoyun.

Siz həmçinin xətti dəyişə bilərsiniz 6.666 Gram*/ constant amount tələb etdiyiniz qramla məbləğdir (20-dən çox deyil). Tam ədəd göstərsəniz belə, ondalık nöqtəni buraxın.

Nəhayət, xətti düzəltmək lazımdır 0x00000011 constant seqno. Burada birinci nömrə qram verən hesabda saxlanılan cari sıra nömrəsidir. Haradan almaq olar? Yuxarıda qeyd edildiyi kimi, müştərini işə salın və işə salın:

last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Ən sonunda ağıllı müqavilə məlumatları ehtiva edəcəkdir

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

0000000D nömrəsi (sizdə daha çox olacaq) və ardıcıllıqla əvəz edilməli olan bir sıra nömrəsi var. testgiver.fif.

Budur, faylı saxla və işə salın (./crypto/fift testgiver.fif). Çıxış bir fayl olacaq wallet-query.boc. Bu formalaşandır сообщение başqasının ağıllı müqaviləsinə - "filan hesaba bu qədər qram köçürmək" tələbi.

Müştəridən istifadə edərək onu şəbəkəyə yükləyin:

> 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

İndi zəng etsə last, və sonra yenidən qram tələb etdiyimiz hesabın statusunu tələb edin, onda onun ardıcıl nömrəsinin bir artdığını görməliyik - bu o deməkdir ki, bizim hesabımıza pul göndərdi.

Qalan son addım pul kisəmizin kodunu yükləməkdir (onun balansı artıq doldurulub, lakin ağıllı müqavilə kodu olmadan onu idarə edə bilməyəcəyik). həyata keçiririk sendfile new-wallet-query.boc - vəssalam, TON şəbəkəsində öz cüzdanınız var (hazırda yalnız bir sınaq olsa da).

Giden əməliyyatlar yaradın

Yaradılmış hesabın balansından pul köçürmək üçün bir fayl var crypto/block/wallet.fif, bu da yığılmış müştəri ilə qovluğa yerləşdirilməlidir.

Əvvəlki addımlara bənzər olaraq, köçürdüyünüz məbləği, alıcının ünvanını (dest_addr) və pul kisəsi seqnosunu düzəltməlisiniz (pul kisəsi işə salındıqdan sonra 1-ə bərabərdir və hər gedən əməliyyatdan sonra 1 artır - bunu görə bilərsiniz. hesabınızın statusunu sorğulayır). Testlər üçün, məsələn, mənim cüzdanımdan istifadə edə bilərsiniz - 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.

Başlanğıcda (./crypto/fift wallet.fif) skript cüzdanınızın ünvanını (köçürdüyünüz yerdən) və onun şəxsi açarını fayllardan götürəcək new-wallet.addr и new-wallet.pk, və alınan mesaj ona yazılacaq new-wallet-query.boc.

Əvvəlki kimi, əməliyyatı birbaşa həyata keçirmək üçün zəng edirik sendfile new-wallet-query.boc müştəridə. Bundan sonra blokçeynin vəziyyətini yeniləməyi unutmayın (last) və pul kisəmizin balansının və seqnosunun dəyişdiyini yoxlayın (getaccount <account_id>).

TON (Telegram Open Network) test müştərisi və ağıllı müqavilələr üçün yeni Fift dili

Hamısı budur, indi TON-da ağıllı müqavilələr yarada və onlara sorğu göndərə bilərik. Gördüyünüz kimi, cari funksionallıq, məsələn, qrafik interfeysi olan daha dost pul kisəsi hazırlamaq üçün artıq kifayətdir (lakin onun hər halda messencerin bir hissəsi kimi əlçatan olacağı gözlənilir).

Sorğuda yalnız qeydiyyatdan keçmiş istifadəçilər iştirak edə bilər. Daxil olunxahiş edirəm.

TON, TVM, Fift təhlili ilə məqalələrin davamı ilə maraqlanırsınız?

  • Bəli, TON-un ümumi icmalı ilə məqalələr silsiləsinin tamamlanmasını gözləyirəm

  • Bəli, Fift dili haqqında daha çox oxumaq maraqlıdır

  • Bəli, mən TON Virtual Maşın və onun üçün assembler haqqında daha çox öyrənmək istəyirəm

  • Xeyr, bunların heç biri məni maraqlandırmır.

39 istifadəçi səs verib. 12 istifadəçi bitərəf qalıb.

Telegram-ın TON-u işə salmaq planlarına münasibətiniz necədir?

  • Bu layihəyə böyük ümidlərim var.

  • Sadəcə onun inkişafını maraqla izləyirəm.

  • Mən skeptikəm, onun uğuruna şübhə edirəm

  • Mən bu təşəbbüsü uğursuz, geniş kütlələr üçün lazımsız hesab edirəm

47 istifadəçi səs verib. 12 istifadəçi bitərəf qalıb.

Mənbə: www.habr.com

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