Ku saabsan sida loo qoro oo loo daabaco qandaraas caqli gal ah Shabakadda Furan ee Telegram (TON)

Ku saabsan sida loo qoro oo loo daabaco qandaraaska casriga ah ee TON

Muxuu ku saabsan yahay maqaalkani?

Maqaalka waxaan kaga hadli doonaa sidii aan uga qayb galay tartankii blockchain ee Telegram kii ugu horeeyay, oo aanan wax abaalmarin ah qaadan, oo aan go'aansaday in aan waayo-aragnimadayda ku qoro maqaal si aysan ugu quusin ilow iyo, laga yaabee, inaan caawiyo. qof.

Tan iyo markii aanan rabin inaan qoro koodka aan la taaban karin, laakiin inaan sameeyo wax shaqeynaya, maqaalka waxaan ku qoray qandaraas caqli-gal ah oo loogu talagalay bakhtiyaanasiibka degdegga ah iyo website-ka oo muujinaya xogta qandaraaska smart ee tooska ah ee TON iyada oo aan la isticmaalin kaydinta dhexe.

Maqaalku wuxuu faa'iido u yeelan doonaa kuwa raba inay sameeyaan qandaraaskooda ugu horreeya ee TON, laakiin ma garanayaan meesha ay ka bilaabaan.

Isticmaalka bakhtiyaanasiibka tusaale ahaan, waxaan ka bixi doonaa rakibidda deegaanka ilaa daabacaadda qandaraas caqli-gal ah, la falgalka, iyo qorista bogga internetka ee helitaanka iyo daabacaadda xogta.

Ku saabsan ka qaybgalka tartanka

Oktoobartii hore, Telegram waxa uu ku dhawaaqay tartan blockchain ah oo leh luuqado cusub Fift ΠΈ FunC. Waxay ahayd lagama maarmaan in la doorto in la qoro mid ka mid ah shanta qandaraas ee la soo jeediyay. Waxaan u maleeyay inay fiicnaan lahayd inaan sameeyo wax ka duwan, inaan barto luuqad oo aan sameeyo, xitaa haddaanan wax kale qorin mustaqbalka. Intaa waxaa dheer, mowduuca si joogto ah ayuu u saaran yahay dibnaha.

Waxaa habboon in la sheego in aanan khibrad u lahayn horumarinta qandaraasyada caqliga leh.

Waxaan qorsheeyay inaan ka qaybqaato ilaa dhamaadka ilaa aan kari karo oo aan qoro maqaal dib u eegis ah, laakiin waxaan ku guuldareystay isla markiiba kii ugu horeeyay. I wuxuu qoray boorso oo leh saxiixyo badan FunC guud ahaanna way shaqeysay. Waxaan u qaatay sal heshiis smart on Solidity.

Waqtigaas, waxaan u maleeyay in tani ay xaqiiqdii ku filnaatay qaadashada ugu yaraan meel abaalmarin ah. Natiijo ahaan, qiyaastii 40 ka mid ah 60 ka mid ah ka qaybgalayaasha waxay noqdeen kuwo ku guuleystay abaal-marin oo anigu kama aan mid ahayn. Guud ahaan, arrintan waxba kama jiraan, laakiin hal shay ayaa i dhibay. Markii lagu dhawaaqay natiijada, dib u eegistii imtixaankii qandaraaska aan la samayn, waxaan weydiiyay ka qaybgalayaasha chat haddii ay jirto cid kale oo aan haysan, ma jirin.

Sida muuqata aniga oo u fiirsada fariimahayga, laba maalmood ka dib garsoorayaashu waxay daabaceen faallo ilaa hadda ma fahmin inay si lama filaan ah u seegeen qandaraaskayga caqli-gal ah inta lagu jiro xukunka ama si fudud u maleeyay inay aad u xun tahay oo aysan u baahnayn faallo. Su'aal ayaan ku weydiiyay bogga, laakiin maan helin jawaab. In kasta oo aanay ahayn wax sir ah cidda xukuntay, haddana waxaan u arkay inaan loo baahnayn in la qoro farriimaha gaarka ah.

Waqti badan ayaa lagu qaatay fahamka, sidaas darteed waxaa la go'aamiyay in maqaal la qoro. Maaddaama aysan jirin macluumaad badan oo weli, maqaalkani wuxuu kaa caawinayaa inaad waqti badbaadiso qof kasta oo daneynaya.

Fikradda qandaraasyada smart ee TON

Kahor intaadan wax qorin, waxaad u baahan tahay inaad ogaatid dhinaca aad u wajaheyso arrintan. Sidaa darteed, hadda waxaan kuu sheegi doonaa qaybaha nidaamku ka kooban yahay. Si sax ah, waa maxay qaybaha aad u baahan tahay inaad ogaato si aad u qorto ugu yaraan nooc ka mid ah qandaraas shaqo.

Waxaan diiradda saari doonaa qorista qandaraas caqli-gal ah iyo la shaqeynta TON Virtual Machine (TVM), Fift ΠΈ FunC, markaa maqaalku wuxuu u eg yahay sharaxaadda horumarinta barnaamijka caadiga ah. Ma dagi doono sida madal lafteedu u shaqeyso halkan.

Guud ahaan sida ay u shaqeyso TVM iyo luqadda Fift waxaa jira dukumentiyo rasmi ah oo wanaagsan. Intii aan tartanka ka qaybqaadanayey iyo hadda oo aan qorayo qandaraaska hadda jira, marar badan ayaan u soo jeestay iyada.

Luuqada ugu weyn ee qandaraasyada caqliga leh lagu qoro waa FunC. Ma jiraan wax dukumeenti ah hadda, markaa si aad wax u qorto waxaad u baahan tahay inaad barato tusaalooyinka qandaraasyada smart ee kaydka rasmiga ah iyo hirgelinta luqadda lafteeda, oo lagu daro waxaad eegi kartaa tusaalooyinka qandaraasyada smart ee labadii hore. tartamada. Xiriirinta dhamaadka maqaalka.

Aynu nidhaahno waxaan hore ugu qornay qandaraas caqli-gal ah FunC, ka dib waxaan ku ururin code galay Fift assembler.

