Mayelana nendlela yokubhala nokushicilela inkontileka ehlakaniphile ku-Telegram Open Network (TON)

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 wabhala isikhwama semali nge-multi-signature ivuliwe FunC futhi ngokuvamile yasebenza. Ngakuthatha njengesisekelo Inkontileka ehlakaniphile kuSolidity.

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-clientKodwa 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 codeukuze 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 kanje ikhodi ephakathi ye 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 isixhumanisi.

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

Lapho ke Ungabona ukuzibophezela okuhambisanayo nemiphumela yamanje.

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 bophezela.

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. Xhumanisa nezinguquko ezifanele.

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 kanje umphumela ophakathi.

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 emibhalweni Yesihlanu.

Futhi ukuqhuba isivivinyo siyabiza futhi.

message_to_send @ 
recv_external 
code 
storage @
c7
runvmctx

Njengalokhu Ifayela elinokuhlolwa kufanele libukeke kanje kulesi sigaba.

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 khona lapha.

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. Njengalokhu ifayela elinokuhlolwa libukeka njengamanje.

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. Zibophezele ngalesi sikhathi.

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.

Isixhumanisi sokuzibophezela ngenhlama eyengeziwe.

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. lapha zibophezele ekushintsheni. Kuhle.

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 kulesi sivumelwano.

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));

Njengalokhu kubukeka njengenkontileka ehlakaniphile okwamanje. Masiqhube izivivinyo futhi siqinisekise ukuthi ziyaphumelela.

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. Nakhu ukuzibophezela.

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. Ukuzibophezela okuhambisanayo.

Manje konke okusele kulula, masidale izindlela zokuthola ukuze sithole ulwazi mayelana nesimo senkontileka ezweni langaphandle (empeleni, sifunde idatha ekugcinweni kwabo kwenkontileka ehlakaniphile).

Ake sengeze izindlela zokuthola. Sizobhala ngezansi mayelana nendlela yokuthola ulwazi mayelana nenkontileka ehlakaniphile.

Ngiphinde ngakhohlwa ukungeza ikhodi ezocubungula isicelo sokuqala esenzeka lapho kushicilelwa inkontileka ehlakaniphile. Ukuzibophezela okuhambisanayo. Futhi ngokuqhubekayo kulungisiwe iphutha ngokuthumela i-1/3 yenani ku-akhawunti yomnikazi.

Isinyathelo esilandelayo ukushicilela inkontileka ehlakaniphile. Masidale ifolda requests.

Ngithathe ikhodi yokushicilela njengesisekelo simple-wallet-code.fc okuyinto angathola endaweni yokugcina esemthethweni.

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). Ikhodi ingabukwa lapha.

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 isikhwama semali esemthethweni, futhi ungacela othile engxoxweni ukuze uthole amagremu okuhlola, engizokhuluma ngawo ekupheleni kwalesi sihloko.

> 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 khona lapha.

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. Nasi isivumelwano esihambisanayo.

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 ekubopheni okukodwa.

Izicelo eziya ku-TON zenziwe kusuka Python ngosizo lwe lite-client. Ukuze kube lula, isayithi lipakishwe ku-Docker futhi lishicilelwe ku-Google Cloud. Isixhumanisi.

Ake sizame

Manje ake sizame ukuthumela amagremu lapho ukuze agcwaliswe kabusha kusuka isikhwama semali. Sizothumela amagremu angu-40. Ake senze ukubheja okumbalwa ukuze kucace. Siyabona ukuthi isayithi libonisa umlando wokubhejwa, iphesenti lamanje lokuwina nolunye ulwazi oluwusizo.

Siyabonaukuthi siwine eyokuqala, sahlulwa okwesibili.

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

  1. Amadokhumenti asemthethweni ku-TON: https://test.ton.org
  2. Inqolobane esemthethweni ye-TON: https://github.com/ton-blockchain/ton
  3. I-wallet esemthethweni yamapulatifomu ahlukene: https://wallet.ton.org
  4. Inqolobane yenkontileka ehlakaniphile evela kulesi sihloko: https://github.com/raiym/astonished
  5. Isixhumanisi sewebhusayithi yenkontileka ehlakaniphile: https://ton-lottery.appspot.com
  6. Inqolobane yesandiso sekhodi ye-Visual Studio ye-FunC: https://github.com/raiym/func-visual-studio-plugin
  7. 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
  8. Enye ingxoxo nge-TON lapho ngithole khona ulwazi oluwusizo: https://t.me/TONgramDev
  9. Isigaba sokuqala somncintiswano: https://contest.com/blockchain
  10. Isigaba sesibili somncintiswano: https://contest.com/blockchain-2

Source: www.habr.com

Engeza amazwana