Zamomwe mungalembe ndikusindikiza mgwirizano wanzeru mu Telegraph Open Network (TON)

Za momwe mungalembe ndikusindikiza mgwirizano wanzeru ku TON

Kodi nkhaniyi ikunena za chiyani?

M'nkhaniyi ndilankhula za momwe ndinachitira nawo mpikisano woyamba (wa awiri) wa Telegraph blockchain, sindinalandire mphotho, ndipo ndinaganiza zolemba zomwe ndakumana nazo m'nkhani kuti zisalowe m'kuiwalika ndipo, mwina, kuthandizira. wina.

Popeza sindinkafuna kulemba code abstract, koma kuti ndichite chinachake chogwira ntchito, chifukwa cha nkhaniyi ndinalemba mgwirizano wanzeru wa lottery yomweyo ndi webusaiti yomwe imasonyeza deta yanzeru ya mgwirizano kuchokera ku TON popanda kugwiritsa ntchito kusungirako kwapakati.

Nkhaniyi idzakhala yothandiza kwa iwo omwe akufuna kupanga mgwirizano wawo woyamba wanzeru ku TON, koma osadziwa komwe angayambire.

Pogwiritsa ntchito lottery monga chitsanzo, ndidzachoka pa kukhazikitsa chilengedwe mpaka kufalitsa mgwirizano wanzeru, kuyanjana nawo, ndikulemba webusaiti kuti ndilandire ndi kusindikiza deta.

Za kutenga nawo mbali pa mpikisano

October watha, Telegalamu adalengeza mpikisano wa blockchain ndi zilankhulo zatsopano Fift ΠΈ FunC. Zinali zofunikira kusankha kulemba chilichonse mwa mapangano asanu omwe akufunsidwa. Ndinaganiza kuti zingakhale bwino kuchita chinachake chosiyana, kuphunzira chinenero ndi kupanga chinachake, ngakhale ine ndiribe kulemba china chilichonse m'tsogolo. Komanso, mutuwo nthawi zonse umakhala pamilomo.

Ndikoyenera kunena kuti ndinalibe chidziwitso chopanga makontrakitala anzeru.

Ndinalinganiza kutengamo mbali mpaka kumapeto kwenikweni kufikira nditakhoza ndiyeno kulemba nkhani yobwereza, koma ndinalephera nthaΕ΅i yomweyo pa yoyamba. Ine analemba chikwama ndi ma signature ambiri FunC ndipo nthawi zambiri zinagwira ntchito. Ndinazitenga ngati maziko smart contract pa Solidity.

Panthawiyo, ndinkaganiza kuti zimenezi zinali zokwanira kuti nditengepo mphoto. Chifukwa cha zimenezi, pafupifupi 40 mwa otenga nawo mbali 60 anakhala opambana mphoto ndipo ine sindinali m’gulu lawo. Mwambiri, palibe cholakwika ndi izi, koma chinthu chimodzi chidandivutitsa. Pa nthawi yolengeza zotsatira, kuwunikanso mayeso a mgwirizano wanga sikunachitike, ndidafunsa omwe adalowa nawo pazokambirana ngati pali wina yemwe alibe, palibe.

Mwachiwonekere kumvetsera mauthenga anga, patatha masiku awiri oweruza adasindikiza ndemanga ndipo sindikumvetsabe ngati adaphonya mwangozi mgwirizano wanga wanzeru panthawi yoweruza kapena amangoganiza kuti zinali zoipa kwambiri moti sizikusowa ndemanga. Ndinafunsa funso patsambalo, koma sindinayankhe. Ngakhale kuti si chinsinsi amene anaweruza, ndinaona kuti sikoyenera kulemba mauthenga aumwini.

Nthawi yochuluka idagwiritsidwa ntchito kumvetsetsa, choncho adaganiza zolemba nkhani. Popeza palibe zambiri zambiri, nkhaniyi ithandiza kusunga nthawi kwa aliyense amene ali ndi chidwi.

Lingaliro la makontrakitala anzeru mu TON

Musanalembe chilichonse, muyenera kudziwa mbali yomwe mungayandikire chinthuchi. Chifukwa chake, tsopano ndikuwuzani magawo omwe dongosololi lili. Ndendende, ndi mbali ziti zomwe muyenera kudziwa kuti mulembe osachepera mtundu wina wa mgwirizano wogwira ntchito.

Tidzayang'ana pa kulemba mgwirizano wanzeru ndikugwira nawo ntchito TON Virtual Machine (TVM), Fift ΠΈ FunC, kotero kuti nkhaniyi ili ngati kufotokozera za chitukuko cha pulogalamu yokhazikika. Sitingoganizira momwe nsanjayo imagwirira ntchito pano.

Zambiri za momwe zimagwirira ntchito TVM ndi chinenero Fift pali zolembedwa zabwino zovomerezeka. Pamene ndikuchita nawo mpikisano ndipo tsopano ndikulemba mgwirizano wamakono, nthawi zambiri ndinkatembenukira kwa iye.

Chilankhulo chachikulu chomwe ma contract anzeru amalembedwa ndi FunC. Palibe zolembedwa pa izo pakali pano, kotero kuti mulembe chinachake muyenera kuphunzira zitsanzo za mapangano anzeru ku chosungira boma ndi kukhazikitsa chinenero palokha kumeneko, kuphatikizapo mukhoza kuyang'ana zitsanzo za mapangano anzeru kuyambira awiri apitawa. mpikisano. Maulalo kumapeto kwa nkhani.

Tinene kuti talemba kale contract yanzeru FunC, pambuyo pake timapanga code kukhala Fift assembler.

