Lebih dari setahun yang lalu, diketahui tentang rencana messenger Telegram untuk merilis jaringan terdesentralisasi Telegram Open Network . Kemudian dokumen teknis yang banyak tersedia, yang, mungkin, ditulis oleh Nikolai Durov dan menggambarkan struktur jaringan masa depan. Bagi mereka yang ketinggalan, saya sarankan Anda membiasakan diri dengan pencabutan kembali dokumen ini ( bagian 1 , bagian 2 ; bagian ketiga, sayangnya, masih mengumpulkan debu dalam konsep).
Sejak itu, tidak ada berita penting tentang status pengembangan TON, sampai beberapa hari yang lalu (di salah satu saluran tidak resmi ) sebuah tautan muncul di halaman https://test.ton.org/download.html , di mana:
◦ ton-test-liteclient-full.tar.xz - kode sumber klien ringan untuk jaringan uji TON;
◦ ton-lite-client-test1.config.json - file konfigurasi untuk menghubungkan ke jaringan uji;
◦ README - informasi tentang membangun dan memulai klien;
◦ HOWTO - petunjuk langkah demi langkah tentang cara membuat kontrak pintar menggunakan klien;
◦ ton.pdf - dokumen yang diperbarui (tanggal 2 Maret 2019) dengan tinjauan teknis jaringan TON;
◦ tvm.pdf - deskripsi teknis TVM (TON Virtual Machine, TON virtual machine);
◦ tblkch.pdf - deskripsi teknis dari blockchain TON;
◦ fiftybase.pdf - deskripsi bahasa Fift baru, yang dirancang untuk membuat kontrak pintar dalam TON.
Saya ulangi, tidak ada konfirmasi resmi halaman dan semua dokumen ini oleh Telegram, tetapi volume materi ini membuatnya cukup masuk akal. Jalankan klien yang diterbitkan dengan risiko Anda sendiri .
Uji membangun klien
Pertama, mari kita coba membangun dan menjalankan klien uji - untungnya, README menjelaskan proses sederhana ini secara terperinci. Saya akan melakukan ini dengan menggunakan contoh macOS 10.14.5, saya tidak dapat menjamin keberhasilan perakitan pada sistem lain.
Unduh dan buka paket arsip dengan kode sumber . Penting untuk mengunduh versi terbaru, karena kompatibilitas ke belakang tidak dijamin pada tahap ini.
Kami memastikan bahwa versi terbaru dari make, cmake (versi 3.0.2 atau lebih tinggi), OpenSSL (termasuk file header C), g ++ atau dentang dipasang pada sistem. Saya tidak perlu menginstal ulang apa pun, semuanya langsung terkumpul.
Misalkan sumber dibongkar ke folder ~/lite-client
. Secara terpisah, kami membuat folder kosong untuk proyek yang dirakit (misalnya, ~/liteclient-build
), dan darinya ( cd ~/liteclient-build
) kami cd ~/liteclient-build
perintah:
cmake ~/lite-client cmake --build . --target test-lite-client

Untuk membangun juru bahasa Fift untuk kontrak pintar (lihat di bawah), kami juga menelepon
cmake --build . --target fift
Unduh file konfigurasi saat ini untuk terhubung ke jaringan tes dan meletakkannya di folder dengan klien yang berkumpul.
Selesai , Anda dapat memulai klien:
./test-lite-client -C ton-lite-client-test1.config.json
Jika semuanya dilakukan dengan benar, maka Anda akan melihat sesuatu seperti ini:

