Mayelana nendlela yokubhala nokushicilela inkontileka ehlakaniphile e-TON
Imayelana nani lesi sihloko?
Kulesi sihloko ngizokhuluma ngokuthi ngibambe iqhaza kanjani emncintiswaneni wokuqala (kokubili) we-Telegram blockchain, angizange ngithathe umklomelo, futhi nganquma ukurekhoda ulwazi lwami esihlokweni ukuze singacwili ekukhohlweni futhi, mhlawumbe, ukusiza. umuntu.
Njengoba ngangingafuni ukubhala ikhodi engabonakali, kodwa ukwenza okuthile okusebenzayo, esihlokweni ngabhala inkontileka ehlakaniphile yelotho esheshayo kanye newebhusayithi ebonisa idatha yenkontileka ehlakaniphile ngokuqondile ku-TON ngaphandle kokusebenzisa isitoreji esiphakathi.
Lesi sihloko sizoba usizo kulabo abafuna ukwenza inkontileka yabo yokuqala ehlakaniphile ku-TON, kodwa abazi ukuthi baqale kuphi.
Ngisebenzisa ilotho njengesibonelo, ngizosuka ekufakeni imvelo ngiye ekushicileleni inkontileka ehlakaniphile, ngisebenzisane nayo, futhi ngibhale iwebhusayithi ukuze ngithole futhi ngishicilele idatha.
Mayelana nokuhlanganyela emqhudelwaneni
Ngo-Okthoba odlule, iTelegram yamemezela umncintiswano we-blockchain ngezilimi ezintsha Fift
ΠΈ FunC
. Bekudingeka ukukhetha ekubhaleni noma yiziphi izinkontileka ezihlakaniphile ezinhlanu ezihlongozwayo. Ngacabanga ukuthi kungaba kuhle ukwenza okuhlukile, ngifunde ulimi futhi ngenze okuthile, ngisho noma kungadingeki ngibhale enye into esikhathini esizayo. Ngaphezu kwalokho, isihloko sihlala sisezindebeni.
Kufanelekile ukusho ukuthi ngangingenalo ulwazi lokuthuthukisa izinkontileka ezihlakaniphile.
Ngahlela ukuba nengxenye kuze kube sekupheleni kwaze kwaba yilapho ngikwazi khona bese ngibhala isihloko sokubukeza, kodwa ngehluleka ngaso leso sikhathi kwesokuqala. I FunC
futhi ngokuvamile yasebenza. Ngakuthatha njengesisekelo
Ngaleso sikhathi, ngangicabanga ukuthi lokhu kwakwanele ukuba ngithathe okungenani indawo ethile yomklomelo. Ngenxa yalokho, ababambiqhaza abangaba ngu-40 kwabangu-60 baba abawine imiklomelo futhi ngangingekho phakathi kwabo. Ngokuvamile, akukho lutho olungalungile ngalokhu, kodwa kunento eyodwa eyangikhathazayo. Ngesikhathi kumenyezelwa imiphumela bekungakenziwa ukubuyekezwa kokuhlolwa kwenkontileka yami, ngibuze ababambe iqhaza engxoxweni ukuthi ngabe ukhona yini omunye ongenalo, akekho.
Ngokusobala inaka imilayezo yami, ezinsukwini ezimbili kamuva amajaji ashicilela ukuphawula futhi angiqondi ukuthi baphuthelwe ngephutha inkontileka yami ehlakaniphile ngesikhathi sokwahlulela noma bavele bacabanga ukuthi yayiyimbi kangangokuthi ayidingi ukuphawula. Ngabuza umbuzo ekhasini, kodwa angizange ngithole impendulo. Nakuba kungeyona imfihlo ukuthi ubani owahlulele, ngakubona kungenasidingo ukubhala imilayezo yomuntu siqu.
Isikhathi esiningi sachithwa ekuqondeni, ngakho kwanqunywa ukubhala isihloko. Njengoba lungekho ulwazi oluningi okwamanje, lesi sihloko sizosiza ukonga isikhathi kuwo wonke umuntu onentshisekelo.
Umqondo wezinkontileka ezihlakaniphile e-TON
Ngaphambi kokuba ubhale noma yini, udinga ukuthola ukuthi yiluphi uhlangothi ongasondela kulo le nto. Ngakho-ke, manje ngizokutshela ukuthi yiziphi izingxenye zesistimu. Ngokunembayo, yiziphi izingxenye okudingeka uzazi ukuze ubhale okungenani uhlobo oluthile lwenkontileka yokusebenza.
Sizogxila ekubhaleni inkontileka ehlakaniphile nokusebenza nayo TON Virtual Machine (TVM)
, Fift
ΠΈ FunC
, ngakho-ke isihloko sifana nencazelo yokuthuthukiswa kohlelo olujwayelekile. Ngeke sigxile ekutheni inkundla ngokwayo isebenza kanjani lapha.
Ngokujwayelekile mayelana nokuthi isebenza kanjani TVM
kanye nolimi Fift
kukhona imibhalo esemthethweni emihle. Ngenkathi ngihlanganyela emncintiswaneni futhi manje ngenkathi ngibhala inkontileka yamanje, ngangivame ukuphendukela kuye.
Ulimi oluyinhloko okubhalwa ngalo izinkontileka ezihlakaniphile FunC
. Awekho amadokhumenti kuwo okwamanje, ngakho-ke ukuze ubhale okuthile udinga ukufunda izibonelo zezinkontileka ezihlakaniphile ezivela endaweni yokugcina esemthethweni kanye nokuqaliswa kolimi ngokwalo lapho, futhi ungabheka izibonelo zezinkontileka ezihlakaniphile kusukela kwezimbili ezedlule. imincintiswano. Izixhumanisi ekupheleni kwesihloko.
Ake sithi sesiyibhalele inkontileka ehlakaniphile FunC
, ngemva kwalokho sihlanganisa ikhodi ibe yi-Fift assembler.
Inkontileka ehlakaniphile ehlanganisiwe isazoshicilelwa. Ukuze wenze lokhu udinga ukubhala umsebenzi ku Fift
, okuzothatha ikhodi yenkontileka ehlakaniphile namanye amapharamitha njengokufakwayo, futhi okuphumayo kuzoba ifayela elinesandiso. .boc
(okusho βisikhwama samaseliβ), futhi, kuye ngokuthi sikubhala kanjani, ukhiye wangasese nekheli, okukhiqizwa ngokusekelwe kukhodi yenkontileka ehlakaniphile. Ungakwazi kakade ukuthumela amagremu ekhelini lenkontileka ehlakaniphile elingakashicilelwa.
Ukuze ushicilele inkontileka ehlakaniphile ku-TON yamukelwe .boc
ifayela lizodinga ukuthunyelwa ku-blockchain kusetshenziswa iklayenti elikhanyayo (ngaphezulu kulokho ngezansi). Kodwa ngaphambi kokushicilela, udinga ukudlulisa amagremu ekhelini elakhiwe, ngaphandle kwalokho inkontileka ehlakaniphile ngeke ishicilelwe. Ngemva kokushicilelwa, ungakwazi ukusebenzisana nenkontileka ehlakaniphile ngokuyithumela imiyalezo ngaphandle (ngokwesibonelo, usebenzisa iklayenti elikhanyayo) noma ngaphakathi (isibonelo, inkontileka eyodwa ehlakaniphile ithumela omunye umlayezo ngaphakathi kwe-TON).
Uma sesiqonda ukuthi ikhodi ishicilelwa kanjani, kuba lula. Cishe siyazi ukuthi yini esifuna ukuyibhala nokuthi uhlelo lwethu luzosebenza kanjani. Futhi ngenkathi sibhala, sibheka ukuthi lokhu sekwenziwe kanjani kakade kuzinkontileka ezihlakaniphile ezikhona, noma sibheka ikhodi yokuqaliswa Fift
ΠΈ FunC
endaweni yokugcina esemthethweni, noma ubheke emibhalweni esemthethweni.
Kaningi ngangifuna amagama angukhiye engxoxweni yeTelegramu lapho kwakubuthene khona bonke abahlanganyeli bomncintiswano nabasebenzi beTelegram, futhi kwenzeka ukuthi phakathi nomncintiswano wonke umuntu wahlangana lapho waqala ukuxoxa nge-Fift ne-FunC. Xhuma ekugcineni kwesihloko.
Sekuyisikhathi sokusuka kuthiyori uye ekusebenzeni.
Ukulungiselela imvelo yokusebenza ne-TON
Ngenze konke okuzochazwa esihlokweni se-MacOS futhi ngisihlole kabili ku-Ubuntu 18.04 LTS ehlanzekile ku-Docker.
Into yokuqala okudingeka uyenze ukulanda futhi ufake lite-client
ongathumela ngayo izicelo ku-TON.
Imiyalo ekuwebhusayithi esemthethweni ichaza inqubo yokufaka ngokuningiliziwe nangokucacile futhi ishiya imininingwane ethile. Lapha silandela imiyalelo, sifaka ukuncika okulahlekile endleleni. Angizange ngizihlanganisele iphrojekthi ngayinye ngokwami ββfuthi ngiyifake endaweni esemthethweni ye-Ubuntu (ku-MacOS engangiyisebenzisa 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
Uma konke okuncikile sekufakiwe ungafaka lite-client
, Fift
, FunC
.
Okokuqala, sihlanganisa inqolobane ye-TON kanye nokuncika kwayo. Ukuze kube lula, sizokwenza yonke into kufolda ~/TON
.
cd ~/TON
git clone https://github.com/ton-blockchain/ton.git
cd ./ton
git submodule update --init --recursive
Inqolobane igcina nokusetshenziswa Fift
ΠΈ FunC
.
Manje sesilungele ukuhlanganisa iphrojekthi. Ikhodi yenqolobane yenziwe ifolda ~/TON/ton
. I ~/TON
dala ifolda build
futhi uqoqe iphrojekthi kuyo.
mkdir ~/TON/build
cd ~/TON/build
cmake ../ton
Njengoba sizobhala inkontileka ehlakaniphile, asidingi kuphela lite-client
Kodwa Fift
Ρ FunC
, ngakho-ke asihlanganise konke. Akuyona inqubo esheshayo, ngakho-ke silindile.
cmake --build . --target lite-client
cmake --build . --target fift
cmake --build . --target func
Okulandelayo, landa ifayela lokucushwa eliqukethe idatha mayelana nendawo okuyo lite-client
izoxhuma.
wget https://test.ton.org/ton-lite-client-test1.config.json
Ukwenza izicelo zokuqala ku-TON
Manje ake siqalise lite-client
.
cd ~/TON/build
./lite-client/lite-client -C ton-lite-client-test1.config.json
Uma ukwakhiwa kuphumelele, khona-ke ngemva kokwethulwa uzobona ilogi yokuxhuma kweklayenti elikhanyayo ku-node.
[ 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)
...
Ungakwazi ukusebenzisa umyalo help
futhi ubone ukuthi yimiphi imiyalo etholakalayo.
help
Ake sibhale imiyalo esizoyisebenzisa kulesi sihloko.
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 parameters
last ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Π±Π»ΠΎΠΊ Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°.
sendfile <filename> ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π² TON ΡΠ°ΠΉΠ» Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΠΌ, ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΏΡΠ±Π»ΠΈΠΊΡΠ΅ΡΡΡ ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ ΠΈ Π·Π°ΠΏΡΡΠΎΡΡ ΠΊ Π½Π΅ΠΌΡ.
getaccount <addr> Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ ΡΠ΅ΠΊΡΡΠ΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ° Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΌ Π°Π΄ΡΠ΅ΡΠΎΠΌ.
runmethod <addr> [<block-id-ext>] <method-id> <params> Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ get-ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΠΌΠ°ΡΡΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ°.
Manje sesikulungele ukubhala inkontileka ngokwayo.
Ukuqaliswa
I-Idea
Njengoba ngibhale ngenhla, inkontileka ehlakaniphile esiyibhalayo iyilotho.
Ngaphezu kwalokho, lena akuyona ilotho lapho udinga ukuthenga ithikithi bese ulinda ihora, usuku noma inyanga, kodwa esheshayo lapho umsebenzisi edlulisela ekhelini lenkontileka. N
amagremu, futhi ngokushesha uyayithola 2 * N
amagremu noma ukulahlekelwa. Sizokwenza amathuba okuwina angaba ngu-40%. Uma kungekho amagremu anele okukhokha, sizobe sesibheka okwenziwayo njengokwengeza.
Ngaphezu kwalokho, kubalulekile ukuthi ukubheja kubonakale ngesikhathi sangempela futhi ngendlela efanelekile, ukuze umsebenzisi aqonde ngokushesha ukuthi uwinile noma ulahlekile. Ngakho-ke, udinga ukwenza iwebhusayithi ezokhombisa ukubhejwa kanye nemiphumela ngqo kusuka ku-TON.
Ukubhala inkontileka ehlakaniphile
Ukuze kube lula, ngigqamise ikhodi ye-FunC; i-plugin ingatholakala futhi ifakwe kusesho lwekhodi ye-Visual Studio; uma ngokungazelelwe ufuna ukwengeza okuthile, ngenze i-plugin yatholakala esidlangalaleni. Futhi, othile ngaphambilini wenze i-plugin yokusebenza ne-Fift, ungakwazi futhi ukuyifaka futhi uyithole ku-VSC.
Masidale ngokushesha indawo yokugcina lapho sizonikela khona imiphumela ephakathi.
Ukwenza impilo yethu ibe lula, sizobhala inkontileka ehlakaniphile futhi siyihlole endaweni ize ilunge. Kuphela ngemva kwalokho sizoyishicilela nge-TON.
Inkontileka ehlakaniphile inezindlela ezimbili zangaphandle ezingafinyeleleka. Okokuqala, recv_external()
lo msebenzi wenziwa lapho isicelo senkontileka sivela ezweni langaphandle, okungukuthi, hhayi ku-TON, isibonelo, lapho thina ngokwethu sikhiqiza umlayezo futhi siwuthumela nge-lite-client. Okwesibili, recv_internal()
yilapho, ngaphakathi kwe-TON ngokwayo, noma iyiphi inkontileka ibhekisela kweyethu. Kuzo zombili izimo, ungadlulisela imingcele kumsebenzi.
Ake siqale ngesibonelo esilula esizosebenza uma sishicilelwe, kodwa akukho mthwalo osebenzayo kuwo.
() recv_internal(slice in_msg) impure {
;; TODO: implementation
}
() recv_external(slice in_msg) impure {
;; TODO: implementation
}
Lapha sidinga ukuchaza ukuthi kuyini slice
. Yonke idatha egcinwe ku-TON Blockchain iyiqoqo TVM cell
noma umane cell
, kuseli elinjalo ungagcina kufika kumabhithi edatha angu-1023 kanye nezixhumanisi ezifika kwezingu-4 kwamanye amaseli.
TVM cell slice
noma slice
lokhu kuyingxenye yale ekhona cell
isetshenziselwe ukuyihlaziya, izocaca ngokuhamba kwesikhathi. Okubalulekile kithina ukuthi singadlulisa slice
futhi kuye ngohlobo lomlayezo, cubungula idatha ngaphakathi recv_external()
noma recv_internal()
.
impure
β igama elingukhiye elibonisa ukuthi umsebenzi ulungisa idatha yenkontileka ehlakaniphile.
Masilondoloze ikhodi yenkontileka kuyo lottery-code.fc
futhi uhlanganise.
~/TON/build/crypto/func -APSR -o lottery-compiled.fif ~/TON/ton/crypto/smartcont/stdlib.fc ./lottery-code.fc
Incazelo yamafulegi ingabhekwa kusetshenziswa umyalo
~/TON/build/crypto/func -help
Sihlanganise ikhodi yokuhlanganisa ye-Fift ku 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>c
Ingethulwa endaweni, ngenxa yalokhu sizolungisa imvelo.
Qaphela ukuthi umugqa wokuqala uyaxhuma Asm.fif
, lena ikhodi ebhalwe ku-Fift ye-Fift assembler.
Njengoba sifuna ukusebenzisa futhi sihlole inkontileka ehlakaniphile endaweni, sizodala ifayela lottery-test-suite.fif
bese ukopisha ikhodi ehlanganisiwe lapho, esikhundleni somugqa wokugcina kuwo, obhala ikhodi yenkontileka ehlakaniphile ibe njalo code
ukuze uyidlulisele emshinini we-virtual:
"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
Kuze kube manje kubonakala kucacile, manje ake sengeze efayeleni elifanayo ikhodi esizoyisebenzisa ukwethula i-TVM.
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
siqopha umongo, okungukuthi, idatha lapho i-TVM (noma isimo senethiwekhi) izokwethulwa ngayo. Ngisho nangesikhathi somncintiswano, omunye wabathuthukisi wabonisa indlela yokudala c7
futhi ngikopishe. Kulesi sihloko kungase kudingeke sishintshe rand_seed
njengoba ukukhiqizwa kwenombolo engahleliwe kuncike kuyo futhi uma ingashintshiwe, inombolo efanayo izobuyiselwa njalo.
recv_internal
ΠΈ recv_external
ama-constants anamanani 0 kanye -1 azoba nesibopho sokubiza imisebenzi ehambisanayo kunkontileka ehlakaniphile.
Manje sesilungele ukudala isivivinyo sokuqala senkontileka yethu ehlakaniphile engenalutho. Ukuze kucace, okwamanje sizofaka zonke izivivinyo efayeleni elifanayo lottery-test-suite.fif
.
Masidale okuguquguqukayo storage
bese ubhala okungenalutho kuyo cell
, lesi kuzoba isitoreji senkontileka esihlakaniphile.
message
Lona umlayezo esizowudlulisela koxhumana naye ohlakaniphile ovela ngaphandle. Sizokwenza futhi kungabi nalutho okwamanje.
variable storage
<b b> storage !
variable message
<b b> message !
Ngemuva kokuthi sesilungiselele okuguquguqukayo nokuguquguqukayo, sethula i-TVM sisebenzisa umyalo runvmctx
bese udlulisela imingcele edaliwe kokokufaka.
message @
recv_external
code
storage @
c7
runvmctx
Ekugcineni sizophumelela Fift
.
Manje singakwazi ukusebenzisa ikhodi ewumphumela.
export FIFTPATH=~/TON/ton/crypto/fift/lib // Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Π΄Π»Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²Π°
~/TON/build/crypto/fift -s lottery-test-suite.fif
Uhlelo kufanele lusebenze ngaphandle kwamaphutha futhi kokuphumayo sizobona ilogi yokwenza:
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=0
Kuhle, sibhale inguqulo yokuqala yokusebenza yenkontileka ehlakaniphile.
Manje sidinga ukwengeza ukusebenza. Okokuqala ake sibhekane nemiyalezo evela emhlabeni wangaphandle eya recv_external()
Unjiniyela ngokwakhe ukhetha ifomethi yomlayezo inkontileka engayamukela.
Kodwa ngokuvamile
- okokuqala, sifuna ukuvikela inkontileka yethu emhlabeni wangaphandle futhi siyenze ngendlela yokuthi umnikazi wenkontileka kuphela ongathumela imilayezo yangaphandle kuyo.
- okwesibili, lapho sithumela umlayezo ovumelekile ku-TON, sifuna lokhu kwenzeke kanye kanye nalapho sithumela umlayezo ofanayo futhi, inkontileka ehlakaniphile iyawenqaba.
Ngakho-ke cishe yonke inkontileka ixazulula lezi zinkinga ezimbili, njengoba inkontileka yethu yamukela imilayezo yangaphandle, kudingeka sikunakekele nalokho.
Sizokwenza ngokulandelana. Okokuqala, masixazulule inkinga ngokuphindaphinda; uma inkontileka isivele iwutholile umlayezo onjalo futhi yawucubungula, ngeke iwusebenzise okwesibili. Futhi-ke sizoxazulula inkinga ukuze kuphela umbuthano othile wabantu ongathumela imilayezo kwinkontileka ehlakaniphile.
Kunezindlela ezahlukene zokuxazulula inkinga ngemilayezo eyimpinda. Nansi indlela esizokwenza ngayo. Kunkontileka ehlakaniphile, siqala ukubala kwemilayezo etholiwe ngenani lokuqala elingu-0. Emlayezo ngamunye oya kwinkontileka ehlakaniphile, sizokwengeza inani lamanje eliphikisayo. Uma inani eliphikisayo emyalezweni lingafani nevelu yenkontileka ehlakaniphile, lapho-ke asiyicubunguli; uma lenza njalo, siyalicubungula futhi sikhulise isibali senkontileka ehlakaniphile ngo-1.
Masibuyele ku lottery-test-suite.fif
bese wengeza isivivinyo sesibili kuso. Uma sithumela inombolo engalungile, ikhodi kufanele yenze okuhlukile. Isibonelo, vumela idatha yenkontileka igcine u-166, futhi sizothumela u-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"
Asiqalise.
~/TON/build/crypto/fift -s lottery-test-suite.fif
Futhi sizobona ukuthi ukuhlolwa kwenziwa ngephutha.
[ 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 passed
Kulesi sigaba lottery-test-suite.fif
kufanele ibukeke
Manje ake sengeze i-counter logic kunkontileka ehlakaniphile 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
amanga umyalezo esiwuthumelayo.
Into yokuqala esiyenzayo ukuhlola ukuthi umlayezo uqukethe yini idatha, uma kungenjalo, bese siyaphuma.
Okulandelayo sidlulisa umlayezo. in_msg~load_uint(32)
ilayisha inombolo engu-165, 32-bit unsigned int
kusuka kumlayezo odlulisiwe.
Okulandelayo silayisha amabhithi angu-32 kusuka kusitoreji senkontileka ehlakaniphile. Sihlola ukuthi inombolo elayishiwe ifana nedlulile; uma kungenjalo, siphonsa okuhlukile. Kithina, njengoba sidlula umdlalo ongaconsi phansi, kufanele kwenziwe okuhlukile.
Manje ake sihlanganise.
~/TON/build/crypto/func -APSR -o lottery-compiled.fif ~/TON/ton/crypto/smartcont/stdlib.fc ./lottery-code.fc
Kopisha ikhodi yomphumela ku lottery-test-suite.fif
, ngingakhohlwa ukufaka esikhundleni somugqa wokugcina.
Sihlola ukuthi isivivinyo siyaphumelela:
~/TON/build/crypto/fift -s lottery-test-suite.fif
Qaphela ukuthi akulungile ukukopisha njalo ikhodi ehlanganisiwe yenkontileka ehlakaniphile efayeleni elinezivivinyo, ngakho-ke sizobhala umbhalo ozobhala ikhodi ibe yinto engaguquki kithi, futhi sizomane sixhume ikhodi ehlanganisiwe ezivivinyweni zethu sisebenzisa. "include"
.
Dala ifayela kufolda yephrojekthi build.sh
ngokuqukethwe okulandelayo.
#!/bin/bash
~/TON/build/crypto/func -SPA -R -o lottery-compiled.fif ~/TON/ton/crypto/smartcont/stdlib.fc ./lottery-code.fc
Masiyenze isebenziseke.
chmod +x ./build.sh
Manje, vele usebenzise iskripthi sethu ukuze uhlanganise inkontileka. Kodwa ngaphandle kwalokhu, sidinga ukuyibhala ibe njalo code
. Ngakho sizodala ifayela elisha lotter-compiled-for-test.fif
, esizozifaka efayeleni lottery-test-suite.fif
.
Ake sengeze ikhodi ye-skirpt ku-sh, ezovele iphindaphinde ifayela elihlanganisiwe kulo lotter-compiled-for-test.fif
futhi ushintshe umugqa wokugcina kuwo.
# 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.fif
Manje, ukuhlola, ake siqhube iskripthi esiwumphumela futhi ifayela lizokhiqizwa lottery-compiled-for-test.fif
, esizokufaka kweyethu lottery-test-suite.fif
Π lottery-test-suite.fif
susa ikhodi yenkontileka bese wengeza umugqa "lottery-compiled-for-test.fif" include
.
Senza izivivinyo ukuze sibheke ukuthi baphumelele yini.
~/TON/build/crypto/fift -s lottery-test-suite.fif
Kuhle, manje ukwenza ngokuzenzakalelayo kwethulwa izivivinyo, masidale ifayela test.sh
, ezoqala iqalise build.sh
, bese uqhuba izivivinyo.
touch test.sh
chmod +x test.sh
Sibhala ngaphakathi
./build.sh
echo "nCompilation completedn"
export FIFTPATH=~/TON/ton/crypto/fift/lib
~/TON/build/crypto/fift -s lottery-test-suite.fif
Asikwenze test.sh
futhi uyigijime ukuze uqiniseke ukuthi izivivinyo ziyasebenza.
chmod +x ./test.sh
./test.sh
Sihlola ukuthi inkontileka iyahlanganiswa futhi izivivinyo ziyenziwa.
Kuhle, manje kuyaqalwa test.sh
Ukuhlolwa kuzohlanganiswa futhi kuqalwe ngokushesha. Nasi isixhumanisi esiya
Kulungile, ngaphambi kokuthi siqhubeke, asenze enye into ukuze kube lula.
Masidale ifolda build
lapho sizogcina khona inkontileka ekopishiwe kanye ne-clone yayo ebhalwe ngokungaguquki lottery-compiled.fif
, lottery-compiled-for-test.fif
. Masiphinde sakhe ifolda test
lizogcinwa kuphi ifayela lokuhlola? lottery-test-suite.fif
kanye namanye amafayela okungenzeka asekelayo.
Masiqhubeke nokuthuthukisa inkontileka ehlakaniphile.
Okulandelayo kufanele kube nokuhlola okuhlola ukuthi umlayezo wamukelwe yini nokuthi ikhawunta ibuyekezwa esitolo lapho sithumela inombolo efanele. Kodwa lokho sizokwenza kamuva.
Manje ake sicabange ngokuthi yisiphi isakhiwo sedatha nokuthi iyiphi idatha okufanele igcinwe kunkontileka ehlakaniphile.
Ngizochaza konke esikugcinayo.
`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` ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠΈΠΏΠ° ΡΠ»ΠΎΠ²Π°ΡΡ, Ρ
ΡΠ°Π½ΠΈΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π΄Π²Π°Π΄ΡΠ°ΡΡ ΡΡΠ°Π²ΠΎΠΊ.
Okulandelayo udinga ukubhala imisebenzi emibili. Asibize owokuqala pack_state()
, ezopakisha idatha ezolondolozwa ngokulandelayo kusitoreji senkontileka ehlakaniphile. Asibize owesibili unpack_state()
izofunda futhi ibuyisele idatha esuka kusitoreji.
_ 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;
}
Sengeza le misebenzi emibili ekuqaleni kwenkontileka ehlakaniphile. Kuzolunga
Ukugcina idatha uzodinga ukushayela umsebenzi owakhelwe ngaphakathi set_data()
futhi izobhala idatha kusuka pack_state()
endaweni yokugcina yenkontileka ehlakaniphile.
cell packed_state = pack_state(arg_1, .., arg_n);
set_data(packed_state);
Manje njengoba sinemisebenzi elula yokubhala nokufunda idatha, singaqhubeka.
Kudingeka sihlole ukuthi umlayezo ovela ngaphandle usayinwe yini umnikazi wenkontileka (noma omunye umsebenzisi okwazi ukufinyelela ukhiye oyimfihlo).
Uma sishicilela inkontileka ehlakaniphile, singayiqalisa ngedatha esiyidingayo endaweni yokugcina, ezogcinelwa ukusetshenziswa esikhathini esizayo. Sizorekhoda ukhiye osesidlangalaleni lapho ukuze sikwazi ukuqinisekisa ukuthi umlayezo ongenayo usayinwe ngokhiye oyimfihlo ohambisanayo.
Ngaphambi kokuqhubeka, masidale ukhiye oyimfihlo futhi siwubhalele test/keys/owner.pk
. Ukuze wenze lokhu, ake sethule i-Fift kumodi yokusebenzisana futhi sikhiphe imiyalo emine.
`newkeypair` Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎΠ³ΠΎ ΠΈ ΠΏΡΠΈΠ²Π°ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ° ΠΈ Π·Π°ΠΏΠΈΡΡ ΠΈΡ
Π² ΡΡΠ΅ΠΊ.
`drop` ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΈΠ· ΡΡΠ΅ΠΊΠ° Π²Π΅ΡΡ
Π½Π΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° (Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠΉ ΠΊΠ»ΡΡ)
`.s` ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΡΠΎ Π»Π΅ΠΆΠΈΡ Π² ΡΡΠ΅ΠΊΠ΅ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ
`"owner.pk" B>file` Π·Π°ΠΏΠΈΡΡ ΠΏΡΠΈΠ²Π°ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ° Π² ΡΠ°ΠΉΠ» Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ `owner.pk`.
`bye` Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ Fift.
Masidale ifolda keys
ngaphakathi kwefolda test
bese ubhala ukhiye oyimfihlo lapho.
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
bye
Sibona ifayela kufolda yamanje owner.pk
.
Sikhipha ukhiye osesidlangalaleni esitakini futhi uma sidingeka singawuthola kwesiyimfihlo.
Manje sidinga ukubhala ukuqinisekiswa kwesiginesha. Ake siqale ngokuhlolwa. Okokuqala sifunda ukhiye oyimfihlo ovela efayeleni sisebenzisa umsebenzi file>B
bese uyibhala kokuguquguqukayo owner_private_key
, bese usebenzisa umsebenzi priv>pub
guqula ukhiye oyimfihlo ube ukhiye womphakathi bese ubhala umphumela kuwo 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 !
Sizodinga okhiye bobabili.
Siqalisa isitoreji senkontileka ehlakaniphile ngedatha engafanele ngokulandelana okufanayo nasemsebenzini pack_state()
bese uyibhala ibe yinto eguquguqukayo 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 !
Okulandelayo, sizobhala umlayezo osayiniwe, uzoqukatha kuphela isiginesha kanye nenani eliphikisayo.
Okokuqala, sidala idatha esifuna ukuyidlulisela, bese siyisayina ngokhiye oyimfihlo futhi ekugcineni sikhiqiza umlayezo osayiniwe.
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 !
Ngenxa yalokho, umlayezo esizowuthumela kunkontileka ehlakaniphile urekhodwa kokuguquguqukayo message_to_send
, mayelana nemisebenzi hashu
, ed25519_sign_uint
ungafunda
Futhi ukuqhuba isivivinyo siyabiza futhi.
message_to_send @
recv_external
code
storage @
c7
runvmctx
Masiqhube ukuhlolwa futhi kuzohluleka, ngakho sizoshintsha inkontileka ehlakaniphile ukuze ikwazi ukuthola imilayezo yale fomethi futhi iqinisekise isiginesha.
Okokuqala, sibala amabhithi angu-512 wesiginesha kusuka kumlayezo futhi siwubhale ku-variable, bese sibala amabhithi angu-32 we-counter variable.
Njengoba sinomsebenzi wokufunda idatha kusitoreji senkontileka esihlakaniphile, sizoyisebenzisa.
Okulandelayo ukuhlola isibali esidluliselwe nesitoreji bese sibheka isiginesha. Uma okuthile kungahambisani, khona-ke siphonsa okuhlukile ngekhodi efanele.
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));
Ukuzibophezela okufanelekile
Ake siqhube izivivinyo futhi sibone ukuthi isivivinyo sesibili siyehluleka. Ngenxa yezizathu ezimbili, awekho amabhithi anele emlayezweni futhi awekho amabhithi anele endaweni yokubeka, ngakho-ke ikhodi iyaphahlazeka lapho idluliswa. Kudingeka sengeze isiginesha kumlayezo esiwuthumelayo futhi sikopishe isitoreji ekuhlolweni kokugcina.
Ohlolweni lwesibili, sizokwengeza isiginesha yomlayezo futhi sishintshe isitoreji senkontileka esihlakaniphile.
Masibhale ukuhlolwa kwesine, lapho sizothumela khona umlayezo osayinwe ngokhiye oyimfihlo womunye umuntu. Masidale omunye ukhiye oyimfihlo futhi siwulondoloze efayelini not-owner.pk
. Sizosayina umlayezo ngalo khiye oyimfihlo. Masiqhube izivivinyo futhi siqinisekise ukuthi zonke izivivinyo ziyaphumelela.
Manje sesingakwazi ukuqhubekela phambili ekusebenziseni i-smart contract logic.
Π recv_external()
sizokwamukela izinhlobo ezimbili zemiyalezo.
Njengoba inkontileka yethu izoqongelela ukulahlekelwa kwabadlali, le mali kumele idluliselwe kumdali welotho. Ikheli lesikhwama somdali welotho lirekhodwa endaweni yokugcina lapho isivumelwano senziwe.
Uma kwenzeka, sidinga amandla okushintsha ikheli esithumela kulo amagremu abahluliwe. Kufanele futhi sikwazi ukuthumela amagremu ukusuka kwilotho kuya ekhelini lomnikazi.
Ake siqale ngeyokuqala. Ake siqale sibhale ukuhlolwa okuzohlola ukuthi ngemva kokuthumela umlayezo, inkontileka ehlakaniphile igcine ikheli elisha endaweni yokugcina. Sicela uqaphele ukuthi emyalezweni, ngaphezu kwekhawunta nekheli elisha, siphinde sithumele action
Inombolo engu-7-bit engeyona inegethivu, kuye ngayo, sizokhetha ukuthi siwucubungula kanjani umlayezo kunkontileka ehlakaniphile.
<b 0 32 u, 1 @ 7 u, new_owner_wc @ 32 i, new_owner_account_id @ 256 u, b> message_to_sign !
Ekuhlolweni ungabona ukuthi isitoreji se-smartcontract sichithwa kanjani storage
kweSihlanu. Ukususwa kokuguquguquka kokuguquguqukayo kuchazwe emibhalweni ye-Fift.
Masiqhube ukuhlolwa futhi siqiniseke ukuthi iyehluleka. Manje ake sengeze ingqondo ukushintsha ikheli lomnikazi welotho.
Kwinkontileka ehlakaniphile siyaqhubeka nokuhlaziya message
, funda ku action
. Ake sikukhumbuze ukuthi sizoba nezimbili action
: shintsha ikheli bese uthumela amagremu.
Bese sifunda ikheli elisha lomnikazi wenkontileka bese siligcina endaweni yokugcina.
Siqhuba izivivinyo futhi sibona ukuthi isivivinyo sesithathu siyehluleka. Iyaphahlazeka ngenxa yokuthi inkontileka manje isidlulisa izingcezu eziyisi-7 zomlayezo, ezingekho esivivinyweni. Engeza engekho emlayezo action
. Ake siqhube izivivinyo futhi sibone ukuthi konke kuyaphumelela.
Manje ake sibhale i-logic yokuthumela inombolo eshiwo yamagremu ekhelini eligcinwe ngaphambilini.
Okokuqala, ake sibhale isivivinyo. Sizobhala izivivinyo ezimbili, eyodwa lapho kungekho ibhalansi eyanele, eyesibili lapho konke kufanele kudlule ngempumelelo. Ukuhlolwa kungabukwa
Manje ake sengeze ikhodi. Okokuqala, ake sibhale izindlela ezimbili zomsizi. Indlela yokuqala yokuthola ukuthola ibhalansi yamanje yenkontileka ehlakaniphile.
int balance() inline_ref method_id {
return get_balance().pair_first();
}
Futhi eyesibili eyokuthumela amagremu kwenye inkontileka ehlakaniphile. Ngiyikopishe ngokuphelele le ndlela kwenye inkontileka ehlakaniphile.
() 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
}
Ake sengeze lezi zindlela ezimbili kwinkontileka ehlakaniphile futhi sibhale i-logic. Okokuqala, sihlaziya inani lamagremu asuka kumlayezo. Okulandelayo sihlola ibhalansi, uma akwanele siphonsa okuhlukile. Uma konke kuhamba kahle, khona-ke sithumela amagremu ekhelini elilondoloziwe futhi sibuyekeze ikhawunta.
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));
Phela, ikhomishini idonswa kunkontileka ehlakaniphile ngaso sonke isikhathi ngomlayezo ocutshungulwayo. Ukuze imilayezo yenkontileka ehlakaniphile yenze isicelo, ngemva kokuhlola okuyisisekelo udinga ukushayela accept_message()
.
Manje ake sidlulele emilayezweni yangaphakathi. Eqinisweni, sizokwamukela kuphela amagremu bese sibuyisela inani eliphindwe kabili kumdlali uma ewina kanye nengxenye yesithathu kumnikazi uma ehluliwe.
Okokuqala, ake sibhale isivivinyo esilula. Ukuze senze lokhu, sidinga ikheli lokuhlola lenkontileka ehlakaniphile lapho kuthiwa sithumela amagremu kwinkontileka ehlakaniphile.
Ikheli lenkontileka ehlakaniphile liqukethe izinombolo ezimbili, inombolo engu-32-bhithi ephelele ebhekele uchungechunge lomsebenzi kanye nenombolo ye-akhawunti eyingqayizivele engu-256-bit engeyona embi kulolu chungechunge lomsebenzi. Isibonelo, -1 kanye no-12345, leli yikheli esizoligcina efayelini.
Ngikopishe umsebenzi wokulondoloza ikheli kuwo TonUtil.fif
// ( wc addr fname -- ) Save address to file in 36-byte format
{ -rot 256 u>B swap 32 i>B B+ swap B>file } : save-address
Ake sibheke ukuthi umsebenzi usebenza kanjani, lokhu kuzonikeza ukuqonda ukuthi i-Fift isebenza kanjani. Yethula i-Fift kumodi yokusebenzisana.
~/TON/build/crypto/fift -i
Okokuqala siphusha okuthi -1, 12345 kanye negama lefayela lesikhathi esizayo elithi "sender.addr" kusitaki:
-1 12345 "sender.addr"
Isinyathelo esilandelayo ukwenza umsebenzi -rot
, okushintsha isitaki ngendlela yokuthi phezulu kwesitaki kube nenombolo yenkontileka ehlakaniphile ehlukile:
"sender.addr" -1 12345
256 u>B
iguqula inombolo engeyona inegethivu engu-256-bit ibe amabhayithi.
"sender.addr" -1 BYTES:0000000000000000000000000000000000000000000000000000000000003039
swap
ishintshanisa izici ezimbili eziphezulu zesitaki.
"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 -1
32 i>B
iguqula inombolo engu-32-bit ibe amabhayithi.
"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 BYTES:FFFFFFFF
B+
ixhuma ukulandelana okubili kwamabhayithi.
"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF
Futhi swap
.
BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF "sender.addr"
Futhi ekugcineni amabhayithi abhalwa kufayela B>file
. Ngemva kwalokhu isitaki sethu asinalutho. Siyama Fift
. Ifayela lenziwe kufolda yamanje sender.addr
. Masihambise ifayela kufolda edaliwe test/addresses/
.
Masibhale isivivinyo esilula esizothumela amagremu kwinkontileka ehlakaniphile.
Manje ake sibheke i-logic yelotho.
Into yokuqala esiyenzayo ukuhlola umlayezo bounced
noma cha uma bounced
, bese singakunaki. bounced
kusho ukuthi inkontileka izobuyisela amagremu uma kwenzeka iphutha elithile. Ngeke sibuyise amagremu uma kwenzeka iphutha kungazelelwe.
Siyahlola, uma ibhalansi ingaphansi kwesigamu segram, bese sivele samukele umlayezo futhi singawunaki.
Okulandelayo, sihlaziya ikheli lenkontileka ehlakaniphile okuvela kuyo umlayezo.
Sifunda idatha kusitoreji bese sisusa ukubhejwa ezindala emlandweni uma kukhona ezingaphezu kwamashumi amabili zazo. Ukuze kube lula, ngibhale imisebenzi emithathu eyengeziwe pack_order()
, unpack_order()
, remove_old_orders()
.
Okulandelayo, sibheka ukuthi ibhalansi ayanele yini ukukhokha, bese sibheka ukuthi lokhu akukona ukubheja, kodwa ukugcwalisa futhi ulondoloze ukugcwaliswa kabusha orders
.
Bese ekugcineni ingqikithi yenkontileka ehlakaniphile.
Okokuqala, uma umdlali elahlekelwa, siyayilondoloza emlandweni wokubheja futhi uma inani lingaphezu kwamagremu angu-3, ββsithumela i-1/3 kumnikazi wenkontileka ehlakaniphile.
Uma umdlali ewina, khona-ke sithumela inani eliphindwe kabili ekhelini lomdlali bese silondoloza ulwazi mayelana nokubheja emlandweni.
() 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));
}
Yilokho kuphela.
Manje konke okusele kulula, masidale izindlela zokuthola ukuze sithole ulwazi mayelana nesimo senkontileka ezweni langaphandle (empeleni, sifunde idatha ekugcinweni kwabo kwenkontileka ehlakaniphile).
Ngiphinde ngakhohlwa ukungeza ikhodi ezocubungula isicelo sokuqala esenzeka lapho kushicilelwa inkontileka ehlakaniphile.
Isinyathelo esilandelayo ukushicilela inkontileka ehlakaniphile. Masidale ifolda requests
.
Ngithathe ikhodi yokushicilela njengesisekelo simple-wallet-code.fc
Kukhona okufanele ukunakwa. Senza isitoreji senkontileka esihlakaniphile kanye nomlayezo ofakiwe. Ngemuva kwalokhu, ikheli lenkontileka ehlakaniphile liyakhiqizwa, okungukuthi, ikheli laziwa ngisho nangaphambi kokushicilelwa ku-TON. Okulandelayo, udinga ukuthumela amagremu amaningana kuleli kheli, futhi kuphela ngemva kwalokho udinga ukuthumela ifayela elinenkontileka ehlakaniphile ngokwayo, ngoba inethiwekhi ithatha ikhomishini yokugcina inkontileka ehlakaniphile nokusebenza kuyo (abaqinisekisi abagcina futhi basebenzise ngokuhlakanipha). izinkontileka).
Okulandelayo senza ikhodi yokushicilela futhi sithole lottery-query.boc
ifayela lenkontileka ehlakaniphile nekheli.
~/TON/build/crypto/fift -s requests/new-lottery.fif 0
Ungakhohlwa ukulondoloza amafayela akhiqiziwe: lottery-query.boc
, lottery.addr
, lottery.pk
.
Phakathi kwezinye izinto, sizobona ikheli lenkontileka ehlakaniphile kumalogi okwenziwa.
new wallet address = 0:044910149dbeaf8eadbb2b28722e7d6a2dc6e264ec2f1d9bebd6fb209079bc2a
(Saving address to file lottery.addr)
Non-bounceable address (for init): 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd
Bounceable address (for later access): kQAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8KpFY
Ukuze sizijabulise, masenze isicelo ku-TON
$ ./lite-client/lite-client -C ton-lite-client-test1.config.json
getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd
Futhi sizobona ukuthi i-akhawunti enaleli kheli ayinalutho.
account state is empty
Sithumela ekhelini 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd
2 Gram futhi ngemva kwemizuzwana embalwa senza umyalo ofanayo. Ukuthumela amagremu engiwasebenzisayo
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd
Kubukeka njengokungaqalwanga (state:account_uninit
) inkontileka ehlakaniphile enekheli elifanayo kanye nebhalansi engu-1 nanograms.
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 2000000000ng
Manje ake sishicilele inkontileka ehlakaniphile. Masiqalise i-lite-client futhi sikhiphe.
> 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
Ake sihlole ukuthi inkontileka isishicilelwe.
> last
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd
Phakathi kwezinye izinto esizitholayo.
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_active
Siyakubona lokho account_active
.
Ukuzibophezela okuhambisanayo nezinguquko
Manje masidale izicelo zokusebenzelana nenkontileka ehlakaniphile.
Ngokunembayo, sizoshiya eyokuqala ngokushintsha ikheli njengomsebenzi ozimele, futhi sizokwenza owesibili ngokuthumela amagremu ekhelini lomnikazi. Eqinisweni, sizodinga ukwenza into efanayo njengasesivivinyweni sokuthumela amagremu.
Lona umlayezo esizowuthumela kwinkontileka ehlakaniphile, lapho msg_seqno
165, action
2 kanye no-9.5 amagremu wokuthumela.
<b 165 32 u, 2 7 u, 9500000000 Gram, b>
Ungakhohlwa ukusayina umlayezo ngokhiye wakho oyimfihlo lottery.pk
, eyakhiwe ngaphambilini ngenkathi kwakhiwa inkontileka ehlakaniphile.
Ukuthola ulwazi kwinkontileka ehlakaniphile usebenzisa izindlela zokuthola
Manje ake sibheke ukuthi singazisebenzisa kanjani izindlela zenkontileka ehlakaniphile.
Yethula lite-client
bese usebenzisa izindlela zokuthola esizibhalile.
$ ./lite-client/lite-client -C ton-lite-client-test1.config.json
> runmethod 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd balance
arguments: [ 104128 ]
result: [ 64633878952 ]
...
Π result
iqukethe inani elibuyiswa umsebenzi balance()
kusukela kunkontileka yethu ehlakaniphile.
Sizokwenza okufanayo kwezinye izindlela ezimbalwa.
> runmethod 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd get_seqno
...
arguments: [ 77871 ]
result: [ 1 ]
Asicele umlando wakho wokubheja.
> 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]) ]
Sizosebenzisa i-lite-client futhi sithole izindlela zokubonisa ulwazi mayelana nenkontileka ehlakaniphile esizeni.
Ibonisa idatha yenkontileka ehlakaniphile kuwebhusayithi
Ngabhala iwebhusayithi elula kuPython ukuze ngibonise idatha evela kunkontileka ehlakaniphile ngendlela elula. Lapha ngeke ngihlale kuyo ngemininingwane futhi ngizoshicilela isiza
Izicelo eziya ku-TON zenziwe kusuka Python
ngosizo lwe lite-client
. Ukuze kube lula, isayithi lipakishwe ku-Docker futhi lishicilelwe ku-Google Cloud.
Ake sizame
Manje ake sizame ukuthumela amagremu lapho ukuze agcwaliswe kabusha kusuka
I-Afterword
Lesi sihloko sibe side kakhulu kunalokho ebengikulindele, mhlawumbe bekungaba mfushane, noma mhlawumbe nje kumuntu ongazi lutho nge-TON futhi ofuna ukubhala nokushicilela inkontileka ehlakaniphile engeyona elula enekhono lokuxhumana naye. yona. Mhlawumbe ezinye izinto bezingachazwa kalula.
Mhlawumbe ezinye izici zokuqaliswa kwazo bezingenziwa ngokuphumelelayo nangendlela ekhangayo, kodwa-ke bekuyothatha isikhathi esengeziwe ukulungisa lesi sihloko. Kungenzeka futhi ukuthi ngenze iphutha endaweni ethile noma ngingaqondi okuthile, ngakho-ke uma wenza okuthile okungathΓ sina, udinga ukuthembela kumadokhumenti asemthethweni noma inqolobane esemthethweni enekhodi ye-TON.
Kumele kuqashelwe ukuthi njengoba i-TON ngokwayo isesiteji esisebenzayo sokuthuthukiswa, izinguquko zingase zenzeke ezizophula noma yiziphi izinyathelo kulesi sihloko (okwenzeka ngenkathi ngibhala, isivele ilungisiwe), kodwa indlela evamile akunakwenzeka ukushintsha.
Ngeke ngikhulume ngekusasa le-TON. Mhlawumbe ipulatifomu izoba yinto enkulu futhi kufanele sichithe isikhathi sifunda futhi sigcwalise i-niche ngemikhiqizo yethu manje.
Kukhona ne-Libra evela ku-Facebook, enezithameli ezingaba khona zabasebenzisi abakhulu kune-TON. Angazi cishe lutho nge-Libra, uma ngibheka inkundla kunomsebenzi omningi lapho kunomphakathi we-TON. Yize abathuthukisi nomphakathi we-TON bafana nabangaphansi komhlaba, nakho okuhle.
izithenjwa
- Amadokhumenti asemthethweni ku-TON:
https://test.ton.org - Inqolobane esemthethweni ye-TON:
https://github.com/ton-blockchain/ton - I-wallet esemthethweni yamapulatifomu ahlukene:
https://wallet.ton.org - Inqolobane yenkontileka ehlakaniphile evela kulesi sihloko:
https://github.com/raiym/astonished - Isixhumanisi sewebhusayithi yenkontileka ehlakaniphile:
https://ton-lottery.appspot.com - Inqolobane yesandiso sekhodi ye-Visual Studio ye-FunC:
https://github.com/raiym/func-visual-studio-plugin - Xoxa nge-TON kuTelegram, okusize ngempela ukuyithola ekuqaleni. Ngicabanga ukuthi ngeke kube yiphutha uma ngithi wonke umuntu obhale okuthile ku-TON ukhona. Ungaphinda ucele amagremu okuhlola lapho.
https://t.me/tondev_ru - Enye ingxoxo nge-TON lapho ngithole khona ulwazi oluwusizo:
https://t.me/TONgramDev - Isigaba sokuqala somncintiswano:
https://contest.com/blockchain - Isigaba sesibili somncintiswano:
https://contest.com/blockchain-2
Source: www.habr.com