Malunga nendlela yokubhala kunye nokupapasha isivumelwano esihlakaniphile kwiTelegram Open Network (TON)

Malunga nendlela yokubhala kunye nokupapasha inkontileka ehlakaniphile kwi-TON

Limalunga nantoni eli nqaku?

Kwinqaku ndiza kuthetha ngendlela endithathe inxaxheba ngayo kukhuphiswano lokuqala (kwezimbini) zeTelegram blockchain, andizange ndithathe ibhaso, kwaye ndagqiba ekubeni ndirekhode amava am kwinqaku ukuze lingatshoni ekulibaleni kwaye, mhlawumbi, lincede. umntu.

Ekubeni andizange ndifune ukubhala ikhowudi engabonakaliyo, kodwa ukwenza into esebenzayo, kwinqaku endibhale inkontileka ehlakaniphile yelotho esheshayo kunye newebhusayithi ebonisa idatha yekhontrakthi ehlakaniphile ngokuthe ngqo kwi-TON ngaphandle kokusebenzisa isitoreji esiphakathi.

Inqaku liya kuba luncedo kwabo bafuna ukwenza isivumelwano sabo sokuqala esihlakaniphile kwi-TON, kodwa abazi ukuba baqale phi.

Ukusebenzisa ilotho njengomzekelo, ndiya kuhamba ekufakeni indawo yokusingqongileyo ukupapasha inkontileka ehlakaniphile, ukusebenzisana nayo, nokubhala i-website yokufumana kunye nokupapasha idatha.

Malunga nokuthatha inxaxheba kukhuphiswano

Ngo-Okthobha ophelileyo, iTelegram ibhengeze ukhuphiswano lwe-blockchain ngeelwimi ezintsha Fift ΠΈ FunC. Kwakuyimfuneko ukuba kukhethwe ekubhaleni naziphi na iikhontrakthi ezintlanu ezicetywayo. Ndacinga ukuba kuya kuba kuhle ukuba ndenze into eyahlukileyo, ndifunde ulwimi kwaye ndenze into, nokuba akufuneki ndibhale enye into kwixesha elizayo. Ngaphezu koko, isihloko sihlala sisemlonyeni.

Kufanelekile ukuthetha ukuba ndandingenawo amava okuphuhlisa izivumelwano ezihlakaniphile.

Ndaceba ukuba nenxaxheba de kube sekupheleni de ndikwazi ukuze ndibhale inqaku lokuphonononga, kodwa ndasilela ngoko nangoko kwelokuqala. I wabhala isipaji ngotyikityo oluninzi FunC kwaye yasebenza ngokubanzi. Ndayithatha njengesiseko ikhontrakthi ehlakaniphile kwiSolidity.

Ngelo xesha, ndandicinga ukuba oku kwakwanele ukuthabatha indawo yebhaso. Ngenxa yoko, abathabathi-nxaxheba abamalunga nama-40 kwabangama-60 baba ngabaphumeleleyo bamabhaso yaye ndandingekho phakathi kwabo. Ngokubanzi, akukho nto iphosakeleyo kule nto, kodwa into enye yandikhathaza. Ngexesha lokubhengezwa kweziphumo, ukuphononongwa kovavanyo lwekhontrakthi yam akuzange kwenziwe, ndabuza abathathi-nxaxheba kwingxoxo ukuba kukho omnye umntu ongenayo, akukho namnye.

Kuyabonakala ukuba ukunikela ingqalelo kwimiyalezo yam, kwiintsuku ezimbini kamva abagwebi bapapasha inkcazo kwaye andiqondi ukuba ngaba baphose ngempazamo isivumelwano sam esilumkileyo ngexesha lokugweba okanye bacinga nje ukuba kubi kangangokuba bekungadingi nkcazo. Ndabuza umbuzo ephepheni, kodwa andizange ndiphendule. Nangona ingeyomfihlo ukuba ngubani ogwebayo, ndiye ndakubona kungeyomfuneko ukubhala imiyalezo yobuqu.

Ixesha elininzi lichithwe ekuqondeni, ngoko kwagqitywa ukuba kubhalwe inqaku. Ekubeni akukho lwazi oluninzi okwangoku, eli nqaku liza kunceda ukugcina ixesha kuye wonke umntu onomdla.

Ingcamango yeekontraki ezihlakaniphile kwi-TON

Ngaphambi kokuba ubhale nantoni na, kufuneka ufumanise ukuba yeyiphi icala onokuthi usondele kuyo le nto. Ke ngoko, ngoku ndiza kukuxelela ukuba zeziphi iindawo eziqulathwe yinkqubo. Ngokuchanekileyo, ngawaphi amacandelo okufuneka ukwazi ukuze ubhale ubuncinci bekhontrakthi yokusebenza.

Siza kugxila ekubhaleni isivumelwano esihlakaniphile kunye nokusebenza kunye TON Virtual Machine (TVM), Fift ΠΈ FunC, ngoko inqaku lifana nenkcazo yokuphuhliswa kweprogram eqhelekileyo. Asizukuhlala kwindlela esebenza ngayo iqonga ngokwalo apha.

Ngokubanzi malunga nendlela esebenza ngayo TVM kunye neyzΡ‹k Fift kukho amaxwebhu asemthethweni alungileyo. Ngelixa ndithatha inxaxheba kukhuphiswano kwaye ngoku ndibhala isivumelwano sangoku, ndandihlala ndiguqukela kuye.

Olona lwimi lubhalwa ngalo iikhontrakthi ezihlakaniphileyo FunC. Akukho maxwebhu kulo mzuzu, ngoko ukuze ubhale into kufuneka ufunde imizekelo yeekontraki ezihlakaniphile ezivela kwindawo yokugcina esemthethweni kunye nokuphunyezwa kolwimi ngokwalo apho, kunye nokwazi ukujonga imizekelo yeekontraki ezihlakaniphile ukusuka ezimbini ezidlulileyo. ukhuphiswano. Amakhonkco ekupheleni kwenqaku.

Masithi sele sibhale isivumelwano esihlakaniphile FunC, emva koko siqokelela ikhowudi kwi-Fift assembler.