Mgwirizano wanzeru wophatikizidwa uyenera kusindikizidwa. Kuti muchite izi muyenera kulemba ntchito mu Fift, yomwe idzatenge kachidindo kanzeru ndi magawo ena monga chothandizira, ndipo zotsatira zake zidzakhala fayilo yokhala ndi zowonjezera. .boc (lomwe limatanthauza "chikwama cha maselo"), ndipo, malingana ndi momwe timalembera, chinsinsi chachinsinsi ndi adiresi, zomwe zimapangidwa motsatira ndondomeko ya mgwirizano wanzeru. Mutha kutumiza kale magalamu ku adilesi ya mgwirizano wanzeru womwe sunasindikizidwebe.

Kuti musindikize mgwirizano wanzeru ku TON walandira .boc fayilo iyenera kutumizidwa ku blockchain pogwiritsa ntchito kasitomala wopepuka (zambiri pamunsimu). Koma musanasindikize, muyenera kusamutsa magalamu ku adilesi yopangidwa, apo ayi mgwirizano wanzeru sudzasindikizidwa. Pambuyo pofalitsa, mutha kuyanjana ndi mgwirizano wanzeru potumiza mauthenga kuchokera kunja (mwachitsanzo, pogwiritsa ntchito kasitomala wopepuka) kapena kuchokera mkati (mwachitsanzo, mgwirizano umodzi wanzeru umatumiza wina uthenga mkati mwa TON).

Tikamvetsetsa momwe code imasindikizidwira, zimakhala zosavuta. Timadziwa bwino zomwe tikufuna kulemba komanso momwe pulogalamu yathu idzagwirira ntchito. Ndipo polemba, timayang'ana momwe izi zagwiritsidwira ntchito kale pamakontrakitala anzeru omwe alipo, kapena timayang'ana pama code okhazikitsa Fift ΠΈ FunC m'malo ovomerezeka, kapena yang'anani muzolemba zovomerezeka.

Nthawi zambiri ndimayang'ana mawu osakira pamacheza a Telegraph pomwe onse omwe adachita nawo mpikisano ndi ogwira ntchito pa Telegraph adasonkhana, ndipo zidachitika kuti pampikisanowo aliyense adasonkhana pamenepo ndikuyamba kukambirana za Fift ndi FunC. Lumikizani kumapeto kwa nkhaniyo.

Yakwana nthawi yochoka ku chiphunzitso kupita kukuchita.

Kukonzekera chilengedwe chogwirira ntchito ndi TON

Ndidachita zonse zomwe zidzafotokozedwe m'nkhani ya MacOS ndikuyiyang'ana kawiri mu Ubuntu 18.04 LTS pa Docker.

Chinthu choyamba muyenera kuchita ndi download ndi kukhazikitsa lite-client momwe mungatumizire zopempha ku TON.

Malangizo omwe ali patsamba lovomerezeka amafotokoza za kukhazikitsa mwatsatanetsatane komanso momveka bwino ndikusiya zambiri. Apa tikutsatira malangizowo, ndikuyika zodalira zomwe zikusowa panjira. Sindinapange pulojekiti iliyonse ndekha ndikuyika kuchokera ku Ubuntu repository (pa MacOS ndidagwiritsa ntchito 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 

Kamodzi zodalira zonse zaikidwa mukhoza kukhazikitsa lite-client, Fift, FunC.

Choyamba, timagwirizanitsa malo a TON pamodzi ndi zodalira zake. Kuti zikhale zosavuta, tidzachita zonse mufoda ~/TON.

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

Malo osungiramonso amasungirako zochitika Fift ΠΈ FunC.

Tsopano ndife okonzeka kusonkhanitsa polojekitiyi. Khodi yosungira imapangidwa kukhala chikwatu ~/TON/ton. The ~/TON pangani chikwatu build ndi kusonkhanitsa polojekiti mmenemo.

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

Popeza tilemba mgwirizano wanzeru, sitifunikira kokha lite-clientkoma Fift с FunC, kotero tiyeni tipange zonse. Si njira yachangu, ndiye tikudikirira.

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

Kenako, tsitsani fayilo yosinthira yomwe ili ndi data yokhudzana ndi node komwe lite-client zidzalumikizana.

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

Kupanga zopempha zoyamba ku TON

Tsopano tiyeni tiyambitse lite-client.

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

Ngati kumangako kunali kopambana, ndiye mutatha kukhazikitsidwa mudzawona chipika cha kulumikizana kwa kasitomala wowunikira 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)
...

Mutha kuyendetsa lamulo help ndikuwona malamulo omwe alipo.

help

Tiyeni tione malamulo amene tigwiritse ntchito m’nkhani ino.

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

Tsopano ndife okonzeka kulemba mgwirizano wokha.

РСализация

Maganizo

Monga ndalembera pamwambapa, mgwirizano wanzeru womwe tikulemba ndi lottery.

Komanso, iyi si lottery yomwe muyenera kugula tikiti ndikudikirira ola, tsiku kapena mwezi, koma nthawi yomweyo yomwe wogwiritsa ntchito amasamutsira ku adilesi ya mgwirizano. N magalamu, ndipo nthawi yomweyo amachibwezera 2 * N magalamu kapena kutaya. Tipanga mwayi wopambana pafupifupi 40%. Ngati palibe magalamu okwanira olipira, ndiye kuti tiwona zomwe zikuchitikazo ngati zowonjezera.

Kuphatikiza apo, ndikofunikira kuti kubetcha kumawonedwa munthawi yeniyeni komanso m'njira yabwino, kuti wogwiritsa ntchitoyo amvetsetse ngati adapambana kapena adataya. Chifukwa chake, muyenera kupanga tsamba lomwe liziwonetsa kubetcha ndi zotsatira kuchokera ku TON.

Kulemba mgwirizano wanzeru

Kuti zikhale zosavuta, ndaunikira kachidindo ka FunC; pulogalamu yowonjezera ingapezeke ndikuyika mukusaka kwa Visual Studio Code; ngati mwadzidzidzi mukufuna kuwonjezera china, ndapangitsa kuti pulogalamu yowonjezerayi ipezeke poyera. Komanso, wina adapanga pulogalamu yowonjezera yogwira ntchito ndi Fift, mutha kuyiyikanso ndikuipeza mu VSC.

