Akıllı sözleşmeler için istemci TON'u (Telegram Açık Ağ) ve yeni Fift dilini test edin

Bir yıldan fazla bir süre önce, Telegram messenger'ın kendi merkezi olmayan ağını yayınlama planları biliniyordu Telgraf Açık Ağı. Daha sonra Nikolai Durov tarafından yazıldığı iddia edilen ve gelecekteki ağın yapısını açıklayan çok sayıda teknik belge ortaya çıktı. Kaçıranlar için bu belgenin yeniden anlatımını okumanızı tavsiye ederim (Bölüm 1, Bölüm 2; ne yazık ki üçüncü kısım hala taslaklarda toz topluyor).

O zamandan bu yana, birkaç gün öncesine kadar TON gelişiminin durumu hakkında önemli bir haber yoktu (birkaç gün öncesine kadar). resmi olmayan kanallar) sayfanın bağlantısı görünmedi https://test.ton.org/download.html, nerede bulunur:
ton-test-liteclient-full.tar.xz — TON test ağı için hafif istemci kaynakları;
ton-lite-client-test1.config.json — test ağına bağlanmak için yapılandırma dosyası;
README — istemciyi oluşturma ve başlatma hakkında bilgi;
NASIL — bir müşteriyi kullanarak akıllı sözleşme oluşturmaya ilişkin adım adım talimatlar;
ton.pdf — TON ağına teknik genel bakış içeren güncellenmiş belge (2 Mart 2019 tarihli);
tvm.pdf — TVM'nin teknik açıklaması (TON Sanal Makinesi, TON sanal makinesi);
tblkch.pdf — TON blok zincirinin teknik açıklaması;
beşinciüs.pdf — TON'da akıllı sözleşmeler oluşturmak için tasarlanan yeni Fift dilinin açıklaması.

Tekrar ediyorum, sayfanın ve Telegram'dan gelen tüm bu belgelerin resmi bir onayı yoktu, ancak bu materyallerin hacmi onları oldukça makul kılıyor. Yayınlanan istemciyi başlat kendi sorumluluğunda.

Test istemcisi oluşturma

Öncelikle bir test istemcisi oluşturup çalıştırmayı deneyelim - neyse ki README bu basit süreci ayrıntılı olarak açıklamaktadır. Bunu örnek olarak macOS 10.14.5 kullanarak yapacağım; diğer sistemlerdeki derlemenin başarısını garanti edemem.

  1. İndirin ve paketi açın kaynak arşivi. Bu aşamada geriye dönük uyumluluk garanti edilmediğinden en son sürümün indirilmesi önemlidir.

  2. Make, cmake (sürüm 3.0.2 veya üzeri), OpenSSL (C başlık dosyaları dahil), g++ veya clang'ın en son sürümlerinin sistemde yüklü olduğundan emin olun. Hiçbir şey kurmama gerek kalmadı, her şey hemen bir araya geldi.

  3. Kaynakların bir klasöre açıldığını varsayalım ~/lite-client. Bundan ayrı olarak, birleştirilmiş proje için boş bir klasör oluşturun (örneğin, ~/liteclient-build) ve ondan (cd ~/liteclient-build) komutları çağırın:

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

    Akıllı sözleşmeler için istemci TON'u (Telegram Açık Ağ) ve yeni Fift dilini test edin

    Akıllı sözleşmelere yönelik Beşinci dil tercümanını oluşturmak için (bu konuda daha fazla bilgi aşağıdadır), ayrıca şunu da çağırıyoruz:

    cmake --build . --target fift

  4. Güncel olanı indirin yapılandırma dosyası test ağına bağlanmak ve onu birleştirilmiş istemcinin bulunduğu klasöre koymak için.

  5. Bitirmek, istemciyi başlatabilirsiniz:

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

Her şey doğru yapılırsa şöyle bir şey görmelisiniz:

Akıllı sözleşmeler için istemci TON'u (Telegram Açık Ağ) ve yeni Fift dilini test edin

