Wiwit kuwi, ora ana kabar sing penting babagan status pangembangan TON nganti sawetara dina kepungkur (ing salah siji saka saluran ora resmi) pranala menyang kaca ora katon https://test.ton.org/download.html, ing ngendi panggonane:
β¦ ton-test-liteclient-full.tar.xz - sumber saka klien cahya kanggo jaringan test TON;
β¦ ton-lite-client-test1.config.json - file konfigurasi kanggo nyambung menyang jaringan test;
β¦ README - informasi babagan mbangun lan ngluncurake klien;
β¦ CARANE - instruksi langkah-langkah kanggo nggawe kontrak pinter nggunakake klien;
β¦ ton.pdf - dokumen sing dianyari (tanggal 2 Maret 2019) kanthi ringkesan teknis jaringan TON;
β¦ tvm.pdf - deskripsi teknis TVM (Mesin Virtual TON, mesin virtual TON);
β¦ tblkch.pdf - gambaran teknis saka TON blockchain;
β¦ fifthbase.pdf - gambaran saka basa Fift anyar, dirancang kanggo nggawe kontrak pinter ing TON.
Aku mbaleni, ora ana konfirmasi resmi saka kaca lan kabeh dokumen kasebut saka Telegram, nanging volume bahan kasebut ndadekake dheweke bisa dipercaya. Bukak klien sing diterbitake kanthi resiko dhewe.
Ngundhuh lan unpack arsip sumber. Penting kanggo ndownload versi paling anyar amarga kompatibilitas mundur ora dijamin ing tahap iki.
Priksa manawa versi paling anyar saka make, cmake (versi 3.0.2 utawa luwih), OpenSSL (kalebu file header C), g ++ utawa clang diinstal ing sistem. Aku ora kudu nginstal apa-apa, kabeh langsung teka.
Ayo nganggep sumber kasebut dibongkar menyang folder ~/lite-client. Kanthi kapisah, gawe folder kosong kanggo proyek sing dirakit (contone, ~/liteclient-build), lan saka iku (cd ~/liteclient-build) nelpon perintah:
Yen kabeh wis rampung kanthi bener, sampeyan kudu ndeleng kaya iki:
Minangka kita bisa ndeleng, ana sawetara printah sing kasedhiya:
β¦ help - nampilake dhaptar printah iki;
β¦ quit - metu;
β¦ time - nuduhake wektu saiki ing server;
β¦ status - nuduhake sambungan lan status database lokal;
β¦ last - nganyari negara blockchain (download blok pungkasan). Penting kanggo mbukak printah iki sadurunge panjalukan kanggo mesthekake yen sampeyan ndeleng kahanan jaringan saiki.
β¦ sendfile<filename> - upload file lokal menyang jaringan TON. Iki carane interaksi karo jaringan dumadi - kalebu, contone, nggawe kontrak pinter anyar lan panjalukan kanggo transfer dana antarane akun;
β¦ getaccount<address> - nuduhake saiki (ing wektu printah dieksekusi) last) status akun kanthi alamat sing ditemtokake;
β¦ privkey<filename> - mbukak kunci pribadi saka file lokal.
Yen, nalika miwiti klien, sampeyan nransfer folder menyang nggunakake pilihan -D, banjur bakal nambah blok pungkasan saka masterchain menyang:
Saiki kita bisa nerusake menyang bab sing luwih menarik - sinau basa Fift, nyoba kanggo ngumpulake kontrak pinter (contone, nggawe dompet test), upload menyang jaringan lan nyoba nransfer dana antarane akun.
Basa Lima
Saka dokumen fifthbase.pdf sampeyan bisa ngerteni manawa tim Telegram wis nggawe basa tumpukan anyar kanggo nggawe kontrak cerdas lima (katon saka angka kalima, padha karo Forth, basa karo Fifth akeh sing padha).
Dokumen kasebut cukup akeh, 87 kaca, lan aku ora bakal nyritakake maneh isine kanthi rinci sajrone kerangka artikel iki (paling ora amarga aku durung rampung maca dhewe :). Aku bakal fokus ing TCTerms utama lan menehi saperangan conto kode ing basa iki.
Ing tingkat dhasar, sintaksis Fift cukup prasaja: kode kasebut kalebu tembung, biasane dipisahake dening spasi utawa garis break (kasus khusus: sawetara tembung ora mbutuhake pamisah sawise dhewe). Sembarang tembung kasebut minangka urutan karakter sing sensitif huruf cilik sing cocog karo tartamtu definisi (kira-kira, apa sing kudu ditindakake juru basa nalika nemoni tembung iki). Yen ora ana definisi tembung, interpreter nyoba ngurai minangka nomer lan sijine ing tumpukan. Miturut cara, nomer kene - dumadakan - 257-dicokot integer, lan ora ana pecahan - luwih tepat, padha langsung dadi pasangan wilangan bulat, mbentuk numerator lan denominator saka pecahan rasional.
Tembung cenderung sesambungan karo nilai ing ndhuwur tumpukan. Jinis tembung sing kapisah - ater-ater - ora nggunakake tumpukan, nanging karakter sakteruse saka file sumber. Contone, iki carane string literals diterapake - karakter kutipan (") yaiku tembung ater-ater sing nggoleki kutipan sabanjure (panutup), lan nyurung senar ing antarane menyang tumpukan. One-liners tumindak kanthi cara sing padha (//) lan multiline (/*) komentar.
Ing kene meh kabeh struktur internal basa rampung. Kabeh liyane (kalebu konstruksi kontrol) ditetepake minangka tembung (salah siji internal, kayata operasi aritmetika lan definisi tembung anyar; utawa ditetepake ing "perpustakaan standar" Fift.fif, sing ana ing folder kasebut crypto/fift ing sumber).
Program conto prasaja ing Fift:
{ dup =: x dup * =: y } : setxy
3 setxy x . y . x y + .
7 setxy x . y . x y + .
Baris pisanan nemtokake tembung anyar setxy (catheten prefiks {, sing nggawe blok sadurunge sing nutup } lan ater-ater :, sing bener nemtokake tembung kasebut). setxy njupuk nomer saka ndhuwur tumpukan, nemtokake (utawa redefines) minangka global pancetx, lan kothak nomer iki minangka konstanta y (Amarga yen nilai-nilai konstanta bisa didefinisikan maneh, aku luwih seneng nyebutake variabel, nanging aku ngetutake konvensi jeneng ing basa kasebut).
File sing katon medeni iki kanggo nggawe kontrak cerdas - bakal diselehake ing file new-wallet-query.boc sawise eksekusi. Wigati dimangerteni manawa basa perakitan liyane digunakake ing kene kanggo Mesin Virtual TON (Aku ora bakal njlentrehake kanthi rinci), instruksi kasebut bakal diselehake ing pamblokiran.
Mangkono, assembler kanggo TVM ditulis ing Fift - sumber assembler iki ana ing file crypto/fift/Asm.fif lan disambungake ing wiwitan potongan kode ing ndhuwur.
Apa sing bisa dakkandhakake, ketoke Nikolai Durov mung seneng nggawe basa pamrograman anyar :)
Nggawe kontrak cerdas lan sesambungan karo TON
Dadi, ayo nganggep kita wis nglumpukake klien TON lan juru basa Fift kaya sing kasebut ing ndhuwur lan dadi akrab karo basa kasebut. Kepiye carane nggawe kontrak cerdas saiki? Iki diterangake ing file CARANE, ditempelake ing sumber.
Ing siji workchain, akeh akun sing disimpen sing duwe account_id pengenal dhewe. Kanggo chain master lan chain karya nul, dawane 256 bit. Dadi, pengenal akun ditulis, contone, kaya iki:
Iki minangka format "mentah": pisanan ID workchain, banjur titik titik, lan ID akun ing notasi heksadesimal.
Kajaba iku, ana format sing disingkat - nomer workchain lan alamat akun dienkode ing wangun binar, checksum ditambahake, lan kabeh iki dienkode ing Base64:
Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb
Ngerti format rekaman iki, kita bisa njaluk status akun saiki liwat klien test nggunakake printah
[ 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}
Kita ndeleng struktur sing disimpen ing DHT saka workchain sing ditemtokake. Contone, ing lapangan storage.balance punika saldo akun saiki, ing storage.state.code - kode kontrak pinter, lan ing storage.state.data - data saiki. Elinga yen panyimpenan data TON - Sel, sel - kaya wit, saben sel bisa duwe data lan sel anak dhewe. Iki dituduhake minangka indentasi ing baris pungkasan.
Nggawe kontrak cerdas
Saiki ayo nggawe struktur kasebut dhewe (sing diarani BOC - tas sel) nggunakake basa Lima. Untunge, sampeyan ora kudu nulis kontrak cerdas dhewe - ing folder kasebut crypto/block ana file saka arsip sumber new-wallet.fif, sing bakal mbantu nggawe dompet anyar. Ayo nyalin menyang folder karo klien sing dirakit (~/liteclient-build, yen sampeyan tindakake pandhuan ing ndhuwur). Aku nyebutake isi ing ndhuwur minangka conto kode ing Fift.
Sawise eksekusi, kaya iki kudu ditampilake ing console:
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)
Iki tegese dompet karo ID -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (utawa, apa sing padha, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) kasil digawe. Kode sing cocog bakal ana ing file kasebut new-wallet-query.boc, alamate nang new-wallet.addr, lan kunci pribadhi ana ing new-wallet.pk (ati-ati - mbukak skrip maneh bakal nimpa file kasebut).
Mesthine, jaringan TON durung ngerti babagan dompet iki, mung disimpen ing bentuk file kasebut. Saiki kudu diunggah menyang jaringan. Nanging, masalahe kanggo nggawe kontrak cerdas sampeyan kudu mbayar komisi, lan imbangan akun sampeyan isih nol.
Ing mode kerja, masalah iki bakal ditanggulangi kanthi tuku gram ing ijol-ijolan (utawa transfer saka dompet liyane). Ya, ing mode tes saiki, kontrak cerdas khusus wis digawe, saka ngendi sampeyan bisa njaluk nganti 20 gram kaya ngono.
Nggawe panjalukan kanggo kontrak pinter wong liya
We nggawe panjalukan kanggo kontrak pinter sing distributes gram kiwa lan tengen kaya iki. Ing folder sing padha crypto/block golek 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
// 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
Kita uga bakal nyimpen ing folder karo klien nglumpuk, nanging kita bakal mbenerake baris kalima - sadurunge baris "constant dest_addr". Ayo diganti karo alamat dompet sing digawe sadurunge (lengkap, ora disingkat). Ora perlu nulis "-1:" ing wiwitan, tinimbang sijine "0x" ing wiwitan.
Sampeyan uga bisa ngganti baris 6.666 Gram*/ constant amount - iki jumlah ing gram sing sampeyan njaluk (ora luwih saka 20). Malah yen sampeyan nemtokake nomer wutuh, ninggalake titik desimal.
Pungkasan, sampeyan kudu mbenerake garis kasebut 0x00000011 constant seqno. Nomer pisanan ing kene yaiku nomer urutan saiki, sing disimpen ing akun sing ngetokake gram. Ngendi aku bisa njaluk saka? Kaya kasebut ing ndhuwur, miwiti klien lan mbukak:
last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d
Angka 0000000D (sampeyan bakal luwih gedhe) minangka nomer urutan sing kudu diganti dadi testgiver.fif.
Iku, simpen file lan mbukak (./crypto/fift testgiver.fif). Output bakal dadi file wallet-query.boc. Iki sing dibentuk pesen menyang kontrak pinter wong liya - panjaluk "transfer akeh gram menyang akun kasebut lan kaya ngono."
Nggunakake klien, kita upload menyang 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
Yen saiki nelpon last, lan banjur njaluk maneh status akun saka ngendi kita takon gram, banjur kita kudu weruh sing nomer urutan wis tambah siji - iki tegese ngirim dhuwit kanggo akun.
Langkah pungkasan tetep - download kode dompet kita (imbangane wis diisi maneh, nanging tanpa kode kontrak cerdas kita ora bakal bisa ngatur). Kita nindakake sendfile new-wallet-query.boc - lan iku, sampeyan duwe dompet dhewe ing jaringan TON (sanajan mung test siji kanggo saiki).
Nggawe transaksi metu
Kanggo nransfer dhuwit saka saldo akun sing digawe, ana file crypto/block/wallet.fif, sing uga kudu diselehake ing folder karo klien sing dirakit.
Kaya langkah sadurunge, sampeyan kudu nyetel jumlah sing sampeyan transfer, alamat panampa (dest_addr), lan seqno dompet sampeyan (padha karo 1 sawise miwiti dompet lan mundhak 1 sawise saben transaksi metu - sampeyan bisa ndeleng kanthi njaluk status akun sampeyan). Kanggo tes, sampeyan bisa nggunakake, umpamane, dompetku - 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.
Ing wiwitan (./crypto/fift wallet.fif) skrip bakal njupuk alamat dompet (saka ngendi sampeyan nransfer) lan kunci pribadi saka file new-wallet.addr ΠΈ new-wallet.pk, lan pesen sing ditampa bakal ditulis kanggo new-wallet-query.boc.
Kaya sadurunge, kanggo langsung nindakake transaksi, nelpon sendfile new-wallet-query.boc ing klien. Sawise iki, aja lali nganyari status blockchain (last) lan priksa manawa imbangan lan seqno dompet kita wis diganti (getaccount <account_id>).