Tiyeni nthawi yomweyo tipange malo osungiramo momwe timapangira zotsatira zapakatikati.

Kuti moyo wathu ukhale wosavuta, tidzalemba mgwirizano wanzeru ndikuyesa kwanuko mpaka itakonzeka. Pambuyo pake tidzazisindikiza mu TON.

Mgwirizano wanzeru uli ndi njira ziwiri zakunja zomwe zingapezeke. Choyamba, recv_external() ntchito iyi imachitidwa pamene pempho la mgwirizano limachokera kudziko lakunja, ndiko kuti, osati kuchokera ku TON, mwachitsanzo, pamene ife tokha timapanga uthenga ndikutumiza kudzera mwa lite-client. Chachiwiri, recv_internal() apa ndi pamene, mkati mwa TON yokha, mgwirizano uliwonse umatanthawuza zathu. Muzochitika zonsezi, mutha kudutsa magawo ku ntchitoyi.

Tiyeni tiyambe ndi chitsanzo chosavuta chomwe chidzagwira ntchito ngati chisindikizidwa, koma palibe katundu wogwira ntchito mmenemo.

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

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

Apa tiyenera kufotokoza chomwe chiri slice. Zonse zomwe zasungidwa mu TON Blockchain ndizosonkhanitsa TVM cell kapena mophweka cell, mu cell yotere mutha kusunga mpaka ma 1023 bits a data ndi mpaka 4 maulalo kuma cell ena.

TVM cell slice kapena slice iyi ndi gawo la zomwe zilipo cell amagwiritsidwa ntchito kulongosola, zidzamveka mtsogolo. Chinthu chachikulu kwa ife ndi chakuti tikhoza kusamutsa slice ndipo kutengera mtundu wa uthenga, sungani deta mu recv_external() kapena recv_internal().

impure - mawu osakira omwe akuwonetsa kuti ntchitoyi imasintha chidziwitso chamgwirizano wanzeru.

Tiyeni tisunge khodi ya mgwirizano lottery-code.fc ndi kusonkhanitsa.

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

Tanthauzo la mbendera likhoza kuwonedwa pogwiritsa ntchito lamulo

~/TON/build/crypto/func -help

Tapanga Fift assembler code in 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

Ikhoza kukhazikitsidwa kwanuko, chifukwa cha izi tidzakonzekera chilengedwe.

Dziwani kuti mzere woyamba ukugwirizana Asm.fif, iyi ndi code yolembedwa mu Fift for the Fift assembler.

Popeza tikufuna kuthamanga ndikuyesa mgwirizano wanzeru kwanuko, tipanga fayilo lottery-test-suite.fif ndikukopera kachidindo kophatikizidwa pamenepo, ndikulowetsa mzere womaliza momwemo, womwe umalemba kachidindo kanzeru kokhazikika codekenako kusamutsa ku makina enieni:

"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

Pakadali pano zikuwoneka zomveka, tsopano tiyeni tiwonjezere ku fayilo yomweyi yomwe tidzagwiritse ntchito poyambitsa 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 timalemba nkhani, ndiye kuti, deta yomwe TVM (kapena network network) idzayambitsidwira. Ngakhale pa mpikisano, mmodzi wa Madivelopa anasonyeza mmene kulenga c7 ndipo ndidakopera. M’nkhani ino tingafunike kusintha rand_seed popeza kubadwa kwa nambala yosasinthika kumadalira ndipo ngati sikunasinthidwe, nambala yomweyi idzabwezeredwa nthawi iliyonse.

recv_internal ΠΈ recv_external zokhazikika zokhala ndi ma values ​​​​0 ndi -1 adzakhala ndi udindo woyitanitsa ntchito zofananira mumgwirizano wanzeru.

Tsopano ndife okonzeka kupanga mayeso oyamba a contract yathu yopanda kanthu yanzeru. Kuti zimveke bwino, pakadali pano tiwonjezera mayeso onse pafayilo yomweyo lottery-test-suite.fif.

Tiyeni tipange zosinthika storage ndi kulembamo chopanda kanthu cell, uku kudzakhala kosungirako bwino mgwirizano.

message Uwu ndi uthenga womwe tidzaupereka kwa odziwa bwino kuchokera kunja. Tipanganso kukhala opanda kanthu pakadali pano.

variable storage 
<b b> storage ! 

variable message 
<b b> message ! 

Pambuyo pokonzekera zokhazikika ndi zosinthika, timayambitsa TVM pogwiritsa ntchito lamulo runvmctx ndipo perekani magawo omwe adapangidwa kuti alowe.

message @ 
recv_external 
code 
storage @ 
c7 
runvmctx 

Pamapeto pake tidzapambana monga choncho intermediate kodi Fift.

Tsopano titha kuyendetsa nambala yomwe yatuluka.

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

Pulogalamuyi iyenera kuthamanga popanda zolakwika ndipo pazotsatira tidzawona chipika chotsatira:

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

Zabwino, talemba mtundu woyamba wantchito wanzeru.

Tsopano tiyenera kuwonjezera magwiridwe antchito. Choyamba tiyeni tithane ndi mauthenga omwe amachokera kudziko lakunja kupita recv_external()

Wopangayo yekha amasankha mtundu wa uthenga womwe mgwirizano ungavomereze.

Koma kawirikawiri

  • choyamba, tikufuna kuteteza mgwirizano wathu kudziko lakunja ndikupangitsa kuti mwini wake yekha wa mgwirizano atumize mauthenga akunja kwa izo.
  • kachiwiri, tikatumiza uthenga wovomerezeka ku TON, tikufuna kuti izi zichitike chimodzimodzi kamodzi ndipo tikatumiza uthenga womwewo kachiwiri, mgwirizano wanzeru umakana.