Gördüğümüz gibi, birkaç tane kullanılabilir komut var:
help — bu komut listesini görüntüleyin;
quit - dışarı çıkmak;
time — sunucudaki geçerli saati göster;
status — bağlantıyı ve yerel veritabanı durumunu gösterin;
last — Blockchain'in durumunu güncelleyin (son bloğu indirin). Ağın mevcut durumunu gördüğünüzden emin olmak için herhangi bir istekten önce bu komutu çalıştırmanız önemlidir.
sendfile <filename> — TON ağına yerel bir dosya yükleyin. Ağ ile etkileşim bu şekilde gerçekleşir; örneğin, yeni akıllı sözleşmelerin oluşturulması ve hesaplar arasında fon transferi talepleri;
getaccount <address> - akımı göster (komutun yürütüldüğü andaki) last) belirtilen adrese sahip hesabın durumu;
privkey <filename> — özel anahtarı yerel bir dosyadan yükleyin.

İstemciyi başlatırken seçeneği kullanarak bir klasörü ona aktarırsanız -D, ardından masterchain'in son bloğunu buna ekleyecektir:

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

Artık daha ilginç şeylere geçebiliriz - Fift dilini öğrenin, akıllı bir sözleşme derlemeye çalışın (örneğin, bir test cüzdanı oluşturun), onu ağa yükleyin ve hesaplar arasında para aktarmayı deneyin.

Dil Beşinci

Belgeden beşinciüs.pdf Telegram ekibinin akıllı sözleşmeler oluşturmak için yeni bir yığın dili oluşturduğunu öğrenebilirsiniz Beşinci (görünüşe göre rakamdan beşinci, Beşinci'nin pek çok ortak noktaya sahip olduğu bir dil olan Forth'a benzer).

Belge oldukça hacimli, 87 sayfa ve bu yazı çerçevesinde içeriğini ayrıntılı olarak tekrar anlatmayacağım (en azından kendim okumayı bitirmediğim için :). Ana noktalara odaklanıp bu dilde birkaç kod örneği vereceğim.

Temel düzeyde, Fift'in sözdizimi oldukça basittir: kodu şunlardan oluşur: sözlergenellikle boşluklarla veya satır sonlarıyla ayrılır (özel durum: bazı kelimelerin ardından ayırıcı kullanılması gerekmez). Herhangi kelime belirli bir harfe karşılık gelen, büyük/küçük harfe duyarlı bir karakter dizisidir tanım (kabaca tercümanın bu kelimeyle karşılaştığında yapması gereken şey). Bir kelimenin tanımı yoksa yorumlayıcı onu sayı olarak ayrıştırmaya ve yığına koymaya çalışır. Bu arada, buradaki sayılar - aniden - 257 bitlik tam sayılardır ve hiç kesir yoktur - daha doğrusu, hemen bir çift tam sayıya dönüşerek rasyonel bir kesrin payını ve paydasını oluştururlar.

Kelimeler yığının en üstündeki değerlerle etkileşime girme eğilimindedir. Ayrı bir kelime türü - önek — yığını değil, kaynak dosyadaki sonraki karakterleri kullanır. Örneğin, dize değişmezleri bu şekilde uygulanır - tırnak karakteri (") bir sonraki (kapanış) alıntıyı arayan ve aralarındaki dizeyi yığına iten bir önek sözcüğüdür. Tek gömlekler aynı şekilde davranır (//) ve çok satırlı (/*) yorumlar.

Dilin neredeyse tüm iç yapısının bittiği yer burasıdır. Diğer her şey (kontrol yapıları dahil) kelimeler olarak tanımlanır (ya aritmetik işlemler ve yeni kelimelerin tanımı gibi dahili olarak; ya da "standart kütüphanede" tanımlanır) Fift.fif, klasörde bulunan crypto/fift Kaynaklarda).

Fift'te basit bir örnek program:

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

