Teste kliyan TON (Telegram Open Network) ak nouvo lang Fift pou kontra entelijan
Plis pase yon ane de sa, li te vin konnen sou plan yo nan mesaje Telegram yo lage pwòp rezo desantralize li yo Open Network telegram. Lè sa a, yon dokiman teknik volumineuz te vin disponib, ki te swadizan ekri pa Nikolai Durov ak dekri estrikti nan rezo a nan lavni. Pou moun ki te rate li, mwen rekòmande ou li rakonte mwen an sou dokiman sa a (pati 1, pati 2; twazyèm pati a, Ay, se toujou kolekte pousyè nan bouyon).
Depi lè sa a, pa te gen okenn nouvèl enpòtan sou estati devlopman TON jiska yon koup de jou de sa (nan youn nan chanèl ofisyèl yo) lyen ki mennen nan paj la pa t parèt https://test.ton.org/download.html, ki kote yo ye:
◦ ton-test-liteclient-full.tar.xz — sous yon kliyan limyè pou rezo tès TON;
◦ ton-lite-client-test1.config.json — fichye konfigirasyon pou konekte ak rezo tès la;
◦ README — enfòmasyon sou bati ak lanse kliyan an;
◦ KOUMAN — enstriksyon etap pa etap sou kreye yon kontra entelijan lè l sèvi avèk yon kliyan;
◦ ton.pdf — dokiman ajou (ki dat 2 mas 2019) ak yon apèsi teknik sou rezo TON an;
◦ tvm.pdf — deskripsyon teknik TVM (TON Virtual Machine, TON Virtual Machine);
◦ tblkch.pdf — deskripsyon teknik TON blockchain la;
◦ fifthbase.pdf — deskripsyon nouvo lang Fift la, ki fèt pou kreye kontra entelijan nan TON.
Mwen repete, pa te gen okenn konfimasyon ofisyèl nan paj la ak tout dokiman sa yo soti nan Telegram, men volim nan materyèl sa yo fè yo byen posib. Lanse kliyan an pibliye sou pwòp risk yon moun.
Bati yon kliyan tès
Premyèman, ann eseye bati ak kouri yon kliyan tès - erezman, README dekri pwosesis senp sa a an detay. Mwen pral fè sa lè l sèvi avèk macOS 10.14.5 kòm yon egzanp; Mwen pa ka garanti pou siksè nan bati a sou lòt sistèm yo.
Telechaje epi depake achiv sous. Li enpòtan pou telechaje dènye vèsyon an kòm konpatibilite bak pa garanti nan etap sa a.
Asire w ke dènye vèsyon make, cmake (vèsyon 3.0.2 oswa pi wo), OpenSSL (ki gen ladan fichye header C), g++ oswa clang yo enstale sou sistèm nan. Mwen pa t 'gen enstale anyen, tout bagay te vini ansanm touswit.
Ann sipoze sous yo depake nan yon katab ~/lite-client. Apa de li, kreye yon katab vid pou pwojè a reyini (pa egzanp, ~/liteclient-build), ak nan li (cd ~/liteclient-build) rele kòmandman yo:
Si tout bagay fèt kòrèkteman, ou ta dwe wè yon bagay tankou sa a:
Kòm nou ka wè, gen kèk kòmandman ki disponib:
◦ help — montre lis kòmandman sa yo;
◦ quit - ale deyò;
◦ time — montre tan aktyèl la sou sèvè a;
◦ status — montre koneksyon an ak estati baz done lokal yo;
◦ last — mete ajou eta blockchain la (telechaje dènye blòk la). Li enpòtan pou kouri lòd sa a anvan nenpòt demann pou asire w ke ou wè eta aktyèl rezo a.
◦ sendfile<filename> — telechaje yon fichye lokal nan rezo TON. Sa a se ki jan entèraksyon ak rezo a rive - ki gen ladan, pou egzanp, kreyasyon an nan nouvo kontra entelijan ak demann yo transfere lajan ant kont;
◦ getaccount<address> — montre aktyèl la (nan moman yo te egzekite kòmandman an) last) estati kont lan ak adrès espesifye a;
◦ privkey<filename> — chaje kle prive a nan yon dosye lokal.
Si, lè w kòmanse kliyan an, ou transfere yon katab nan li lè l sèvi avèk opsyon an -D, Lè sa a, li pral ajoute dènye blòk masterchain la nan li:
Koulye a, nou ka ale nan bagay ki pi enteresan - aprann lang Fift la, eseye konpile yon kontra entelijan (pa egzanp, kreye yon bous tès), telechaje li nan rezo a epi eseye transfere lajan ant kont yo.
Lang senkant
Soti nan dokiman an fifthbase.pdf ou ka jwenn ke ekip Telegram la te kreye yon nouvo lang pile pou kreye kontra entelijan Senk (aparamman soti nan nimerik la senkyèm, menm jan ak Forth, yon lang ak Fifth gen anpil bagay an komen).
Dokiman an byen volumineuz, 87 paj, e mwen pap rakonte sa li an detay nan kad atik sa a (omwen paske mwen poko fin li li tèt mwen :). Mwen pral konsantre sou pwen prensipal yo epi bay yon koup nan egzanp kòd nan lang sa a.
Nan yon nivo debaz, sentaks Fift a se byen senp: kòd li a konsiste de mo, anjeneral separe pa espas oswa kase liy (ka espesyal: kèk mo pa mande pou yon separasyon apre tèt yo). Nenpòt mo a se yon sekans de karaktè ki koresponn ak yon sèten definisyon (apre, kisa entèprèt la ta dwe fè lè li rankontre mo sa a). Si pa gen okenn definisyon yon mo, entèprèt la eseye analize li kòm yon nimewo epi mete l sou pil la. By wout la, nimewo yo isit la se - toudenkou - 257-bit nonm antye, epi pa gen okenn fraksyon nan tout - pi jisteman, yo imedyatman vire nan yon pè nan nonm antye, fòme nimeratè a ak denominatè nan yon fraksyon rasyonèl.
Mo yo gen tandans kominike avèk valè nan tèt pil la. Yon kalite mo separe - prefiks — pa sèvi ak pile a, men karaktè ki vin apre yo nan dosye sous la. Pou egzanp, sa a se ki jan literal fisèl yo aplike - karaktè a quote (") se yon mo prefiks ki chèche pwochen (fèmen) quote, epi pouse fisèl ki genyen ant yo sou pil la. One-liners konpòte menm jan an (//) ak plizyè liy (/*) kòmantè.
Sa a se kote prèske tout estrikti entèn lang nan fini. Tout lòt bagay (ki gen ladan konstriksyon kontwòl) defini kòm mo (swa entèn, tankou operasyon aritmetik ak definisyon nouvo mo; oswa defini nan "bibliotèk estanda" Fift.fif, ki nan katab la crypto/fift nan sous yo).
Yon pwogram egzanp senp nan Fift:
{ dup =: x dup * =: y } : setxy
3 setxy x . y . x y + .
7 setxy x . y . x y + .
Premye liy lan defini yon nouvo mo setxy (Note prefiks la {, ki kreye yon blòk anvan yon sèl la fèmen } ak prefiks :, ki aktyèlman defini mo a). setxy pran yon nimewo ki soti nan tèt pil la, defini (oswa redefini) li kòm mondyal konstanx, ak kare nimewo sa a kòm yon konstan y (Etandone ke valè konstan yo ka redefini, mwen ta pito rele yo varyab, men mwen swiv konvansyon nonmen nan lang lan).
De pwochen liy yo mete yon nimewo sou pil la epi rele setxy, Lè sa a, valè konstan yo parèt x, y (yo itilize mo a pou pwodiksyon an .), tou de konstan yo mete sou pil la, adisyone, epi rezilta a enprime tou. Kòm yon rezilta nou pral wè:
3 9 12 ok
7 49 56 ok
(Liy "ok" a enprime pa entèprèt la lè li fini trete liy aktyèl la nan mòd opinyon entèaktif)
Fichye kap pè sa a se pou kreye yon kontra entelijan - li pral mete l nan yon dosye new-wallet-query.boc apre ekzekisyon. Tanpri sonje ke yo itilize yon lòt lang asanble isit la pou TON Virtual Machine (mwen pa pral rete sou li an detay), enstriksyon yo pral mete sou blockchain la.
Kidonk, asanble a pou TVM ekri nan senkant - sous asanblaj sa a yo nan dosye a crypto/fift/Asm.fif epi yo konekte nan kòmansman an nan moso ki pi wo a nan kòd.
Kisa mwen ka di, aparamman Nikolai Durov jis renmen kreye nouvo lang pwogramasyon :)
Kreye yon kontra entelijan ak kominike avèk TON
Kidonk, ann sipoze nou reyini kliyan TON an ak entèprèt Fift la jan sa dekri pi wo a epi nou vin abitye ak lang nan. Ki jan yo kreye yon kontra entelijan kounye a? Sa a se dekri nan dosye a KOUMAN, tache ak sous yo.
Kont nan TON
Jan mwen te dekri nan TON revizyon, rezo sa a gen plis pase yon blòk - gen yon sèl komen, sa yo rele an. "chèn mèt", osi byen ke yon kantite abitrè nan "chèn travay" adisyonèl, idantifye pa yon nimewo 32-bit. Masterchain la gen yon idantifyan -1; anplis de li, yo ka itilize tou yon workchain "baz" ak yon idantifyan 0. Chak workchain ka gen pwòp konfigirasyon li. Entèn, chak workchain divize an shardchains, men sa a se yon detay aplikasyon ki pa bezwen kenbe nan tèt ou.
Nan yon sèl workchain, anpil kont yo estoke ki gen pwòp idantifyan account_id yo. Pou chèn mèt la ak chèn travay zewo, yo gen 256 bit nan longè. Kidonk, idantifyan kont la ekri, pou egzanp, tankou sa a:
Sa a se fòma "kri" la: premye ID workchain la, answit yon kolon, ak ID kont lan nan notasyon egzadesimal.
Anplis de sa, gen yon fòma ki pi kout - nimewo workchain la ak adrès kont yo kode nan fòm binè, yo ajoute yon sòm chèk, ak tout bagay sa yo kode nan Base64:
Ef+BVndbeTJeXWLnQtm5bDC2UVpc0vH2TF2ksZPAPwcODSkb
Lè nou konnen fòma dosye sa a, nou ka mande eta aktyèl la nan yon kont atravè yon kliyan tès lè l sèvi avèk lòd la
[ 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}
Nou wè estrikti ki estoke nan DHT nan workchain espesifye a. Pou egzanp, nan jaden an storage.balance se balans kont kouran an, nan storage.state.code - kòd kontra entelijan, ak nan storage.state.data - done aktyèl li yo. Tanpri sonje ke depo done TON - Selil, selil - se tankou yon pyebwa, chak selil ka gen tou de done pwòp li yo ak selil timoun yo. Sa a montre kòm endentasyon nan dènye liy yo.
Bati yon kontra entelijan
Koulye a, ann kreye yon estrikti konsa tèt nou (li rele BOC - sak selil yo) lè l sèvi avèk lang senkyèm lan. Erezman, ou pa bezwen ekri yon kontra entelijan tèt ou - nan katab la crypto/block gen yon dosye ki soti nan achiv sous la new-wallet.fif, ki pral ede nou kreye yon nouvo bous. Ann kopye li nan katab la ak kliyan an reyini (~/liteclient-build, si ou te swiv enstriksyon ki anwo yo). Mwen te site sa ki pi wo a kòm yon egzanp kòd sou Fift.
Isit la <source-directory> dwe ranplase ak chemen ki mennen nan sous ki pa pake yo (senbòl "~" malerezman pa ka itilize isit la, chemen konplè a nesesè). Olye pou yo sèvi ak yon kle -I ou ka defini yon varyab anviwònman FIFTPATH epi mete chemen sa a ladan l.
Depi nou te lanse Fift ak non fichye a new-wallet.fif, li pral egzekite li epi sòti. Si ou kite non fichye a, ou ka jwe ak entèprèt la entèaktif.
Apre egzekisyon an, yon bagay tankou sa a ta dwe parèt nan konsole a:
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)
Sa vle di ke bous la ak ID la -1:4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2 (oswa, ki sa ki menm bagay la tou, 0f9PzVILj8yglrVn1zS-NSjtxr7QBfaTCp7JrBqnFPIR8nhZ) kreye avèk siksè. Kòd ki koresponn lan pral nan dosye a new-wallet-query.boc, adrès li se nan new-wallet.addr, ak kle prive a se nan new-wallet.pk (Fè atansyon - kouri script la ankò pral ranplase dosye sa yo).
Natirèlman, rezo TON an poko konnen sou bous sa a; li estoke sèlman nan fòm sa yo. Koulye a, li bezwen yo dwe Uploaded nan rezo a. Sepandan, pwoblèm nan se ke yo kreye yon kontra entelijan ou bezwen peye yon komisyon, ak balans kont ou se toujou zewo.
Nan mòd travay, pwoblèm sa a pral rezoud pa achte gram sou echanj la (oswa transfere soti nan yon lòt bous). Oke, nan mòd tès aktyèl la, yo te kreye yon kontra entelijan espesyal, ki soti nan ki ou ka mande pou jiska 20 gram jis konsa.
Jenere yon demann nan kontra entelijan yon lòt moun
Nou fè yon demann nan yon kontra entelijan ki distribye gram agoch ak dwa tankou sa a. Nan katab la menm crypto/block jwenn fichye a 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
Nou pral sove li tou nan katab la ak kliyan an reyini, men nou pral korije senkyèm liy lan - anvan liy lan "constant dest_addr". Ann ranplase li ak adrès bous ou te kreye anvan an (plen, pa abreje). Pa gen okenn bezwen ekri "-1:" nan kòmansman an, olye de mete "0x" nan kòmansman an.
Ou kapab tou chanje liy lan 6.666 Gram*/ constant amount — sa a se kantite gram w ap mande a (pa plis pase 20). Menm si ou presize yon nonm antye, kite pwen desimal la.
Finalman, ou bezwen korije liy lan 0x00000011 constant seqno. Premye nimewo isit la se nimewo sekans aktyèl la, ki estoke nan gram ki bay kont yo. Ki kote mwen ka jwenn li soti? Jan sa di pi wo a, kòmanse kliyan an epi kouri:
last
getaccount -1:8156775b79325e5d62e742d9b96c30b6515a5cd2f1f64c5da4b193c03f070e0d
Nan fen a anpil, done yo kontra entelijan pral genyen
Nimewo 0000000D (ou pral pi gwo) se nimewo sekans ki dwe ranplase nan testgiver.fif.
Se li, sove fichye a epi kouri (./crypto/fift testgiver.fif). Pwodiksyon an pral yon dosye wallet-query.boc. Sa a se sa ki fòme сообщение nan kontra entelijan yon lòt moun - yon demann "transfere anpil gram nan tankou yon kont."
Sèvi ak kliyan an, nou telechaje li sou rezo a:
> 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
Si w kounye a rele last, ak Lè sa a ankò mande estati a nan kont ki soti nan ki nou te mande pou gram, Lè sa a, nou ta dwe wè ke nimewo sekans li yo te ogmante pa yon sèl - sa vle di ke li voye lajan nan kont nou an.
Dènye etap la rete - telechaje kòd bous nou an (balans li te deja ranpli, men san kòd kontra entelijan nou pa pral kapab jere li). Nou pote soti sendfile new-wallet-query.boc - e se li, ou gen pwòp bous ou nan rezo a TON (menm si li se sèlman yon tès pou kounye a).
Kreye tranzaksyon sortan
Pou transfere lajan nan balans lan nan kont la kreye, gen yon dosye crypto/block/wallet.fif, ki tou bezwen yo dwe mete nan katab la ak kliyan an reyini.
Menm jan ak etap anvan yo, ou bezwen ajiste kantite lajan w ap transfere a, adrès moun k ap resevwa a (dest_addr), ak seqno nan bous ou a (li egal a 1 apre inisyalize bous la ak ogmante pa 1 apre chak tranzaksyon sòtan - ou kapab wè li lè w mande estati kont ou a). Pou tès yo, ou ka itilize, pou egzanp, bous mwen an - 0x4fcd520b8fcca096b567d734be3528edc6bed005f6930a9ec9ac1aa714f211f2.
Sou demaraj (./crypto/fift wallet.fif) script la pral pran adrès bous ou a (ki soti kote ou transfere) ak kle prive li nan dosye yo new-wallet.addr и new-wallet.pk, epi yo pral ekri mesaj la resevwa a new-wallet-query.boc.
Kòm anvan, dirèkteman fè tranzaksyon an, rele sendfile new-wallet-query.boc nan kliyan an. Apre sa, pa bliye mete ajou eta blockchain la (last) epi tcheke ke balans lan ak seqno nan bous nou an te chanje (getaccount <account_id>).
Sa a tout, kounye a nou ka kreye kontra entelijan nan TON epi voye demann ba yo. Kòm ou ka wè, fonksyonalite aktyèl la deja ase pou, pou egzanp, fè yon bous ki pi zanmitay ak yon koòdone grafik (sepandan, li espere ke li pral deja vin disponib kòm yon pati nan mesaje a).
Se sèlman itilizatè ki anrejistre ki ka patisipe nan sondaj la. Enskri, tanpri.
Èske w enterese kontinye atik yo ak analiz TON, TVM, Fift?
Wi, m ap tann fini seri atik yo ak yon apèsi jeneral sou TON
Wi, li enteresan pou li plis enfòmasyon sou lang senkyèm lan
Wi, mwen vle aprann plis sou TON Virtual Machine ak asanblaj la pou li
Non, okenn nan sa a pa enteresan
39 itilizatè yo te vote. 12 itilizatè te absteni.
Kisa ou panse de plan Telegram pou lanse TON?
Mwen gen gwo espwa pou pwojè sa a
Mwen jis swiv devlopman li ak enterè.
Mwen ensèten e mwen doute siksè li.
Mwen gen tandans konsidere inisyativ sa a kòm yon echèk e ki pa nesesè pou gwo mas yo