Kotero pafupifupi mgwirizano uliwonse umathetsa mavuto awiriwa, popeza mgwirizano wathu umavomereza mauthenga akunja, tiyenera kusamaliranso zimenezo.

Tizichita motsatira dongosolo. Choyamba, tiyeni tithetse vutoli ndikubwerezabwereza; ngati mgwirizano walandira kale uthenga wotere ndikuwukonza, sudzaupanga kachiwiri. Ndiyeno tidzathetsa vutoli kotero kuti gulu lina la anthu likhoza kutumiza mauthenga ku mgwirizano wanzeru.

Pali njira zosiyanasiyana zothetsera vuto ndi mauthenga obwereza. Umu ndi momwe tichitire. Mu mgwirizano wanzeru, timayambitsa zowerengera za mauthenga omwe alandilidwa ndi mtengo woyambira 0. Mu uthenga uliwonse ku mgwirizano wanzeru, tidzawonjezera mtengo waposachedwa. Ngati mtengo wowerengera mu uthengawo sukugwirizana ndi mtengo wa mgwirizano wanzeru, ndiye kuti sitikukonza; ngati zitero, ndiye kuti timazikonza ndikuwonjezera kauntala mu mgwirizano wanzeru ndi 1.

Tiyeni tibwerere ku lottery-test-suite.fif ndi kuwonjezera mayeso achiwiri kwa izo. Ngati titumiza nambala yolakwika, nambalayo iyenera kuchitapo kanthu. Mwachitsanzo, lolani deta ya mgwirizano isunge 166, ndipo tidzatumiza 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"

Tiyeni tiyambitse.

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

Ndipo tiwona kuti mayesowo akuchitidwa ndi cholakwika.