Ikhontrakthi ehlanganisiweyo ye-smart isaza kupapashwa. Ukwenza oku kufuneka ubhale umsebenzi kwi Fift, eya kuthatha ikhowudi yekhontrakthi ehlakaniphile kunye nezinye iiparameters njengegalelo, kwaye imveliso iya kuba yifayile kunye nolwandiso. .boc (oko kuthetha "ingxowa yeeseli"), kwaye, kuxhomekeke kwindlela esiyibhala ngayo, isitshixo sangasese kunye nedilesi, eyenziwa ngokusekelwe kwikhowudi yekhontrakthi ehlakaniphile. Unako ukuthumela iigram kwidilesi yenkontileka ehlakaniphile engekapapashwa.

Ukupapasha ikhontrakthi ehlakaniphile kwi-TON efunyenweyo .boc ifayile iya kufuneka ithunyelwe kwi-blockchain usebenzisa umxhasi okhanyayo (ngakumbi kule ngezantsi). Kodwa ngaphambi kokupapasha, kufuneka udlulisele iigram kwidilesi eyenziweyo, ngaphandle koko isivumelwano esihlakaniphile asiyi kupapashwa. Emva kokupapashwa, unokusebenzisana nekhontrakthi ehlakaniphile ngokuyithumela imiyalezo evela ngaphandle (umzekelo, usebenzisa umxhasi okhanyayo) okanye ngaphakathi (umzekelo, isivumelwano esihlakaniphile sithumela omnye umyalezo ngaphakathi kwe-TON).

Nje ukuba siqonde indlela ikhowudi epapashwa ngayo, kuba lula. Siyazi kakuhle into esifuna ukuyibhala kunye nendlela eya kusebenza ngayo inkqubo yethu. Kwaye ngelixa sibhala, sijonge ukuba le nto sele iphunyezwe njani kwiikontraka ezikhoyo, okanye sijonge kwikhowudi yokuphunyezwa Fift ΠΈ FunC kwindawo yokugcina esemthethweni, okanye ujonge kumaxwebhu asemthethweni.

Rhoqo ndandikhangela amagama aphambili kwincoko yeTelegram apho bonke abathathi-nxaxheba kunye nabasebenzi beTelegram babehlanganisene, kwaye kwenzekile ukuba ngexesha lokhuphiswano wonke umntu wahlanganisana apho kwaye waqala ukuxoxa ngeFift kunye neFunC. Ikhonkco ekupheleni kwenqaku.

Lixesha lokusuka kwithiyori uye kuziqhelanisa.

Ukulungiselela indawo yokusebenza ne-TON

Ndenze yonke into eya kuchazwa kwinqaku leMacOS kwaye ndiyijonge kabini ku-Ubuntu 18.04 LTS ecocekileyo kwiDocker.

Into yokuqala ekufuneka uyenzile kukukhuphela kwaye uyifake lite-client onokuthumela ngayo izicelo kwi-TON.

Imiyalelo kwiwebhusayithi esemthethweni ichaza inkqubo yofakelo ngokweenkcukacha kwaye ngokucacileyo kwaye ishiya ezinye iinkcukacha. Apha silandela imiyalelo, ukufaka izinto ezixhomekeke ezilahlekileyo endleleni. Khange ndiqulunqe iprojekthi nganye ngokwam kwaye ndayifaka kwindawo yokugcina esemthethweni ye-Ubuntu (kwi-MacOS endiyisebenzisileyo 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 

Nje ukuba zonke izinto ezixhomekeke kuyo zifakwe ungazifaka lite-client, Fift, FunC.

Okokuqala, sidibanisa indawo yokugcina ye-TON kunye nokuxhomekeka kwayo. Ukuze kube lula, siya kwenza yonke into kwifolda ~/TON.

cd ~/TON
git clone https://github.com/ton-blockchain/ton.git
cd ./ton
git submodule update --init --recursive

Uvimba ukwagcina ukuphunyezwa Fift ΠΈ FunC.

Ngoku sikulungele ukudibanisa iprojekthi. Ikhowudi yogcino yenziwe ifowulda ~/TON/ton. Ku ~/TON yenza ifolda build kwaye uqokelele iprojekthi kuyo.

mkdir ~/TON/build 
cd ~/TON/build
cmake ../ton

Ekubeni siza kubhala isivumelwano esihlakaniphile, asifuni kuphela lite-clientkodwa Fift с FunC, ngoko masiqokelele yonke into. Asiyonkqubo ekhawulezayo, ngoko ke silindile.

cmake --build . --target lite-client
cmake --build . --target fift
cmake --build . --target func

Okulandelayo, khuphela ifayile yoqwalaselo equlethe idatha malunga node oya kuyo lite-client izakudibanisa.

wget https://test.ton.org/ton-lite-client-test1.config.json

Ukwenza izicelo zokuqala kwi-TON

Ngoku masiqalise lite-client.

cd ~/TON/build
./lite-client/lite-client -C ton-lite-client-test1.config.json

Ukuba ulwakhiwo luphumelele, emva kokuqaliswa uya kubona ilogi yoxhumo lomxhasi wokukhanya kwi-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)
...

Ungaqhuba umyalelo help kwaye ubone ukuba yeyiphi imiyalelo ekhoyo.

help

Masidwelise imiyalelo esiza kuyisebenzisa kweli nqaku.

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-ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ смартконтракта. 

Ngoku sikulungele ukubhala ikhontrakthi ngokwayo.

Ukuphunyezwa

Umbono

Njengoko ndibhale ngasentla, ikontraki ehlakaniphile esiyibhalayo yilotho.

Ngaphezu koko, oku akusiyo ilotho apho kufuneka uthenge itikiti kwaye ulinde iyure, usuku okanye inyanga, kodwa ngoko nangoko apho umsebenzisi atshintshela kwidilesi yesivumelwano. N iigram, kwaye ngoko nangoko uyibuyisela 2 * N iigram okanye ilahleko. Siza kwenza amathuba okuba siphumelele malunga nama-40%. Ukuba akukho gram ezaneleyo zokuhlawula, ngoko siya kuqwalasela ukuthengiselana njenge-top-up.

Ngaphezu koko, kubalulekile ukuba ukubheja kunokubonwa ngexesha langempela kunye nefom efanelekileyo, ukuze umsebenzisi aqonde ngokukhawuleza ukuba uphumelele okanye ulahlekile. Ngoko ke, kufuneka wenze iwebhusayithi eya kubonisa ukubheja kunye neziphumo ngokuthe ngqo kwi-TON.

Ukubhala isivumelwano esihlakaniphile

Ukwenzela lula, ndiyiqaqambise ikhowudi ye-FunC; iplagin inokufumaneka kwaye ifakwe kwiKhowudi yeVisual Studio yokukhangela; ukuba ngequbuliso ufuna ukongeza into, ndiyenzile iplagin ifumaneke esidlangalaleni. Kwakhona, umntu ngaphambili wenze iplagin yokusebenza neFift, unokuyifaka kwaye uyifumane kwiVSC.