İlk satır yeni bir kelimeyi tanımlar setxy (ön eke dikkat edin {kapanış blokundan önce bir blok oluşturur } ve önek :, aslında kelimeyi tanımlayan). setxy yığının en üstünden bir sayı alır, onu global olarak tanımlar (veya yeniden tanımlar) devamlı xve bu sayının karesi sabit olarak y (Sabitlerin değerlerinin yeniden tanımlanabileceği göz önüne alındığında, onları değişken olarak adlandırmayı tercih ederim, ancak dildeki adlandırma kuralını takip ediyorum).

Sonraki iki satır yığına bir sayı koyar ve çağırır setxy, ardından sabitlerin değerleri görüntülenir x, y (kelime çıktı için kullanılır .), her iki sabit de yığına yerleştirilir, toplanır ve sonuç da yazdırılır. Sonuç olarak şunları göreceğiz:

3 9 12 ok
7 49 56 ok

(Etkileşimli giriş modunda geçerli satırın işlenmesi tamamlandığında yorumlayıcı tarafından “tamam” satırı yazdırılır)

Tam kod örneği:

"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 korkutucu görünen dosya akıllı bir sözleşme oluşturmak içindir - bir dosyaya yerleştirilecektir new-wallet-query.boc infazdan sonra. Lütfen burada TON Sanal Makinesi için başka bir montaj dilinin kullanıldığını unutmayın (bunun üzerinde ayrıntılı olarak durmayacağım), talimatları blockchain'e yerleştirilecektir.

Böylece, TVM için birleştirici Beşli'de yazılmıştır - bu birleştiricinin kaynakları dosyadadır crypto/fift/Asm.fif ve yukarıdaki kod parçasının başına bağlanır.

Ne diyebilirim ki, görünüşe göre Nikolai Durov yeni programlama dilleri yaratmayı çok seviyor :)

Akıllı bir sözleşme oluşturma ve TON ile etkileşim kurma

Yani, yukarıda açıklandığı gibi TON istemcisini ve Fift yorumlayıcısını bir araya getirdiğimizi ve dile aşina olduğumuzu varsayalım. Şimdi akıllı sözleşme nasıl oluşturulur? Bu dosyada açıklanmıştır NASIL, kaynaklara eklenmiştir.

TON cinsinden hesaplar

tarif ettiğim gibi TON incelemesi, bu ağ birden fazla blockchain içeriyor - sözde ortak bir tane var. "ana zincir" ve 32 bitlik bir sayıyla tanımlanan isteğe bağlı sayıda ek "iş zinciri". Ana zincir -1 tanımlayıcısına sahiptir, buna ek olarak tanımlayıcısı 0 olan bir “temel” iş zinciri de kullanılabilir. Her iş zincirinin kendi konfigürasyonu olabilir. Dahili olarak her çalışma zinciri, parça zincirlerine bölünmüştür ancak bu, akılda tutulması gerekmeyen bir uygulama detayıdır.

Bir çalışma zincirinde, kendi account_id tanımlayıcılarına sahip birçok hesap depolanır. Ana zincir ve sıfır çalışma zinciri için bunlar 256 bit uzunluğundadır. Böylece hesap tanımlayıcı örneğin şu şekilde yazılır:

-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Bu "ham" formattır: önce çalışma zinciri kimliği, ardından iki nokta üst üste ve onaltılık gösterimle hesap kimliği.

Ek olarak kısaltılmış bir format da vardır - çalışma zinciri numarası ve hesap adresi ikili biçimde kodlanır, bunlara bir sağlama toplamı eklenir ve bunların tümü Base64'te kodlanır:

Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb

Bu kayıt formatını bildiğimizde, şu komutu kullanarak bir test istemcisi aracılığıyla bir hesabın mevcut durumunu talep edebiliriz:

getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

Bunun gibi bir şey elde edeceğiz:

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