Qandaraaska casriga ah ee la soo ururiyey ayaa weli ah in la daabaco. Si aad tan u samayso waxaad u baahan tahay inaad ku qorto hawl Fift, kaas oo qaadan doona koodhka qandaraaska ee smart iyo qaar ka mid ah xuduudaha kale sida gelinta, iyo soo saarista waxay noqon doontaa fayl leh kordhinta .boc (taas oo macnaheedu yahay "bacda unugyada"), iyo, iyadoo ku xiran sida aan u qorno, furaha gaarka ah iyo ciwaanka, kaas oo la soo saaray iyada oo ku saleysan code qandaraaska smart. Waxaad horeba u diri kartaa garaam ciwaanka qandaraas caqli gal ah oo aan wali la daabicin.

Si loo daabaco qandaraas caqli gal ah TON ayaa heshay .boc faylka wuxuu u baahan doonaa in loo diro blockchain iyadoo la isticmaalayo macmiil iftiin ah (wax badan oo ku saabsan kuwan hoose). Laakiin ka hor intaanad daabicin, waxaad u baahan tahay inaad garaamyada u wareejiso cinwaanka la soo saaray, haddii kale qandaraaska caqliga leh lama daabici doono. Daabacaada ka dib, waxaad la macaamili kartaa qandaraaska caqliga leh adigoo u soo diraya farriimaha dibadda (tusaale ahaan, adoo isticmaalaya macmiil khafiif ah) ama gudaha (tusaale ahaan, hal qandaraas oo caqli-gal ah ayaa fariin kale u soo diraya gudaha TON).

Marka aan fahamno sida koodka loo daabaco, way fududahay. Waxaan si aad ah u ognahay waxa aan rabno in aan qorno iyo sida barnaamijkeenu u shaqayn doono. Iyo inta aan qoreyno, waxaan raadineynaa sida tan horeyba loogu hirgeliyey qandaraasyada casriga ah ee jira, ama waxaan eegnaa xeerka fulinta Fift ΠΈ FunC gudaha kaydka rasmiga ah, ama eeg dukumentiyada rasmiga ah.

Inta badan waxaan ka raadiyay ereyo muhiim ah oo ku jiray chatka Telegram-ka oo ay isugu yimaadeen dhamaan ka qeyb galayaasha tartanka iyo shaqaalaha Telegram-ka, waxaana dhacday in intii uu tartanku socday uu qof walba uu halkaas isugu yimid oo uu bilaabay in uu ka doodo Fift iyo FunC. Isku xirka dhamaadka maqaalka.

Waa markii laga guuri lahaa aragtida loona guuri lahaa ku-dhaqanka.

U diyaarinta deegaanka si loola shaqeeyo TON

Waxaan sameeyay wax kasta oo lagu sharxi doono maqaalka MacOS oo laba jeer ku hubiyay Ubuntu 18.04 LTS nadiif ah oo ku yaal Docker.

Waxa ugu horreeya ee aad u baahan tahay inaad sameyso waa soo dejiso oo rakib lite-client kaas oo aad codsiyo ugu diri karto TON.