Masidale ngokukhawuleza indawo yokugcina apho siya kwenza khona iziphumo eziphakathi.

Ukwenza ubomi bethu bube lula, siya kubhala inkontileka ehlakaniphile kwaye siyivavanye kwindawo de ibe ilungile. Kuphela emva koko siya kuyipapasha kwi-TON.

Ikhontrakthi ehlakaniphile ineendlela ezimbini zangaphandle ezinokufumaneka. Ekuqaleni, recv_external() lo msebenzi wenziwa xa isicelo sekhontrakthi sivela kwihlabathi langaphandle, oko kukuthi, kungekhona kwi-TON, umzekelo, xa thina ngokwethu sivelisa umyalezo kwaye siwuthumele nge-lite-client. Isibini, recv_internal() oku kuxa, ngaphakathi kweTON ngokwayo, nayiphi na ikhontrakthi ibhekiselele kweyethu. Kuzo zombini iimeko, ungadlula iparameters kumsebenzi.

Masiqale ngomzekelo olula oya kusebenza ukuba ushicilelwe, kodwa akukho mthwalo osebenzayo kuwo.

() recv_internal(slice in_msg) impure {
    ;; TODO: implementation 
}

() recv_external(slice in_msg) impure {
    ;; TODO: implementation  
}

Apha kufuneka sichaze ukuba yintoni na slice. Yonke idatha egcinwe kwi-TON Blockchain yingqokelela TVM cell okanye nje cell, kwiseli enjalo ungagcina ukuya kuthi ga kwi-1023 bits yedatha kunye ne-4 ikhonkco kwezinye iiseli.

TVM cell slice okanye slice le yinxalenye yale ikhoyo cell isetyenziselwa ukuyicazulula, iya kucaca kamva. Into ephambili kuthi kukuba sinokudlulisela slice kwaye ngokuxhomekeke kuhlobo lomyalezo, qhubekekisa idatha ngaphakathi recv_external() okanye recv_internal().

impure - igama elingundoqo elibonisa ukuba umsebenzi uguqula idatha yekhontrakthi ehlakaniphile.

Masigcine ikhowudi yekhontrakthi lottery-code.fc kwaye uqokelele.

~/TON/build/crypto/func -APSR -o lottery-compiled.fif ~/TON/ton/crypto/smartcont/stdlib.fc ./lottery-code.fc 

Intsingiselo yeeflegi inokujongwa ngokusebenzisa umyalelo

~/TON/build/crypto/func -help

Siqulunqe ikhowudi yokuhlanganisa yesihlanu kwi 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

Inokusungulwa ekuhlaleni, kuba oku siya kulungisa okusingqongileyo.

Qaphela ukuba umgca wokuqala udibanisa Asm.fif, le yikhowudi ebhalwe kwiFift yeFift ehlanganisayo.

Ekubeni sifuna ukuqhuba kunye nokuvavanya inkontileka ehlakaniphile ekuhlaleni, siya kudala ifayile lottery-test-suite.fif kwaye ukopishe ikhowudi ehlanganisiweyo apho, utshintshe umgca wokugqibela kuyo, obhala ikhowudi yekhontrakthi ehlakaniphile kwisigxina codeUkuyidlulisela kumatshini wenyani:

"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

Ukuza kuthi ga ngoku kubonakala kucacile, ngoku masiyongeze kwifayile efanayo ikhowudi esiya kuyisebenzisa ukusungula iTVM.

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 sirekhoda umxholo, oko kukuthi, idatha apho i-TVM (okanye i-network state) iya kuqaliswa. Nangona ngexesha lokhuphiswano, omnye wabaphuhlisi wabonisa indlela yokudala c7 kwaye ndakopa. Kweli nqaku kusenokufuneka sitshintshe rand_seed kuba ukuveliswa kwenani elingenamkhethe kuxhomekeke kuyo kwaye ukuba ayitshintshwanga, inani elifanayo liya kubuyiselwa ngalo lonke ixesha.

recv_internal ΠΈ recv_external i-constants enexabiso 0 kunye -1 iya kuba noxanduva lokubiza imisebenzi ehambelanayo kwikhontrakthi ehlakaniphile.

Ngoku sikulungele ukwenza uvavanyo lokuqala lwekhontrakthi yethu engenanto. Ukucaca, okwangoku siyakongeza zonke iimvavanyo kwifayile efanayo lottery-test-suite.fif.

Masenze inguqu storage kwaye ubhale engenanto kuyo cell, oku kuya kuba yi-smart contract storage.

message Lo ngumyalezo esiya kuwudlulisela kumfowunelwa ohlakaniphile ovela ngaphandle. Siza kuyenza ingabi nanto okwangoku.

variable storage 
<b b> storage ! 

variable message 
<b b> message ! 

Emva kokuba silungiselele i-constants kunye nezinto eziguquguqukayo, siqalisa i-TVM ngokusebenzisa umyalelo runvmctx kwaye ugqithise iiparameters ezenziweyo kwigalelo.

message @ 
recv_external 
code 
storage @ 
c7 
runvmctx 

Ekugqibeleni siya kuphumelela ndiyayithanda lento ikhowudi ephakathi ye Fift.

Ngoku sinokuqhuba ikhowudi yesiphumo.

export FIFTPATH=~/TON/ton/crypto/fift/lib // выполняСм ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для удобства 
~/TON/build/crypto/fift -s lottery-test-suite.fif 

Inkqubo kufuneka iqhube ngaphandle kweempazamo kwaye kwisiphumo siya kubona ilog yophumezo:

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

Enkulu, sibhale inguqulelo yokuqala yokusebenza yekhontrakthi ehlakaniphile.

Ngoku kufuneka songeze ukusebenza. Okokuqala masijongane nemiyalezo evela kwihlabathi langaphandle ukuya recv_external()

Umphuhlisi ngokwakhe ukhetha ifomathi yomyalezo enokuthi ivume isivumelwano.

Kodwa ngokuqhelekileyo

  • okokuqala, sifuna ukukhusela isivumelwano sethu kwihlabathi langaphandle kwaye siyenze ukuze kuphela umnini wekhontrakthi onokuthumela imiyalezo yangaphandle kuyo.
  • okwesibini, xa sithumela umyalezo osebenzayo kwi-TON, sifuna ukuba oku kwenzeke kanye kanye kwaye xa sithumela umyalezo ofanayo kwakhona, isivumelwano esihlakaniphile siyayigatya.