Belirtilen çalışma zincirinin DHT'sinde saklanan yapıyı görüyoruz. Örneğin, sahada storage.balance cari hesap dengesi, storage.state.code - akıllı sözleşme kodu ve storage.state.data - mevcut verileri. Lütfen TON veri depolama alanının (Hücre, hücreler) ağaç benzeri olduğunu, her hücrenin hem kendi verilerine hem de alt hücrelere sahip olabileceğini unutmayın. Bu, son satırlarda girinti olarak gösterilmiştir.

Akıllı sözleşme oluşturma

Şimdi kendimiz böyle bir yapı oluşturalım (buna BOC denir - hücre torbası) Beşinci dili kullanarak. Neyse ki, akıllı sözleşmeyi kendiniz yazmanıza gerek yok - klasöre crypto/block kaynak arşivden bir dosya var new-wallet.fifbu da yeni bir cüzdan oluşturmamıza yardımcı olacak. Birleştirilmiş istemcinin bulunduğu klasöre kopyalayalım (~/liteclient-build, yukarıdaki talimatları izlediyseniz). İçeriğini yukarıda Fift'teki kod örneği olarak aktardım.

Bu dosyayı aşağıdaki gibi yürütün:

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

öyle <source-directory> paketlenmemiş kaynaklara giden yolla değiştirilmelidir (“~” sembolü ne yazık ki burada kullanılamaz, tam yola ihtiyaç vardır). Anahtar kullanmak yerine -I bir ortam değişkeni tanımlayabilirsiniz FIFTPATH ve bu yolu onun içine koy.

Fift'i dosya adıyla başlattığımızdan beri new-wallet.fif, onu yürütecek ve çıkacaktır. Dosya adını atlarsanız yorumlayıcıyla etkileşimli olarak oynayabilirsiniz.

Yürütmeden sonra konsolda buna benzer bir şey görüntülenmelidir:

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, kimliğe sahip cüzdanın -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (ya da aynı olan şey, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) başarıyla oluşturuldu. İlgili kod dosyada olacaktır new-wallet-query.boc, adresi burada new-wallet.addrve özel anahtar şurada new-wallet.pk (dikkatli olun; betiği tekrar çalıştırmak bu dosyaların üzerine yazılmasına neden olacaktır).

Elbette TON ağının henüz bu cüzdandan haberi yok, sadece bu dosyalar şeklinde saklanıyor. Şimdi ağa yüklenmesi gerekiyor. Ancak sorun şu ki, akıllı bir sözleşme oluşturmak için komisyon ödemeniz gerekiyor ve hesap bakiyeniz hala sıfır.

Çalışma modunda bu sorun borsadan gram satın alınarak (veya başka bir cüzdandan aktarılarak) çözülecektir. Mevcut test modunda, 20 grama kadar isteyebileceğiniz özel bir akıllı sözleşme oluşturuldu.

Başka birinin akıllı sözleşmesine istek oluşturmak

Gramları sağa sola bu şekilde dağıtan bir akıllı sözleşme talebinde bulunuyoruz. Aynı klasörde crypto/block dosyayı bul 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

Ayrıca onu birleştirilmiş istemcinin bulunduğu klasöre kaydedeceğiz, ancak beşinci satırı - " satırından önce düzelteceğiz "constant dest_addr". Bunu daha önce oluşturduğunuz cüzdanın adresiyle (tam, kısaltılmamış) değiştirelim. Başına “-1:” yazmanıza gerek yok, bunun yerine başına “0x” yazın.

Ayrıca satırı değiştirebilirsiniz 6.666 Gram*/ constant amount — talep ettiğiniz gram cinsinden miktardır (en fazla 20). Tam sayı belirtseniz bile virgülü bırakın.

Son olarak çizgiyi düzeltmeniz gerekiyor 0x00000011 constant seqno. Buradaki ilk sayı, hesap veren gramda saklanan güncel sıra numarasıdır. Nereden alabilirim? Yukarıda belirtildiği gibi istemciyi başlatın ve çalıştırın:

last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d

En sonunda akıllı sözleşme verileri şunları içerecektir:

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

0000000D sayısı (sizinki daha büyük olacaktır), yerine kullanılması gereken sıra numarasıdır. testgiver.fif.