Tilmaamaha ku yaal website-ka rasmiga ah ayaa si faahfaahsan oo cad u qeexaya habka rakibidda oo ka tagaya faahfaahinta qaarkood. Halkan waxaan raacnaa tilmaamaha, ku rakibida ku-tiirsanaanta maqan ee jidka. Anigu ma soo ururin mashruuc kasta oo aan ka rakibay kaydka rasmiga ah ee Ubuntu (MacOS waxaan isticmaalay 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 

Marka dhammaan waxyaalaha ku tiirsanaanta la rakibo waad rakibi kartaa lite-client, Fift, FunC.

Marka hore, waxaanu xidhnay kaydka TON oo ay weheliso ku-tiirsanaanteeda. Si ku habboon, waxaan ku samayn doonaa wax kasta oo ku jira galka ~/TON.

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

Kaydka ayaa sidoo kale kaydiya fulinta Fift ΠΈ FunC.

Hadda waxaan diyaar u nahay inaan soo ururino mashruuca. Koodhka kaydka waxa lagu xidhay gal ~/TON/ton. The ~/TON samee gal build oo ku soo ururi mashruuca.

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

Maadaama aan dooneyno inaan qorno qandaraas caqli-gal ah, waxaan u baahanahay ma aha oo kaliya lite-clientLaakiin Fift с FunC, markaa aynu wax walba soo ururino. Ma ahan hannaan degdeg ah, markaa waannu sugaynaa.

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

Marka xigta, soo deji faylka qaabeynta kaas oo ka kooban xogta ku saabsan noodhka kaas oo lite-client isku xidhi doona

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

Samaynta codsiyada ugu horreeya TON

Hadda aynu bilowno lite-client.

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

Haddii dhismuhu uu guulaystey, ka dib bilaabista waxaad arki doontaa log of isku xirka macmiilka iftiinka ee noodhka.

[ 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)
...

Waxaad maamuli kartaa amarka help oo arag amarrada la heli karo.

help

Aan ku taxno amarrada aan ku isticmaali doono maqaalkan.

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

Hadda waxaan diyaar u nahay inaan qandaraaska laftiisa qorno.

РСализация

Fikradda

Sida aan kor ku qoray, qandaraaska caqliga leh ee aan qorayno waa bakhtiyaanasiib.

Intaa waxaa dheer, kani maaha bakhtiyaanasiib aad u baahan tahay inaad iibsato tigidh oo aad sugto saacad, maalin ama bil, laakiin waa mid degdeg ah kaas oo isticmaaluhu uu u wareejiyo cinwaanka qandaraaska. N garaam, oo isla markiiba dib u soo celiya 2 * N garaam ama lumin. Waxaan samayn doonaa suurtogalnimada inaan ku guuleysano ilaa 40%. Haddii aysan jirin garaam ku filan oo lacag bixin ah, markaa waxaan u tixgelin doonaa macaamilka sida kor u kaca.

Waxaa intaa dheer, waxaa muhiim ah in khamaarka la arki karo waqtiga dhabta ah iyo qaab ku habboon, si isticmaaluhu isla markiiba u fahmo haddii uu ku guuleystay ama laga badiyay. Sidaa darteed, waxaad u baahan tahay inaad sameyso degel internet oo muujinaya khamaar iyo natiijooyin toos ah TON.

Qoritaanka qandaraas caqli gal ah

Si ay ugu habboonaato, waxaan iftiimiyay koodhka FunC; plugin-ka ayaa laga heli karaa oo lagu rakibi karaa raadinta Code Studio Visual; haddii aad si lama filaan ah u rabto inaad wax ku darto, waxaan sameeyay plugin si guud loo heli karo. Sidoo kale, qof hore u sameeyay plugin la shaqaynta Fift, waxaad sidoo kale ku rakibi kartaa oo aad ka heli kartaa VSC.

Aynu isla markiiba abuurno bakhaar halkaas oo aanu ku fulin doono natiijooyinka dhexdhexaadka ah.

Si aan nolosheena u fududeyno, waxaan qori doonaa qandaraas caqli-gal ah oo aan tijaabin doono gudaha ilaa inta ay diyaar tahay. Kaliya markaas ka dib waxaan ku daabici doonaa TON.

Qandaraaska smart wuxuu leeyahay laba hab oo dibadda ah oo la heli karo. Marka hore, recv_external() shaqadan waxaa la fuliyaa marka codsiga qandaraasku ka yimaado dunida dibadda, taas oo ah, ma ka TON, tusaale ahaan, marka annagu lafteena soo saara fariin oo u dirto iyada oo loo marayo Lite-macmiil. Labaad, recv_internal() tani waa marka, gudaha TON lafteeda, qandaraas kasta uu tixraacayo annaga. Labada xaaladoodba, waxaad u gudbin kartaa cabbirada shaqada.

Aan ku bilowno tusaale fudud oo shaqayn doona haddii la daabaco, laakiin ma jiro wax culays ah oo shaqaynaya.

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

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

Halkan waxaan u baahanahay inaan sharaxno waxa ay tahay slice. Dhammaan xogta ku kaydsan TON Blockchain waa ururin TVM cell ama si fudud cell, unugga noocaan ah waxaad ku kaydin kartaa ilaa 1023 bits oo xog ah iyo ilaa 4 xiriiriye oo unugyo kale ah.

TVM cell slice ama slice tani waa qayb ka mid ah kuwa jira cell waxaa loo isticmaalaa in lagu kala saaro, way kala caddaan doontaa hadhow. Waxa inoogu muhiimsan waa inaan wareejin karno slice oo ku xidhan nooca fariinta, ka baaraandegi xogta recv_external() ama recv_internal().

impure - kelmad muhiim ah oo tilmaamaysa in shaqadu wax ka beddesho xogta qandaraaska smart.

Aan ku dhex xafidno koodhka qandaraaska lottery-code.fc oo la ururiyo.

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

Macnaha calamada waxaa lagu arki karaa iyadoo la adeegsanayo amarka

~/TON/build/crypto/func -help

Waxaan ku soo uruurinay koodka Fift assembler 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

Waxaa lagu bilaabi karaa gudaha, tan waxaan u diyaarin doonaa deegaanka.

Ogow in xariiqda kowaad isku xidho Asm.fif, kani waa kood ku qoran Fift for the Fift assembler.

Tan iyo markii aan rabno in aan ordo oo aan tijaabino qandaraaska caqliga leh gudaha, waxaan abuuri doonaa fayl lottery-test-suite.fif oo koobi ka samee koodka la soo ururiyey, adoo bedelaya xariiqda ugu dambeysa ee ku jirta, kaas oo u qora koodhka qandaraaska smart si joogto ah codesi markaas loogu wareejiyo mashiinka farsamada:

"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

Ilaa hadda waxay u muuqataa mid cad, hadda aan ku darno isla faylkaas koodka aan u isticmaali doono inaan bilowno 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 Waxaan duubnaa macnaha guud, taas oo ah, xogta taas oo TVM (ama gobolka network) la bilaabi doono. Xitaa inta lagu jiro tartanka, mid ka mid ah horumarinta ayaa muujiyay sida loo abuuro c7 waana soo guuriyay. Maqaalkan waxa laga yaabaa inaan u baahanahay inaan bedelno rand_seed maadaama jiilka tiro aan toos ahayn ay ku xiran tahay haddii aan la beddelin, isla tiradaas ayaa mar kasta la soo celinayaa.

recv_internal ΠΈ recv_external Joogtada leh qiyamka 0 iyo -1 ayaa mas'uul ka noqon doona wacitaanka hawlaha u dhigma ee qandaraaska smart.

Hadda waxaan diyaar u nahay inaan abuurno tijaabada ugu horeysa ee qandaraaskeena smart ee faaruqa ah. Si loo caddeeyo, hadda waxaan dhammaan imtixaanada ku dari doonaa isla fayl isku mid ah lottery-test-suite.fif.

Aan abuurno doorsoome storage oo mid maran ku qor cell, tani waxay noqon doontaa kaydinta qandaraaska smart.

message Tani waa fariinta aan u gudbin doono xiriirka caqliga leh ee dibadda. Waxaan sidoo kale ka dhigi doonaa madhan hadda.

variable storage 
<b b> storage ! 

variable message 
<b b> message ! 

Ka dib markii aan diyaarinay joogtada ah iyo doorsoomayaasha, waxaan bilaabay TVM isticmaalaya amarka runvmctx oo u gudbi xuduudaha la abuuray gelinta.

message @ 
recv_external 
code 
storage @ 
c7 
runvmctx 

Aakhirka waan guulaysan doonaa sida code dhexe ee Fift.

Hadda waxaan socodsiin karnaa koodhka natiijada.

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

Barnaamijku waa inuu ku shaqeeyaa khaladaad la'aan, wax-soo-saarka waxaan arki doonnaa log-ka fulinta:

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

Way fiican tahay, waxaanu qornay nooca shaqada ee ugu horreeya ee qandaraaska smart.

Hadda waxaan u baahanahay inaan ku darno shaqeynta. Marka hore aan wax ka qabanno farriimaha ka imanaya adduunka dibadda ee u socda recv_external()

Horumariyaha laftiisa ayaa dooranaya qaabka fariinta ee uu qandaraasku aqbali karo.

Laakiin sida caadiga ah

  • marka hore waxaan rabnaa in aan qandaraaskayaga ka ilaalino dibadda oo aan ka dhigno in qofka qandaraaska leh oo keliya uu fariimo dibadda ah ugu soo diro.
  • Marka labaad, marka aan u dirno fariin sax ah TON, waxaan rabnaa in tani ay si sax ah u dhacdo hal mar iyo marka aan dirno fariin isku mid ah mar labaad, qandaraaska smart ayaa diidaya.

Markaa ku dhawaad ​​qandaraas kastaa wuxuu xalliyaa labadan mashaakil, maadaama qandaraaskeenu aqbalayo fariimaha dibadda, waxaan u baahanahay inaan sidoo kale ilaalino taas.

Waxaan u samayn doonaa si rogan. Marka hore, aan ku xalino dhibaatada ku celcelin, haddii qandaraasku hore u helay fariinta noocaas ah oo la farsameeyay, ma fulin doono mar labaad. Ka dibna waxaan xallin doonaa dhibaatada si dad gaar ah oo kaliya ay farriimaha u soo diri karaan qandaraaska smart.

Waxaa jira siyaabo kala duwan oo lagu xalliyo dhibaatada farriimaha nuqul ka mid ah. Waa kan sida aan u samayn doono. Qandaraaska casriga ah, waxaan ku bilownaa miiska farriimaha la helay qiimaha bilowga ah 0. Fariin kasta oo qandaraaska smart ah, waxaan ku dari doonaa qiimaha miiska hadda. Haddii qiimaha counter-ta ee fariinta uusan u dhigmin qiimaha qandaraaska smart, markaa ma socodsiineyno; haddii ay sameyso, markaa waanu ka baaraandegi karnaa oo kordhineynaa miiska qandaraaska smart by 1.

Aan ku soo noqonno lottery-test-suite.fif oo ku dar imtixaan labaad. Haddii aan dirno lambar khaldan, koodka waa inuu tuuraa ka reeban yahay. Tusaale ahaan, xogta qandaraasku ha kaydiso 166, waxaanu soo diri doonaa 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"

Aan bilowno.

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

Waxaana arki doonaa in imtixaanka lagu fuliyo qalad.

[ 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

Marxaladdan lottery-test-suite.fif waa inay u ekaadaan link.

Hadda aan ku darno caqli-celinta counter-ka ee qandaraaska caqliga leh 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 been fariinta aan dirno.

Waxa ugu horreeya ee aan sameyno waa hubinta haddii fariintu ay ku jirto xog, haddii aysan ahayn, markaa si fudud ayaan uga baxnaa.

Marka xigta waxaan kala saareynaa fariinta. in_msg~load_uint(32) wuxuu ku shubaa lambarka 165, 32-bit unsigned int ka fariinta la gudbiyay.

Marka xigta waxaan ka soo rarinaa 32 bits kaydinta qandaraasyada smart. Waxaan hubinaa in nambarka la raray uu la mid yahay kan la gudbay, haddii kale, waxaan tuuraynaa ka reeban. Xaaladeena, mar haddii aan dhaafeyno ciyaar aan ciyaar ahayn, ka reeban waa in la tuuraa.

Hadda aan soo ururinno.

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

Ku koobbi koodka soo baxay lottery-test-suite.fif, adigoon ilaawin inaad beddesho xariiqda ugu dambeysa.

Waxaan hubineynaa in imtixaanku uu gudbay:

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

Isla halkan Waxaad arki kartaa ballanqaadka u dhigma natiijooyinka hadda jira.

Ogsoonow in aysan dhib lahayn in si joogto ah loo koobiyeeyo koodka la soo ururiyey ee qandaraaska smart ee faylka leh imtixaannada, markaa waxaanu qori doonaa qoraal noo qori doona koodhka si joogto ah, waxaananu si fudud ugu xidhi doonaa koodka la soo ururiyey ee imtixaanadayada annagoo isticmaalaya "include".

Ku samee fayl galka mashruuca build.sh oo leh nuxurka soo socda.

#!/bin/bash

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

Aan ka dhigno mid la fulin karo.

chmod +x ./build.sh

Hadda, kaliya socodsii qoraalkayaga si aad u ururiso qandaraaska. Laakiin tan ka sokow, waxaan u baahanahay inaan u qorno si joogto ah code. Markaa waxaan abuuri doonaa fayl cusub lotter-compiled-for-test.fif, kaas oo aan ku dari doono faylka lottery-test-suite.fif.

Aan ku darno koodka skirpt sh, kaas oo si fudud u koobi doona faylka la soo ururiyay lotter-compiled-for-test.fif oo beddel xariiqda ugu dambeysa ee ku jirta.

# 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

Hadda, si aad u hubiso, aynu socodsiino qoraalka natiijada oo fayl ayaa la soo saari doonaa lottery-compiled-for-test.fif, oo aan ku dari doono our lottery-test-suite.fif

Π’ lottery-test-suite.fif tirtir xeerka qandaraaska oo ku dar khadka "lottery-compiled-for-test.fif" include.

Waxaan wadnaa imtixaanno si aan u hubinno inay gudbaan.

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

Way fiican tahay, hadda si otomaatig ah loo bilaabo imtixaannada, aan abuurno fayl test.sh, kaas oo marka hore fulin doona build.sh, ka dibna samee imtixaanada.

touch test.sh
chmod +x test.sh

Waxaan ku qornaa gudaha

./build.sh 

echo "nCompilation completedn"

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

Aan samayno test.sh oo wad si aad u hubiso in imtixaanadu shaqeeyaan.

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

Waxaan hubineynaa in qandaraasku uu ururiyey imtixaannadana la fuliyay.

Way fiicantahay, hadda bilawga test.sh Tijaabooyinku waa la soo ururin doonaa oo isla markaaba waa la wadi doonaa. Waa kan isku xirka galan.

Hagaag, ka hor inta aynaan sii wadin, aynu samayno hal shay oo kale si ay ugu habboonaato.

Aan abuurno gal build halkaas oo aanu ku kaydin doono qandaraaska la koobiyay iyo kloonkiisa oo qoran si joogto ah lottery-compiled.fif, lottery-compiled-for-test.fif. Aynu sidoo kale samayno gal test xagee lagu kaydin doonaa faylka tijaabada? lottery-test-suite.fif iyo faylal kale oo suurtagal ah oo taageeraya Isku xidhka isbeddelada khuseeya.

Aynu sii wadno horumarinta qandaraaska caqliga leh.

Marka xigta waa in la sameeyaa imtixaan hubinaya in fariinta la helay iyo miiska la cusbooneysiiyay ee dukaanka marka aan dirno lambarka saxda ah. Laakiin taas mar dambe ayaan samayn doonaa.

Hadda aan ka fekerno qaabka xogta iyo xogta loo baahan yahay in lagu kaydiyo qandaraaska smart.

Waxaan ku tilmaami doonaa wax kasta oo aan kaydin.

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

Marka xigta waxaad u baahan tahay inaad qorto laba hawlood. Marka hore aan wacno pack_state(), kaas oo ku xidhi doona xogta kaydinta xiga ee kaydinta qandaraaska smart. Aan wacno tan labaad unpack_state() akhrin doona oo soo celin doona xogta kaydinta.

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

Waxaan ku darnaa labadan shaqo bilowga qandaraaska smart. Way shaqayn doontaa sida natiijo dhexdhexaad ah.

Si loo kaydiyo xogta waxaad u baahan doontaa inaad wacdo shaqada ku dhex jirta set_data() waxayna ka qori doontaa xogta pack_state() in kaydinta qandaraas smart.

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

Hadda oo aan haysanno hawlo ku habboon qorista iyo akhrinta xogta, waan sii socon karnaa.

Waxaan u baahanahay inaan hubino in fariinta ka imanaysa dibadda uu saxiixay mulkiilaha qandaraaska (ama isticmaale kale oo marin u leh furaha gaarka ah).

Marka aan daabacno qandaraas caqli-gal ah, waxaan ku bilaabi karnaa xogta aan u baahanahay kaydinta, taas oo loo keydin doono isticmaalka mustaqbalka. Waxaan ku duubi doonaa furaha dadweynaha halkaas si aan u xaqiijino in fariinta soo socota lagu saxiixay furaha gaarka ah ee u dhigma.

Kahor intaanan sii wadin, aan abuurno fure gaar ah oo aan u qorno test/keys/owner.pk. Si tan loo sameeyo, aynu bilowno Fift qaab is-dhexgal ah oo aan fulino afar amar.

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

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

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

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

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

Aan abuurno gal keys gudaha galka test halkaasna ku qor furaha gaarka ah.

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

Waxaan ku aragnaa fayl galka hadda jira owner.pk.

Waxaan ka saareynaa furaha guud ee xirmada markii loo baahdo waxaan ka heli karnaa midka gaarka ah.

Hadda waxaan u baahanahay inaan qorno xaqiijinta saxiixa. Aan ku bilowno imtixaanka. Marka hore waxaanu akhrinay furaha khaaska ah ee faylka anagoo adeegsanayna shaqada file>B una qor doorsoome owner_private_key, ka dibna isticmaalaya shaqada priv>pub furaha gaarka ah u beddel furaha guud oo ku qor natiijada 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 !

Waxaan u baahan doonaa labada fure.

Waxaan ku bilownay kaydinta qandaraaska smart xogta aan loo meel dayin ee isku xigxiga sida shaqada pack_state()una qor doorsoome 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 !

Marka xigta, waxaanu samayn doonaa fariin saxeexan, waxay ka koobnaan doontaa oo kaliya saxiixa iyo qiimaha miiska.

Marka hore, waxaan abuurnaa xogta aan rabno inaan gudbino, ka dib waxaan ku saxiixnaa fure gaar ah ugu dambeyntiina waxaan soo saareynaa fariin saxiix ah.

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 !  

Natiijo ahaan, fariinta aan u diri doono qandaraaska casriga ah waxaa lagu duubaa doorsoome message_to_send, ku saabsan hawlaha hashu, ed25519_sign_uint waad akhrin kartaa dukumeentiyada shanaad.

Oo si aan u tijaabino imtixaanka mar labaad wac.

message_to_send @ 
recv_external 
code 
storage @
c7
runvmctx

Sidan oo kale Faylka leh imtixaanada waa inuu u ekaado sidan heerkan.

Aan tijaabino imtixaanka wuuna guuldareysan doonaa, markaa waxaan bedeli doonaa qandaraaska smart si uu u helo farriimaha qaabkan ah oo uu xaqiijiyo saxiixa.

Marka hore, waxaan ka tirineynaa fariinta 512 ee saxiixa oo ku qor doorsoome, ka dib waxaan tirinaa 32 bit oo doorsoomaha counter.

Maadaama aan haysano shaqo loogu talagalay akhrinta xogta kaydinta qandaraaska smart, waxaan isticmaali doonaa.

Marka xigta waa hubinta miiska lagu wareejiyay kaydinta iyo hubinta saxiixa. Haddii shay uusan u dhigmin, markaa waxaan tuurnaa ka reeban oo leh koodka ku habboon.

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

Ballanqaad ku habboon halkan.

Aynu wadno imtixaanada oo aynu aragno in imtixaankii labaad uu guuldarraystay. Laba sababood dartood, fariinta kuma filna oo kuma jiraan kaydinta, markaa koodku wuu burburaa marka la kala saarayo. Waxaan u baahanahay inaan saxiix ku darno fariinta aan dirayno oo aan nuqul ka samayno kaydinta imtixaankii u dambeeyay.

Imtixaanka labaad, waxaan ku dari doonaa saxiixa fariinta oo aan bedeli doonaa kaydinta qandaraaska smart. Sidan oo kale faylka leh imtixaanno wuxuu u eg yahay xilligan.

Aynu qorno imtixaan afraad, kaas oo aanu ku diri doono fariin ku saxeexan furaha gaarka ah ee qof kale. Aan abuurno fure kale oo gaar ah oo aan ku xafidno fayl not-owner.pk. Waxaan ku saxiixi doonaa fariinta furahan gaarka ah. Aan wadno imtixaanada oo aan hubinno in dhammaan imtixaanada ay gudbeen. Ballanqaad xilligan.

Hadda waxaan ugu dambeyntii u gudbi karnaa hirgelinta macquulnimada qandaraaska ee caqliga leh.
Π’ recv_external() waxaanu aqbali doonaa laba nooc oo fariimo ah.

Maadaama qandaraaskeenu uu ururin doono khasaaraha ciyaartoyda, lacagtan waa in lagu wareejiyo abuuraha bakhtiyaanasiibka. Cinwaanka boorsada abuuraha bakhtiyaanasiibka waxa lagu qoraa kaydinta marka heshiiska la abuurayo.

Kaliya haddii ay dhacdo, waxaan u baahanahay awood aan ku bedelno cinwaanka aan u dirno garaamyada kuwa khasaaray. Waa inaan sidoo kale ka diri karnaa garaamyada bakhtiyaanasiibka una dirno ciwaanka mulkiilaha.

Aan ku bilowno midka koowaad. Aynu marka hore qorno imtixaan hubin doona in farriinta diritaanka ka dib, qandaraaska smart uu keydiyay cinwaanka cusub ee kaydinta. Fadlan ogow in fariinta, marka lagu daro miiska iyo cinwaanka cusub, waxaan sidoo kale gudbineynaa action Tirada 7-bit ee aan taban ahayn, iyada oo ku xidhan, waxaanu dooran doonaa sida loo farsameeyo fariinta qandaraaska casriga ah.

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

Imtixaanka waxaad ku arki kartaa sida kaydinta qandaraasyada smart-ka laga dhigay storage ee Shanaad. Kala soocida doorsoomayaasha waxaa lagu sifeeyay dukumeentiyada shanaad.

Samee xiriirinta oo lagu daray cajiinka.

Aan wadno imtixaanka oo aan hubinno inuu guuldareysto. Hadda aan ku darno macquul si aan u bedelno ciwaanka mulkiilaha bakhtiyaanasiibka.

Qandaraaska caqliga leh waxaan sii wadeynaa inaan kala saarno message, ku akhri action. Aan ku xasuusino in aan laba yeelan doono action: bedel ciwaanka oo dir garaam.

Kadibna waxaanu akhrinay ciwaanka cusub ee mulkiilaha qandaraaska oo aanu ku kaydinay kaydinta.
Waxaan wadnaa imtixaanada waxaanan aragnaa in imtixaanka saddexaad uu guuldareysto. Waxay u burburtaa sababtoo ah xaqiiqda ah in qandaraasku hadda sidoo kale ka saaro 7-bit oo fariinta ah, kuwaas oo ka maqan imtixaanka. Ku dar mid aan jirin fariinta action. Aan wadno imtixaanada oo aan aragno in wax walba ay gudbaan. halkan u go'aan in isbedel. Wayn

Hadda aan qorno caqli-galnimada dirida tirada garaamyada ee la cayimay cinwaanka hore loo kaydiyay.

Marka hore, aan qorno imtixaan. Waxaan qori doonaa laba imtixaan, mid marka aysan jirin dheelitirnaan ku filan, kan labaad marka wax walba ay tahay inay si guul leh u gudbaan. Imtixaannada waa la arki karaa ballantan.

Hadda aan ku darno koodka. Marka hore, aynu qorno laba hab oo caawiyayaasha ah. Habka ugu horreeya ee loo helo waa in la ogaado dheelitirka hadda ee qandaraaska smart.

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

Midda labaadna waa in garaam loo diro qandaraas kale oo caqli badan. Waxaan gabi ahaanba habkan ka soo guuriyay qandaraas kale oo caqli badan.

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

Aynu ku darno labadan hab qandaraaska caqliga leh oo aan qorno caqli-galnimada. Marka hore, waxaan kala saareynaa tirada garaamyada fariinta. Marka xigta waxaan hubineynaa dheelitirka, haddii aysan ku filneyn waxaan tuureynaa ka reebis. Haddii wax waliba ay fiican yihiin, markaa waxaan u dirnaa garaamyada ciwaanka la keydiyay oo aan cusbooneysiinno miiska.

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

Sidan oo kale waxay u egtahay qandaraaska caqliga leh xilligan. Aan wadno imtixaanada oo aan hubinno inay gudbaan.

By habka, komishan ayaa laga jarayaa qandaraaska smart mar kasta fariin la habeeyey. Si farriimaha qandaraaska smart ay u fuliyaan codsiga, ka dib hubinta aasaasiga ah waxaad u baahan tahay inaad wacdo accept_message().

Hadda aan u gudubno fariimaha gudaha. Dhab ahaantii, waxaanu aqbali doonaa oo kaliya garaam oo dib ugu soo celin doonaa labanlaab lacagta ciyaaryahanka haddii uu guuleysto iyo saddex meelood meel milkiilaha haddii laga adkaado.

Marka hore, aan qorno imtixaan fudud. Si tan loo sameeyo, waxaan u baahanahay ciwaanka tijaabada ee qandaraaska smart kaas oo aan ka soo dirno garaamyada qandaraaska smart.

Cinwaanka qandaraaska ee casriga ah wuxuu ka kooban yahay laba lambar, 32-bit integer mas'uul ka ah silsiladda shaqada iyo 256-bit lambar xisaabeed gaar ah oo aan taban ahayn. Tusaale ahaan, -1 iyo 12345, kani waa cinwaanka aan ku kaydin doono faylka.

Waxaan ka soo guuriyay shaqada cinwaanka cinwaanka 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

Aynu eegno sida shaqadu u shaqeyso, tani waxay ku siin doontaa fahamka sida Fift u shaqeyso. Ku bilow Fift qaab is-dhexgal ah.

~/TON/build/crypto/fift -i 

Marka hore waxaan ku riixnay -1, 12345 iyo magaca faylka mustaqbalka "sender.addr" dulsaarka:

-1 12345 "sender.addr" 

Tallaabada xigta waa in la fuliyo shaqada -rot, Kaas oo u beddelaya xirmooyinka si ay ugu sarreyso xirmada uu jiro nambar qandaraas oo gaar ah:

"sender.addr" -1 12345

256 u>B wuxuu u beddelaa 256-bit tiro aan taban ahayn oo u beddela bytes.

"sender.addr" -1 BYTES:0000000000000000000000000000000000000000000000000000000000003039

swap isku beddesho labada shay ee ugu sarreeya ee xidhmada.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 -1

32 i>B wuxuu u beddelaa 32-bit integer ka mid ah bytes.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 BYTES:FFFFFFFF

B+ isku xidha laba taxane oo bytes ah.

 "sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF

Haddana swap.

BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF "sender.addr" 

Ugu dambeyntiina bytes ayaa lagu qoraa faylka B>file. Taas ka dib raasamaalkeennu waa madhan yahay. Waan joojinay Fift. Fayl ayaa lagu dhex abuuray galka hadda sender.addr. Aan u guurno faylka gal galka la abuuray test/addresses/.

Aynu qorno imtixaan fudud oo garaamyada u diri doona qandaraas caqli-gal ah. Waa kan ballan-qaadkii.

Haddaba aan eegno macquulnimada bakhtiyaanasiibka.

Waxa ugu horreeya ee aan samayno waa hubinta fariinta bounced ama haddii kale bounced, markaas waanu iska indha tiraynaa. bounced macneheedu waxa weeye in qandaraasku soo celin doono garaam haddii qaar khalad dhaco. Ma soo celin doono garaam haddii qalad si lama filaan ah u dhaco.

Waxaan hubineynaa, haddii dheelitirka uu ka yar yahay nus garaam, ka dibna waxaan si fudud u aqbalnaa fariinta oo aan iska indhatirno.

Marka xigta, waxaan kala saareynaa ciwaanka qandaraaska caqliga leh ee fariintu ka timid.

Waxaan akhrinay xogta kaydinta ka dibna tirtiray sharadyadii hore ee taariikhda haddii ay jiraan in ka badan labaatan. Si ku habboon, waxaan qoray saddex hawlood oo dheeraad ah pack_order(), unpack_order(), remove_old_orders().

Marka xigta, waxaan eegnaa haddii dheelitirka uusan ku filneyn bixinta, ka dibna waxaan tixgelineynaa in tani aysan ahayn sharad, laakiin dib u buuxin iyo badbaadinta buuxinta orders.

Kadibna ugu dambeyntii nuxurka qandaraaska caqliga leh.

Marka hore, haddii ciyaaryahanku lumiyo, waxaan ku badbaadineynaa taariikhda sharadka iyo haddii qadarku ka badan yahay 3 garaam, waxaan u dirnaa 1/3 milkiilaha qandaraaska smart.

Haddii ciyaaryahanku guuleysto, markaa waxaan u dirnaa labanlaab lacagta ciwaanka ciyaaryahanka ka dibna waxaan keydineynaa macluumaadka ku saabsan sharadka taariikhda.

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

Taasi waa dhan. Ballanqaadka u dhigma.

Hadda waxa hadhay oo dhan waa sahlan yihiin, aynu abuurno habab-helid si aan u helno macluumaadka ku saabsan xaaladda qandaraaska ee adduunka ka baxsan (xaqiiqda, akhri xogta kaydinta qandaraaskooda smart).

Aynu ku darno habab hel. Waxaan hoos ku qori doonaa sida loo helo macluumaadka ku saabsan qandaraaska smart.

Waxa kale oo aan ilaaway in aan ku daro koodka ka shaqayn doona codsiga ugu horreeya ee dhacaya marka la daabacayo qandaraas caqli-gal ah. Ballanqaadka u dhigma. Iyo dheeraad ah la saxay kutaan la dirayo 1/3 ee lacagta xisaabta milkiilaha.

Tallaabada xigta waa in la daabaco qandaraaska smart. Aan abuurno gal requests.

Waxaan u qaatay xeerka daabacaada sal simple-wallet-code.fc taas oo waa la heli karaa ee kaydka rasmiga ah.

Wax mudan in fiiro gaar ah loo yeesho. Waxaan abuurnaa kayd qandaraas oo caqli badan iyo fariin gelinta. Taas ka dib, cinwaanka qandaraaska smart ayaa la soo saaray, taas oo ah, cinwaanka waa la yaqaan xitaa ka hor inta aan la daabicin TON. Marka xigta, waxaad u baahan tahay inaad dhowr garaam u dirto cinwaankan, ka dib markaa waxaad u baahan tahay inaad soo dirto fayl leh qandaraaska caqliga leh laftiisa, maadaama shabakadu ay qaadato komishan lagu kaydinayo qandaraaska caqliga leh iyo hawlgallada ku jira (validators kuwaas oo kaydiya oo fuliya smart qandaraasyada). Koodhka waxaa laga arki karaa halkan.

Marka xigta waxaan fulineynaa koodka daabacaadda oo hel lottery-query.boc faylka qandaraaska smart iyo cinwaanka.

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

Ha ilaawin inaad kaydiso faylasha la sameeyay: lottery-query.boc, lottery.addr, lottery.pk.

Waxyaabaha kale, waxaan ku arki doonaa cinwaanka qandaraaska smart ee diiwaanka fulinta.

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

Kaliya madadaalo, aan codsi u dirno TON

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

Oo waxaan arki doonaa in akoonka ciwaankani uu faaruq yahay.

account state is empty

Waxaan u dirnaa cinwaanka 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd 2 Gram iyo dhowr ilbiriqsi ka dib waxaan fulinaa isla amarkii. Si aan u diro garaam ayaan isticmaalaa boorsada rasmiga ah, oo waxaad waydiisan kartaa qof ka mid ah chat-ka garaamyada tijaabada, kaas oo aan kaga hadli doono dhamaadka maqaalka.

> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Waxay u egtahay mid aan la aqoon (state:account_uninit) Qandaraas caqli gal ah oo isku ciwaan ah iyo dheellitirkiisu yahay 1 nanogram.

account state is (account
  addr:(addr_std
    anycast:nothing workchain_id:0 address:x044910149DBEAF8EADBB2B28722E7D6A2DC6E264EC2F1D9BEBD6FB209079BC2A)
  storage_stat:(storage_info
    used:(storage_used
      cells:(var_uint len:1 value:1)
      bits:(var_uint len:1 value:103)
      public_cells:(var_uint len:0 value:0)) last_paid:1583257959
    due_payment:nothing)
  storage:(account_storage last_trans_lt:3825478000002
    balance:(currencies
      grams:(nanograms
        amount:(var_uint len:4 value:2000000000))
      other:(extra_currencies
        dict:hme_empty))
    state:account_uninit))
x{C00044910149DBEAF8EADBB2B28722E7D6A2DC6E264EC2F1D9BEBD6FB209079BC2A20259C2F2F4CB3800000DEAC10776091DCD650004_}
last transaction lt = 3825478000001 hash = B043616AE016682699477FFF01E6E903878CDFD6846042BA1BFC64775E7AC6C4
account balance is 2000000000ng

Hadda aynu daabacno qandaraaska caqliga leh. Aan bilowno macmiil fudud oo aan fulino.

> 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 

Aynu eegno in heshiiska la daabacay.

> last
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Waxyaabaha kale ee aan helno.

  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

Waxaan aragnaa taas account_active.

Ballanqaad ku habboon oo isbeddello leh halkan.

Hadda aan abuurno codsiyo si aan ula macaamilno qandaraaska caqliga leh.

Si sax ah, waxaan uga tagi doonaa kan ugu horreeya si loogu beddelo ciwaanka sida shaqo madax-bannaan, waxaanan samayn doonaa kan labaad si loogu diro garaamyada ciwaanka milkiilaha. Dhab ahaantii, waxaan u baahan doonaa inaan samayno wax la mid ah sidii imtixaanka dirida garaamyada.

Tani waa fariinta aan u diri doono qandaraaska smart, halkaas oo msg_seqno 165, action 2 iyo 9.5 garaam oo diris ah.

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

Ha iloobin inaad ku saxiixdo fariinta furahaaga khaaska ah lottery.pk, kaas oo hore loo soo saaray markii la abuurayo qandaraaska smart. Waa kan ballan-qaadka u dhigma.

Helitaanka macluumaadka qandaraaska caqliga leh iyadoo la isticmaalayo habab hel

Hadda aan eegno sida loo maamulo qandaraasyada smart heli hababka.

Daahfurka lite-client oo socodsii hababka hel ee aan u qornay.

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

Π’ result ka kooban yahay qiimaha ay shaqadu soo celiso balance() laga bilaabo qandaraaskeena smart.
Waxaan ku samayn doonaa si la mid ah dhowr hab oo kale.

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

Aan ku waydiino taariikhda sharadkaaga.

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

Waxaan isticmaali doonaa macmiil fudud waxaanan heli doonaa habab aan ku soo bandhigno macluumaadka ku saabsan qandaraaska caqliga leh ee goobta.

Muujinta xogta qandaraaska smart ee mareegaha

Waxaan ku qoray degel fudud oo Python ah si aan u muujiyo xogta qandaraaska caqliga leh ee hab ku habboon. Halkan si faahfaahsan uga hadli maayo oo waxaan daabici doonaa goobta hal ballan.

Codsiyada TON ayaa laga sameeyay Python iyadoo gacan ka heleysa lite-client. Si loo fududeeyo, goobta waxaa lagu baakadeeyay Docker waxaana lagu daabacay Google Cloud. Xiriirinta.

Isku dayaya

Hadda aan isku dayno inaan u dirno garaamyada halkaas si aad u buuxiso jeebka. Waxaan soo diri doonaa 40 garaam. Oo aan samayno laba sharadka si loo caddeeyo. Waxaan aragnaa in goobta ay muujiso taariikhda sharadka, boqolkiiba guusha hadda iyo macluumaadka kale ee waxtarka leh.

Waan aragnaain aan ku guulaysanay kii hore, kii labaadna waa laga badiyay.

Kadib

Maqaalku wuxuu noqday mid aad uga dheer intii aan filayay, malaha wuxuu noqon karaa mid gaaban, ama laga yaabee kaliya qof aan waxba ka aqoon TON oo raba inuu qoro oo daabaco qandaraas caqli-gal ah oo aan sahlanayn oo awood u leh inuu la falgalo. waa. Waxaa laga yaabaa in waxyaabaha qaarkood si fudud loo sharraxay.

Waxaa laga yaabaa in dhinacyada qaar ee fulinta loo samayn lahaa si hufan oo xarrago leh, laakiin markaas waxay qaadan lahayd wakhti dheer in la diyaariyo maqaalka. Waxa kale oo suurtogal ah in aan meel ku qaldamay ama aanan fahmin wax, markaa haddii aad samaynayso wax halis ah, waxaad u baahan tahay inaad ku tiirsato dukumeenti rasmi ah ama kaydka rasmiga ah ee TON code.

Waa in la ogaadaa in maadaama TON lafteedu ay weli ku jirto marxaladda firfircoon ee horumarinta, waxaa laga yaabaa inay dhacaan isbeddelo jabin doona mid ka mid ah tillaabooyinka maqaalkan (taas oo dhacday intaan wax qorayo, mar hore ayaa la saxay), laakiin habka guud ayaa ah. lagama yaabo inuu isbedelo.

Ka hadli maayo mustaqbalka TON. Waxaa laga yaabaa in madalku ay noqoto wax weyn oo ay tahay in aan waqti ku bixinno daraasadda oo aan ka buuxinno wax soo saarkeena hadda.

Waxa kale oo jira Libra oo ka socota Facebook, kaas oo leh dhagaystayaal suurtagal ah oo isticmaala oo ka weyn TON. Waxba kama aqaano Miisaanka, marka loo eego golaha waxaa jira hawlo aad uga badan marka loo eego bulshada TON. In kasta oo horumarinta iyo bulshada TON ay aad ugu eg yihiin dhulka hoostiisa, taas oo sidoo kale qabow.

tixraacyada

  1. Dukumentiga rasmiga ah ee TON: https://test.ton.org
  2. Kaydka rasmiga ah ee TON: https://github.com/ton-blockchain/ton
  3. Boorsada rasmiga ah ee aaladaha kala duwan: https://wallet.ton.org
  4. Kaydka qandaraasyada casriga ah ee maqaalkan: https://github.com/raiym/astonished
  5. Ku xidhka shabakada qandaraaska smart: https://ton-lottery.appspot.com
  6. Kaydka kordhinta ee Visual Studio Code for FunC: https://github.com/raiym/func-visual-studio-plugin
  7. Kala hadal TON Telegram, kaas oo runtii gacan ka geystay in la ogaado marxaladda hore. Waxaan filayaa inaysan khalad noqon doonin haddii aan idhaahdo qof kasta oo wax u qoray TON ayaa jooga. Waxa kale oo aad ka codsan kartaa garaamyada tijaabada halkaas. https://t.me/tondev_ru
  8. Sheeko kale oo ku saabsan TON oo aan ka helay macluumaad waxtar leh: https://t.me/TONgramDev
  9. Marxaladda koowaad ee tartanka: https://contest.com/blockchain
  10. Marxaladda labaad ee tartanka: https://contest.com/blockchain-2

Source: www.habr.com

Add a comment