Ngoko ke phantse yonke ikhontrakthi isombulula ezi ngxaki zimbini, kuba isivumelwano sethu sisamkela imiyalezo yangaphandle, kufuneka siyikhathalele loo nto nathi.

Siza kuyenza ngokulandelelana. Okokuqala, masisombulule ingxaki ngokuphindaphinda; ukuba ikhontrakthi sele ifumene umyalezo onjalo kwaye yawuqhuba, ayiyi kuwenza okwesibini. Kwaye ke siya kuyicombulula ingxaki ukwenzela ukuba kuphela isangqa esithile sabantu sinokuthumela imiyalezo kwinkontileka ehlakaniphile.

Kukho iindlela ezahlukeneyo zokusombulula ingxaki ngemiyalezo ephindwe kabini. Nantsi indlela esiya kuyenza ngayo. Kwikhontrakthi ehlakaniphile, siqalisa ikhawuntari yemiyalezo efunyenweyo ngexabiso lokuqala 0. Kumyalezo ngamnye kwinkontileka ye-smart, siya kongeza ixabiso langoku lekhawuntara. Ukuba ixabiso le-counter kumyalezo alihambelani nexabiso kwikhontrakthi ye-smart, ngoko ke asiyiqhubeki; ukuba iyenzeka, siyayiqhuba kwaye sonyuse ikhawuntala kwikhontrakthi ehlakaniphile ngo-1.

Masibuyele ku lottery-test-suite.fif kwaye wongeze uvavanyo lwesibini kuyo. Ukuba sithumela inombolo engachanekanga, ikhowudi kufuneka ilahle. Umzekelo, vumela idatha yekhontrakthi igcine i-166, kwaye siya kuthumela i-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"

Masiqalise.

 ~/TON/build/crypto/fift -s lottery-test-suite.fif 

Kwaye siya kubona ukuba uvavanyo lwenziwa ngempazamo.