İşte bu, dosyayı kaydedin ve çalıştırın (./crypto/fift testgiver.fif). Çıktı bir dosya olacak wallet-query.boc. Oluşan şey bu mesaj başka birinin akıllı sözleşmesine - "şu kadar gramın falan hesaba aktarılması" talebi.

İstemciyi kullanarak onu ağa yüklüyoruz:

> 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

Eğer şimdi ararsan last, ardından tekrar gram istediğimiz hesabın durumunu talep edersek sıra numarasının bir arttığını görmeliyiz - bu da hesabımıza para gönderdiği anlamına gelir.

Son adım kaldı - cüzdanımızın kodunu indirin (bakiyesi zaten yenilendi, ancak akıllı sözleşme kodu olmadan onu yönetemeyeceğiz). biz yürütüyoruz sendfile new-wallet-query.boc - işte bu kadar, TON ağında kendi cüzdanınız var (şimdilik sadece bir test olsa bile).

Giden işlemler oluşturma

Oluşturulan hesabın bakiyesinden para aktarmak için bir dosya var crypto/block/wallet.fif, ayrıca birleştirilmiş istemcinin bulunduğu klasöre de yerleştirilmesi gerekir.

Önceki adımlara benzer şekilde, aktardığınız tutarı, alıcının adresini (dest_addr) ve cüzdanınızın sıra numarasını (cüzdanı başlattıktan sonra 1'e eşittir ve her giden işlemden sonra 1 artar) ayarlamanız gerekir; hesabınızın durumunu sorarak görebilirsiniz) . Testler için örneğin cüzdanımı kullanabilirsiniz - 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.

Başlangıçta (./crypto/fift wallet.fif) komut dosyası, cüzdanınızın adresini (aktarım yaptığınız yerden) ve özel anahtarını dosyalardan alacaktır. new-wallet.addr и new-wallet.pkve alınan mesaj şuraya yazılacaktır: new-wallet-query.boc.

Daha önce olduğu gibi, işlemi doğrudan gerçekleştirmek için arayın sendfile new-wallet-query.boc istemcide. Bundan sonra blockchain durumunu güncellemeyi unutmayın (last) ve cüzdanımızın bakiyesinin ve sırasının değiştiğini kontrol edin (getaccount <account_id>).

Akıllı sözleşmeler için istemci TON'u (Telegram Açık Ağ) ve yeni Fift dilini test edin

Hepsi bu, artık TON'da akıllı sözleşmeler oluşturup onlara istek gönderebiliyoruz. Gördüğünüz gibi, mevcut işlevsellik, örneğin grafik arayüzlü daha kullanıcı dostu bir cüzdan oluşturmak için zaten yeterli (ancak bunun mesajlaşma uygulamasının bir parçası olarak zaten mevcut olması bekleniyor).

Ankete sadece kayıtlı kullanıcılar katılabilir. Giriş yapLütfen.

TON, TVM, Fift analizleriyle ilgili yazılara devam etmek ister misiniz?

  • Evet, TON'a genel bir bakış sunan makale serisinin tamamlanmasını bekliyorum

  • Evet, Beşinci dil hakkında daha fazlasını okumak ilginç

  • Evet, TON Sanal Makinesi ve bunun için birleştirici hakkında daha fazla bilgi edinmek istiyorum

  • Hayır bunların hiçbiri ilginç değil

39 kullanıcı oy kullandı. 12 kişi çekimser kaldı.

Telegram'ın TON'u başlatma planları hakkında ne düşünüyorsunuz?

  • Bu projeden büyük umutlarım var

  • Gelişimini ilgiyle takip ediyorum.

  • Başarısından şüpheliyim ve şüpheliyim.

  • Bu girişimi bir başarısızlık ve geniş kitleler için gereksiz olarak değerlendirme eğilimindeyim.

47 kullanıcı oy kullandı. 12 kişi çekimser kaldı.

Kaynak: habr.com

Yorum ekle