Mu mar a sgrĂŹobhas agus a dhâ fhoillsicheas tu cĂšmhnant snasail ann an TON
Cò mu dheidhinn a tha an artaigil seo?
Anns an artaigil bruidhnidh mi mu mar a ghabh mi pĂ irt anns a âchiad (de dhĂ ) co-fharpais blockchain Telegram, nach do ghabh duais, agus cho-dhĂšin mi mâ eòlas a chlĂ radh ann an artaigil gus nach tèid e a-steach do dearmad agus, is dòcha, cuideachadh cuideigin.
Leis nach robh mi airson còd eas-chruthach a sgrĂŹobhadh, ach rudeigin a dhèanamh ag obair, airson an artaigil sgrĂŹobh mi cĂšmhnant snasail airson crannchur sa bhad agus lĂ rach-lĂŹn a sheallas dĂ ta cĂšmhnant snasail gu dĂŹreach bho TON gun a bhith aâ cleachdadh stòradh eadar-mheadhanach.
Bidh an artaigil feumail dhaibhsan a tha airson aâ chiad chĂšmhnant snasail aca a dhèanamh ann an TON, ach aig nach eil fios cĂ ite an tòisich iad.
A 'cleachdadh a' chrannchuir mar eisimpleir, thèid mi bho bhith a 'stà ladh na h-à rainneachd gu bhith a' foillseachadh cÚmhnant snasail, ag eadar-obrachadh leis, agus a 'sgrÏobhadh là rach-lÏn airson dà ta fhaighinn agus fhoillseachadh.
Mu dheidhinn com-pĂ irteachas ann an co-fharpais a
Anns an DĂ mhair an-uiridh, dhâainmich Telegram farpais blockchain le cĂ nanan Ăšra Fift и FunC. Bâ fheudar taghadh bho bhith aâ sgrĂŹobhadh gin de na còig cĂšmhnantan snasail a chaidh a mholadh. Bha mi aâ smaoineachadh gum biodh e math rudeigin eadar-dhealaichte a dhèanamh, cĂ nan ionnsachadh agus rudeigin a dhèanamh, fiĂš âs mura feum mi dad eile a sgrĂŹobhadh san Ă m ri teachd. A bharrachd air an sin, tha an cuspair an-còmhnaidh air na bilean.
Is fhiach a rà dh nach robh eòlas sam bith agam air cÚmhnantan snasail a leasachadh.
Bha mi an dĂšil pĂ irt a ghabhail gu deireadh gus an urrainn dhomh agus an uairsin artaigil ath-bhreithneachaidh a sgrĂŹobhadh, ach dhâ fhĂ ilnich mi sa bhad aig a âchiad fhear. mi le ioma-ainm-sgrĂŹobhte air FunC agus dh'obraich e san fharsaingeachd. Ghabh mi e mar bhunait .
Aig an à m sin, bha mi a 'smaoineachadh gu robh seo gu cinnteach gu leòr airson à ite duais co-dhiÚ a ghabhail. Mar thoradh air an sin, thà inig timcheall air 40 a-mach à 60 com-pà irtiche gu bhith nan duaisean agus cha robh mi nam measg. San fharsaingeachd, chan eil dad ceà rr air seo, ach chuir aon rud dragh orm. Aig an à m a chaidh na toraidhean ainmeachadh, cha robh an ath-sgrÚdadh air an deuchainn airson mo chÚmhnant air a dhèanamh, dh 'fhaighnich mi dha na com-pà irtichean anns a' chat an robh duine sam bith eile aig nach robh e, cha robh gin ann.
A rèir choltais aâ toirt aire do na teachdaireachdan agam, dĂ latha Ă s deidh sin dhâ fhoillsich na britheamhan beachd agus chan eil mi fhathast aâ tuigsinn an do chaill iad gun fhiosta mo chĂšmhnant snasail rè aâ bhreitheanais no an robh iad dĂŹreach aâ smaoineachadh gu robh e cho dona is nach robh feum air beachd. Chuir mi ceist air an duilleag, ach cha dâ fhuair mi freagairt. Ged nach eil e na dhĂŹomhaireachd cò a bha aâ breithneachadh, bha mi den bheachd nach robh feum air teachdaireachdan pearsanta a sgrĂŹobhadh.
Chaidh tòrr Ăšine a chosg air tuigse, agus mar sin chaidh co-dhĂšnadh artaigil a sgrĂŹobhadh. Leis nach eil mòran fiosrachaidh ann fhathast, cuidichidh an artaigil seo le bhith aâ sĂ bhaladh Ăšine dha gach neach le Ăšidh.
Bun-bheachd cĂšmhnantan snasail ann an TON
Mus sgrĂŹobh thu dad, feumaidh tu faighinn a-mach cò Ă s a bu chòir dhut dèiligeadh ris an rud seo. Mar sin, a-nis innsidh mi dhut dè na pĂ irtean den t-siostam a thâ ann. Nas mionaidiche, dè na pĂ irtean a dh'fheumas tu a bhith eòlach gus co-dhiĂš cuid de chĂšmhnant obrach a sgrĂŹobhadh.
Cuiridh sinn fòcas air a bhith aâ sgrĂŹobhadh cĂšmhnant snasail agus ag obair leis TON Virtual Machine (TVM), Fift и FunC, mar sin tha an artaigil nas coltaiche ri tuairisgeul air leasachadh prògram cunbhalach. Cha bhith sinn aâ fuireach air mar a tha an Ă rd-Ăšrlar fhèin ag obair an seo.
San fharsaingeachd mu mar a tha e ag obair TVM agus cĂ nan Fift tha deagh sgrĂŹobhainnean oifigeil ann. Fhad 'sa bha mi a' gabhail pĂ irt anns a 'cho-fharpais agus a-nis fhad' sa bha mi a 'sgrĂŹobhadh a' chĂšmhnant lĂ ithreach, thionndaidh mi thuice gu tric.
Is e am prĂŹomh chĂ nan anns a bheil cĂšmhnantan snasail air an sgrĂŹobhadh FunC. Chan eil sgrĂŹobhainnean sam bith mu dheidhinn an-drĂ sta, agus mar sin gus rudeigin a sgrĂŹobhadh feumaidh tu eisimpleirean de chĂšmhnantan snasail bhon stòr oifigeil agus buileachadh aâ chĂ nain fhèin a sgrĂšdadh, agus faodaidh tu coimhead air eisimpleirean de chĂšmhnantan snasail bhon dĂ Ă m a dhâ fhalbh. co-fharpaisean. Ceanglaichean aig deireadh an artaigil.
Canaidh sinn gu bheil sinn mu thrĂ th air cĂšmhnant snasail a sgrĂŹobhadh airson FunC, Ă s deidh sin bidh sinn aâ tional a âchòd gu Fift assembler.
Tha an cĂšmhnant smart cruinnichte fhathast ri fhoillseachadh. Gus seo a dhèanamh feumaidh tu gnĂŹomh a sgrĂŹobhadh a-steach Fift, a bheir an còd cĂšmhnant snasail agus cuid de pharaimearan eile mar chur-a-steach, agus bidh an toradh mar fhaidhle leis an leudachadh .boc (a tha aâ ciallachadh âpoca cheallanâ), agus, a rèir mar a bhios sinn ga sgrĂŹobhadh, iuchair phrĂŹobhaideach agus seòladh, a thèid a chruthachadh a rèir còd aâ chĂšmhnaint snasail. Faodaidh tu graman a chuir gu seòladh cĂšmhnant sgairteil nach deach fhoillseachadh fhathast.
Gus cĂšmhnant snasail fhoillseachadh ann an TON a fhuaireadh .boc feumar am faidhle a chuir chun blockchain aâ cleachdadh teachdaiche aotrom (barrachd air sin gu h-ĂŹosal). Ach mus tèid fhoillseachadh, feumaidh tu graman a ghluasad chun an t-seòlaidh a chaidh a chruthachadh, air neo cha tèid an cĂšmhnant snasail fhoillseachadh. Ăs deidh fhoillseachadh, faodaidh tu eadar-obrachadh leis a âchĂšmhnant snasail le bhith aâ cur teachdaireachdan thuige bhon taobh a-muigh (mar eisimpleir, a âcleachdadh teachdaiche aotrom) no bhon taobh a-staigh (mar eisimpleir, bidh aon chĂšmhnant snasail aâ cur teachdaireachd eile taobh a-staigh TON).
Cho luath âs a thuigeas sinn mar a thèid an còd fhoillseachadh, bidh e nas fhasa. Tha fios againn gu ĂŹre mhòr dè a tha sinn airson a sgrĂŹobhadh agus mar a dhâ obraicheas ar prògram. Agus fhad âs a tha sinn aâ sgrĂŹobhadh, bidh sinn a âcoimhead airson mar a tha seo air a chuir an gnĂŹomh ann an cĂšmhnantan snasail a thâ ann mar-thĂ , no bidh sinn a âcoimhead a-steach don chòd buileachaidh Fift и FunC anns an ionad-tasgaidh oifigeil, no coimhead anns na sgrĂŹobhainnean oifigeil.
Glè thric bha mi aâ coimhead airson prĂŹomh fhaclan anns aâ chat Telegram far an do chruinnich com-pĂ irtichean na farpais agus luchd-obrach Telegram, agus mar sin thachair gun do chruinnich a h-uile duine an sin rè aâ cho-fharpais agus thòisich iad aâ bruidhinn air Fift agus FunC. Ceangal aig deireadh an artaigil.
Tha an t-à m ann gluasad bho theòiridh gu cleachdadh.
Ag ullachadh na h-Ă rainneachd airson a bhith ag obair le TON
Rinn mi a h-uile rud a thèid a mhÏneachadh san artaigil air MacOS agus rinn mi sgrÚdadh dÚbailte air ann an dreach glan. Ubuntu 18.04 LTS air Docker.
Is e a 'chiad rud a dh'fheumas tu a dhèanamh a luchdachadh sÏos agus a stà ladh lite-client leis an urrainn dhut iarrtasan a chuir gu TON.
Tha an stiĂšireadh air an lĂ rach-lĂŹn oifigeil aâ toirt cunntas mionaideach agus soilleir air aâ phròiseas stĂ laidh, gun mòran fiosrachaidh fhĂ gail a-mach. An seo, bidh sinn aâ leantainn an stiĂširidh, aâ stĂ ladh eisimeileachdan sam bith a tha a dhĂŹth air an t-slighe. Cha do chuir mi gach pròiseact ri chèile mi-fhĂŹn agus stĂ laich mi e bhon stòr-dĂ ta oifigeil. Ubuntu (air MacOS a chleachd mi brew).
apt -y install git
apt -y install wget
apt -y install cmake
apt -y install g++
apt -y install zlib1g-dev
apt -y install libssl-dev Aon uair âs gu bheil a h-uile eisimeileachd air a chuir a-steach faodaidh tu a stĂ ladh lite-client, Fift, FunC.
An toiseach, bidh sinn aâ clonadh an stòr TON còmhla ris na h-eisimeileachdan aige. Airson goireasachd, nĂŹ sinn a h-uile cĂ il ann am pasgan ~/TON.
cd ~/TON
git clone https://github.com/ton-blockchain/ton.git
cd ./ton
git submodule update --init --recursiveBidh an stòr cuideachd aâ stòradh buileachadh Fift и FunC.
A-nis tha sinn deiseil airson am pròiseact a chruinneachadh. Tha an còd tasgaidh air a chlonadh ann am pasgan ~/TON/ton. Tha a ' ~/TON cruthaich pasgan build agus cruinnich am pròiseact innte.
mkdir ~/TON/build
cd ~/TON/build
cmake ../tonLeis gu bheil sinn a 'dol a sgrĂŹobhadh cĂšmhnant snasail, chan fheum sinn a-mhĂ in lite-clientach Fift Ń FunC, mar sin leig leinn a h-uile cĂ il a chruinneachadh. Chan e pròiseas luath a thâ ann, agus mar sin tha sinn aâ feitheamh.
cmake --build . --target lite-client
cmake --build . --target fift
cmake --build . --target funcAn uairsin, luchdaich sÏos am faidhle rèiteachaidh anns a bheil dà ta mun nód dha bheil lite-client ceangailidh.
wget https://test.ton.org/ton-lite-client-test1.config.jsonAâ dèanamh aâ chiad iarrtasan gu TON
A-nis leig leinn a chuir air bhog lite-client.
cd ~/TON/build
./lite-client/lite-client -C ton-lite-client-test1.config.jsonMa bha an togail soirbheachail, an uairsin às deidh dhut a chuir air bhog chÏ thu log de cheangal an neach-dèiligidh solais ris an nód.
[ 1][t 2][1582054822.963129282][lite-client.h:201][!testnode] conn ready
[ 2][t 2][1582054823.085654020][lite-client.cpp:277][!testnode] server version is 1.1, capabilities 7
[ 3][t 2][1582054823.085725069][lite-client.cpp:286][!testnode] server time is 1582054823 (delta 0)
...Faodaidh tu an à ithne a ruith help agus faic dè na h-òrdughan a tha rim faighinn.
helpDèanamaid liosta de na h-òrdughan a chleachdas sinn san artaigil seo.
list of available commands:
last Get last block and state info from server
sendfile <filename> Load a serialized message from <filename> and send it to server
getaccount <addr> [<block-id-ext>] Loads the most recent state of specified account; <addr> is in [<workchain>:]<hex-or-base64-addr> format
runmethod <addr> [<block-id-ext>] <method-id> <params>... Runs GET method <method-id> of account <addr> with specified parameterslast пОНŃŃĐ°ĐľŃ ĐżĐžŃНодниК ŃОСданнŃĐš йНОк Ń ŃĐľŃвоŃа.
sendfile <filename> ĐžŃĐżŃавНŃĐľŃ Đ˛ TON ŃаКН Ń ŃООйŃониоП, иПоннО Ń ĐżĐžĐźĐžŃŃŃ ŃŃОК ĐşĐžĐźĐ°Đ˝Đ´Ń ĐżŃйНикŃĐľŃŃŃ ŃПаŃŃ-кОнŃŃĐ°ĐşŃ Đ¸ СапŃŃĐžŃŃ Đş ноПŃ.
getaccount <addr> СагŃŃĐśĐ°ĐľŃ ŃокŃŃоо ŃĐžŃŃĐžŃнио ŃПаŃŃ-кОнŃŃакŃа Ń ŃкаСаннŃĐź адŃĐľŃОП.
runmethod <addr> [<block-id-ext>] <method-id> <params> СапŃŃĐşĐ°ĐľŃ get-ПоŃĐžĐ´Ń ŃПаŃŃкОнŃŃакŃа. A-nis tha sinn deiseil airson an cĂšmhnant fhèin a sgrĂŹobhadh.
РоаНиСаŃиŃ
Idea
Mar a sgrĂŹobh mi gu h-Ă rd, is e crannchur a th 'anns a' chĂšmhnant snasail a tha sinn a 'sgrĂŹobhadh.
A bharrachd air an sin, chan e crannchur a tha seo anns am feum thu tiogaid a cheannach agus feitheamh uair, latha no mĂŹos, ach fear sa bhad anns am bi an neach-cleachdaidh aâ gluasad gu seòladh aâ chĂšmhnant. N gram, agus sa bhad gheibh e air ais e 2 * N gram no caill. NĂŹ sinn an coltachd buannachadh mu 40%. Mura h-eil gram gu leòr ann airson pĂ igheadh, beachdaichidh sinn air aâ ghnothach mar rud a bharrachd.
A bharrachd air an sin, tha e cudromach gum faicear geall ann an à m fÏor agus ann an cruth goireasach, gus an tuig an neach-cleachdaidh sa bhad a bheil e air buannachadh no air chall. Mar sin, feumaidh tu là rach-lÏn a dhèanamh a sheallas geall agus toraidhean gu dÏreach bho TON.
A 'sgrĂŹobhadh cĂšmhnant smart
Airson goireasachd, tha mi air an còd airson FunC a shoilleireachadh; faodar am plugan a lorg agus a chuir a-steach ann an sgrÚdadh Còd Visual Studio; ma tha thu gu h-obann airson rudeigin a chuir ris, tha mi air am plugan fhoillseachadh gu poblach. Cuideachd, rinn cuideigin plugan roimhe seo airson a bhith ag obair le Fift, faodaidh tu cuideachd a stà ladh agus a lorg ann an VSC.
Cruthaichidh sinn sa bhad stòr far an toir sinn seachad na toraidhean eadar-mheadhanach.
Gus ar beatha a dhèanamh nas fhasa, sgrĂŹobhaidh sinn cĂšmhnant snasail agus deuchainn gu h-ionadail gus am bi e deiseil. Is ann dĂŹreach Ă s deidh sin a dhâ fhoillsicheas sinn e ann an TON.
Tha dĂ dhòigh taobh a-muigh aig aâ chĂšmhnant snasail a gheibhear thuige. Aâ chiad, recv_external() tha an gnĂŹomh seo air a chuir gu bĂ s nuair a thig iarrtas chun chĂšmhnant bhon t-saoghal a-muigh, is e sin, chan ann bho TON, mar eisimpleir, nuair a bhios sinn fhĂŹn aâ gineadh teachdaireachd agus ga chuir tron ââââchliant lite. An dĂ rna, recv_internal() seo nuair, taobh a-staigh TON fhèin, tha cĂšmhnant sam bith aâ toirt iomradh air an fheadhainn againne. Anns an dĂ chĂšis, faodaidh tu crĂŹochan a thoirt don ghnĂŹomh.
Feuch an tòisich sinn le eisimpleir shÏmplidh a dh'obraicheas ma thèid fhoillseachadh, ach chan eil eallach gnÏomhach ann.
() recv_internal(slice in_msg) impure {
;; TODO: implementation
}
() recv_external(slice in_msg) impure {
;; TODO: implementation
}An seo feumaidh sinn mĂŹneachadh dè a thâ ann slice. Tha a h-uile dĂ ta a tha air a stòradh ann an TON Blockchain na chruinneachadh TVM cell no dĂŹreach cell, ann an cealla mar sin faodaidh tu suas ri 1023 pĂŹosan dĂ ta a stòradh agus suas ri 4 ceanglaichean gu ceallan eile.
TVM cell slice no slice tha seo na phĂ irt den fhear a thâ ann mar-thĂ cell air a chleachdadh airson a pharsadh, bidh e soilleir nas fhaide air adhart. Is e am prĂŹomh rud dhuinne gun urrainn dhuinn gluasad slice agus a rèir an t-seòrsa teachdaireachd, pròiseas an dĂ ta a-steach recv_external() no recv_internal().
impure - prĂŹomh fhacal a tha aâ nochdadh gu bheil an gnĂŹomh ag atharrachadh dĂ ta cĂšmhnant snasail.
Sà bhail sinn an còd cÚmhnant a-steach lottery-code.fc agus a chur ri chèile.
~/TON/build/crypto/func -APSR -o lottery-compiled.fif ~/TON/ton/crypto/smartcont/stdlib.fc ./lottery-code.fc Faodar brĂŹgh nam brataichean fhaicinn aâ cleachdadh an Ă ithne
~/TON/build/crypto/func -helpTha sinn air còd assembler Fift a chuir ri chèile a-steach lottery-compiled.fif:
// lottery-compiled.fif
"Asm.fif" include
// automatically generated from `/Users/rajymbekkapisev/TON/ton/crypto/smartcont/stdlib.fc` `./lottery-code.fc`
PROGRAM{
DECLPROC recv_internal
DECLPROC recv_external
recv_internal PROC:<{
// in_msg
DROP //
}>
recv_external PROC:<{
// in_msg
DROP //
}>
}END>cFaodar a chuir air bhog gu h-ionadail, airson seo ullaichidh sinn an Ă rainneachd.
Thoir an aire gu bheil a 'chiad loidhne a' ceangal Asm.fif, is e seo còd sgrÏobhte ann am Fift for the Fift assembler.
Leis gu bheil sinn airson an cĂšmhnant snasail a ruith agus fheuchainn gu h-ionadail, cruthaichidh sinn faidhle lottery-test-suite.fif agus dèan lethbhreac den chòd cruinnichte an sin, aâ dol an Ă ite na loidhne mu dheireadh ann, a bhios aâ sgrĂŹobhadh aâ chòd cĂšmhnant snasail gu seasmhach codegus an uairsin a ghluasad chun inneal brĂŹgheil:
"TonUtil.fif" include
"Asm.fif" include
PROGRAM{
DECLPROC recv_internal
DECLPROC recv_external
recv_internal PROC:<{
// in_msg
DROP //
}>
recv_external PROC:<{
// in_msg
DROP //
}>
}END>s constant code
Gu ruige seo tha e coltach gu bheil e soilleir, a-nis cuiridh sinn ris an aon fhaidhle an còd a chleachdas sinn gus TVM a chuir air bhog.
0 tuple 0x076ef1ea , // magic
0 , 0 , // actions msg_sents
1570998536 , // unix_time
1 , 1 , 3 , // block_lt, trans_lt, rand_seed
0 tuple 100000000000000 , dictnew , , // remaining balance
0 , dictnew , // contract_address, global_config
1 tuple // wrap to another tuple
constant c7
0 constant recv_internal // to run recv_internal()
-1 constant recv_external // to invoke recv_external()Đ c7 bidh sinn aâ clĂ radh aâ cho-theacsa, is e sin, an dĂ ta leis an tèid an TVM (no stĂ it an lĂŹonraidh) a chur air bhog. FiĂš 's rè a' cho-fharpais, sheall aon de na leasaichean mar a chruthaicheas iad c7 agus rinn mi lethbhreac. San artaigil seo is dòcha gum feum sinn atharrachadh rand_seed leis gu bheil gineadh Ă ireamh air thuaiream an urra ris agus mura tèid atharrachadh, thèid an aon Ă ireamh a thilleadh a h-uile turas.
recv_internal и recv_external bidh uallach air rèiteachaidhean le luachan 0 agus -1 airson na gnÏomhan co-fhreagarrach a ghairm sa chÚmhnant snasail.
A-nis tha sinn deiseil airson aâ chiad deuchainn a chruthachadh airson ar cĂšmhnant smart falamh. Airson soilleireachd, airson a-nis cuiridh sinn a h-uile deuchainn ris an aon fhaidhle lottery-test-suite.fif.
Cruthaichidh sinn caochladair storage agus sgrÏobh ann aon falamh ann cell, bidh seo a 'smart' stòradh cÚmhnant.
message Is e seo an teachdaireachd a bheir sinn chun neach-conaltraidh snasail bhon taobh a-muigh. Bidh sinn cuideachd ga dhèanamh falamh airson a-nis.
variable storage
<b b> storage !
variable message
<b b> message ! Ăs deidh dhuinn na seasmhach agus na caochladairean ullachadh, bidh sinn a âcur TVM air bhog aâ cleachdadh an Ă ithne runvmctx agus cuir seachad na crĂŹochan cruthaichte chun an cuir a-steach.
message @
recv_external
code
storage @
c7
runvmctx Aig aâ cheann thall bidh sinn aâ soirbheachadh Còd airson eadar-mheadhanach a Fift.
A-nis is urrainn dhuinn an còd a thig às a ruith.
export FIFTPATH=~/TON/ton/crypto/fift/lib // вŃпОНнŃоП Один ŃаС Đ´ĐťŃ ŃдОйŃŃва
~/TON/build/crypto/fift -s lottery-test-suite.fif Bu chòir don phrògram ruith gun mhearachdan agus anns an toradh chÏ sinn an loga cur gu bà s:
execute SETCP 0
execute DICTPUSHCONST 19 (xC_,1)
execute DICTIGETJMPZ
execute DROP
execute implicit RET
[ 3][t 0][1582281699.325381279][vm.cpp:479] steps: 5 gas: used=304, max=9223372036854775807, limit=9223372036854775807, credit=0Sgoinneil, tha sinn air aâ chiad dreach obrach den chĂšmhnant snasail a sgrĂŹobhadh.
A-nis feumaidh sinn comas-gnÏomh a chuir ris. An toiseach leig dhuinn dèiligeadh ri teachdaireachdan a thig bhon t-saoghal a-muigh gu recv_external()
Bidh an leasaiche fhèin aâ taghadh an cruth teachdaireachd ris am faod an cĂšmhnant gabhail ris.
Ach mar as trice
- an toiseach, tha sinn airson ar cĂšmhnant a dhĂŹon bhon t-saoghal a-muigh agus a dhèanamh gus nach urrainn ach sealbhadair aâ chĂšmhnant teachdaireachdan bhon taobh a-muigh a chuir thuige.
- san dĂ rna Ă ite, nuair a chuireas sinn teachdaireachd dhligheach gu TON, tha sinn airson gun tachair seo dĂŹreach aon turas agus nuair a chuireas sinn an aon teachdaireachd a-rithist, tha an cĂšmhnant snasail ga dhiĂšltadh.
Mar sin bidh cha mhòr a h-uile cĂšmhnant aâ fuasgladh an dĂ dhuilgheadas sin, leis gu bheil ar cĂšmhnant aâ gabhail ri teachdaireachdan bhon taobh a-muigh, feumaidh sinn aire a thoirt dha sin cuideachd.
Bidh sinn ga dhèanamh ann an òrdugh cÚil. An toiseach, leig dhuinn fuasgladh fhaighinn air an duilgheadas le ath-aithris; ma tha an cÚmhnant mar-thà air a leithid de theachdaireachd fhaighinn agus air a phròiseasadh, cha chuir e an gnÏomh e an dà rna turas. Agus an uairsin fuasglaidh sinn an duilgheadas gus nach urrainn ach cearcall sònraichte de dhaoine teachdaireachdan a chuir chun chÚmhnant snasail.
Tha diofar dhòighean ann air an duilgheadas fhuasgladh le teachdaireachdan dĂšblaichte. Seo mar a nĂŹ sinn e. Anns a 'chĂšmhnant snasail, bidh sinn a' tòiseachadh a 'chunntair de theachdaireachdan a fhuaireadh leis a' chiad luach 0. Anns gach teachdaireachd ris a 'chĂšmhnant snasail, cuiridh sinn ris a' chunntair lĂ ithreach. Mura h-eil an luach cuntair san teachdaireachd a rèir luach aâ chĂšmhnant snasail, cha bhith sinn ga phròiseasadh; ma nĂŹ e, bidh sinn ga phròiseasadh agus ag Ă rdachadh aâ chunntair sa chĂšmhnant snasail le 1.
Tillidh sinn gu lottery-test-suite.fif agus cuir dara deuchainn ris. Ma chuireas sinn à ireamh ceà rr, bu chòir don chòd eisgeachd a thilgeil. Mar eisimpleir, leig le stòr dà ta cÚmhnant 166, agus cuiridh sinn 165.
<b 166 32 u, b> storage !
<b 165 32 u, b> message !
message @
recv_external
code
storage @
c7
runvmctx
drop
exit_code !
."Exit code " exit_code @ . cr
exit_code @ 33 - abort"Test #2 Not passed"Cuir air bhog sinn.
~/TON/build/crypto/fift -s lottery-test-suite.fif Agus chĂŹ sinn gu bheil an deuchainn air a chur gu bĂ s le mearachd.
[ 1][t 0][1582283084.210902214][words.cpp:3046] lottery-test-suite.fif:67: abort": Test #2 Not passed
[ 1][t 0][1582283084.210941076][fift-main.cpp:196] Error interpreting file `lottery-test-suite.fif`: error interpreting included file `lottery-test-suite.fif` : lottery-test-suite.fif:67: abort": Test #2 Not passedAig an Ïre seo lottery-test-suite.fif bu chòir coimhead coltach .
A-nis leig leinn loidsig aâ chunntair a chuir ris aâ chĂšmhnant snasail a-steach lottery-code.fc.
() recv_internal(slice in_msg) impure {
;; TODO: implementation
}
() recv_external(slice in_msg) impure {
if (slice_empty?(in_msg)) {
return ();
}
int msg_seqno = in_msg~load_uint(32);
var ds = begin_parse(get_data());
int stored_seqno = ds~load_uint(32);
throw_unless(33, msg_seqno == stored_seqno);
}Đ slice in_msg is breug an teachdaireachd a chuireas sinn.
Is e aâ chiad rud a nĂŹ sinn sgrĂšdadh a bheil dĂ ta anns an teachdaireachd, mura h-eil, bidh sinn dĂŹreach aâ falbh.
An uairsin bidh sinn a 'roinn an teachdaireachd. in_msg~load_uint(32) Luchdaich an Ă ireamh 165, 32-bit unsigned int bhon teachdaireachd a chaidh a chraoladh.
An uairsin bidh sinn aâ luchdachadh 32 pĂŹosan bhon stòradh cĂšmhnant smart. Bidh sinn aâ dèanamh cinnteach gu bheil an Ă ireamh luchdaichte aâ freagairt ris an fhear a chaidh seachad; mura h-eil, bidh sinn aâ tilgeil eisgeachd. Anns a 'chĂšis againn, leis gu bheil sinn a' dol seachad air neo-ghèam, bu chòir eisgeachd a thilgeil.
A-nis leig dhuinn a chur ri chèile.
~/TON/build/crypto/func -APSR -o lottery-compiled.fif ~/TON/ton/crypto/smartcont/stdlib.fc ./lottery-code.fc Dèan lethbhreac den chòd a thig Ă s gu lottery-test-suite.fif, gun a bhith aâ dĂŹochuimhneachadh an loidhne mu dheireadh a chuir na Ă ite.
NĂŹ sinn cinnteach gu bheil an deuchainn seachad:
~/TON/build/crypto/fift -s lottery-test-suite.fifChĂŹ thu an gealltanas co-fhreagarrach leis na toraidhean lĂ ithreach.
Thoir an aire gu bheil e mĂŹ-ghoireasach an còd cruinn de chĂšmhnant snasail a chopaigeadh gu faidhle le deuchainnean, agus mar sin sgrĂŹobhaidh sinn sgriobt a sgrĂŹobhas an còd gu cunbhalach dhuinn, agus bidh sinn dĂŹreach aâ ceangal aâ chòd cruinnichte ris na deuchainnean againn aâ cleachdadh "include".
Cruthaich faidhle ann am pasgan aâ phròiseict build.sh leis an t-susbaint a leanas.
#!/bin/bash
~/TON/build/crypto/func -SPA -R -o lottery-compiled.fif ~/TON/ton/crypto/smartcont/stdlib.fc ./lottery-code.fcDèanamaid e so-ghnÏomhaichte.
chmod +x ./build.shA-nis, dÏreach ruith an sgriobt againn gus an cÚmhnant a chuir ri chèile. Ach a bharrachd air an seo, feumaidh sinn a sgrÏobhadh gu seasmhach code. Mar sin cruthaichidh sinn faidhle Úr lotter-compiled-for-test.fif, a bheir sinn a-steach don fhaidhle lottery-test-suite.fif.
Nach cuir sinn còd skirpt ri sh, a nÏ dÏreach dÚblachadh air an fhaidhle cruinnichte a-steach lotter-compiled-for-test.fif agus atharraich an loidhne mu dheireadh innte.
# copy and change for test
cp lottery-compiled.fif lottery-compiled-for-test.fif
sed '$d' lottery-compiled-for-test.fif > test.fif
rm lottery-compiled-for-test.fif
mv test.fif lottery-compiled-for-test.fif
echo -n "}END>s constant code" >> lottery-compiled-for-test.fifA-nis, airson sgrÚdadh, ruithidh sinn an sgriobt a thig às agus thèid faidhle a chruthachadh lottery-compiled-for-test.fif, a bheir sinn a steach 'nar n- lottery-test-suite.fif
Рlottery-test-suite.fif sguab às an còd cÚmhnant agus cuir ris an loidhne "lottery-compiled-for-test.fif" include.
Bidh sinn aâ ruith deuchainnean gus dèanamh cinnteach gu bheil iad seachad.
~/TON/build/crypto/fift -s lottery-test-suite.fifSgoinneil, a-nis gus foillseachadh deuchainnean a chuir air bhog gu fèin-ghluasadach, cruthaichidh sinn faidhle test.sh, a chuireas an gnÏomh an toiseach build.sh, agus an uairsin ruith na deuchainnean.
touch test.sh
chmod +x test.shBidh sinn aâ sgrĂŹobhadh a-staigh
./build.sh
echo "nCompilation completedn"
export FIFTPATH=~/TON/ton/crypto/fift/lib
~/TON/build/crypto/fift -s lottery-test-suite.fifDèanamaid e test.sh agus ruith e gus dèanamh cinnteach gu bheil na deuchainnean ag obair.
chmod +x ./test.sh
./test.shBidh sinn aâ dèanamh cinnteach gu bheil an cĂšmhnant air a chruinneachadh agus gu bheil na deuchainnean air an coileanadh.
Sgoinneil, a-nis air tòiseachadh test.sh Thèid na deuchainnean a chuir ri chèile agus ruith iad sa bhad. Seo an ceangal gu .
Ceart gu leòr, mus lean sinn oirnn, dèanamaid aon rud eile airson goireasachd.
Cruthaichidh sinn pasgan build far an glèidh sinn an cĂšmhnant a chaidh a lethbhreacadh agus a chlò air a sgrĂŹobhadh gu seasmhach lottery-compiled.fif, lottery-compiled-for-test.fif. Cruthaichidh sinn pasgan cuideachd test cĂ ite am bi am faidhle deuchainn air a stòradh? lottery-test-suite.fif agus faidhlichean taic eile a dhâ fhaodadh a bhith ann. .
Leanaidh sinn oirnn aâ leasachadh aâ chĂšmhnant smart.
An uairsin bu chòir deuchainn a bhith ann a nĂŹ cinnteach gu bheil an teachdaireachd air fhaighinn agus gu bheil an cuntair air Ăšrachadh anns aâ bhĂšth nuair a chuireas sinn an Ă ireamh cheart. Ach nĂŹ sinn sin nas fhaide air adhart.
A-nis smaoinichidh sinn air dè an structar dĂ ta agus dè an dĂ ta a dhâ fheumar a stòradh sa chĂšmhnant snasail.
Bheir mi cunntas air a h-uile dad a bhios sinn aâ stòradh.
`seqno` 32-Ń
йиŃнОо ŃоНОо пОНОМиŃоНŃнОо ŃиŃНО ŃŃĐľŃŃик.
`pubkey` 256-Ńи йиŃнОо ŃоНОо пОНОМиŃоНŃнОо ŃиŃНО ĐżŃйНиŃĐ˝ŃĐš кНŃŃ, Ń ĐżĐžĐźĐžŃŃŃ ĐşĐžŃĐžŃОгО, ĐźŃ ĐąŃдоП ĐżŃОвоŃŃŃŃ ĐżĐžĐ´ĐżĐ¸ŃŃ ĐžŃĐżŃавНоннОгО иСвно ŃООйŃониŃ, Đž ŃоП ниМо.
`order_seqno` 32-Ń
йиŃнОо ŃоНОо пОНОМиŃоНŃнОо ŃиŃНО Ń
ŃĐ°Đ˝Đ¸Ń ŃŃĐľŃŃик кОНиŃĐľŃŃва ŃŃавОк.
`number_of_wins` 32-Ń
йиŃнОо ŃоНОо пОНОМиŃоНŃнОо ŃиŃНО Ń
ŃĐ°Đ˝Đ¸Ń ĐşĐžĐťĐ¸ŃĐľŃŃвО пОйод.
`incoming_amount` Ńип даннŃŃ
Gram (поŃвŃĐľ 4 йиŃа ĐžŃвоŃĐ°ĐľŃ ĐˇĐ° дНинŃ), Ń
ŃĐ°Đ˝Đ¸Ń ĐžĐąŃоо кОНиŃĐľŃŃвО ĐłŃаПОв, кОŃĐžŃŃĐľ ĐąŃНи ĐžŃĐżŃĐ°Đ˛ĐťĐľĐ˝Ń Đ˝Đ° кОнŃŃŃакŃ.
`outgoing_amount` ОйŃоо кОНиŃĐľŃŃвО ĐłŃаПОв, кОŃĐžŃОо ĐąŃНО ĐžŃĐżŃавНонО пОйодиŃоНŃĐź.
`owner_wc` Đ˝ĐžĐźĐľŃ Đ˛ĐžŃĐşŃоКна, 32-Ń
йиŃнОо (в нокОŃĐžŃŃŃ
ПоŃŃаŃ
напиŃанО, ŃŃĐž 8-Пи йиŃнОо) ŃоНОо ŃиŃНО. РданнŃĐš ĐźĐžĐźĐľĐ˝Ń Đ˛ŃогО два -1 и 0.
`owner_account_id` 256-Ńи йиŃнОо ŃоНОо пОНОМиŃоНŃнОо ŃиŃНО, адŃĐľŃ ĐşĐžĐ˝ŃŃакŃа в ŃокŃŃоП вОŃĐşŃоКно.
`orders` поŃĐľĐźĐľĐ˝Đ˝Đ°Ń Ńипа ŃНОваŃŃ, Ń
ŃĐ°Đ˝Đ¸Ń ĐżĐžŃНоднио двадŃаŃŃ ŃŃавОк. An uairsin feumaidh tu dĂ ghnĂŹomh a sgrĂŹobhadh. Canaidh sinn aâ chiad fhear pack_state(), a bhios aâ pacadh an dĂ ta airson a shĂ bhaladh Ă s deidh sin ann an stòradh cĂšmhnant smart. Canaidh sinn an dĂ rna fear unpack_state() leughaidh agus tillidh e dĂ ta bhon stòradh.
_ pack_state(int seqno, int pubkey, int order_seqno, int number_of_wins, int incoming_amount, int outgoing_amount, int owner_wc, int owner_account_id, cell orders) inline_ref {
return begin_cell()
.store_uint(seqno, 32)
.store_uint(pubkey, 256)
.store_uint(order_seqno, 32)
.store_uint(number_of_wins, 32)
.store_grams(incoming_amount)
.store_grams(outgoing_amount)
.store_int(owner_wc, 32)
.store_uint(owner_account_id, 256)
.store_dict(orders)
.end_cell();
}
_ unpack_state() inline_ref {
var ds = begin_parse(get_data());
var unpacked = (ds~load_uint(32), ds~load_uint(256), ds~load_uint(32), ds~load_uint(32), ds~load_grams(), ds~load_grams(), ds~load_int(32), ds~load_uint(256), ds~load_dict());
ds.end_parse();
return unpacked;
}Bidh sinn aâ cur an dĂ ghnĂŹomh seo ri toiseach aâ chĂšmhnant snasail. Obraichidh e a-mach toradh eadar-mheadhanach.
Gus dà ta a shà bhaladh feumaidh tu an gnÏomh togte a ghairm set_data() agus sgrÏobhaidh e dà ta bho pack_state() ann an stòradh cÚmhnant smart.
cell packed_state = pack_state(arg_1, .., arg_n);
set_data(packed_state);A-nis gu bheil gnĂŹomhan goireasach againn airson sgrĂŹobhadh agus leughadh dĂ ta, is urrainn dhuinn gluasad air adhart.
Feumaidh sinn dèanamh cinnteach gu bheil an teachdaireachd a thig a-steach bhon taobh a-muigh air a shoidhnigeadh le sealbhadair aâ chĂšmhnaint (no neach-cleachdaidh eile aig a bheil cothrom air an iuchair phrĂŹobhaideach).
Nuair a dhâ fhoillsicheas sinn cĂšmhnant snasail, is urrainn dhuinn a thòiseachadh leis an dĂ ta a tha a dhĂŹth oirnn ann an stòradh, a thèid a shĂ bhaladh airson a chleachdadh san Ă m ri teachd. ClĂ raidh sinn an iuchair phoblach an sin gus an urrainn dhuinn dearbhadh gun deach an teachdaireachd a thĂ inig a-steach a shoidhnigeadh leis an iuchair phrĂŹobhaideach iomchaidh.
Mus lean sinn air adhart, cruthaichidh sinn iuchair phrÏobhaideach agus sgrÏobh e thuige test/keys/owner.pk. Gus seo a dhèanamh, leig dhuinn Fift a chuir air bhog ann am modh eadar-ghnÏomhach agus cuir an gnÏomh ceithir òrdughan.
`newkeypair` гоноŃаŃĐ¸Ń ĐżŃйНиŃнОгО и ĐżŃиваŃнОгО кНŃŃа и СапиŃŃ Đ¸Ń
в ŃŃок.
`drop` ŃĐ´Đ°ĐťĐľĐ˝Đ¸Ń Đ¸Đˇ ŃŃока воŃŃ
ногО ŃНоПонŃа (в даннОП ŃĐťŃŃао ĐżŃйНиŃĐ˝ŃĐš кНŃŃ)
`.s` ĐżŃĐžŃŃĐž пОŃПОŃŃĐľŃŃ ŃŃĐž ĐťĐľĐśĐ¸Ń Đ˛ ŃŃоко в даннŃĐš ПОПонŃ
`"owner.pk" B>file` СапиŃŃ ĐżŃиваŃнОгО кНŃŃа в ŃаКН Ń Đ¸ĐźĐľĐ˝ĐľĐź `owner.pk`.
`bye` СавоŃŃĐ°ĐľŃ ŃайОŃŃ Ń Fift. Cruthaichidh sinn pasgan keys taobh a-staigh a 'phasgan test agus sgrĂŹobh an iuchair phrĂŹobhaideach an sin.
mkdir test/keys
cd test/keys
~/TON/build/crypto/fift -i
newkeypair
ok
.s
BYTES:128DB222CEB6CF5722021C3F21D4DF391CE6D5F70C874097E28D06FCE9FD6917 BYTES:DD0A81AAF5C07AAAA0C7772BB274E494E93BB0123AA1B29ECE7D42AE45184128
drop
ok
"owner.pk" B>file
ok
byeChĂŹ sinn faidhle sa phasgan lĂ ithreach owner.pk.
Bheir sinn air falbh an iuchair phoblach bhon stac agus nuair a bhios feum air gheibh sinn bhon fhear phrĂŹobhaideach i.
A-nis feumaidh sinn dearbhadh ainm-sgrĂŹobhte a sgrĂŹobhadh. Feuch an tòisich sinn leis an deuchainn. An toiseach leugh sinn an iuchair phrĂŹobhaideach bhon fhaidhle aâ cleachdadh aâ ghnĂŹomh file>B agus sgrĂŹobh e gu caochladair owner_private_key, an uairsin a 'cleachdadh a' ghnĂŹomh priv>pub tionndaidh an iuchair phrĂŹobhaideach gu iuchair phoblach agus sgrĂŹobh an toradh a-steach owner_public_key.
variable owner_private_key
variable owner_public_key
"./keys/owner.pk" file>B owner_private_key !
owner_private_key @ priv>pub owner_public_key !Feumaidh sinn an dĂ iuchair.
Bidh sinn aâ tòiseachadh stòradh cĂšmhnant snasail le dĂ ta neo-riaghailteach san aon sreath ris aâ ghnĂŹomh pack_state()agus sgrĂŹobh e ann an caochladair storage.
variable owner_private_key
variable owner_public_key
variable orders
variable owner_wc
variable owner_account_id
"./keys/owner.pk" file>B owner_private_key !
owner_private_key @ priv>pub owner_public_key !
dictnew orders !
0 owner_wc !
0 owner_account_id !
<b 0 32 u, owner_public_key @ B, 0 32 u, 0 32 u, 0 Gram, 0 Gram, owner_wc @ 32 i, owner_account_id @ 256 u, orders @ dict, b> storage !An ath rud, cruthaichidh sinn teachdaireachd soidhnichte, cha bhi ann ach an t-ainm-sgrĂŹobhte agus an luach cuntair.
An toiseach, cruthaichidh sinn an dĂ ta a tha sinn airson a chuir a-mach, an uairsin bidh sinn ga shoidhnigeadh le iuchair phrĂŹobhaideach agus mu dheireadh bidh sinn aâ gineadh teachdaireachd le ainm sgrĂŹobhte.
variable message_to_sign
variable message_to_send
variable signature
<b 0 32 u, b> message_to_sign !
message_to_sign @ hashu owner_private_key @ ed25519_sign_uint signature !
<b signature @ B, 0 32 u, b> <s message_to_send ! Mar thoradh air an sin, tha an teachdaireachd a chuireas sinn chun chĂšmhnant snasail air a chlĂ radh ann an caochladair message_to_send, mu ghnĂŹomhan hashu, ed25519_sign_uint faodaidh tu leughadh .
Agus airson an deuchainn a ruith tha sinn a 'gairm a-rithist.
message_to_send @
recv_external
code
storage @
c7
runvmctxBu chòir gum biodh am faidhle le deuchainnean coltach ri seo aig an Ïre seo.
Feuch an ruith sinn an deuchainn agus fĂ illidh e, agus mar sin atharraichidh sinn an cĂšmhnant snasail gus am faigh e teachdaireachdan den chruth seo agus dearbhadh an ainm-sgrĂŹobhte.
An toiseach, bidh sinn aâ cunntadh 512 pĂŹosan den ainm-sgrĂŹobhte bhon teachdaireachd agus ga sgrĂŹobhadh gu caochladair, an uairsin bidh sinn aâ cunntadh 32 pĂŹosan den chunntair caochlaideach.
Leis gu bheil gnÏomh againn airson dà ta a leughadh bhon stòradh cÚmhnant smart, cleachdaidh sinn e.
An ath rud tha sgrĂšdadh air aâ chunntair a chaidh a ghluasad leis an stòradh agus sĂšil a thoirt air an ainm-sgrĂŹobhte. Mura h-eil rudeigin a 'freagairt, bidh sinn a' tilgeil eisgeachd leis a 'chòd iomchaidh.
var signature = in_msg~load_bits(512);
var message = in_msg;
int msg_seqno = message~load_uint(32);
(int stored_seqno, int pubkey, int order_seqno, int number_of_wins, int incoming_amount, int outgoing_amount, int owner_wc, int owner_account_id, cell orders) = unpack_state();
throw_unless(33, msg_seqno == stored_seqno);
throw_unless(34, check_signature(slice_hash(in_msg), signature, pubkey));Gealltanas iomchaidh .
Rachamaid na deuchainnean agus chĂŹ sinn gu bheil an dĂ rna deuchainn a 'fĂ illigeadh. Airson dĂ adhbhar, chan eil pĂŹosan gu leòr anns an teachdaireachd agus chan eil pĂŹosan gu leòr anns an stòradh, agus mar sin bidh an còd aâ tuiteam nuair a thathar aâ parsadh. Feumaidh sinn ainm-sgrĂŹobhte a chuir ris an teachdaireachd a tha sinn aâ cur agus lethbhreac a dhèanamh den stòradh bhon deuchainn mu dheireadh.
Anns an dà rna deuchainn, cuiridh sinn ainm-sgrÏobhte teachdaireachd ris agus atharraichidh sinn an stòradh cÚmhnant smart. tha am faidhle le deuchainnean coltach ris an-drà sta.
SgrÏobhamaid ceathramh deuchainn, anns an cuir sinn teachdaireachd air a shoidhnigeadh le iuchair phrÏobhaideach cuideigin eile. Cruthaichidh sinn iuchair phrÏobhaideach eile agus sà bhail sinn gu faidhle not-owner.pk. Cuiridh sinn ainm ris an teachdaireachd leis an iuchair phrÏobhaideach seo. Rachamaid na deuchainnean agus dèan cinnteach gun tèid a h-uile deuchainn seachad. aig an à m seo.
A-nis is urrainn dhuinn gluasad air adhart gu bhith aâ buileachadh loidsig cĂšmhnant snasail.
Рrecv_external() gabhaidh sinn ri dà sheòrsa teachdaireachd.
Leis gun cruinnich ar cĂšmhnant call nan cluicheadairean, feumar an t-airgead seo a ghluasad gu neach-cruthachaidh aâ chrannchuir. Tha seòladh wallet neach-cruthachaidh aâ chrannchuir air a chlĂ radh anns an stòradh nuair a thèid an cĂšmhnant a chruthachadh.
DÏreach air eagal, feumaidh sinn an comas an seòladh chun an cuir sinn graman de luchd-call atharrachadh. Bu chòir dhuinn cuideachd a bhith comasach air graman a chuir bhon chrannchur gu seòladh an neach-seilbh.
Feuch an tòisich sinn leis a 'chiad fhear. SgrĂŹobh sinn an toiseach deuchainn a nĂŹ cinnteach Ă s deidh dhuinn an teachdaireachd a chuir, gun do shĂ bhail an cĂšmhnant snasail an seòladh Ăšr anns an stòradh. Thoir an aire, anns an teachdaireachd, a bharrachd air aâ chunntair agus an seòladh Ăšr, gum bi sinn cuideachd aâ sgaoileadh action Ăireamh iomlan neo-Ă icheil 7-bit, a rèir e, taghaidh sinn mar a lĂ imhsicheas sinn an teachdaireachd sa chĂšmhnant snasail.
<b 0 32 u, 1 @ 7 u, new_owner_wc @ 32 i, new_owner_account_id @ 256 u, b> message_to_sign !Anns an deuchainn chÏ thu mar a tha stòradh cÚmhnant smart air a dhÏ-shreathachadh storage ann am Fift. Tha mion-sgrÚdadh air caochladairean air a mhÏneachadh ann an sgrÏobhainnean Fift.
le taois a bharrachd.
Rachamaid an deuchainn agus dèan cinnteach gu bheil e a 'fĂ illigeadh. A-nis leig dhuinn loidsig a chuir ris gus seòladh sealbhadair aâ chrannchuir atharrachadh.
Anns aâ chĂšmhnant snasail tha sinn aâ leantainn air adhart aâ parsadh message, leugh a-steach action. Cuimhnichidh sinn gum bi dithis againn action: atharraich seòladh agus cuir graman.
An uairsin bidh sinn a 'leughadh seòladh Úr sealbhadair a' chÚmhnant agus ga shà bhaladh ann an stòradh.
Bidh sinn aâ ruith nan deuchainnean agus chĂŹ sinn gu bheil an treas deuchainn aâ fĂ iligeadh. Bidh e a âtuiteam air sgĂ th gu bheil an cĂšmhnant a-nis aâ parsadh 7 pĂŹosan bhon teachdaireachd, a tha a dhĂŹth san deuchainn. Cuir fear nach eil ann ris an teachdaireachd action. Rachamaid na deuchainnean agus chĂŹ sinn gu bheil a h-uile cĂ il a 'dol seachad. gealltainn atharrachaidhean. Sgoinneil.
A-nis sgrÏobhamaid an reusanachadh airson an à ireamh shònraichte de ghramaichean a chuir chun t-seòladh a chaidh a shà bhaladh roimhe.
An toiseach, sgrÏobhamaid deuchainn. SgrÏobhaidh sinn dà dheuchainn, aon nuair nach eil cothromachadh gu leòr ann, an dà rna fear nuair a bu chòir a h-uile cà il a dhol seachad gu soirbheachail. Faodar coimhead air deuchainnean .
A-nis leig dhuinn an còd a chur ris. An toiseach, sgrĂŹobhamaid dĂ dhòigh cuideachaidh. Is e aâ chiad dòigh faighinn a-mach an cothromachadh gnĂ thach de chĂšmhnant snasail.
int balance() inline_ref method_id {
return get_balance().pair_first();
}Agus tha an dà rna fear airson graman a chuir gu cÚmhnant snasail eile. Rinn mi leth-bhreac gu tur den dòigh seo bho chÚmhnant snasail eile.
() send_grams(int wc, int addr, int grams) impure {
;; int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool src:MsgAddress -> 011000
cell msg = begin_cell()
;; .store_uint(0, 1) ;; 0 <= format indicator int_msg_info$0
;; .store_uint(1, 1) ;; 1 <= ihr disabled
;; .store_uint(1, 1) ;; 1 <= bounce = true
;; .store_uint(0, 1) ;; 0 <= bounced = false
;; .store_uint(4, 5) ;; 00100 <= address flags, anycast = false, 8-bit workchain
.store_uint (196, 9)
.store_int(wc, 8)
.store_uint(addr, 256)
.store_grams(grams)
.store_uint(0, 107) ;; 106 zeroes + 0 as an indicator that there is no cell with the data.
.end_cell();
send_raw_message(msg, 3); ;; mode, 2 for ignoring errors, 1 for sender pays fees, 64 for returning inbound message value
}Nach cuir sinn an dĂ dhòigh seo ris aâ chĂšmhnant snasail agus sgrĂŹobh sinn an loidsig. An toiseach, bidh sinn aâ parsadh an Ă ireamh ghramaichean bhon teachdaireachd. An uairsin nĂŹ sinn sgrĂšdadh air a âchothromachadh, mura h-eil e gu leòr bidh sinn aâ tilgeil eisgeachd. Ma tha a h-uile cĂ il ceart gu leòr, an uairsin cuiridh sinn na graman chun t-seòladh a chaidh a shĂ bhaladh agus Ăšraich sinn aâ chunntair.
int amount_to_send = message~load_grams();
throw_if(36, amount_to_send + 500000000 > balance());
accept_message();
send_grams(owner_wc, owner_account_id, amount_to_send);
set_data(pack_state(stored_seqno + 1, pubkey, order_seqno, number_of_wins, incoming_amount, outgoing_amount, owner_wc, owner_account_id, orders));aâ coimhead coltach ris aâ chĂšmhnant snasail an-drĂ sta. Feuch an ruith sinn na deuchainnean agus dèan cinnteach gun tèid iad seachad.
Co-dhiĂš, thèid coimisean a thoirt a-mach Ă s a âchĂšmhnant smart a h-uile uair airson teachdaireachd giullachd. Gus am bi na teachdaireachdan cĂšmhnant smart an t-iarrtas a chuir an gnĂŹomh, Ă s deidh sgrĂšdaidhean bunaiteach feumaidh tu fònadh accept_message().
A-nis gluaisidh sinn air adhart gu teachdaireachdan a-staigh. Gu dearbh, cha ghabh sinn ach ri graman agus cuiridh sinn air ais dĂ uiread an t-suim chun a 'chluicheadair ma bhuannaicheas e agus an treas cuid chun an t-sealbhadair ma chailleas e.
An toiseach, sgrĂŹobhamaid deuchainn shĂŹmplidh. Gus seo a dhèanamh, feumaidh sinn seòladh deuchainn den chĂšmhnant snasail Ă s am bi sinn aâ cur graman chun chĂšmhnant snasail.
Tha dà à ireamh anns an t-seòladh cÚmhnant snasail, à ireamh 32-bit le uallach airson an t-sreath-obrach agus à ireamh cunntais sònraichte 256-bit neo-à icheil san t-sreath obrach seo. Mar eisimpleir, -1 agus 12345, is e seo an seòladh a shà bhaileas sinn gu faidhle.
Rinn mi leth-bhreac den ghnÏomh airson an seòladh a shà bhaladh bho .
// ( wc addr fname -- ) Save address to file in 36-byte format
{ -rot 256 u>B swap 32 i>B B+ swap B>file } : save-addressBheir sinn sĂšil air mar a tha an gnĂŹomh ag obair, bheir seo tuigse air mar a tha Fift ag obair. Cuir air bhog Fift ann am modh eadar-ghnĂŹomhach.
~/TON/build/crypto/fift -i An toiseach bidh sinn aâ putadh -1, 12345 agus ainm an fhaidhle san Ă m ri teachd âsender.addrâ air aâ chruach:
-1 12345 "sender.addr" Is e an ath cheum an gnĂŹomh a choileanadh -rot, a ghluaiseas aâ chruach ann an dòigh is gu bheil Ă ireamh cĂšmhnant snasail sònraichte aig mullach na stac:
"sender.addr" -1 12345256 u>B ag atharrachadh Ă ireamh iomlan 256-bit neo-Ă icheil gu bytes.
"sender.addr" -1 BYTES:0000000000000000000000000000000000000000000000000000000000003039swap ag atharrachadh an dĂ eileamaid as Ă irde den chruach.
"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 -132 i>B ag atharrachadh slĂĄn-Ă ireamh 32-bit gu bytes.
"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 BYTES:FFFFFFFFB+ aâ ceangal dĂ shreath de bytes.
"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFFA-rithist swap.
BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF "sender.addr" Agus mu dheireadh tha na bytes air an sgrĂŹobhadh chun fhaidhle B>file. Ăs deidh seo tha ar stac falamh. Stad sinn Fift. Chaidh faidhle a chruthachadh sa phasgan lĂ ithreach sender.addr. Gluaisidh sinn am faidhle chun phasgan a chaidh a chruthachadh test/addresses/.
SgrĂŹobhamaid deuchainn shĂŹmplidh a chuireas graman gu cĂšmhnant sgairteil. .
A-nis leig dhuinn sĂšil a thoirt air loidsig a 'chrannchuir.
Is e aâ chiad rud a nĂŹ sinn sgrĂšdadh air an teachdaireachd bounced no ma tha bounced, an uairsin bidh sinn ga dearmad. bounced ciallachadh gun till an cĂšmhnant graman ma thachras mearachd air choireigin. Cha till sinn graman ma thachras mearachd gu h-obann.
Bidh sinn aâ sgrĂšdadh, ma tha an cothromachadh nas lugha na leth ghram, bidh sinn dĂŹreach a âgabhail ris an teachdaireachd agus ga leigeil seachad.
An ath rud, bidh sinn aâ parsadh seòladh aâ chĂšmhnant snasail Ă s an tĂ inig an teachdaireachd.
Leugh sinn an dà ta bhon stòradh agus an uairsin cuir às do sheann gheall bhon eachdraidh ma tha còrr air fichead dhiubh ann. Airson goireasachd, sgrÏobh mi trÏ gnÏomhan a bharrachd pack_order(), unpack_order(), remove_old_orders().
An ath rud, bidh sinn a 'coimhead mura h-eil an cothromachadh gu leòr airson a' phà ighidh, tha sinn den bheachd nach e geall a tha seo, ach ath-lÏonadh agus sà bhail an ath-lÏonadh ann an orders.
An uairsin mu dheireadh brĂŹgh a âchĂšmhnant smart.
An toiseach, ma chailleas an cluicheadair, bidh sinn ga shĂ bhaladh san eachdraidh geall agus ma tha an t-suim nas motha na 3 gram, bidh sinn aâ cur 1/3 gu sealbhadair aâ chĂšmhnant snasail.
Ma bhuannaicheas an cluicheadair, an uairsin bidh sinn aâ cur a dhĂ uiread gu seòladh aâ chluicheadair agus an uairsin aâ sĂ bhaladh am fiosrachadh mun gheall ann an eachdraidh.
() recv_internal(int order_amount, cell in_msg_cell, slice in_msg) impure {
var cs = in_msg_cell.begin_parse();
int flags = cs~load_uint(4); ;; int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool
if (flags & 1) { ;; ignore bounced
return ();
}
if (order_amount < 500000000) { ;; just receive grams without changing state
return ();
}
slice src_addr_slice = cs~load_msg_addr();
(int src_wc, int src_addr) = parse_std_addr(src_addr_slice);
(int stored_seqno, int pubkey, int order_seqno, int number_of_wins, int incoming_amount, int outgoing_amount, int owner_wc, int owner_account_id, cell orders) = unpack_state();
orders = remove_old_orders(orders, order_seqno);
if (balance() < 2 * order_amount + 500000000) { ;; not enough grams to pay the bet back, so this is re-fill
builder order = pack_order(order_seqno, 1, now(), order_amount, src_wc, src_addr);
orders~udict_set_builder(32, order_seqno, order);
set_data(pack_state(stored_seqno, pubkey, order_seqno + 1, number_of_wins, incoming_amount + order_amount, outgoing_amount, owner_wc, owner_account_id, orders));
return ();
}
if (rand(10) >= 4) {
builder order = pack_order(order_seqno, 3, now(), order_amount, src_wc, src_addr);
orders~udict_set_builder(32, order_seqno, order);
set_data(pack_state(stored_seqno, pubkey, order_seqno + 1, number_of_wins, incoming_amount + order_amount, outgoing_amount, owner_wc, owner_account_id, orders));
if (order_amount > 3000000000) {
send_grams(owner_wc, owner_account_id, order_amount / 3);
}
return ();
}
send_grams(src_wc, src_addr, 2 * order_amount);
builder order = pack_order(order_seqno, 2, now(), order_amount, src_wc, src_addr);
orders~udict_set_builder(32, order_seqno, order);
set_data(pack_state(stored_seqno, pubkey, order_seqno + 1, number_of_wins + 1, incoming_amount, outgoing_amount + 2 * order_amount, owner_wc, owner_account_id, orders));
}Tha sin uile. .
A-nis tha a h-uile cĂ il a tha air fhĂ gail sĂŹmplidh, cruthaichidh sinn dòighean faighinn gus am faigh sinn fiosrachadh mu staid aâ chĂšmhnant bhon t-saoghal a-muigh (gu dearbh, leugh an dĂ ta bhon stòradh cĂšmhnant smart aca).
. Bidh sinn a 'sgrĂŹobhadh gu h-ĂŹosal mu mar a gheibh thu fiosrachadh mu smart cĂšmhnant.
DhĂŹochuimhnich mi cuideachd an còd a chuir ris a lĂ imhsicheas aâ chiad iarrtas a thachras nuair a bhios mi aâ foillseachadh cĂšmhnant snasail. . Agus nas fhaide bug le bhith aâ cur 1/3 den t-suim gu cunntas an neach-seilbh.
Is e an ath cheum an cĂšmhnant smart fhoillseachadh. Cruthaichidh sinn pasgan requests.
Ghabh mi an còd foillseachaidh mar bhunait dè anns an ionad-tasgaidh oifigeil.
Rud as fhiach aire a thoirt dha. Bidh sinn aâ gineadh stòradh cĂšmhnant snasail agus teachdaireachd cuir a-steach. Ăs deidh seo, thèid seòladh a âchĂšmhnant smart a chruthachadh, is e sin, tha fios air an t-seòladh eadhon mus tèid fhoillseachadh ann an TON. An ath rud, feumaidh tu grunn ghramaichean a chuir chun t-seòladh seo, agus dĂŹreach Ă s deidh sin feumaidh tu faidhle a chuir leis aâ chĂšmhnant snasail fhèin, leis gu bheil an lĂŹonra a âgabhail coimisean airson aâ chĂšmhnant snasail agus gnĂŹomhachd a stòradh ann (luchd-dearbhaidh a bhios a âstòradh agus aâ coileanadh smart. cĂšmhnantan). .
An uairsin cuiridh sinn an còd foillseachaidh an gnÏomh agus gheibh sinn lottery-query.boc faidhle cÚmhnant smart agus seòladh.
~/TON/build/crypto/fift -s requests/new-lottery.fif 0Na dĂŹochuimhnich na faidhlichean a chaidh a chruthachadh a shĂ bhaladh: lottery-query.boc, lottery.addr, lottery.pk.
Am measg rudan eile, chĂŹ sinn seòladh aâ chĂšmhnant snasail anns na logaichean cur gu bĂ s.
new wallet address = 0:044910149dbeaf8eadbb2b28722e7d6a2dc6e264ec2f1d9bebd6fb209079bc2a
(Saving address to file lottery.addr)
Non-bounceable address (for init): 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd
Bounceable address (for later access): kQAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8KpFYDÏreach airson spòrs, dèanamaid iarrtas gu TON
$ ./lite-client/lite-client -C ton-lite-client-test1.config.json
getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8KsydAgus chÏ sinn gu bheil an cunntas leis an t-seòladh seo falamh.
account state is emptyBidh sinn a 'cur chun an t-seòlaidh 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd 2 Gram agus an ceann beagan dhiog bidh sinn aâ cur an gnĂŹomh an aon Ă ithne. Airson graman a chuir mi aâ cleachdadh , agus faodaidh tu faighneachd dha cuideigin bhon chat airson graman deuchainn, air am bi mi aâ bruidhinn aig deireadh an artaigil.
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8KsydTha e coltach ri neo-aithnichte (state:account_uninit) cÚmhnant snasail leis an aon sheòladh agus cothromachadh de 1 nanogram.
account state is (account
addr:(addr_std
anycast:nothing workchain_id:0 address:x044910149DBEAF8EADBB2B28722E7D6A2DC6E264EC2F1D9BEBD6FB209079BC2A)
storage_stat:(storage_info
used:(storage_used
cells:(var_uint len:1 value:1)
bits:(var_uint len:1 value:103)
public_cells:(var_uint len:0 value:0)) last_paid:1583257959
due_payment:nothing)
storage:(account_storage last_trans_lt:3825478000002
balance:(currencies
grams:(nanograms
amount:(var_uint len:4 value:2000000000))
other:(extra_currencies
dict:hme_empty))
state:account_uninit))
x{C00044910149DBEAF8EADBB2B28722E7D6A2DC6E264EC2F1D9BEBD6FB209079BC2A20259C2F2F4CB3800000DEAC10776091DCD650004_}
last transaction lt = 3825478000001 hash = B043616AE016682699477FFF01E6E903878CDFD6846042BA1BFC64775E7AC6C4
account balance is 2000000000ngA-nis leig dhuinn an cĂšmhnant smart fhoillseachadh. Nach cuir sinn air bhog lite-client agus cuiridh sinn an gnĂŹomh.
> sendfile lottery-query.boc
[ 1][t 2][1583008371.631410122][lite-client.cpp:966][!testnode] sending query from file lottery-query.boc
[ 3][t 1][1583008371.828550100][lite-client.cpp:976][!query] external message status is 1 Feuch an dèan sinn cinnteach gu bheil an cÚmhnant air fhoillseachadh.
> last
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8KsydAm measg rudan eile gheibh sinn.
storage:(account_storage last_trans_lt:3825499000002
balance:(currencies
grams:(nanograms
amount:(var_uint len:4 value:1987150999))
other:(extra_currencies
dict:hme_empty))
state:(account_activeChĂŹ sinn sin account_active.
Gealltanas co-fhreagarrach le atharrachaidhean .
A-nis cruthaichidh sinn iarrtasan airson eadar-obrachadh leis aâ chĂšmhnant snasail.
Nas mionaidiche, fà gaidh sinn a 'chiad fhear airson an seòladh atharrachadh mar obair neo-eisimeileach, agus nÏ sinn an dà rna fear airson graman a chuir gu seòladh an neach-seilbh. Gu dearbh, feumaidh sinn an aon rud a dhèanamh ris an deuchainn airson graman a chuir.
Is e seo an teachdaireachd a chuireas sinn chun chĂšmhnant smart, far a bheil msg_seqno 165, action 2 agus 9.5 gram airson a chuir.
<b 165 32 u, 2 7 u, 9500000000 Gram, b>Na dĂŹochuimhnich ainm a chuir ris an teachdaireachd leis an iuchair phrĂŹobhaideach agad lottery.pk, a chaidh a chruthachadh na bu thrĂ ithe nuair a chaidh aâ chĂšmhnant snasail a chruthachadh. .
A 'faighinn fiosrachadh bho smart cÚmhnant a' cleachdadh dòighean fhaighinn
A-nis leig dhuinn sÚil a thoirt air mar a ruith smart cÚmhnantan faighinn dòighean.
Cur air bhog lite-client agus ruith na dòighean faighinn a sgrÏobh sinn.
$ ./lite-client/lite-client -C ton-lite-client-test1.config.json
> runmethod 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd balance
arguments: [ 104128 ]
result: [ 64633878952 ]
...Đ result aâ toirt a-steach an luach a tha an gnĂŹomh aâ tilleadh balance() bhon chĂšmhnant smart againn.
NÏ sinn an aon rud airson grunn dhòighean eile.
> runmethod 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd get_seqno
...
arguments: [ 77871 ]
result: [ 1 ] Iarraidh sinn an eachdraidh geall agad.
> runmethod 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd get_orders
...
arguments: [ 67442 ]
result: [ ([0 1 1583258284 10000000000 0 74649920601963823558742197308127565167945016780694342660493511643532213172308] [1 3 1583258347 4000000000 0 74649920601963823558742197308127565167945016780694342660493511643532213172308] [2 1 1583259901 50000000000 0 74649920601963823558742197308127565167945016780694342660493511643532213172308]) ] Cleachdaidh sinn lite-client agus gheibh sinn dòighean gus fiosrachadh mun chÚmhnant snasail a thaisbeanadh air an là rach.
Aâ taisbeanadh dĂ ta cĂšmhnant smart air an lĂ rach-lĂŹn
SgrÏobh mi là rach-lÏn sÏmplidh ann am Python gus an dà ta bhon chÚmhnant snasail a thaisbeanadh ann an dòigh iomchaidh. An seo cha bhith mi a 'fuireach air gu mionaideach agus foillsichidh mi an là rach .
Tha iarrtasan gu TON air an dèanamh bho Python le cuideachadh lite-client. Airson goireasachd, tha an là rach air a phacaigeadh ann an Docker agus air fhoillseachadh air Google Cloud. .
Feuch sinn
A-nis feuchaidh sinn ri graman a chuir an sin airson ath-lÏonadh bho . Cuiridh sinn 40 gram. Agus dèanamaid geall no dhà airson soilleireachd. ChÏ sinn gu bheil an là rach a 'sealltainn eachdraidh gheall, an à ireamh sa cheud a bhuannaich an-drà sta agus fiosrachadh feumail eile.
gun do bhuannaich sinn aâ chiad, gun do chaill sinn an dĂ rna fear.
Post-d gu caraid
Thionndaidh an artaigil a-mach gu bhith fada nas fhaide na bha mi an dĂšil, is dòcha gum faodadh e a bhith nas giorra, no is dòcha dĂŹreach airson neach aig nach eil eòlas sam bith mu TON agus a tha airson cĂšmhnant snasail nach eil cho sĂŹmplidh a sgrĂŹobhadh agus fhoillseachadh leis a âchomas eadar-obrachadh leis. e. Is dòcha gum faodadh cuid de rudan a bhith air am mĂŹneachadh nas sĂŹmplidh.
Is dòcha gum faodadh cuid de thaobhan den bhuileachadh a bhith air a dhèanamh nas èifeachdaiche agus nas eireachdail, ach an uairsin bhiodh e air eadhon barrachd Ăšine a thoirt airson an artaigil ullachadh. Tha e comasach cuideachd gun do rinn mi mearachd an Ă iteigin no nach do thuig mi rudeigin, mar sin ma tha thu a âdèanamh rudeigin dona, feumaidh tu a bhith an urra ris na sgrĂŹobhainnean oifigeil no an stòr oifigeil leis aâ chòd TON.
Bu chòir a thoirt fa-near, leis gu bheil TON fhèin fhathast aig ĂŹre leasachaidh gnĂŹomhach, gum faodadh atharrachaidhean tachairt a bhriseas gin de na ceumannan san artaigil seo (a thachair fhad âs a bha mi aâ sgrĂŹobhadh, chaidh a cheartachadh mar-thĂ ), ach is e an dòigh-obrach coitcheann. eu-coltach ri atharrachadh.
Cha bhith mi aâ bruidhinn mu Ă m ri teachd TON. Is dòcha gum fĂ s an Ă rd-Ăšrlar rudeigin mòr agus bu chòir dhuinn Ăšine a chaitheamh ga sgrĂšdadh agus Ă ite sònraichte a lĂŹonadh leis na toraidhean againn a-nis.
Tha Libra ann cuideachd bho Facebook, aig a bheil comas luchd-cleachdaidh nas motha na TON. Cha mhòr nach eil fios agam mu Libra, aâ breithneachadh leis an fhòram gu bheil tòrr a bharrachd gnĂŹomhachd an sin na ann an coimhearsnachd TON. Ged a tha an luchd-leasachaidh agus coimhearsnachd TON nas coltaiche ri fon talamh, a tha cuideachd fionnar.
iomraidhean
- SgrĂŹobhainnean oifigeil TON:
- Stòr-tasgaidh oifigeil TON:
- Wallet oifigeil airson diofar Ă rd-Ăšrlaran:
- Stòr cÚmhnant smart bhon artaigil seo:
- Ceangal gu lĂ rach-lĂŹn cĂšmhnant smart:
- Stòr airson an leudachadh airson Visual Studio Code airson FunC:
- Bruidhinn mu dheidhinn TON ann an Telegram, a chuidich gu mòr le bhith ga thuigsinn aig a 'chiad ĂŹre. Tha mi aâ smaoineachadh nach e mearachd a bhios ann ma chanas mi gu bheil a h-uile duine a sgrĂŹobh rudeigin airson TON ann. Faodaidh tu cuideachd graman deuchainn iarraidh an sin.
- Còmhradh eile mu TON anns an do lorg mi fiosrachadh feumail:
- Aâ chiad ĂŹre den fharpais:
- An dĂ rna ĂŹre den cho-fharpais:
Source: www.habr.com