[ 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

Kweli nqanaba lottery-test-suite.fif kufuneka ibonakale ngathi ikhonkco.

Ngoku masiyongeze i-counter logic kwi-smart contract in 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 ubuxoki umyalezo esiwuthumelayo.

Into yokuqala esiyenzayo kukukhangela ukuba umyalezo uqulethe idatha, ukuba akunjalo, ngoko siphuma ngokulula.

Okulandelayo sihlahlela umyalezo. in_msg~load_uint(32) ilayisha inani le-165, i-32-bit unsigned int kumyalezo ogqithisiweyo.

Okulandelayo silayisha iibhithi ze-32 ukusuka kwisitoreji sekhontrakthi ehlakaniphile. Sijonga ukuba inani elilayishiweyo lihambelana naleyo ipasisiweyo; ukuba akunjalo, siphosa ngaphandle. Kwimeko yethu, ekubeni sidlula umdlalo ongafanelanga, kufuneka kuphoswe ngaphandle.

Ngoku masiqokelele.

~/TON/build/crypto/func -APSR -o lottery-compiled.fif ~/TON/ton/crypto/smartcont/stdlib.fc ./lottery-code.fc 

Khuphela ikhowudi yesiphumo ku lottery-test-suite.fif, ungalibali ukubuyisela umgca wokugqibela.

Sijonga ukuba uvavanyo luyaphumelela:

~/TON/build/crypto/fift -s lottery-test-suite.fif

Apha apha Unokubona ukuzinikela okuhambelanayo kunye neziphumo zangoku.

Qaphela ukuba akulunganga ukukopa rhoqo ikhowudi ehlanganisiweyo yekhontrakthi ehlakaniphile kwifayile eneemvavanyo, ngoko siya kubhala iskripthi esiya kubhala ikhowudi ibe yinto eqhubekayo kuthi, kwaye siya kudibanisa ikhowudi ehlanganisiweyo kwiimvavanyo zethu sisebenzisa. "include".

Yenza ifayile kwifolda yeprojekthi build.sh ngomxholo olandelayo.

#!/bin/bash

~/TON/build/crypto/func -SPA -R -o lottery-compiled.fif ~/TON/ton/crypto/smartcont/stdlib.fc ./lottery-code.fc

Masiyenze iphunyezwe.

chmod +x ./build.sh

Ngoku, sebenzisa nje iskripthi sethu ukuqokelela isivumelwano. Kodwa ngaphandle koku, kufuneka siyibhale ibe yinto engatshintshiyo code. Ke siya kudala ifayile entsha lotter-compiled-for-test.fif, esiya kuthi siyifake kwifayile lottery-test-suite.fif.

Makhe songeze ikhowudi yokutsibela ku-sh, eyakuthi iphinde ngokulula ifayile ehlanganisiweyo lotter-compiled-for-test.fif kwaye utshintshe umgca wokugqibela kuyo.

# 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

Ngoku, ukujonga, masiqhube iskripthi esisiphumo kwaye ifayile iya kuveliswa lottery-compiled-for-test.fif, esiya kuthi siyifake kweyethu lottery-test-suite.fif

Π’ lottery-test-suite.fif cima ikhowudi yekhontrakthi kwaye wongeze umgca "lottery-compiled-for-test.fif" include.

Siqhuba iimvavanyo ukujonga ukuba baphumelele na.

~/TON/build/crypto/fift -s lottery-test-suite.fif

Kuhle, ngoku ukwenza ngokuzenzekelayo ukuqaliswa kovavanyo, masenze ifayile test.sh, eya kuqala iphumeze build.sh, kwaye emva koko uqhube iimvavanyo.

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

Masiyenze test.sh kwaye uyiqhube ukuqinisekisa ukuba iimvavanyo ziyasebenza.

chmod +x ./test.sh
./test.sh

Sijonga ukuba ikhontrakthi iqulunqa kwaye iimvavanyo zenziwe.

Kuhle, ngoku kuqalwa test.sh Iimvavanyo ziya kuqulunqwa kwaye ziqhutywe ngokukhawuleza. Nali ikhonkco lokuya zibophelele.

Kulungile, phambi kokuba siqhubeke, masenze enye into ukunceda.

Masenze ifolda build apho siya kugcina ikhontrakthi ekhutshelweyo kunye ne-clone yayo ebhalwe ngokungaguqukiyo lottery-compiled.fif, lottery-compiled-for-test.fif. Masenze kwakhona ifolda test izakugcinwa phi ifayile yovavanyo? lottery-test-suite.fif kunye nezinye iifayile ezixhasayo ezinokubakho. Ikhonkco kwiinguqu ezifanelekileyo.

Masiqhubeke siphuhlisa ikhontrakthi ehlakaniphile.

Okulandelayo kufuneka kubekho uvavanyo olujonga ukuba umyalezo ufunyenwe kwaye i-counter ihlaziywa kwivenkile xa sithumela inombolo echanekileyo. Kodwa siya kuyenza loo nto kamva.

Ngoku makhe sicinge malunga nesakhiwo sedatha kunye nokuba yeyiphi idatha ekufuneka igcinwe kwinkontileka ehlakaniphile.

Ndiza kuchaza yonke into esiyigcinayo.

`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 kufuneka ubhale imisebenzi emibini. Masibize eyokuqala pack_state(), eya kupakisha idatha yokugcinwa okulandelayo kwi-smart contract storage. Masibize eyesibini unpack_state() iya kufunda kwaye ibuyisele idatha kwindawo yokugcina.

_ 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;
}

Songeza le misebenzi mibini ekuqaleni kwekhontrakthi ehlakaniphile. Iza kusebenza ndiyayithanda lento isiphumo esiphakathi.

Ukugcina idatha kuya kufuneka ufowunele umsebenzi owakhelwe ngaphakathi set_data() kwaye iya kubhala idatha ukusuka pack_state() kwindawo yokugcina ikhontrakthi ehlakaniphile.

cell packed_state = pack_state(arg_1, .., arg_n); 
set_data(packed_state);

Ngoku ukuba sinemisebenzi efanelekileyo yokubhala kunye nokufunda idatha, sinokuqhubeka.

Kufuneka sijonge ukuba umyalezo ongenayo uvela ngaphandle usayinwe ngumnini wekhontrakthi (okanye omnye umsebenzisi onokufikelela kwisitshixo sabucala).

Xa sipapasha ikhontrakthi ehlakaniphile, sinokuyiqala ngedatha esiyidingayo kwindawo yokugcina, eya kugcinwa ukuze isetyenziswe kwixesha elizayo. Siza kurekhoda isitshixo sikawonke-wonke apho ukuze siqinisekise ukuba umyalezo ongenayo usayinwe ngesitshixo sabucala esihambelanayo.

Phambi kokuqhubeka, masenze isitshixo sabucala kwaye sibhalele kuso test/keys/owner.pk. Ukwenza oku, masiqalise i-Fift kwimowudi yokunxibelelana kwaye senze imiyalelo emine.

`newkeypair` гСнСрация ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° ΠΈ запись ΠΈΡ… Π² стСк. 

`drop` удалСния ΠΈΠ· стСка Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ элСмСнта (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡)  

`.s` просто ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ Π»Π΅ΠΆΠΈΡ‚ Π² стСкС Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ 

`"owner.pk" B>file` запись ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° Π² Ρ„Π°ΠΉΠ» с ΠΈΠΌΠ΅Π½Π΅ΠΌ `owner.pk`. 

`bye` Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Fift. 

Masenze ifolda keys ngaphakathi kwisiqulathi seefayili test kwaye ubhale isitshixo sabucala apho.

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 ifayile kwifolda yangoku owner.pk.

Sisusa isitshixo sikawonke-wonke kwisitaki kwaye xa sifuneka singasifumana kwesabucala.

Ngoku kufuneka sibhale isiqinisekiso sotyikityo. Masiqale ngovavanyo. Okokuqala sifunda iqhosha labucala kwifayile usebenzisa umsebenzi file>B kwaye uyibhale kwinto eguquguqukayo owner_private_key, emva koko usebenzisa umsebenzi priv>pub guqula iqhosha labucala libe liqhosha likawonke-wonke kwaye ubhale isiphumo kuyo 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 !

Siza kufuna zombini izitshixo.

Siqala ukugcinwa kwekhontrakthi ehlakaniphile kunye nedatha engafanelekanga ngokulandelelana okufanayo kunye nomsebenzi pack_state()kwaye uyibhale kwisiguquli 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, siya kuqulunqa umyalezo osayiniweyo, uya kuqulatha kuphela utyikityo kunye nexabiso lokubala.

Okokuqala, senza idatha esifuna ukuyihambisa, emva koko siyisayine ngesitshixo sangasese kwaye ekugqibeleni sivelise umyalezo osayiniweyo.

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 yoko, umyalezo esiya kuwuthumela kwikhontrakthi ehlakaniphile urekhodwa ngokuguquguqukayo message_to_send, malunga nemisebenzi hashu, ed25519_sign_uint unokufunda kumaxwebhu amahlanu.

Kwaye ukuqhuba uvavanyo sibiza kwakhona.

message_to_send @ 
recv_external 
code 
storage @
c7
runvmctx

Nantsi njalo Ifayile eneemvavanyo kufuneka ijongeke ngolu hlobo kweli nqanaba.

Masiluqhube uvavanyo kwaye luya kusilela, ke siya kutshintsha isivumelwano se-smart ukuze sifumane imiyalezo yale fomati kwaye siqinisekise utyikityo.

Okokuqala, sibala amasuntswana angama-512 otyikityo olusuka kumyalezo kwaye siwubhale kuguquguquko, emva koko sibala amasuntswana angama-32 oguquguqukayo lwekhawuntari.

Ekubeni sinomsebenzi wokufunda idatha kwi-smart contract storage, siya kuyisebenzisa.

Okulandelayo kukujonga ikhawuntara edluliselwe kunye nokugcinwa kunye nokujonga utyikityo. Ukuba kukho into engahambelaniyo, ngoko siphosa ngaphandle ngekhowudi efanelekileyo.

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

Isibophelelo esifanelekileyo kanye apha.

Masiqhube iimvavanyo kwaye sibone ukuba uvavanyo lwesibini aluphumeleli. Ngenxa yezizathu ezibini, akukho bits ezaneleyo kumyalezo kwaye akukho zixhobo ezaneleyo kwisitoreji, ngoko ke ikhowudi iyaphuka xa isahlula. Kufuneka songeze utyikityo kumyalezo esiwuthumelayo kwaye sikhuphele ugcino kuvavanyo lokugqibela.

Kuvavanyo lwesibini, siya kongeza isignesha yomyalezo kwaye sitshintshe ukugcinwa kwekhontrakthi ehlakaniphile. Nantsi njalo ifayile eneemvavanyo ibonakala ngathi ngalo mzuzu.

Masibhale uvavanyo lwesine, apho siya kuthumela umyalezo osayinwe ngesitshixo sabucala somnye umntu. Masenze elinye iqhosha labucala kwaye siligcine kwifayile not-owner.pk. Siza kutyikitya umyalezo ngeli qhosha labucala. Masiqhube iimvavanyo kwaye siqinisekise ukuba zonke iimvavanyo ziyaphumelela. Zibophelele ngalo mzuzu.

Ngoku sinokuthi ekugqibeleni siqhubele phambili ekuphumezeni ingqiqo yekhontrakthi ehlakaniphile.
Π’ recv_external() siya kwamkela iindidi ezimbini zemiyalezo.

Ekubeni isivumelwano sethu siya kuqokelela ilahleko yabadlali, le mali kufuneka idluliselwe kumdali welotho. Idilesi ye-wallet yomdali welotho irekhodwa kwindawo yokugcina xa isivumelwano senziwe.

Kanye kwimeko, sifuna ukukwazi ukutshintsha idilesi apho sithumela iigrama zabalahlekileyo. Kufuneka kwakhona sikwazi ukuthumela iigram ukusuka kwilotho kwidilesi yomnini.

Masiqale ngeyokuqala. Masiqale sibhale uvavanyo oluya kukhangela ukuba emva kokuthumela umyalezo, inkontileka ehlakaniphile igcine idilesi entsha kwindawo yokugcina. Nceda uqaphele ukuba kumyalezo, ukongeza kwi-counter kunye nedilesi entsha, sihambisa kwakhona action Inani elipheleleyo le-7-bit non-negative, kuxhomekeke kuyo, siya kukhetha indlela yokuqhuba umyalezo kwikhontrakthi ehlakaniphile.

<b 0 32 u, 1 @ 7 u, new_owner_wc @  32 i, new_owner_account_id @ 256 u, b> message_to_sign !

Kuvavanyo unokubona ukuba ukugcinwa kwe-smartcontract kwenziwa njani storage kwiSihlanu. Ukususwa kwezinto eziguquguqukayo kuchazwa kuxwebhu lweFift.

Ikhonkco lokuzibophelela ngentlama eyongeziweyo.

Masiluqhube uvavanyo kwaye siqinisekise ukuba aluphumeleli. Ngoku masenze ingqiqo yokutshintsha idilesi yomnini welotho.

Kwikhontrakthi ehlakaniphile siyaqhubeka ukucazulula message, funda ngaphakathi action. Masikukhumbuze ukuba siza kuba nezimbini action: tshintsha idilesi kwaye uthumele iigram.

Emva koko sifunda idilesi entsha yomnini wekhontrakthi kwaye uyigcine kwindawo yokugcina.
Siqhuba iimvavanyo kwaye sibone ukuba uvavanyo lwesithathu aluphumeleli. Iyantlitheka ngenxa yokuba ikhontrakthi ngoku yongeza iibhithi ezisi-7 zomyalezo, ezilahlekileyo kuvavanyo. Yongeza engekhoyo kumyalezo action. Masiqhube iimvavanyo kwaye sibone ukuba yonke into iyaphumelela. apha zibophelele kwiinguqu. Kakhulu.

Ngoku masibhale ingqiqo yokuthumela inani elichaziweyo leegram kwidilesi egcinwe ngaphambili.

Okokuqala, masibhale uvavanyo. Siza kubhala iimvavanyo ezimbini, enye xa kungekho kulinganisela okwaneleyo, okwesibini xa yonke into ifanele iphumelele ngempumelelo. Iimvavanyo zinokujongwa kwesi sibophelelo.

Ngoku masidibanise ikhowudi. Okokuqala, masibhale iindlela ezimbini zokuncedisa. Indlela yokuqala yokufumana kukufumana ibhalansi yangoku yekhontrakthi ehlakaniphile.

int balance() inline_ref method_id {
    return get_balance().pair_first();
}

Kwaye okwesibini kukuthumela iigram kwenye inkontileka ehlakaniphile. Ndiyikopishe ngokupheleleyo le ndlela kwenye ikhontrakthi 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
}

Masidibanise ezi ndlela zimbini kwikhontrakthi ehlakaniphile kwaye sibhale ingqiqo. Okokuqala, sicazulula inani leegrem ezisuka kumyalezo. Okulandelayo sijonga ibhalansi, ukuba akwanelanga siphosa ngaphandle. Ukuba yonke into ilungile, ngoko sithumela iigram kwidilesi egciniweyo kwaye sihlaziye i-counter.

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

Nantsi njalo ijongeka njengesivumelwano esikrelekrele okwangoku. Masiqhube iimvavanyo kwaye siqinisekise ukuba bayaphumelela.

Ngendlela, ikhomishini itsalwa kwikhontrakthi ehlakaniphile rhoqo ngomyalezo ogqityiweyo. Ukuze imiyalezo yekhontrakthi ehlakaniphile iqhube isicelo, emva kokuhlolwa okusisiseko kufuneka ufowunele accept_message().

Ngoku masiqhubele phambili kwimiyalezo yangaphakathi. Enyanisweni, siya kwamkela iigram kuphela kwaye sibuyisele imali ephindwe kabini kumdlali ukuba uyaphumelela kunye nesithathu kumnini ukuba ulahlekile.

Okokuqala, masibhale uvavanyo olulula. Ukwenza oku, sidinga idilesi yovavanyo yekhontrakthi ehlakaniphile ekucingelwa ukuba sithumela kuyo iigram kwikhontrakthi ehlakaniphile.

Idilesi yekhontrakthi ehlakaniphile inamanani amabini, i-32-bit integer enoxanduva lwe-workchain kunye ne-256-bit non-negative inombolo ye-akhawunti ekhethekileyo kweli khonkco lomsebenzi. Umzekelo, -1 kunye ne-12345, le yidilesi esiya kuyigcina kwifayile.

Ndikhuphele umsebenzi wokugcina idilesi 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

Makhe sijonge indlela umsebenzi osebenza ngayo, oku kuya kunika ukuqonda ukuba iFift isebenza njani. Qalisa iFift kwimowudi yonxibelelwano.

~/TON/build/crypto/fift -i 

Okokuqala sityhala -1, 12345 kunye negama lefayile yexesha elizayo "sender.addr" kwisitaki:

-1 12345 "sender.addr" 

Inyathelo elilandelayo kukuphumeza umsebenzi -rot, etshintsha isitaki ngendlela yokuba phezulu kwesitaki kukho inombolo eyodwa yekontraki ehlakaniphile:

"sender.addr" -1 12345

256 u>B iguqula i-256-bit non-negative epheleleyo kwi-bytes.

"sender.addr" -1 BYTES:0000000000000000000000000000000000000000000000000000000000003039

swap utshintshanisa izinto ezimbini eziphezulu zesitaki.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 -1

32 i>B iguqula i-32-bit integer ukuya kwi-bytes.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 BYTES:FFFFFFFF

B+ idibanisa iibhayithi ezimbini ezilandelelanayo.

 "sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF

Kwakhona swap.

BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF "sender.addr" 

Kwaye ekugqibeleni ii-bytes zibhalwa kwifayile B>file. Emva koku isitaki sethu asinanto. Siyema Fift. Ifayile yenziwe kulawulo lwangoku sender.addr. Masihambise ifayile kwifolda eyenziweyo test/addresses/.

Masibhale uvavanyo olulula oluya kuthumela iigram kwinkontileka ehlakaniphile. Naku ukuzibophelela.

Ngoku makhe sijonge ingqiqo yelotho.

Into yokuqala esiyenzayo kukukhangela umyalezo bounced okanye hayi ukuba bounced, emva koko asiyihoyi. bounced kuthetha ukuba ikhontrakthi iya kubuyisela iigram ukuba kukho impazamo eyenzekayo. Asiyi kubuyisela iigram ukuba impazamo iyenzeka ngesiquphe.

Sijonga, ukuba ibhalansi ingaphantsi kwesiqingatha segrama, ngoko sivele samkele umyalezo kwaye singawunaki.

Emva koko, sihlalutya idilesi yekhontrakthi ehlakaniphile apho umyalezo uvela khona.

Sifunda i data kwindawo yokugcina uze ucime ukubheja endala kwimbali ukuba kukho ngaphezu kwamashumi amabini kubo. Ukuze kube lula, ndibhale imisebenzi emithathu eyongezelelweyo pack_order(), unpack_order(), remove_old_orders().

Okulandelayo, sijonga ukuba ibhalansi ayanelanga kwintlawulo, ke sicinga ukuba oku akukona ukubheja, kodwa ukuzaliswa kunye nokugcina ukuzaliswa kwakhona. orders.

Emva koko ekugqibeleni ingundoqo yekhontrakthi ehlakaniphile.

Okokuqala, ukuba umdlali ulahlekelwa, sigcina kwimbali yokubheja kwaye ukuba isixa singaphezulu kwe-3 grams, sithumela i-1/3 kumnini wenkontileka ehlakaniphile.

Ukuba umdlali uphumelele, ngoko sithumela imali ephindwe kabini kwidilesi yomdlali kwaye sigcine ulwazi malunga nokubheja kwimbali.

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

Yonke into. Isibophelelo esihambelanayo.

Ngoku yonke into eseleyo ilula, makhe senze iindlela zokufumana ukuze sikwazi ukufumana ulwazi malunga nemeko yekhontrakthi evela kwihlabathi langaphandle (enyanisweni, funda idatha kwi-smart contract storage).

Makhe songeze ukufumana iindlela. Siza kubhala ngezantsi malunga nendlela yokufumana ulwazi malunga nekhontrakthi ehlakaniphile.

Ndikwalibele ukongeza ikhowudi eya kuqhuba isicelo sokuqala esenzekayo xa kupapashwa ikhontrakthi ehlakaniphile. Isibophelelo esihambelanayo. Kwaye ngakumbi ilungisiwe ibug ngokuthumela i-1/3 yemali kwi-akhawunti yomnini.

Inyathelo elilandelayo kukupapasha ikhontrakthi ehlakaniphile. Masenze ifolda requests.

Ndathatha ikhowudi yopapasho njengesiseko simple-wallet-code.fc yintoni inokufunyanwa kwindawo yokugcina esemthethweni.

Into ekufanele inikele ingqalelo kuyo. Senza i-smart contract storage kunye nomyalezo wegalelo. Emva koko, idilesi yekhontrakthi ehlakaniphile yenziwe, oko kukuthi, idilesi iyaziwa nangaphambi kokupapashwa kwi-TON. Emva koko, kufuneka uthumele iigremu ezininzi kule dilesi, kwaye kuphela emva koko kufuneka uthumele ifayile kunye nekhontrakthi ehlakaniphile ngokwayo, ekubeni inethwekhi ithatha ikhomishini yokugcina inkontileka ehlakaniphile kunye nokusebenza kuyo (abaqinisekisi abagcina kwaye baqhube kakuhle. izivumelwano). Ikhowudi inokujongwa apha.

Okulandelayo siphumeza ikhowudi yokushicilela kwaye sifumane lottery-query.boc ifayile yenkontileka ehlakaniphile kunye nedilesi.

~/TON/build/crypto/fift -s requests/new-lottery.fif 0

Ungalibali ukugcina iifayile ezenziweyo: lottery-query.boc, lottery.addr, lottery.pk.

Phakathi kwezinye izinto, siya kubona idilesi yekhontrakthi ehlakaniphile kwiilogi zokubulawa.

new wallet address = 0:044910149dbeaf8eadbb2b28722e7d6a2dc6e264ec2f1d9bebd6fb209079bc2a 
(Saving address to file lottery.addr)
Non-bounceable address (for init): 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd
Bounceable address (for later access): kQAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8KpFY

Ukuzonwabisa nje, masenze isicelo kwi-TON

$ ./lite-client/lite-client -C ton-lite-client-test1.config.json 
getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Kwaye siya kubona ukuba iakhawunti enale dilesi ayinanto.

account state is empty

Sithumela kwidilesi 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd 2 Gram kwaye emva kwemizuzwana embalwa senza umyalelo ofanayo. Ukuthumela iigram endizisebenzisayo isipaji esisemthethweni, kwaye unokucela umntu ovela kwingxoxo yeegram zokuvavanya, endiya kuthetha ngazo ekupheleni kwenqaku.

> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Ijongeka ngathi ngumntu ongaqalwanga (state:account_uninit) inkontileka ehlakaniphile enedilesi efanayo kunye nebhalansi ye-nanograms ye-1.

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

Ngoku masipapashe ikhontrakthi ehlakaniphile. Masiqalise i-lite-client kwaye siphumeze.

> 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 

Masijonge ukuba ikhontrakthi ishicilelwe.

> last
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Phakathi kwezinye izinto esizifumanayo.

  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

Siyayibona loo nto account_active.

Ukuzinikela okuhambelanayo notshintsho kanye apha.

Ngoku makhe senze izicelo zokusebenzisana nekhontrakthi ehlakaniphile.

Ngokuchanekileyo, siya kushiya eyokuqala yokutshintsha idilesi njengomsebenzi ozimeleyo, kwaye siya kwenza okwesibini ukuthumela iigram kwidilesi yomnini. Enyanisweni, kuya kufuneka senze into efanayo nanjengoko kuvavanyo lokuthumela iigram.

Lo ngumyalezo esiya kuwuthumela kwinkontileka ehlakaniphile, apho msg_seqno 165, action I-2 kunye ne-9.5 grams yokuthumela.

<b 165 32 u, 2 7 u, 9500000000 Gram, b>

Ungalibali ukusayina umyalezo ngesitshixo sakho sabucala lottery.pk, eyaveliswa ngaphambili xa idala inkontileka ehlakaniphile. Nasi isibophelelo esihambelanayo.

Ukufumana ulwazi kwinkontileka ehlakaniphile usebenzisa iindlela zokufumana

Ngoku makhe sijonge indlela yokuqhuba iikhontrakthi ezihlakaniphile ukufumana iindlela.

Qalisa lite-client kwaye uqhube ukufumana iindlela esizibhalileyo.

$ ./lite-client/lite-client -C ton-lite-client-test1.config.json
> runmethod 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd balance
arguments:  [ 104128 ] 
result:  [ 64633878952 ] 
...

Π’ result iqulathe ixabiso elibuyiswa ngumsebenzi balance() kwikhontrakthi yethu ehlakaniphile.
Siza kwenza okufanayo kwezinye iindlela ezininzi.

> runmethod 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd get_seqno
...
arguments:  [ 77871 ] 
result:  [ 1 ] 

Masicele imbali yakho yokubheja.

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

Siza kusebenzisa i-lite-client kwaye sifumane iindlela zokubonisa ulwazi malunga nekhontrakthi ehlakaniphile kwisayithi.

Ukubonisa idatha yekhontrakthi ehlakaniphile kwiwebhusayithi

Ndabhala iwebhusayithi elula kwiPython ukubonisa idatha kwinkontileka ehlakaniphile ngendlela efanelekileyo. Apha andiyi kuhlala kuyo ngokubanzi kwaye ndiya kupapasha indawo kwisibophelelo esinye.

Izicelo eziya kwiTON zenziwe kwi Python ngoncedo lite-client. Ukwenzela lula, indawo ipakishwe kwiDocker kwaye ipapashwe kwiLifu likaGoogle. Ikhonkco.

Masizame

Ngoku makhe sizame ukuthumela iigram apho ukuze zizaliswe kwakhona ukusuka isipaji. Siza kuthumela i-40 grams. Kwaye masenze iibheji ezimbalwa zokucaca. Siyabona ukuba isayithi ibonisa imbali yokubheja, ipesenti yokuwina yangoku kunye nolunye ulwazi oluluncedo.

Siyabonaukuba siphumelele eyokuqala, saphulukana neyesibini.

Emva kwegama

Eli nqaku liye laba lide kakhulu kunokuba bendilindele, mhlawumbi linokuba lifutshane, okanye mhlawumbi nje kumntu ongazi nto malunga ne-TON kwaye ufuna ukubhala kunye nokupapasha isivumelwano esingenangqondo esilula kunye nokukwazi ukusebenzisana naye. yona. Mhlawumbi ezinye izinto bezinokucaciswa ngokulula ngakumbi.

Mhlawumbi eminye imiba yophunyezo yayinokwenziwa ngokufanelekileyo nangobuchule, kodwa ke bekuya kuthatha ixesha elingakumbi ukulungiselela inqaku. Kwakhona kunokwenzeka ukuba ndenze impazamo kwindawo ethile okanye andiyiqondi into ethile, ngoko ke ukuba wenza into enzulu, kufuneka uthembele kumaxwebhu asemthethweni okanye indawo yokugcina esemthethweni kunye nekhowudi ye-TON.

Kufuneka kuqatshelwe ukuba ekubeni i-TON ngokwayo isekho kwinqanaba elisebenzayo lophuhliso, utshintsho lunokuthi lwenzeke oluya kuphula nayiphi na inyathelo eli nqaku (okwenzekayo ngelixa ndibhala, sele sele ilungisiwe), kodwa indlela eqhelekileyo. akunakwenzeka ukutshintsha.

Andiyi kuthetha ngekamva le-TON. Mhlawumbi iqonga liya kuba yinto enkulu kwaye kufuneka sichithe ixesha silifunda kwaye sigcwalise i-niche ngeemveliso zethu ngoku.

Kukwakho neLibra evela kuFacebook, enabaphulaphuli abanokubakho kubasebenzisi abakhulu kuneTON. Andazi phantse nto malunga neLibra, ngokujonga iforum kukho umsebenzi omninzi apho kunoluntu lweTON. Nangona abaphuhlisi kunye noluntu lwe-TON bafana nangaphantsi komhlaba, okupholileyo.

iimbekiselo

  1. Amaxwebhu eTON asemthethweni: https://test.ton.org
  2. Uvimba osemthethweni weTON: https://github.com/ton-blockchain/ton
  3. Isipaji esisemthethweni samaqonga ahlukeneyo: https://wallet.ton.org
  4. Ugcino lwekhontrakthi ehlakaniphile kweli nqaku: https://github.com/raiym/astonished
  5. Ikhonkco kwiwebhusayithi yekhontrakthi ehlakaniphile: https://ton-lottery.appspot.com
  6. Uvimba wokwandiswa kweKhowudi yeSitudiyo esiBonakalayo seFunC: https://github.com/raiym/func-visual-studio-plugin
  7. Thetha malunga neTON kwiTelegram, eyanceda ngokwenene ukuyifumana kwinqanaba lokuqala. Ndicinga ukuba akuyi kuba yimpazamo ukuba ndithi wonke umntu obhale into ye-TON ukhona. Ungaphinda ucele iigrem zovavanyo apho. https://t.me/tondev_ru
  8. Enye incoko malunga neTON apho ndifumene ulwazi oluluncedo: https://t.me/TONgramDev
  9. Inqanaba lokuqala lokhuphiswano: https://contest.com/blockchain
  10. Inqanaba lesibini lokhuphiswano: https://contest.com/blockchain-2

umthombo: www.habr.com

Yongeza izimvo