[ 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

Pakadali pano lottery-test-suite.fif ziyenera kuwoneka ngati kugwirizana.

Tsopano tiyeni tiwonjeze malingaliro otsutsa ku mgwirizano wanzeru mu 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 bodza meseji yomwe timatumiza.

Chinthu choyamba chimene timachita ndikuwona ngati uthengawo uli ndi deta, ngati sichoncho, ndiye kuti timatuluka.

Kenako timagawa uthengawo. in_msg~load_uint(32) imanyamula nambala 165, 32-bit unsigned int kuchokera ku uthenga woperekedwa.

Kenako timayika ma bits 32 kuchokera kusungidwe lanzeru la contract. Timayang'ana kuti nambala yonyamulidwa ikugwirizana ndi yomwe yadutsa; ngati sichoncho, timasiya. Kwa ife, popeza tikudutsa osasewera, chosiyana chiyenera kutayidwa.

Tsopano tiyeni tipange.

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

Koperani kachidindo kotsatira ku lottery-test-suite.fif, osayiwala kusintha mzere womaliza.

Tikuwona kuti mayesowo akudutsa:

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

Pomwe pano Mutha kuwona kudzipereka kofananira ndi zotsatira zapano.

Zindikirani kuti ndizosavutikira kukopera nthawi zonse khodi yopangidwa ndi mgwirizano wanzeru mufayilo yokhala ndi mayeso, chifukwa chake tidzalemba script yomwe itilembera khodiyo mokhazikika kwa ife, ndipo tidzangolumikiza nambala yomwe yapangidwa ku mayeso athu pogwiritsa ntchito. "include".

Pangani fayilo mufoda ya polojekiti build.sh ndi zomwe zili pansipa.

#!/bin/bash

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

Tizipanga kuti zitheke.

chmod +x ./build.sh

Tsopano, ingoyendetsani script yathu kuti mupange mgwirizano. Koma kuwonjezera pa izi, tiyenera kulemba izo mu nthawi zonse code. Chifukwa chake tipanga fayilo yatsopano lotter-compiled-for-test.fif, zomwe tidzaziphatikiza mu fayilo lottery-test-suite.fif.

Tiyeni tiwonjeze skirpt code ku sh, yomwe imangobwereza fayilo yomwe idapangidwa lotter-compiled-for-test.fif ndi kusintha mzere wotsiriza mmenemo.

# 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

Tsopano, kuti muwone, tiyeni tiyendetse zolemba zomwe zatuluka ndipo fayilo idzapangidwa lottery-compiled-for-test.fif, zomwe tidzaziphatikiza m'nkhani yathu lottery-test-suite.fif

Π’ lottery-test-suite.fif Chotsani nambala ya mgwirizano ndikuwonjezera mzere "lottery-compiled-for-test.fif" include.

Timayesa mayeso kuti tiwone ngati apambana.

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

Zabwino, tsopano kuti tiyambe kuyesa kuyesa, tiyeni tipange fayilo test.sh, yomwe idzayambe kuchita build.sh, ndiyeno yendetsani mayesowo.

touch test.sh
chmod +x test.sh

Timalemba mkati

./build.sh 

echo "nCompilation completedn"

export FIFTPATH=~/TON/ton/crypto/fift/lib
~/TON/build/crypto/fift -s lottery-test-suite.fif

Tiyeni tichite zomwezo test.sh ndikuyendetsa kuti muwonetsetse kuti mayesowo akugwira ntchito.

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

Timayang'ana kuti mgwirizano wapangidwa ndipo mayesero akuchitika.

Zabwino, tsopano poyambira test.sh Mayeserowa adzapangidwa ndikuyendetsedwa nthawi yomweyo. Nawu ulalo wopita perekani.

Chabwino, tisanapitilize, tiyeni tichitenso chinthu chimodzi chothandizira.

Tiyeni tipange chikwatu build komwe tidzasunga mgwirizano womwe wakopedwa ndi cholozera chake cholembedwa mokhazikika lottery-compiled.fif, lottery-compiled-for-test.fif. Tiyeni tipangenso chikwatu test Kodi fayilo yoyeserera idzasungidwa kuti? lottery-test-suite.fif ndi mafayilo ena othandizira. Lumikizani ku zosintha zoyenera.

Tiyeni tipitilize kupanga contract yanzeru.

Kenako payenera kukhala mayeso omwe amayang'ana kuti uthengawo walandilidwa ndipo kauntala imasinthidwa m'sitolo tikatumiza nambala yolondola. Koma tidzachita zimenezo pambuyo pake.

Tsopano tiyeni tiganizire za dongosolo la deta ndi zomwe deta iyenera kusungidwa mu mgwirizano wanzeru.

Ndifotokoza zonse zomwe timasunga.

`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` пСрСмСнная Ρ‚ΠΈΠΏΠ° ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ, Ρ…Ρ€Π°Π½ΠΈΡ‚ послСдниС Π΄Π²Π°Π΄Ρ†Π°Ρ‚ΡŒ ставок. 

Kenako muyenera kulemba ntchito ziwiri. Tiyeni tiyitane woyamba pack_state(), yomwe idzanyamula deta kuti isungidwe motsatira mu yosungirako mgwirizano wanzeru. Tiyeni tiitane wachiwiri unpack_state() adzawerenga ndi kubwezera deta kuchokera ku yosungirako.

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

Timawonjezera ntchito ziwirizi kumayambiriro kwa mgwirizano wanzeru. Zidzatheka monga choncho zotsatira zapakatikati.

Kuti musunge deta muyenera kuyimbira ntchito yomangidwa set_data() ndipo idzalemba deta kuchokera pack_state() m'malo osungiramo ma contract anzeru.

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

Tsopano popeza tili ndi ntchito zabwino zolembera ndikuwerenga deta, titha kupitilira.

Tiyenera kuwonetsetsa kuti uthenga womwe umachokera kunja wasainidwa ndi eni ake a mgwirizano (kapena wogwiritsa ntchito wina yemwe ali ndi kiyi yachinsinsi).

Tikasindikiza mgwirizano wanzeru, titha kuyiyambitsa ndi zomwe tikufuna posungira, zomwe zidzasungidwa kuti tidzagwiritse ntchito mtsogolo. Tilemba makiyi apagulu pamenepo kuti titsimikizire kuti uthenga womwe ukubwera udasainidwa ndi kiyi yachinsinsi yofananira.

Tisanapitilize, tiyeni tipange kiyi yachinsinsi ndikulembera test/keys/owner.pk. Kuti tichite izi, tiyeni tiyambitse Fift munjira yolumikizirana ndikuchita malamulo anayi.

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

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

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

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

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

Tiyeni tipange chikwatu keys mkati mwa chikwatu test ndipo lembani kiyi yachinsinsi pamenepo.

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

Timawona fayilo mufoda yamakono owner.pk.

Timachotsa makiyi a anthu onse pamtengowo ndipo pakafunika, titha kuutenga kuchokera kwachinsinsi.

Tsopano tiyenera kulemba chitsimikiziro cha siginecha. Tiyeni tiyambe ndi mayeso. Choyamba timawerenga kiyi yachinsinsi kuchokera pafayilo pogwiritsa ntchito ntchitoyi file>B ndi kulemba ku variable owner_private_key, kenako kugwiritsa ntchito priv>pub sinthani kiyi yachinsinsi kukhala kiyi yapagulu ndikulemba zotsatira zake 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 !

Tidzafuna makiyi onse awiri.

Timayamba kusungirako kontrakiti wanzeru ndi data yosasinthika motsatizana ndi momwe zimagwirira ntchito pack_state()ndi kulemba mu variable 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 !

Kenako, tidzalemba uthenga wosainidwa, womwe umangokhala ndi siginecha ndi mtengo wotsutsa.

Choyamba, timapanga deta yomwe tikufuna kutumiza, kenako timasaina ndi kiyi yachinsinsi ndipo pamapeto pake timapanga uthenga wosainidwa.

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 !  

Zotsatira zake, uthenga womwe tidzatumiza ku mgwirizano wanzeru umalembedwa mosintha message_to_send, za ntchito hashu, ed25519_sign_uint mukhoza kuwerenga mu Fift zolembedwa.

Ndipo kuti tiyendetse mayesowo timayitananso.

message_to_send @ 
recv_external 
code 
storage @
c7
runvmctx

Ngati chonchi Fayilo yokhala ndi mayeso iyenera kuwoneka chonchi pakadali pano.

Tiyeni tiyendetse mayesowo ndipo alephera, ndiye tisintha mgwirizano wanzeru kuti ulandire mauthenga amtunduwu ndikutsimikizira siginecha.

Choyamba, timawerengera ma bits 512 a siginecha kuchokera ku uthenga ndikuulemba ku kusintha, kenako timawerengera ma bits 32 amitundu yosiyanasiyana.

Popeza tili ndi ntchito yowerengera deta kuchokera ku yosungirako mgwirizano wanzeru, tidzagwiritsa ntchito.

Chotsatira ndikuyang'ana kauntala yomwe yasamutsidwa ndi yosungirako ndikuyang'ana siginecha. Ngati china chake sichikufanana, ndiye kuti timapanga chosiyana ndi code yoyenera.

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

Kudzipereka koyenera pomwe pano.

Tiyeni tiyendetse mayesowo ndikuwona kuti mayeso achiwiri akulephera. Pazifukwa ziwiri, mulibe ma bits okwanira muuthenga ndipo mulibe ma bits okwanira posungira, chifukwa chake codeyo imasweka poyimitsa. Tiyenera kuwonjezera siginecha ku uthenga womwe tikutumiza ndikukopera zosungira kuchokera ku mayeso omaliza.

Pachiyeso chachiwiri, tidzawonjezera siginecha ya uthenga ndikusintha kusungirako kwanzeru mgwirizano. Ngati chonchi fayilo yokhala ndi mayeso ikuwoneka ngati pakadali pano.

Tiyeni tilembe mayeso achinayi, momwe tidzatumizira uthenga wosainidwa ndi kiyi yachinsinsi ya munthu wina. Tiyeni tipange kiyi ina yachinsinsi ndikuisunga ku fayilo not-owner.pk. Tisaina uthengawu ndi kiyi yachinsinsiyi. Tiyeni tiyendetse mayesowo ndikuwonetsetsa kuti mayeso onse apambana. Kudzipereka pa nthawi ino.

Tsopano titha kupitiliza kukhazikitsa malingaliro anzeru a contract.
Π’ recv_external() tidzavomereza mitundu iwiri ya mauthenga.

Popeza kontrakitala yathu idzasonkhanitsa zotayika za osewera, ndalamazi ziyenera kutumizidwa kwa amene adapanga lottery. Adilesi yachikwama ya wopanga lottery imalembedwa mu yosungirako pamene mgwirizano umapangidwa.

Zikatero, tifunika kutha kusintha adilesi yomwe timatumiza magalamu a otayika. Tiyeneranso kutumiza magalamu kuchokera ku lotale kupita ku adilesi ya eni ake.

Tiyeni tiyambe ndi yoyamba. Tiyeni tilembe kaye mayeso omwe angayang'ane kuti pambuyo potumiza uthengawo, mgwirizano wanzeru unasunga adilesi yatsopano posungira. Chonde dziwani kuti mu uthengawo, kuwonjezera pa kauntala ndi adilesi yatsopano, timatumizanso action Nambala ya 7-bit yosakhala yoipa, kutengera, tidzasankha momwe tingagwiritsire ntchito uthenga mu mgwirizano wanzeru.

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

Mumayeso mutha kuwona momwe kusungirako kwa smartcontract kumasinthidwira storage mu Fift. Deserialization of variables ikufotokozedwa mu Fift zolemba.

Ulalo wodzipereka ndi kuwonjezera mkate.

Tiyeni tiyendetse mayesowo ndikuwonetsetsa kuti zalephera. Tsopano tiyeni tiwonjezere malingaliro kuti tisinthe adilesi ya mwini lottery.

Mu contract yanzeru timapitiliza kugawa message, werengani mu action. Tikumbukenso kuti tidzakhala ndi awiri action: sinthani adilesi ndikutumiza magalamu.

Kenaka timawerenga adiresi yatsopano ya mwiniwake wa mgwirizano ndikuisunga posungira.
Timayesa mayeso ndikuwona kuti mayeso achitatu akulephera. Zimawonongeka chifukwa chakuti mgwirizanowu tsopano umaphatikizapo ma bits 7 kuchokera ku uthenga, omwe akusowa muyeso. Onjezani imodzi yomwe palibe ku uthengawo action. Tiyeni tiyendetse mayeso ndikuwona kuti zonse zadutsa. apa kudzipereka kusintha. Zabwino.

Tsopano tiyeni tilembe malingaliro otumizira nambala yodziwika ya magalamu ku adilesi yosungidwa kale.

Choyamba, tiyeni tilembe mayeso. Tidzalemba mayeso awiri, imodzi pamene palibe malire okwanira, yachiwiri pamene chirichonse chiyenera kupambana bwino. Mayesero akhoza kuwonedwa mu msonkhano uwu.

Tsopano tiyeni tiwonjezere khodi. Choyamba, tiyeni tilembe njira ziwiri zothandizira. Njira yoyamba yopezera ndikupeza ndalama zomwe zilipo panopa za mgwirizano wanzeru.

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

Ndipo yachiwiri ndi yotumiza magalamu ku mgwirizano wina wanzeru. Ndinakopera njira iyi kuchokera ku mgwirizano wina wanzeru.

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

Tiyeni tiwonjezere njira ziwiri izi ku mgwirizano wanzeru ndikulemba zomveka. Choyamba, timawerengera kuchuluka kwa magalamu a uthengawo. Kenako ife fufuzani bwino, ngati sikokwanira ife kuponya kupatula. Ngati zonse zili bwino, ndiye kuti timatumiza magalamu ku adilesi yosungidwa ndikusintha kauntala.

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

Ngati chonchi zikuwoneka ngati mgwirizano wanzeru pakadali pano. Tiyeni tiyendetse mayesowo ndikuwonetsetsa kuti apambana.

Mwa njira, komishoni imachotsedwa ku mgwirizano wanzeru nthawi iliyonse pa uthenga wokonzedwa. Kuti mauthenga anzeru a mgwirizano akwaniritse pempholi, mutatha kufufuza zofunikira muyenera kuyimba accept_message().

Tsopano tiyeni tipite ku mauthenga amkati. M'malo mwake, tidzangolandira ma gramu ndikubweza ndalama zowirikiza kawiri kwa wosewera mpira ngati wapambana ndipo gawo lachitatu kwa mwiniwake ngati waluza.

Choyamba, tiyeni tilembe mayeso osavuta. Kuti tichite izi, tifunika adilesi yoyeserera ya mgwirizano wanzeru womwe tikuyenera kutumiza magalamu ku mgwirizano wanzeru.

Adilesi yamgwirizano wanzeru imakhala ndi manambala awiri, nambala ya 32-bit yomwe imayang'anira gulu lantchito ndi 256-bit non-negative integer integer integer chamugawo chantchitoyi. Mwachitsanzo, -1 ndi 12345, iyi ndi adilesi yomwe tidzasunga ku fayilo.

Ndakopera ntchito yosungira adilesiyo 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

Tiyeni tiwone momwe ntchitoyi imagwirira ntchito, izi zipereka kumvetsetsa momwe Fift imagwirira ntchito. Yambitsani Fift mumalowedwe ochezera.

~/TON/build/crypto/fift -i 

Choyamba timakankhira -1, 12345 ndi dzina la fayilo yamtsogolo "sender.addr" pamndandanda:

-1 12345 "sender.addr" 

Chotsatira ndikuchita ntchitoyi -rot, yomwe imasuntha stack m'njira yoti pamwamba pa stackyo pali nambala yapadera ya mgwirizano wanzeru:

"sender.addr" -1 12345

256 u>B amasintha 256-bit non-negative integer kukhala ma byte.

"sender.addr" -1 BYTES:0000000000000000000000000000000000000000000000000000000000003039

swap amasintha zinthu ziwiri zapamwamba za stack.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 -1

32 i>B amasintha 32-bit integer kukhala ma byte.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 BYTES:FFFFFFFF

B+ imagwirizanitsa magawo awiri a ma byte.

 "sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF

Ndiponso swap.

BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF "sender.addr" 

Ndipo potsiriza ma byte amalembedwa ku fayilo B>file. Zitatha izi mulu wathu mulibe. Timasiya Fift. Fayilo yapangidwa mufoda yamakono sender.addr. Tiyeni tisunthire fayilo ku foda yomwe idapangidwa test/addresses/.

Tiyeni tilembe mayeso osavuta omwe angatumize magalamu ku mgwirizano wanzeru. Nayi kudzipereka.

Tsopano tiyeni tiwone malingaliro a lottery.

Chinthu choyamba chimene timachita ndi kufufuza uthengawo bounced kapena ayi ngati bounced, ndiye timanyalanyaza. bounced zikutanthauza kuti mgwirizano udzabweza magalamu ngati zolakwika zina zimachitika. Sitidzabwezera magalamu ngati cholakwika chichitika mwadzidzidzi.

Timayang'ana, ngati ndalamazo zili zosakwana theka la gramu, ndiye kuti timangovomereza uthengawo ndikunyalanyaza.

Kenaka, timayika adiresi ya mgwirizano wanzeru kumene uthenga unachokera.

Timawerenga zosungirako ndikuchotsa mabetcha akale m'mbiri ngati pali oposa makumi awiri a iwo. Kuti zikhale zosavuta, ndinalemba ntchito zina zitatu pack_order(), unpack_order(), remove_old_orders().

Kenako, timayang'ana ngati ndalamazo sizikukwanira kulipira, ndiye tikuwona kuti uku si kubetcha, koma kubwezeretsanso ndikusunga kubwezeretsedwanso mu. orders.

Ndiye potsiriza akamanena za mgwirizano wanzeru.

Choyamba, ngati wosewera mpira ataya, timasunga m'mbiri ya kubetcha ndipo ngati ndalamazo ndi zoposa 3 magalamu, timatumiza 1/3 kwa mwiniwake wa mgwirizano wanzeru.

Ngati wosewera mpira wapambana, ndiye kuti timatumiza kuwirikiza kawiri ku adilesi ya wosewerayo ndikusunga zambiri za kubetcha m'mbiri.

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

Ndizo zonse. Kudzipereka kogwirizana.

Tsopano zonse zomwe zatsala ndi zophweka, tiyeni tipange njira zopezera kuti tipeze zambiri zokhudza momwe mgwirizanowu ulili kuchokera kudziko lakunja (kwenikweni, werengani deta kuchokera kusungirako zawo zanzeru za mgwirizano).

Tiyeni tiwonjezere kupeza njira. Tidzalemba m'munsimu momwe tingalandirire zambiri za mgwirizano wanzeru.

Ndinayiwalanso kuwonjezera kachidindo kamene kadzakonza pempho loyamba lomwe limapezeka pofalitsa mgwirizano wanzeru. Kudzipereka kogwirizana. Ndipo kupitirira kukonzedwa cholakwika potumiza 1/3 ya ndalamazo ku akaunti ya eni ake.

Chotsatira ndikusindikiza mgwirizano wanzeru. Tiyeni tipange chikwatu requests.

Ndinatenga code yofalitsa ngati maziko simple-wallet-code.fc zomwe angapezeke m'malo ovomerezeka.

Chinachake choyenera kusamala nacho. Timapanga zosungirako zanzeru ndi uthenga wolowa. Pambuyo pake, adiresi ya mgwirizano wanzeru imapangidwa, ndiko kuti, adiresi imadziwika ngakhale isanayambe kusindikizidwa ku TON. Kenako, muyenera kutumiza magalamu angapo ku adilesi iyi, ndipo pambuyo pake muyenera kutumiza fayilo yokhala ndi mgwirizano wanzeru palokha, popeza maukonde amatenga ntchito yosunga mgwirizano wanzeru ndi magwiridwe antchito momwemo (ovomerezeka omwe amasunga ndikuchita mwanzeru. makontrakitala). Code ikhoza kuwonedwa pano.

Kenako timapanga code yosindikiza ndikupeza lottery-query.boc smart contract file ndi adilesi.

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

Musaiwale kusunga mafayilo opangidwa: lottery-query.boc, lottery.addr, lottery.pk.

Mwa zina, tiwona adilesi ya mgwirizano wanzeru muzolemba zakupha.

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

Kungosangalala, tiyeni tipemphe ku TON

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

Ndipo tiwona kuti akaunti yomwe ili ndi adilesiyi ilibe kanthu.

account state is empty

Timatumiza ku adilesi 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd 2 Gram ndipo patatha masekondi angapo timachita lamulo lomwelo. Kutumiza magalamu ndimagwiritsa ntchito chikwama cha boma, ndipo mukhoza kufunsa munthu wina kuchokera pa macheza kuti ayese magalamu, zomwe ndidzakamba kumapeto kwa nkhaniyi.

> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Amawoneka ngati wosadziwika (state:account_uninit) mgwirizano wanzeru wokhala ndi adilesi yomweyi komanso ndalama zokwana 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

Tsopano tiyeni tifalitse mgwirizano wanzeru. Tiyeni tiyambitse lite-client ndikuchita.

> 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 

Tiyeni tiwone ngati mgwirizano wasindikizidwa.

> last
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Mwa zina zomwe timapeza.

  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

Ife tikuziwona izo account_active.

Kusintha kogwirizana ndi kusintha pomwe pano.

Tsopano tiyeni tipange zopempha kuti tigwirizane ndi mgwirizano wanzeru.

Zowonjezereka, tidzasiya yoyamba kuti tisinthe adilesi ngati ntchito yodziyimira pawokha, ndipo tidzachita yachiwiri kutumiza magalamu ku adilesi ya eni ake. M'malo mwake, tidzafunika kuchita zomwezo monga poyesa kutumiza magalamu.

Uwu ndi uthenga womwe tidzatumiza ku contract yanzeru, komwe msg_seqno 165, action 2 ndi 9.5 magalamu potumiza.

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

Osayiwala kusaina uthengawo ndi kiyi yanu yachinsinsi lottery.pk, yomwe idapangidwa kale popanga mgwirizano wanzeru. Nayi kudzipereka kofananira.

Kulandira zambiri kuchokera ku mgwirizano wanzeru pogwiritsa ntchito njira zopezera

Tsopano tiyeni tione mmene kuthamanga anzeru mgwirizano kupeza njira.

Yambitsani lite-client ndikuyendetsa kupeza njira zomwe tidalemba.

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

Π’ result ili ndi mtengo womwe ntchitoyi imabwerera balance() kuchokera ku mgwirizano wathu wanzeru.
Tidzachitanso chimodzimodzi ndi njira zina zingapo.

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

Tiyeni tifunse mbiri yanu ya kubetcha.

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

Tigwiritsa ntchito kasitomala ndikupeza njira zowonetsera zambiri zamakampani anzeru patsamba.

Kuwonetsa chidziwitso chamgwirizano wanzeru patsamba lawebusayiti

Ndinalemba tsamba losavuta ku Python kuti ndiwonetse deta kuchokera ku mgwirizano wanzeru m'njira yabwino. Pano sindikhalapo mwatsatanetsatane ndipo ndidzafalitsa malowa mu kudzipereka kumodzi.

Zopempha ku TON zimapangidwa kuchokera Python ndi thandizo lite-client. Kuti zitheke, tsambalo limayikidwa mu Docker ndikusindikizidwa pa Google Cloud. Lumikizani.

Kuyesera

Tsopano tiyeni tiyese kutumiza magalamu kumeneko kuti abwereze kuchokera chikwama. Timatumiza 40 magalamu. Ndipo tiyeni tichite mabetcha angapo kuti amveke bwino. Tikuwona kuti tsambalo likuwonetsa mbiri ya kubetcha, kuchuluka komwe kwapambana ndi zina zambiri zothandiza.

Tikuwonakuti tinapambana yoyamba, tinataya yachiwiri.

Pambuyo pake

Nkhaniyi idakhala yayitali kwambiri kuposa momwe ndimayembekezera, mwina ingakhale yayifupi, kapena mwina kwa munthu amene sadziwa chilichonse chokhudza TON ndipo akufuna kulemba ndikusindikiza mgwirizano wanzeru wosavuta komanso wokhoza kuyanjana nawo. izo. Mwina zinthu zina zikanatha kufotokozedwa mosavuta.

Mwinamwake mbali zina za kukhazikitsidwa zikanachitidwa bwino kwambiri ndi mokongola, koma zikanatenga nthawi yochuluka kwambiri kukonzekera nkhaniyo. N'zothekanso kuti ndinalakwitsa kwinakwake kapena sindinamvetse chinachake, kotero ngati mukuchita chinachake chachikulu, muyenera kudalira zolemba zovomerezeka kapena malo ovomerezeka ndi TON code.

Tiyenera kukumbukira kuti popeza TON mwiniwakeyo akadali mu gawo logwira ntchito lachitukuko, kusintha kungachitike kuti kuthyole njira iliyonse m'nkhaniyi (zomwe zinachitika pamene ndikulemba, zakonzedwa kale), koma njira yowonjezereka ndiyo. zokayikitsa kusintha.

Sindilankhula za tsogolo la TON. Mwina nsanja idzakhala yayikulu ndipo tiyenera kuthera nthawi yophunzira ndikudzaza kagawo ndi zinthu zathu tsopano.

Palinso Libra yochokera ku Facebook, yomwe ili ndi ogwiritsa ntchito ambiri kuposa TON. Sindikudziwa chilichonse chokhudza Libra, kutengera gululi pali zochitika zambiri kumeneko kuposa gulu la TON. Ngakhale otukula ndi gulu la TON ali ngati mobisa, zomwe ndizozizira.

powatsimikizira

  1. Zolemba zovomerezeka za TON: https://test.ton.org
  2. Malo ovomerezeka a TON: https://github.com/ton-blockchain/ton
  3. Chikwama chovomerezeka pamapulatifomu osiyanasiyana: https://wallet.ton.org
  4. Posungira makontrakitala anzeru kuchokera m'nkhaniyi: https://github.com/raiym/astonished
  5. Lumikizani ku webusayiti ya smart contract: https://ton-lottery.appspot.com
  6. Malo owonjezera a Visual Studio Code for FunC: https://github.com/raiym/func-visual-studio-plugin
  7. Chezani za TON mu Telegraph, zomwe zidathandizira kwambiri kuzizindikira pa gawo loyambirira. Ndikuganiza kuti sikulakwa ngati ndikunena kuti aliyense amene analemba chinachake kwa TON alipo. Mukhozanso kupempha mayeso magalamu kumeneko. https://t.me/tondev_ru
  8. Kucheza kwina kokhudza TON komwe ndidapezako zambiri zothandiza: https://t.me/TONgramDev
  9. Gawo loyamba lampikisano: https://contest.com/blockchain
  10. Gawo lachiwiri la mpikisano: https://contest.com/blockchain-2

Source: www.habr.com

Kuwonjezera ndemanga