Seperti yang Anda lihat, ada beberapa perintah yang tersedia:
◦ help
- tampilkan daftar perintah ini;
◦ quit
- keluar;
◦ time
- menunjukkan waktu saat ini di server;
◦ status
- menunjukkan status koneksi dan database lokal;
◦ last
- perbarui status blockchain (muat blok terakhir). Penting untuk mengeksekusi perintah ini sebelum permintaan apa pun untuk memastikan bahwa Anda melihat kondisi jaringan saat ini.
◦ sendfile
<filename>
- unggah file lokal ke jaringan TON. Ini adalah interaksi dengan jaringan - termasuk, misalnya, pembuatan kontrak pintar baru dan permintaan untuk mentransfer dana antar akun;
◦ getaccount
<address>
- menunjukkan status akun saat ini (pada saat perintah last
dijalankan) dengan alamat yang ditentukan;
◦ privkey
<filename>
- memuat kunci pribadi dari file lokal.
Jika pada saat peluncuran klien, Anda meneruskan folder ke sana menggunakan opsi -D
, maka itu akan menambahkan blok terakhir dari rantai induk ke dalamnya:
./test-lite-client -C ton-lite-client-test1.config.json -D ~/ton-db-dir
Sekarang kita dapat beralih ke hal-hal yang lebih menarik - mempelajari bahasa Fift, mencoba menyusun kontrak pintar (misalnya, membuat dompet uji), mengunggahnya ke jaringan dan mencoba mentransfer dana antar akun.
Lima bahasa
Dari limabase.pdf, Anda dapat mengetahui bahwa untuk membuat kontrak yang cerdas, tim Telegram menciptakan bahasa tumpukan baru Fift (tampaknya, dari angka kelima , dengan analogi dengan Forth - bahasa yang digunakan Fift untuk memiliki banyak kesamaan).
Dokumen ini cukup banyak, dengan 87 halaman, dan saya tidak akan menceritakan kembali isinya secara rinci dalam kerangka artikel ini (setidaknya karena saya sendiri tidak selesai membacanya :). Saya akan membahas poin utama dan memberikan beberapa contoh kode dalam bahasa ini.
Pada tingkat dasar, sintaks Fift cukup sederhana: kodenya terdiri dari kata - kata , biasanya dipisahkan oleh spasi atau jeda baris (kasus khusus: beberapa kata tidak memerlukan pembatas setelah dirinya sendiri). Kata apa pun adalah urutan karakter yang peka terhadap huruf besar-kecil yang sesuai dengan beberapa definisi (secara kasar, apa yang harus dilakukan penerjemah ketika menemukan kata ini). Jika tidak ada definisi kata, penerjemah akan mencoba menguraikannya sebagai angka dan meletakkannya di tumpukan. By the way, angka-angka di sini tiba-tiba bilangan bulat 257-bit, tetapi tidak ada bilangan pecahan sama sekali - lebih tepatnya, mereka segera berubah menjadi sepasang bilangan bulat, membentuk pembilang dan penyebut dari pecahan rasional.
Kata-kata biasanya berinteraksi dengan makna di bagian atas tumpukan. Jenis kata yang terpisah - awalan - tidak menggunakan tumpukan, tetapi karakter berikutnya dari file sumber. Misalnya, string literal diimplementasikan dengan cara ini - karakter "tanda kutip" ( "
) adalah kata awalan yang mencari tanda kutip (penutup) berikutnya dan menempatkan string di antara mereka di tumpukan. Single-line ( //
) dan multi-line ( /*
) berperilaku dengan cara yang sama. komentar.
Tentang ini, hampir seluruh struktur internal bahasa berakhir. Segala sesuatu yang lain (termasuk struktur kontrol) didefinisikan sebagai kata-kata (baik internal, seperti operasi aritmatika dan definisi kata-kata baru, atau didefinisikan dalam "perpustakaan standar" Fift.fif
, yang terletak di crypto/fift
di sumber).
Contoh sederhana program Fift:
{ dup =: x dup * =: y } : setxy 3 setxy x . y . xy + . 7 setxy x . y . xy + .
Baris pertama mendefinisikan setxy
kata baru (perhatikan awalan {
, yang membuat blok sebelum penutup }
dan awalan setxy
yang sebenarnya mendefinisikan kata). setxy
mengambil angka dari atas tumpukan, mendefinisikan (atau mendefinisikan ulang) sebagai konstanta global x
, dan kuadrat dari angka ini sebagai konstanta y
(mengingat bahwa nilai-nilai konstanta dapat didefinisikan ulang, saya lebih suka memanggil mereka variabel, tetapi saya mengikuti penamaannya dalam bahasa).
Dalam dua baris berikutnya, nomor diletakkan di stack, setxy
, maka nilai konstanta x
, y
output (kata tersebut digunakan untuk output .
), Kedua konstanta diletakkan di stack, dijumlahkan dan hasilnya juga ditampilkan. Sebagai hasilnya, kita akan melihat:
3 9 12 ok 7 49 56 ok
(Interpreter mencetak garis "ok" ketika selesai memproses garis saat ini dalam mode input interaktif)
Nah, contoh kode lengkap:
"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 <bb{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 <bb{1000100} s, wc 8 i, wallet_addr 256 u, b{000010} s, swap <ss, b{0} s, swap B, swap <ss, 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
File yang tampak menakutkan ini dirancang untuk membuat kontrak yang cerdas - file itu akan ditempatkan di file new-wallet-query.boc
setelah eksekusi. Harap dicatat bahwa di sini digunakan bahasa rakitan lain untuk Mesin Virtual TON (saya tidak akan membahasnya secara rinci), instruksi yang akan ditempatkan di blockchain.
Dengan demikian, assembler untuk TVM ditulis dalam Fift - sumber assembler ini ada di file crypto/fift/Asm.fif
dan terhubung pada awal potongan kode di atas.
Apa yang bisa saya katakan, ternyata, Nikolai Durov hanya suka membuat bahasa pemrograman baru :)
Membuat kontrak yang cerdas dan berinteraksi dengan TON
Jadi, misalkan kita mengumpulkan klien TON dan juru bahasa Fift, seperti yang dijelaskan di atas, dan menjadi terbiasa dengan bahasa tersebut. Bagaimana cara membuat kontrak pintar sekarang? Ini dijelaskan dalam file HOWTO yang dilampirkan pada sumbernya.
Akun TON
Seperti yang saya jelaskan dalam ulasan TON , jaringan ini mengandung lebih dari satu blockchain - ada satu yang umum, yang disebut "Rantai induk", serta sejumlah tambahan "rantai kerja" tambahan yang diidentifikasi oleh nomor 32-bit. Rantai master memiliki pengidentifikasi -1, selain itu, rantai kerja "dasar" dengan pengidentifikasi 0 juga dapat digunakan. Setiap rantai kerja dapat memiliki konfigurasi sendiri. Secara internal, setiap kelompok kerja dibagi menjadi shardchains, tetapi ini sudah merupakan detail dari implementasi, yang tidak harus diingat.
Banyak akun disimpan dalam satu rantai kerja, yang memiliki pengidentifikasi akun_id mereka sendiri. Untuk rantai master dan rantai kerja nol, mereka memiliki panjang 256 bit. Jadi, pengenal akun ditulis, misalnya, seperti ini:
-1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d
Ini adalah format "mentah": pertama, pengidentifikasi workchain, lalu titik dua, dan pengidentifikasi akun dalam notasi heksadesimal.
Selain itu, ada format singkat - nomor workchain dan alamat akun dikodekan dalam bentuk biner, sebuah checksum ditambahkan ke dalamnya dan semua ini dikodekan di Base64:
Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb
Mengetahui format rekaman ini, kami dapat meminta status akun saat ini melalui klien uji menggunakan perintah
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d
Kami mendapat jawaban seperti ini:
[ 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}
-client.cpp: [ 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}
untuk -1: 8156775B79325E5D62E742D9B96C30B6515A5CD2F1F64C5DA4B193C03F070E0D sehubungan dengan blok (-1,8000000000000000,72355): F566005749C1B97F18EDE013EBA7A054B9014961BC1AD91F475B9082919A2296: 1BD5DE54333164025EE39D389ECE2E93DA2871DA616D488253953E52B50DC03F dan [ 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}
Kami melihat struktur yang disimpan dalam DHT dari workchain yang ditentukan. Misalnya, dalam bidang storage.balance
adalah saldo akun saat ini, di storage.state.code
adalah kode kontrak pintar, dan di storage.state.data
adalah data saat ini. Perhatikan bahwa penyimpanan data TON - Sel, sel - adalah pohon, setiap sel dapat memiliki data sendiri, serta sel anak. Ini ditampilkan sebagai lekukan di baris terakhir.
Perakitan kontrak yang cerdas
Sekarang mari kita buat struktur seperti itu sendiri (disebut BOC - kantong sel ) menggunakan bahasa Fift. Untungnya, Anda tidak perlu menulis sendiri kontrak pintar - di folder crypto/block
dari arsip sumber ada file new-wallet.fif
yang akan membantu kami membuat dompet baru. Salin ke folder dengan klien rakitan ( ~/liteclient-build
, jika Anda ~/liteclient-build
instruksi di atas). Saya mengutip isinya di atas sebagai contoh kode pada Fift.
Kami menjalankan file ini sebagai berikut:
./crypto/fift -I"<source-directory>/crypto/fift" new-wallet.fif
Di sini <source-directory>
harus diganti dengan path ke sumber yang tidak dibongkar (simbol "~" tidak dapat digunakan di sini, sayangnya, Anda memerlukan path lengkap). Alih-alih menggunakan -I
Anda bisa mendefinisikan FIFTPATH
lingkungan FIFTPATH
dan memasukkan path ini ke dalamnya.
Karena kami meluncurkan Fift dengan nama file new-wallet.fif
, itu akan mengeksekusinya dan menyelesaikannya. Jika Anda menghilangkan nama file, Anda dapat bermain dengan penerjemah dalam mode interaktif.
Setelah eksekusi, sesuatu seperti ini harus ditampilkan di konsol:
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)
} 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)
Ini berarti bahwa dompet dengan pengidentifikasi -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2
(atau, yang merupakan hal yang sama, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ
Kode yang sesuai dengannya akan new-wallet-query.boc
dalam file new-wallet-query.boc
, alamatnya di new-wallet.addr
, dan kunci pribadi di new-wallet.pk
(hati-hati - memulai ulang skrip akan menimpa file-file ini).
Tentu saja, jaringan TON belum tahu tentang dompet ini, hanya disimpan dalam bentuk file-file ini. Sekarang Anda perlu mengunggahnya ke jaringan. Benar, masalahnya adalah untuk membuat kontrak pintar Anda perlu membayar komisi, dan saldo akun Anda masih nol.
Dalam mode kerja, masalah ini akan diselesaikan dengan membeli gram di bursa (atau dengan mentransfer dari dompet lain). Nah, dalam mode tes saat ini, kontrak pintar khusus telah dilembagakan, dari mana Anda dapat meminta hingga 20 gram begitu saja.
Minta kontrak yang cerdas, bagikan gram ke kiri dan kanan, lakukanlah. Dalam folder crypto/block
sama kita temukan file 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 // bx --> 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) <bb{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 <bb{1000100} s, wc 8 i, wallet_addr 256 u, 0 Gram, b{00} s, swap <ss, b> dup ."resulting external message: " <s csr. cr 2 boc+>B dup Bx. cr "wallet-query.boc" B>file
Kami juga menyimpannya di folder dengan klien yang dirakit, tetapi perbaiki baris kelima - sebelum baris " constant dest_addr
". Ganti dengan alamat dompet yang Anda buat sebelumnya (penuh, tidak disingkat). "-1:" Anda tidak perlu menulis di awal, alih-alih tulis "0x" di awal.
Anda juga dapat mengubah baris 6.666 Gram*/ constant amount
- ini adalah jumlah gram yang Anda minta (tidak lebih dari 20). Bahkan jika Anda menentukan bilangan bulat, tinggalkan titik desimal.
Akhirnya, Anda perlu memperbaiki garis 0x00000011 constant seqno
. Nomor pertama di sini adalah nomor urut saat ini, yang disimpan dalam akun yang mengeluarkan gram. Darimana mendapatkannya? Seperti yang disebutkan di atas, mulai klien dan jalankan:
last getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d
Di bagian paling akhir dalam data kontrak pintar akan
... x{FF0020DDA4F260D31F01ED44D0D31FD166BAF2A1F80001D307D4D1821804A817C80073FB0201FB00A4C8CB1FC9ED54} x{0000000D}
Nomor 0000000D (Anda akan memiliki lebih banyak) adalah nomor urut, yang harus diganti di testgiver.fif
.
Itu saja, simpan file dan jalankan ( ./crypto/fift testgiver.fif
). Outputnya akan menjadi file wallet-query.boc
. Ini adalah pesan yang dibentuk untuk kontrak pintar orang lain - permintaannya adalah "mentransfer begitu banyak gram ke akun ini dan itu."
Menggunakan klien, kami mengunggahnya ke jaringan:
> 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
Jika sekarang kita panggil last
, dan lagi-lagi meminta status akun dari mana kita meminta gram, maka kita akan melihat bahwa nomor urutnya telah bertambah satu - ini berarti ia mengirim uang ke akun kita.
Langkah terakhir tetap - kita memuat kode dompet kita (saldo sudah diisi ulang, tetapi tanpa kode kontrak pintar kita tidak akan bisa mengelolanya). sendfile new-wallet-query.boc
- dan hanya itu, Anda memiliki dompet Anda sendiri di jaringan TON (meskipun untuk saat ini hanya yang uji).
Buat Transaksi Keluar
Untuk mentransfer uang dari saldo akun yang dibuat, ada file crypto/block/wallet.fif
, yang juga perlu ditempatkan di folder bersama klien yang terkumpul.
Mirip dengan langkah-langkah sebelumnya, Anda perlu menyesuaikan jumlah yang Anda transfer, alamat penerima (dest_addr), dan seqno dompet Anda (1 setelah dompet diinisialisasi dan bertambah 1 setelah setiap transaksi keluar - Anda dapat melihatnya dengan meminta status akun Anda) . Untuk tes, Anda dapat menggunakan, misalnya, dompet saya - 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2
.
Ketika Anda menjalankan ( ./crypto/fift wallet.fif
), skrip akan mengambil alamat dompet Anda (dari mana Anda mentransfer) dan kunci privatnya dari file new-wallet.addr
dan new-wallet.pk
, dan menulis pesan yang diterima ke new-wallet-query.boc
.
Seperti sebelumnya, untuk langsung melakukan transaksi, kami memanggil sendfile new-wallet-query.boc
di klien. Setelah itu, jangan lupa memperbarui status blockchain ( last
) dan periksa apakah saldo dan seqno dompet kita telah berubah ( getaccount <account_id>
).

Itu saja, sekarang kita bisa membuat kontrak pintar dalam TON dan mengirim permintaan kepada mereka. Seperti yang Anda lihat, fungsi saat ini sudah cukup untuk, misalnya, membuat dompet yang lebih ramah dengan antarmuka grafis (namun, diharapkan akan tersedia sebagai bagian dari messenger).