ProHoster > Blog > Pentadbiran > Pelanggan uji TON (Rangkaian Terbuka Telegram) dan bahasa Fift baharu untuk kontrak pintar
Pelanggan uji TON (Rangkaian Terbuka Telegram) dan bahasa Fift baharu untuk kontrak pintar
Lebih daripada setahun yang lalu, ia diketahui tentang rancangan utusan Telegram untuk mengeluarkan rangkaian terdesentralisasinya sendiri Rangkaian Terbuka Telegram. Kemudian dokumen teknikal yang banyak tersedia, yang didakwa ditulis oleh Nikolai Durov dan menggambarkan struktur rangkaian masa depan. Bagi mereka yang terlepas, saya syorkan anda membaca penceritaan semula saya tentang dokumen ini (bahagian 1, bahagian 2; bahagian ketiga, malangnya, masih mengumpul habuk dalam draf).
Sejak itu, tiada berita penting mengenai status pembangunan TON sehingga beberapa hari yang lalu (dalam salah satu daripada saluran tidak rasmi) pautan ke halaman tidak muncul https://test.ton.org/download.htmldi mana terletak:
β¦ ton-test-liteclient-full.tar.xz β sumber pelanggan ringan untuk rangkaian ujian TON;
β¦ ton-lite-client-test1.config.json β fail konfigurasi untuk menyambung ke rangkaian ujian;
β¦ README - maklumat mengenai pemasangan dan pelancaran pelanggan;
β¦ BAGAIMANA UNTUK β arahan langkah demi langkah tentang cara membuat kontrak pintar menggunakan pelanggan;
β¦ ton.pdf β dokumen yang dikemas kini (bertarikh 2 Mac 2019) dengan gambaran keseluruhan teknikal rangkaian TON;
β¦ tvm.pdf β penerangan teknikal TVM (Mesin Maya TON, mesin maya TON);
β¦ tblkch.pdf β penerangan teknikal blok TON;
β¦ fivebase.pdf β perihalan bahasa Fift baharu, direka untuk mencipta kontrak pintar dalam TON.
Saya ulangi, tiada pengesahan rasmi halaman dan semua dokumen ini dari Telegram, tetapi jumlah bahan ini menjadikannya agak munasabah. Lancarkan klien yang diterbitkan atas risiko seseorang.
Membina pelanggan ujian
Mula-mula, mari kita cuba membina dan menjalankan klien ujian - mujurlah, README menerangkan proses mudah ini secara terperinci. Saya akan melakukan ini menggunakan macOS 10.14.5 sebagai contoh; Saya tidak boleh menjamin kejayaan binaan pada sistem lain.
Muat turun dan buka bungkusan arkib sumber. Adalah penting untuk memuat turun versi terkini kerana keserasian ke belakang tidak dijamin pada peringkat ini.
Pastikan versi terkini make, cmake (versi 3.0.2 atau lebih tinggi), OpenSSL (termasuk fail pengepala C), g++ atau clang dipasang pada sistem. Saya tidak perlu memasang apa-apa, semuanya datang bersama-sama serta-merta.
Mari kita anggap sumber dibongkar ke dalam folder ~/lite-client. Secara berasingan, buat folder kosong untuk projek yang dipasang (contohnya, ~/liteclient-build), dan daripadanya (cd ~/liteclient-build) panggil arahan:
Jika semuanya dilakukan dengan betul, anda akan melihat sesuatu seperti ini:
Seperti yang kita lihat, terdapat beberapa arahan yang tersedia:
β¦ help β paparkan senarai arahan ini;
β¦ quit - keluar;
β¦ time β tunjukkan masa semasa pada pelayan;
β¦ status β tunjukkan sambungan dan status pangkalan data tempatan;
β¦ last β kemas kini keadaan blockchain (muat turun blok terakhir). Adalah penting untuk menjalankan arahan ini sebelum sebarang permintaan untuk memastikan anda melihat keadaan semasa rangkaian.
β¦ sendfile<filename> β muat naik fail tempatan ke rangkaian TON. Beginilah interaksi dengan rangkaian berlaku - termasuk, sebagai contoh, penciptaan kontrak pintar baharu dan permintaan untuk memindahkan dana antara akaun;
β¦ getaccount<address> β tunjukkan arus (pada masa arahan itu dilaksanakan) last) status akaun dengan alamat yang ditentukan;
β¦ privkey<filename> β muatkan kunci persendirian daripada fail setempat.
Jika, apabila memulakan klien, anda memindahkan folder kepadanya menggunakan pilihan -D, kemudian dia akan menambah blok terakhir rantaian induk ke dalamnya:
Sekarang kita boleh beralih kepada perkara yang lebih menarik - pelajari bahasa Fift, cuba susun kontrak pintar (contohnya, buat dompet ujian), muat naik ke rangkaian dan cuba pindahkan dana antara akaun.
Bahasa Kelima
Daripada dokumen fivebase.pdf anda boleh mengetahui bahawa pasukan Telegram telah mencipta bahasa tindanan baharu untuk mencipta kontrak pintar Lima (nampaknya dari angka kelima, sama dengan Forth, bahasa yang Fifth mempunyai banyak persamaan).
Dokumen itu agak tebal, 87 halaman, dan saya tidak akan menceritakan semula kandungannya secara terperinci dalam rangka artikel ini (sekurang-kurangnya kerana saya sendiri belum selesai membacanya :). Saya akan memberi tumpuan kepada perkara utama dan memberikan beberapa contoh kod dalam bahasa ini.
Pada peringkat asas, sintaks Fift agak mudah: kodnya terdiri daripada perkataan, biasanya dipisahkan oleh ruang atau pemisah baris (kes khas: sesetengah perkataan tidak memerlukan pemisah selepas diri mereka sendiri). mana-mana perkataan itu ialah urutan aksara sensitif huruf besar yang sepadan dengan yang tertentu ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ (kira-kira, apa yang jurubahasa harus lakukan apabila ia menemui perkataan ini). Jika tiada definisi perkataan, jurubahasa cuba menghuraikannya sebagai nombor dan meletakkannya pada timbunan. Ngomong-ngomong, nombor di sini adalah - tiba-tiba - integer 257-bit, dan tidak ada pecahan sama sekali - lebih tepat lagi, mereka segera bertukar menjadi sepasang integer, membentuk pengangka dan penyebut pecahan rasional.
Perkataan cenderung untuk berinteraksi dengan nilai di bahagian atas timbunan. Jenis perkataan yang berasingan - awalan β tidak menggunakan timbunan, tetapi aksara seterusnya daripada fail sumber. Sebagai contoh, beginilah cara literal rentetan dilaksanakan - watak petikan (") ialah perkataan awalan yang mencari petikan (penutup) seterusnya, dan menolak rentetan di antara mereka ke tindanan. One-liners berkelakuan dengan cara yang sama (//) dan berbilang talian (/*) komen.
Di sinilah hampir keseluruhan struktur dalaman bahasa berakhir. Segala-galanya (termasuk binaan kawalan) ditakrifkan sebagai perkataan (sama ada dalaman, seperti operasi aritmetik dan takrif perkataan baharu; atau ditakrifkan dalam "perpustakaan standard" Fift.fif, yang terdapat dalam folder crypto/fift dalam sumber).
Contoh program mudah dalam Fift:
{ dup =: x dup * =: y } : setxy
3 setxy x . y . x y + .
7 setxy x . y . x y + .
Baris pertama mentakrifkan perkataan baharu setxy (perhatikan awalan {, yang mencipta blok sebelum yang penutup } dan awalan :, yang sebenarnya mentakrifkan perkataan). setxy mengambil nombor dari bahagian atas timbunan, mentakrifkan (atau mentakrifkan semula) sebagai global tetapx, dan kuasa dua nombor ini sebagai pemalar y (Memandangkan nilai pemalar boleh ditakrifkan semula, saya lebih suka memanggilnya pembolehubah, tetapi saya mengikut konvensyen penamaan dalam bahasa itu).
Dua baris seterusnya meletakkan nombor pada timbunan dan panggil setxy, maka nilai pemalar dipaparkan x, y (perkataan itu digunakan untuk output .), kedua-dua pemalar diletakkan pada timbunan, dijumlahkan, dan hasilnya juga dicetak. Hasilnya kita akan melihat:
3 9 12 ok
7 49 56 ok
(Baris "ok" dicetak oleh jurubahasa apabila ia selesai memproses baris semasa dalam mod input interaktif)
Fail yang kelihatan menakutkan ini adalah untuk mencipta kontrak pintar - ia akan diletakkan dalam fail new-wallet-query.boc selepas pelaksanaan. Sila ambil perhatian bahawa bahasa himpunan lain digunakan di sini untuk Mesin Maya TON (saya tidak akan membincangkannya secara terperinci), arahan yang akan diletakkan pada blockchain.
Oleh itu, pemasang untuk TVM ditulis dalam Fift - sumber pemasang ini ada dalam fail crypto/fift/Asm.fif dan disambungkan pada permulaan sekeping kod di atas.
Apa yang boleh saya katakan, nampaknya Nikolai Durov suka mencipta bahasa pengaturcaraan baru :)
Mewujudkan kontrak pintar dan berinteraksi dengan TON
Jadi, mari kita anggap kita telah mengumpulkan pelanggan TON dan jurubahasa Fift seperti yang diterangkan di atas dan membiasakan diri dengan bahasa tersebut. Bagaimana untuk mencipta kontrak pintar sekarang? Ini diterangkan dalam fail BAGAIMANA UNTUK, dilampirkan pada sumber.
Akaun dalam TON
Seperti yang saya jelaskan dalam ulasan TON, rangkaian ini mengandungi lebih daripada satu blockchain - terdapat satu yang biasa, yang dipanggil. "rantai induk", serta bilangan arbitrari "rantai kerja" tambahan, yang dikenal pasti dengan nombor 32-bit. Rantaian induk mempunyai pengecam -1; selain itu, rantai kerja "asas" dengan pengecam 0 juga boleh digunakan. Setiap rantai kerja boleh mempunyai konfigurasi sendiri. Secara dalaman, setiap rantai kerja dibahagikan kepada shardchains, tetapi ini adalah perincian pelaksanaan yang tidak perlu diingati.
Dalam satu rantaian kerja, banyak akaun disimpan yang mempunyai pengecam id_akaun mereka sendiri. Untuk rantai induk dan rantai kerja sifar, ia adalah 256 bit panjang. Oleh itu, pengecam akaun ditulis, sebagai contoh, seperti ini:
Ini ialah format "mentah": pertama ID rantai kerja, kemudian titik bertindih dan ID akaun dalam tatatanda perenambelasan.
Di samping itu, terdapat format yang dipendekkan - nombor rantai kerja dan alamat akaun dikodkan dalam bentuk binari, jumlah semak ditambah kepada mereka, dan semua ini dikodkan dalam Base64:
Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb
Mengetahui format rekod ini, kami boleh meminta keadaan semasa akaun melalui klien ujian menggunakan arahan
[ 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 rantai kerja yang ditentukan. Sebagai contoh, di lapangan storage.balance ialah baki akaun semasa, dalam storage.state.code - kod kontrak pintar, dan dalam storage.state.data - data semasanya. Sila ambil perhatian bahawa storan data TON - Sel, sel - adalah seperti pokok, setiap sel boleh mempunyai kedua-dua data dan sel anak sendiri. Ini ditunjukkan sebagai lekukan dalam baris terakhir.
Membina kontrak pintar
Sekarang mari kita buat sendiri struktur sedemikian (ia dipanggil BOC - beg sel) menggunakan bahasa Lima. Nasib baik, anda tidak perlu menulis kontrak pintar sendiri - dalam folder crypto/block terdapat fail dari arkib sumber new-wallet.fif, yang akan membantu kami mencipta dompet baharu. Mari salin ke folder dengan klien yang dipasang (~/liteclient-build, jika anda mengikuti arahan di atas). Saya memetik kandungannya di atas sebagai contoh kod pada Fift.
ia adalah <source-directory> mesti diganti dengan laluan ke sumber yang tidak dibungkus (malangnya simbol "~", tidak boleh digunakan di sini, laluan penuh diperlukan). Daripada menggunakan kunci -I anda boleh menentukan pembolehubah persekitaran FIFTPATH dan masukkan jalan ini ke dalamnya.
Sejak kami melancarkan Fift dengan nama fail new-wallet.fif, ia akan melaksanakannya dan keluar. Jika anda meninggalkan nama fail, anda boleh bermain dengan jurubahasa secara interaktif.
Selepas pelaksanaan, sesuatu seperti ini harus dipaparkan dalam 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)
Ini bermakna bahawa dompet dengan ID -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (atau, apa yang sama, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) berjaya dibuat. Kod yang sepadan akan berada dalam fail new-wallet-query.boc, alamatnya ada di new-wallet.addr, dan kunci persendirian berada dalam new-wallet.pk (berhati-hati - menjalankan skrip sekali lagi akan menimpa fail ini).
Sudah tentu, rangkaian TON belum mengetahui tentang dompet ini; ia hanya disimpan dalam bentuk fail ini. Kini ia perlu dimuat naik ke rangkaian. Walau bagaimanapun, masalahnya ialah untuk membuat kontrak pintar anda perlu membayar komisen, dan baki akaun anda masih sifar.
Dalam mod kerja, masalah ini akan diselesaikan dengan membeli gram di bursa (atau memindahkan dari dompet lain). Nah, dalam mod ujian semasa, kontrak pintar khas telah dibuat, yang mana anda boleh meminta sehingga 20 gram begitu sahaja.
Menjana permintaan kepada kontrak pintar orang lain
Kami membuat permintaan kepada kontrak pintar yang mengedarkan gram kiri dan kanan seperti ini. Dalam folder yang sama crypto/block cari fail 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
Kami juga akan menyimpannya dalam folder dengan klien yang dipasang, tetapi kami akan membetulkan baris kelima - sebelum baris "constant dest_addr". Mari gantikan dengan alamat dompet yang anda buat sebelum ini (penuh, bukan disingkat). Tidak perlu menulis "-1:" pada permulaan, sebaliknya letakkan "0x" pada permulaan.
Anda juga boleh menukar talian 6.666 Gram*/ constant amount β ini ialah jumlah dalam gram yang anda minta (tidak lebih daripada 20). Walaupun anda menentukan nombor bulat, biarkan titik perpuluhan.
Akhirnya, anda perlu membetulkan garisan 0x00000011 constant seqno. Nombor pertama di sini ialah nombor jujukan semasa, yang disimpan dalam akaun yang mengeluarkan gram. Di manakah saya boleh mendapatkannya? Seperti yang dinyatakan di atas, mulakan klien dan jalankan:
last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d
Pada akhirnya, data kontrak pintar akan mengandungi
Nombor 0000000D (anda akan lebih besar) ialah nombor urutan yang mesti digantikan ke testgiver.fif.
Itu sahaja, simpan fail dan jalankan (./crypto/fift testgiver.fif). Output akan menjadi fail wallet-query.boc. Inilah yang terbentuk mesej itu kepada kontrak pintar orang lain - permintaan "pindahkan begitu banyak gram ke akaun itu dan itu."
Menggunakan pelanggan, kami memuat naiknya ke rangkaian:
> 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 anda sekarang menelefon last, dan kemudian sekali lagi meminta status akaun dari mana kami meminta gram, maka kami harus melihat bahawa nombor urutannya telah meningkat sebanyak satu - ini bermakna ia menghantar wang ke akaun kami.
Langkah terakhir kekal - muat turun kod dompet kami (bakinya telah diisi semula, tetapi tanpa kod kontrak pintar kami tidak akan dapat mengurusnya). Kami laksanakan sendfile new-wallet-query.boc β dan itu sahaja, anda mempunyai dompet anda sendiri pada rangkaian TON (walaupun ia hanya satu ujian buat masa ini).
Mencipta urus niaga keluar
Untuk memindahkan wang dari baki akaun yang dibuat, terdapat fail crypto/block/wallet.fif, yang juga perlu diletakkan dalam folder dengan klien yang dipasang.
Sama seperti langkah sebelumnya, anda perlu melaraskan jumlah yang anda pindahkan, alamat penerima (dest_addr), dan seqno dompet anda (ia bersamaan dengan 1 selepas memulakan dompet dan meningkat sebanyak 1 selepas setiap transaksi keluar - anda boleh lihat dengan meminta status akaun anda) . Untuk ujian, anda boleh menggunakan, sebagai contoh, dompet saya - 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.
Pada permulaan (./crypto/fift wallet.fif) skrip akan mengambil alamat dompet anda (dari tempat anda memindahkan) dan kunci peribadinya daripada fail new-wallet.addr ΠΈ new-wallet.pk, dan mesej yang diterima akan ditulis kepada new-wallet-query.boc.
Seperti sebelum ini, untuk terus melakukan transaksi, hubungi sendfile new-wallet-query.boc dalam klien. Selepas ini, jangan lupa untuk mengemas kini keadaan blockchain (last) dan semak sama ada baki dan seqno dompet kami telah berubah (getaccount <account_id>).
Itu sahaja, kini kita boleh membuat kontrak pintar dalam TON dan menghantar permintaan kepada mereka. Seperti yang anda lihat, fungsi semasa sudah cukup untuk, sebagai contoh, membuat dompet yang lebih mesra dengan antara muka grafik (namun, ia dijangka sudah tersedia sebagai sebahagian daripada messenger).
Hanya pengguna berdaftar boleh mengambil bahagian dalam tinjauan. Log masuk, Sama-sama.
Adakah anda berminat untuk meneruskan artikel dengan analisis TON, TVM, Fift?
Ya, saya sedang menunggu penyiapan siri artikel dengan gambaran umum TON
Ya, menarik untuk membaca lebih lanjut tentang bahasa Fift
Ya, saya ingin mengetahui lebih lanjut tentang Mesin Maya TON dan pemasang untuknya
Tidak, semua ini tidak menarik
39 pengguna mengundi. 12 pengguna berpantang.
Apakah pendapat anda tentang rancangan Telegram untuk melancarkan TON?
Saya mempunyai harapan yang tinggi untuk projek ini
Saya hanya mengikuti perkembangannya dengan penuh minat.
Saya ragu-ragu dan meragui kejayaannya.
Saya cenderung untuk menganggap inisiatif ini gagal dan tidak perlu untuk orang ramai