Mahitungod sa pagsulat ug pagmantala sa usa ka smart nga kontrata sa Telegram Open Network (TON)

Mahitungod sa pagsulat ug pagmantala sa usa ka smart nga kontrata sa TON

Mahitungod sa unsa kini nga artikulo?

Sa artikulo maghisgot ako kung giunsa nako pag-apil sa una (sa duha) nga kompetisyon sa blockchain sa Telegram, wala makakuha usa ka premyo, ug nakahukom nga irekord ang akong kasinatian sa usa ka artikulo aron dili kini malunod sa kalimot ug, tingali, makatabang. usa ka tawo.

Tungod kay dili ko gusto nga magsulat abstract code, apan sa pagbuhat sa usa ka butang nga nagtrabaho, alang sa artikulo ako misulat sa usa ka smart kontrata alang sa usa ka instant lottery ug sa usa ka website nga nagpakita sa smart data sa kontrata direkta gikan sa TON nga walay paggamit sa intermediate storage.

Ang artikulo mahimong mapuslanon sa mga gusto nga maghimo sa ilang una nga smart nga kontrata sa TON, apan wala mahibal-an kung asa magsugod.

Gigamit ang loterya isip usa ka pananglitan, moadto ako gikan sa pag-instalar sa palibot ngadto sa pagmantala sa usa ka maalamon nga kontrata, pagpakig-uban niini, ug pagsulat sa usa ka website alang sa pagdawat ug pagmantala sa datos.

Mahitungod sa pag-apil sa kompetisyon

Kaniadtong Oktubre, gipahibalo sa Telegram ang usa ka kompetisyon sa blockchain nga adunay mga bag-ong sinultihan Fift ΠΈ FunC. Gikinahanglan ang pagpili gikan sa pagsulat sa bisan unsa sa lima nga gisugyot nga mga smart nga kontrata. Naghunahuna ko nga maayo nga buhaton ang usa ka butang nga lahi, pagkat-on og usa ka pinulongan ug paghimo og usa ka butang, bisan kung dili na kinahanglan nga magsulat pa ako sa umaabot. Dugang pa, ang hilisgutan kanunay sa mga ngabil.

Angayan nga isulti nga wala ako'y kasinatian sa paghimo og mga smart nga kontrata.

Nagplano ako nga moapil hangtod sa katapusan hangtod nga mahimo nako ug dayon magsulat usa ka artikulo sa pagrepaso, apan napakyas ako dayon sa una. Ako nagsulat ug pitaka uban sa multi-pirma sa FunC ug kini sa kasagaran nagtrabaho. Gikuha nako kini isip basehan smart nga kontrata sa Solidity.

Nianang panahona, naghunahuna ko nga igo na kini aron makuha ang bisan unsang lugar nga premyo. Tungod niini, mga 40 sa 60 ka partisipante ang nahimong premyo-winner ug wala ko apil nila. Sa kinatibuk-an, walay sayop niini, apan usa ka butang ang nakapahasol kanako. Sa panahon sa pag-anunsyo sa mga resulta, ang pagrepaso sa pagsulay alang sa akong kontrata wala pa nahimo, akong gipangutana ang mga partisipante sa chat kung naa bay lain nga wala niini, wala.

Dayag nga nagtagad sa akong mga mensahe, duha ka adlaw ang milabay ang mga maghuhukom nagpatik sa usa ka komentaryo ug wala pa nako masabti kung wala nila tuyoa ang akong smart nga kontrata sa panahon sa paghukom o naghunahuna lang nga kini daotan kaayo nga wala na magkinahanglan og komento. Nangutana kog pangutana sa page, pero wala koy tubag. Bisan kung dili sekreto kung kinsa ang naghukom, giisip nako nga dili kinahanglan ang pagsulat sa personal nga mga mensahe.

Daghang panahon ang gigugol sa pagsabot, mao nga nakahukom sa pagsulat ug artikulo. Tungod kay wala pay daghang impormasyon, kini nga artikulo makatabang sa pagdaginot ug panahon alang sa tanang interesado.

Ang konsepto sa mga smart nga kontrata sa TON

Sa dili pa nimo isulat ang bisan unsang butang, kinahanglan nimo nga mahibal-an kung diin gikan sa pagduol niini nga butang. Busa, karon isulti ko kanimo kung unsang mga bahin ang naglangkob sa sistema. Mas tukma, unsa nga mga bahin ang kinahanglan nimong mahibal-an aron magsulat bisan usa ka matang sa kontrata sa pagtrabaho.

Magpokus kami sa pagsulat sa usa ka intelihenteng kontrata ug pagtrabaho kauban TON Virtual Machine (TVM), Fift ΠΈ FunC, mao nga ang artikulo mas sama sa usa ka paghulagway sa pagpalambo sa usa ka regular nga programa. Dili kami maghisgot kung giunsa ang plataporma mismo molihok dinhi.

Sa kinatibuk-an bahin sa kung giunsa kini molihok TVM ug pinulongan Fift adunay maayo nga opisyal nga dokumentasyon. Samtang nag-apil sa kompetisyon ug karon samtang nagsulat sa kasamtangan nga kontrata, kanunay kong milingi kaniya.

Ang nag-unang pinulongan diin gisulat ang mga smart nga kontrata mao ang FunC. Wala’y dokumentasyon bahin niini sa pagkakaron, mao nga aron makasulat ka usa ka butang kinahanglan nimo nga tun-an ang mga pananglitan sa mga intelihente nga kontrata gikan sa opisyal nga repository ug ang pagpatuman sa mismong pinulongan didto, ug mahimo nimong tan-awon ang mga pananglitan sa mga smart nga kontrata gikan sa miaging duha. mga kompetisyon. Mga link sa katapusan sa artikulo.

Ingnon ta nga nagsulat na kami og usa ka smart nga kontrata alang sa FunC, human niana among gihugpong ang code ngadto sa Fift assembler.

Ang hinipos nga smart nga kontrata nagpabilin nga imantala. Aron mahimo kini kinahanglan nimo nga isulat ang usa ka function sa Fift, nga magkuha sa smart contract code ug uban pang mga parameter isip input, ug ang output usa ka file nga adunay extension .boc (nga nagpasabut nga "bag sa mga selyula"), ug, depende sa kung giunsa naton kini isulat, usa ka pribado nga yawe ug adres, nga gihimo base sa smart contract code. Mahimo na nimo ipadala ang mga gramo sa adres sa usa ka smart nga kontrata nga wala pa mamantala.

Sa pagmantala sa usa ka smart kontrata sa TON nadawat .boc ang file kinahanglan ipadala sa blockchain gamit ang usa ka light client (labaw pa niana sa ubos). Apan sa wala pa imantala, kinahanglan nimo nga ibalhin ang mga gramo sa nahimo nga adres, kung dili ang smart nga kontrata dili ma-publish. Human sa publikasyon, mahimo nimong i-interact ang smart contract pinaagi sa pagpadala niini og mga mensahe gikan sa gawas (pananglitan, gamit ang light client) o gikan sa sulod (pananglitan, ang usa ka smart contract nagpadala og lain nga mensahe sulod sa TON).

Sa higayon nga masabtan nato kung giunsa ang pagmantala sa code, kini mahimong mas sayon. Kami halos nahibalo kung unsa ang gusto namon isulat ug kung giunsa ang among programa molihok. Ug samtang nagsulat, gipangita namon kung giunsa kini gipatuman sa naa na nga mga smart nga kontrata, o gitan-aw namon ang code sa pagpatuman Fift ΠΈ FunC sa opisyal nga repositoryo, o tan-awa ang opisyal nga dokumentasyon.

Kanunay nakong gipangita ang mga keyword sa Telegram chat diin ang tanan nga mga partisipante sa kompetisyon ug mga empleyado sa Telegram nagpundok, ug nahitabo nga sa panahon sa kompetisyon ang tanan nagpundok didto ug nagsugod sa paghisgot sa Fift ug FunC. Link sa katapusan sa artikulo.

Panahon na nga mobalhin gikan sa teorya ngadto sa praktis.

Pag-andam sa palibot alang sa pagtrabaho kauban ang TON

Gibuhat nako ang tanan nga ihulagway sa artikulo sa MacOS ug gi-double check kini sa limpyo nga Ubuntu 18.04 LTS sa Docker.

Ang unang butang nga kinahanglan nimong buhaton mao ang pag-download ug pag-install lite-client diin mahimo nimong ipadala ang mga hangyo sa TON.

Ang mga panudlo sa opisyal nga website naghubit sa proseso sa pag-install sa detalyado ug tin-aw ug wala’y mga detalye. Dinhi among gisunod ang mga instruksyon, pag-instalar sa nawala nga mga dependency sa dalan. Wala nako gi-compile ang matag proyekto sa akong kaugalingon ug gi-install gikan sa opisyal nga repository sa Ubuntu (sa MacOS nga akong gigamit 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 

Kung ma-install na ang tanan nga mga dependency mahimo nimong i-install lite-client, Fift, FunC.

Una, gi-clone namon ang repository sa TON kauban ang mga dependency niini. Alang sa kasayon, buhaton namo ang tanan sa usa ka folder ~/TON.

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

Ang repositoryo usab nagtipig sa mga pagpatuman Fift ΠΈ FunC.

Karon andam na kami sa pag-assemble sa proyekto. Ang repository code gi-clone sa usa ka folder ~/TON/ton. ang ~/TON paghimo og folder build ug kolektaha ang proyekto niini.

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

Tungod kay magsulat kami usa ka smart nga kontrata, kinahanglan namon dili lamang lite-clientapan Fift с FunC, mao nga atong i-compile ang tanan. Dili kini dali nga proseso, mao nga naghulat kami.

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

Sunod, i-download ang configuration file nga adunay mga datos mahitungod sa node diin lite-client magkonektar.

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

Paghimo sa unang mga hangyo sa TON

Karon atong ilunsad lite-client.

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

Kung malampuson ang pagtukod, unya pagkahuman sa paglansad makita nimo ang usa ka log sa koneksyon sa light client sa 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)
...

Mahimo nimong ipadagan ang mando help ug tan-awa unsa nga mga sugo ang anaa.

help

Atong ilista ang mga sugo nga atong gamiton niining artikuloha.

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

Karon andam na kami sa pagsulat sa kontrata mismo.

Pagpatuman

Ideya

Sama sa akong gisulat sa ibabaw, ang intelihente nga kontrata nga among gisulat usa ka loterya.

Dugang pa, dili kini usa ka loterya diin kinahanglan nimo nga mopalit usa ka tiket ug maghulat usa ka oras, adlaw o bulan, apan usa ka diha-diha dayon diin ang tiggamit mobalhin sa adres sa kontrata. N gramo, ug makuha kini dayon 2 * N gramo o mawala. Himoon namo ang posibilidad nga makadaog mga 40%. Kung wala’y igo nga mga gramo alang sa pagbayad, ikonsiderar namon ang transaksyon ingon usa ka top-up.

Dugang pa, hinungdanon nga ang mga pusta makita sa tinuud nga oras ug sa usa ka kombenyente nga porma, aron masabtan dayon sa tiggamit kung siya midaog o napildi. Busa, kinahanglan ka nga maghimo usa ka website nga magpakita sa mga pusta ug mga resulta direkta gikan sa TON.

Pagsulat og smart contract

Alang sa kasayon, akong gipasiugda ang code alang sa FunC; ang plugin makit-an ug ma-install sa pagpangita sa Visual Studio Code; kung kalit nga gusto nimong idugang, akong gihimo ang plugin nga magamit sa publiko. Usab, ang usa ka tawo kaniadto naghimo sa usa ka plugin alang sa pagtrabaho uban sa Fift, mahimo usab nimo kini i-install ug pangitaa kini sa VSC.

Himoon dayon nato ang usa ka repository diin atong itugyan ang mga intermediate nga resulta.

Aron mapasayon ​​ang among kinabuhi, magsulat kami og usa ka smart nga kontrata ug sulayan kini sa lokal hangtod nga andam na. Pagkahuman ra namo imantala sa TON.

Ang smart nga kontrata adunay duha ka eksternal nga pamaagi nga mahimong ma-access. Una, recv_external() kini nga function gipatuman sa diha nga ang usa ka hangyo sa kontrata gikan sa gawas nga kalibutan, nga mao, dili gikan sa TON, pananglitan, sa diha nga kita sa atong kaugalingon sa paghimo sa usa ka mensahe ug ipadala kini pinaagi sa lite-kliyente. Ikaduha, recv_internal() mao kini kung, sulod mismo sa TON, ang bisan unsang kontrata nagtumong sa atoa. Sa duha ka mga kaso, mahimo nimong ipasa ang mga parameter sa function.

Magsugod kita sa usa ka yano nga panig-ingnan nga magamit kung gipatik, apan wala’y magamit nga karga niini.

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

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

Dinhi kinahanglan naton ipasabut kung unsa kini slice. Ang tanan nga datos nga gitipigan sa TON Blockchain usa ka koleksyon TVM cell o sa yano cell, sa ingon nga cell mahimo nimong tipigan ang hangtod sa 1023 bits sa data ug hangtod sa 4 ka link sa ubang mga cell.

TVM cell slice o slice kini mao ang bahin sa kasamtangan nga cell gigamit sa pag-parse niini, kini mahimong klaro sa ulahi. Ang nag-unang butang alang kanamo mao nga kami makabalhin slice ug depende sa matang sa mensahe, iproseso ang datos sa recv_external() o recv_internal().

impure - usa ka keyword nga nagpaila nga ang function nagbag-o sa datos sa intelihente nga kontrata.

Atong tipigan ang contract code sa lottery-code.fc ug pag-compile.

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

Ang kahulogan sa mga bandila mahimong tan-awon gamit ang sugo

~/TON/build/crypto/func -help

Gi-compile namo ang Fift assembler code sa 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

Mahimo kini nga ilunsad sa lokal, alang niini atong andamon ang palibot.

Timan-i nga ang unang linya nagkonektar Asm.fif, kini ang code nga gisulat sa Fift para sa Fift assembler.

Tungod kay gusto namon nga modagan ug sulayan ang smart nga kontrata sa lokal, maghimo kami usa ka file lottery-test-suite.fif ug kopyaha ang gihugpong nga code didto, ilisan ang katapusang linya niini, nga nagsulat sa smart contract code ngadto sa kanunay codearon ibalhin kini sa virtual machine:

"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

Sa pagkakaron morag klaro na, karon atong idugang sa samang file ang code nga atong gamiton sa paglusad sa 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 among girekord ang konteksto, nga mao, ang datos diin ang TVM (o network state) ilusad. Bisan sa panahon sa kompetisyon, gipakita sa usa sa mga developer kung giunsa paghimo c7 ug gikopya nako. Niini nga artikulo tingali kinahanglan natong usbon rand_seed tungod kay ang henerasyon sa usa ka random nga numero nagdepende niini ug kung dili usbon, ang parehas nga numero ibalik sa matag higayon.

recv_internal ΠΈ recv_external Ang mga makanunayon nga adunay mga kantidad nga 0 ug -1 ang responsable sa pagtawag sa katugbang nga mga gimbuhaton sa smart contract.

Karon andam na kami sa paghimo sa una nga pagsulay alang sa among walay sulod nga smart contract. Alang sa katin-awan, sa pagkakaron among idugang ang tanan nga mga pagsulay sa parehas nga file lottery-test-suite.fif.

Magbuhat ta ug variable storage ug isulat ang usa nga walay sulod niini cell, kini ang mahimong smart nga pagtipig sa kontrata.

message Kini ang mensahe nga among ipadala sa intelihenteng kontak gikan sa gawas. Himoon sab nato nga walay sulod sa pagkakaron.

variable storage 
<b b> storage ! 

variable message 
<b b> message ! 

Human namo maandam ang mga constants ug variables, among ilunsad ang TVM gamit ang command runvmctx ug ipasa ang gibuhat nga mga parameter sa input.

message @ 
recv_external 
code 
storage @ 
c7 
runvmctx 

Sa katapusan kita molampos ingon ana intermediate code alang sa Fift.

Karon mahimo na namon nga ipadagan ang resulta nga code.

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

Ang programa kinahanglan nga modagan nga walay mga sayup ug sa output atong makita ang execution log:

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

Maayo, gisulat namon ang una nga nagtrabaho nga bersyon sa smart nga kontrata.

Karon kinahanglan namong idugang ang pagpaandar. Una atong atubangon ang mga mensahe nga gikan sa gawas sa kalibutan sa recv_external()

Ang developer mismo ang nagpili sa format sa mensahe nga madawat sa kontrata.

Apan kasagaran

  • una, gusto namo nga protektahan ang among kontrata gikan sa gawas nga kalibutan ug himoon kini aron ang tag-iya lang sa kontrata ang makapadala ug external nga mga mensahe niini.
  • ikaduha, kung magpadala kami usa ka balido nga mensahe sa TON, gusto namon nga kini mahitabo sa makausa ug kung magpadala kami usab sa parehas nga mensahe, gisalikway kini sa smart contract.

Busa halos tanang kontrata makasulbad niining duha ka mga problema, tungod kay ang atong kontrata modawat sa mga eksternal nga mensahe, kinahanglan usab natong atimanon kana.

Buhaton nato kini sa baliktad nga han-ay. Una, atong sulbaron ang problema pinaagi sa pagsubli; kung ang kontrata nakadawat na sa ingon nga mensahe ug giproseso kini, dili kini ipatuman sa ikaduhang higayon. Ug unya atong sulbaron ang problema aron usa ra ka sirkulo sa mga tawo ang makapadala mga mensahe sa smart contract.

Adunay lainlaing mga paagi aron masulbad ang problema sa mga doble nga mensahe. Ania kung giunsa naton kini buhaton. Sa smart nga kontrata, atong gisugdan ang counter sa nadawat nga mga mensahe nga adunay inisyal nga bili 0. Sa matag mensahe ngadto sa smart contract, atong idugang ang kasamtangan nga counter value. Kung ang counter value sa mensahe dili motakdo sa bili sa smart contract, nan dili namo kini iproseso; kung mahitabo, among iproseso kini ug dugangan ang counter sa smart contract sa 1.

Balik ta sa lottery-test-suite.fif ug idugang ang ikaduhang pagsulay niini. Kung magpadala kami usa ka sayup nga numero, ang code kinahanglan nga magbutang usa ka eksepsiyon. Pananglitan, tugoti ang data sa kontrata nga magtipig 166, ug ipadala namon ang 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"

Maglansad ta.

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

Ug atong makita nga ang pagsulay gipatuman sa usa ka sayup.

[ 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

Niini nga yugto lottery-test-suite.fif dapat tan-awon link.

Karon atong idugang ang counter logic sa smart contract in lottery-code.fc.

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

() recv_external(slice in_msg) impure {
    if (slice_empty?(in_msg)) {
        return (); 
    }
    int msg_seqno = in_msg~load_uint(32);
    var ds = begin_parse(get_data());
    int stored_seqno = ds~load_uint(32);
    throw_unless(33, msg_seqno == stored_seqno);
}

Π’ slice in_msg bakak ang mensahe nga among gipadala.

Ang una nga butang nga among buhaton mao ang pagsusi kung ang mensahe adunay sulud nga datos, kung wala, dayon kami mogawas.

Sunod among gi-parse ang mensahe. in_msg~load_uint(32) load ang numero 165, 32-bit unsigned int gikan sa gipadala nga mensahe.

Sunod among gi-load ang 32 bits gikan sa smart contract storage. Among susihon nga ang gikarga nga numero motakdo sa gipasa; kon dili, among ihulog ang eksepsiyon. Sa among kaso, tungod kay nagpasa kami sa usa ka non-match, usa ka eksepsiyon ang kinahanglan ilabay.

Karon atong i-compile.

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

Kopyaha ang resulta nga code sa lottery-test-suite.fif, dili kalimot sa pag-ilis sa kataposang linya.

Gisusi namon nga ang pagsulay nakapasar:

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

Dinhi mismo Imong makita ang katugbang nga pasalig sa kasamtangang resulta.

Timan-i nga dili kombenyente ang kanunay nga pagkopya sa nahipos nga code sa usa ka intelihente nga kontrata ngadto sa usa ka file nga adunay mga pagsulay, mao nga magsulat kita og usa ka script nga isulat ang code ngadto sa usa ka kanunay alang kanato, ug atong ikonektar lamang ang naipon nga code sa atong mga pagsulay gamit ang "include".

Paghimo usa ka file sa folder sa proyekto build.sh uban sa mosunod nga sulod.

#!/bin/bash

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

Himoon nato kini nga executable.

chmod +x ./build.sh

Karon, pagdagan lang ang among script aron ma-compile ang kontrata. Apan gawas pa niini, kinahanglan natong isulat kini sa usa ka makanunayon code. Mao nga maghimo kami usa ka bag-ong file lotter-compiled-for-test.fif, nga atong iapil sa file lottery-test-suite.fif.

Atong idugang ang skirpt code sa sh, nga magdoble lang sa giipon nga file sa lotter-compiled-for-test.fif ug usba ang kataposang linya niini.

# 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

Karon, aron masusi, atong padaganon ang resulta nga script ug usa ka file ang mabuhat lottery-compiled-for-test.fif, nga atong ilakip sa atong lottery-test-suite.fif

Π’ lottery-test-suite.fif kuhaa ang code sa kontrata ug idugang ang linya "lottery-compiled-for-test.fif" include.

Naghimo kami mga pagsulay aron masusi kung sila nakapasar.

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

Maayo, karon aron ma-automate ang paglansad sa mga pagsulay, maghimo kita usa ka file test.sh, nga una nga ipatuman build.sh, ug dayon ipadagan ang mga pagsulay.

touch test.sh
chmod +x test.sh

Nagsulat mi sa sulod

./build.sh 

echo "nCompilation completedn"

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

Buhaton nato kini test.sh ug pagdagan kini aron masiguro nga ang mga pagsulay molihok.

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

Gisusi namon nga ang kontrata nag-compile ug ang mga pagsulay gipatuman.

Maayo, karon sa pagsugod test.sh Ang mga pagsulay tigumon ug dagan dayon. Ania ang link sa pasalig.

Okay, sa dili pa kita magpadayon, buhaton nato ang usa pa ka butang alang sa kasayon.

Magbuhat ta ug folder build diin atong tipigan ang gikopya nga kontrata ug ang clone niini nga gisulat ngadto sa usa ka makanunayon lottery-compiled.fif, lottery-compiled-for-test.fif. Magbuhat sab ta ug folder test asa itago ang test file? lottery-test-suite.fif ug posibleng uban pang nagsuporta nga mga file. I-link sa may kalabutan nga mga pagbag-o.

Ipadayon nato ang pagpalambo sa smart contract.

Sunod kinahanglan adunay usa ka pagsulay nga nagsusi nga ang mensahe nadawat ug ang counter gi-update sa tindahan kung ipadala namon ang husto nga numero. Pero ato kanang buhaton unya.

Karon atong hunahunaon kung unsa nga istruktura sa datos ug unsa nga datos ang kinahanglan nga tipigan sa smart contract.

Akong ihulagway ang tanan nga among gitipigan.

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

Sunod kinahanglan nimo nga isulat ang duha ka mga gimbuhaton. Tawgon nato ang una pack_state(), nga mag-pack sa datos alang sa sunod nga pagtipig sa pagtipig sa smart contract. Tawgon nato ang ikaduha unpack_state() magbasa ug magbalik sa datos gikan sa pagtipig.

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

Gidugang namon kining duha ka mga gimbuhaton sa pagsugod sa smart contract. Molampos kini ingon ana intermediate nga resulta.

Aron makatipig sa datos kinahanglan nimo nga tawagan ang built-in nga function set_data() ug kini isulat data gikan sa pack_state() sa intelihenteng pagtipig sa kontrata.

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

Karon nga kita adunay kombenyente nga mga gimbuhaton alang sa pagsulat ug pagbasa sa datos, mahimo na kita magpadayon.

Kinahanglan natong susihon nga ang mensahe nga umaabot gikan sa gawas gipirmahan sa tag-iya sa kontrata (o laing user nga adunay access sa pribadong yawe).

Kung mag-publish kami usa ka smart nga kontrata, mahimo namon nga masugdan kini sa mga datos nga kinahanglan namon sa pagtipig, nga matipig alang sa umaabot nga paggamit. Among irekord ang publikong yawe didto aron among mapamatud-an nga ang umaabot nga mensahe gipirmahan gamit ang katugbang nga pribadong yawe.

Sa dili pa mopadayon, maghimo ta ug pribadong yawe ug isulat kini test/keys/owner.pk. Aron mahimo kini, ilunsad nato ang Fift sa interactive mode ug ipatuman ang upat ka mga sugo.

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

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

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

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

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

Magbuhat ta ug folder keys sulod sa folder test ug isulat ang pribadong yawe didto.

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

Nakita namon ang usa ka file sa kasamtangan nga folder owner.pk.

Gikuha namo ang public key gikan sa stack ug kung gikinahanglan makuha namo kini gikan sa pribado.

Karon kinahanglan namong isulat ang usa ka pag-verify sa pirma. Magsugod ta sa pagsulay. Una among gibasa ang pribadong yawe gikan sa file gamit ang function file>B ug isulat kini sa usa ka variable owner_private_key, unya gamita ang function priv>pub i-convert ang private key ngadto sa public key ug isulat ang resulta sa 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 !

Kinahanglan namon ang duha ka yawe.

Gisugdan namon ang intelihente nga pagtipig sa kontrata nga adunay arbitraryong datos sa parehas nga pagkasunod-sunod sama sa function pack_state()ug isulat kini sa usa ka 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 !

Sunod, maghimo kami usa ka gipirmahan nga mensahe, kini maglangkob lamang sa pirma ug kantidad sa counter.

Una, gimugna namo ang datos nga gusto namong ipadala, dayon gipirmahan namo kini gamit ang pribadong yawe ug sa kataposan makamugna kami og gipirmahan nga mensahe.

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 !  

Ingon usa ka sangputanan, ang mensahe nga among ipadala sa smart nga kontrata natala sa usa ka variable message_to_send, mahitungod sa mga gimbuhaton hashu, ed25519_sign_uint makabasa ka sa Lima ka dokumentasyon.

Ug sa pagdagan sa pagsulay kami nagtawag pag-usab.

message_to_send @ 
recv_external 
code 
storage @
c7
runvmctx

Dinhi Ang file nga adunay mga pagsulay kinahanglan nga ingon niini sa kini nga yugto.

Atong ipahigayon ang pagsulay ug kini mapakyas, mao nga atong usbon ang smart nga kontrata aron kini makadawat sa mga mensahe niini nga format ug mapamatud-an ang pirma.

Una, mag-ihap kita og 512 ka bits sa pirma gikan sa mensahe ug isulat kini ngadto sa usa ka variable, unya mag-ihap kita og 32 ka bits sa counter variable.

Tungod kay kami adunay usa ka function alang sa pagbasa sa mga datos gikan sa intelihenteng pagtipig sa kontrata, among gamiton kini.

Sunod mao ang pagsusi sa counter nga gibalhin sa pagtipig ug pagsusi sa pirma. Kung adunay usa ka butang nga dili motakdo, nan among gilabay ang usa ka eksepsiyon sa angay nga code.

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

May kalabotan nga pasalig dinhi mismo.

Atong sugdan ang mga pagsulay ug tan-awon nga ang ikaduhang pagsulay mapakyas. Sa duha ka rason, walay igong bits sa mensahe ug walay igong bits sa storage, mao nga ang code nahagsa sa dihang nag-parse. Kinahanglan namon nga magdugang usa ka pirma sa mensahe nga among gipadala ug kopyahon ang pagtipig gikan sa katapusan nga pagsulay.

Sa ikaduhang pagsulay, magdugang kami og pirma sa mensahe ug usbon ang smart contract storage. Dinhi ang file nga adunay mga pagsulay sama sa karon.

Magsulat kita og ikaupat nga pagsulay, diin magpadala kita og mensahe nga gipirmahan gamit ang pribadong yawe sa laing tawo. Magbuhat ta og laing pribadong yawe ug i-save kini sa usa ka file not-owner.pk. Atong pirmahan ang mensahe gamit kining pribadong yawe. Atong sugdan ang mga pagsulay ug siguruha nga ang tanan nga mga pagsulay makapasar. Ipasalig Sa pagkakaron.

Karon kita sa katapusan makapadayon sa pagpatuman sa smart contract logic.
Π’ recv_external() kami modawat ug duha ka matang sa mga mensahe.

Tungod kay ang among kontrata magtigum sa mga kapildihan sa mga magdudula, kini nga salapi kinahanglan nga ibalhin sa naghimo sa loterya. Ang adres sa pitaka sa tigbuhat sa loterya girekord sa pagtipig sa dihang gihimo ang kontrata.

Sa kaso lang, gikinahanglan nato ang abilidad sa pag-usab sa adres diin atong ipadala ang mga gramo sa mga napildi. Kinahanglan usab nga kita makapadala sa mga gramo gikan sa loterya ngadto sa adres sa tag-iya.

Magsugod ta sa una. Magsulat una kita og usa ka pagsulay nga magsusi nga human ipadala ang mensahe, ang smart contract nagtipig sa bag-ong adres sa storage. Palihug timan-i nga sa mensahe, dugang sa counter ug sa bag-ong adres, kita usab ipadala action Usa ka 7-bit nga integer nga dili negatibo nga numero, depende niini, pilion namon kung giunsa ang pagproseso sa mensahe sa smart nga kontrata.

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

Sa pagsulay imong makita kung giunsa ang pagtipig sa smartcontract deserialized storage sa Fift. Ang deserialization sa mga variable gihulagway sa dokumentasyon sa Fift.

I-commit ang link uban sa pagdugang sa minasa.

Atong sugdan ang pagsulay ug siguroha nga kini mapakyas. Karon atong idugang ang lohika aron mausab ang adres sa tag-iya sa lottery.

Sa smart nga kontrata nagpadayon kami sa pag-parse message, basaha sa action. Pahinumdoman ta ka nga naa tay duha action: usba ang adres ug ipadala ang mga gramo.

Dayon among gibasa ang bag-ong adres sa tag-iya sa kontrata ug gitipigan kini sa storage.
Gipadagan namo ang mga pagsulay ug nakita nga napakyas ang ikatulo nga pagsulay. Nag-crash kini tungod sa kamatuoran nga ang kontrata karon dugang nga nag-parse sa 7 ka bit gikan sa mensahe, nga nawala sa pagsulay. Idugang ang usa nga wala sa mensahe action. Atong sugdan ang mga pagsulay ug tan-awon nga ang tanan moagi. dinhi pasalig sa mga pagbag-o. Nindot.

Karon atong isulat ang lohika sa pagpadala sa espesipikong gidaghanon sa mga gramo ngadto sa na-save nga adres kaniadto.

Una, magsulat kita og usa ka pagsulay. Magsulat kami og duha ka mga pagsulay, ang usa kung walay igo nga balanse, ang ikaduha kung ang tanan kinahanglan nga malampuson nga moagi. Ang mga pagsulay mahimong tan-awon sa kini nga pasalig.

Karon atong idugang ang code. Una, isulat nato ang duha ka paagi sa katabang. Ang una nga paagi sa pagkuha mao ang pagpangita sa kasamtangan nga balanse sa usa ka smart nga kontrata.

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

Ug ang ikaduha mao ang pagpadala sa mga gramo sa laing smart contract. Hingpit nakong gikopya kini nga pamaagi gikan sa laing smart contract.

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

Atong idugang kining duha ka pamaagi sa smart contract ug isulat ang logic. Una, among gi-parse ang gidaghanon sa mga gramo gikan sa mensahe. Sunod atong susihon ang balanse, kung kini dili igo atong ilabay ang usa ka eksepsiyon. Kung maayo ang tanan, dayon ipadala namon ang mga gramo sa natipig nga adres ug i-update ang counter.

int amount_to_send = message~load_grams();
throw_if(36, amount_to_send + 500000000 > balance());
accept_message();
send_grams(owner_wc, owner_account_id, amount_to_send);
set_data(pack_state(stored_seqno + 1, pubkey, order_seqno, number_of_wins, incoming_amount, outgoing_amount, owner_wc, owner_account_id, orders));

Dinhi murag ang smart contract sa pagkakaron. Atong sugdan ang mga pagsulay ug siguruha nga makapasar sila.

Pinaagi sa dalan, ang usa ka komisyon gikuha gikan sa smart nga kontrata matag higayon alang sa usa ka naproseso nga mensahe. Aron ang mga intelihente nga mga mensahe sa kontrata ipatuman ang hangyo, pagkahuman sa mga sukaranan nga pagsusi kinahanglan nimo nga tawagan accept_message().

Karon magpadayon kita sa internal nga mga mensahe. Sa pagkatinuod, modawat lang kami og gramo ug ipadala pagbalik ang doble sa kantidad ngadto sa magdudula kon siya modaog ug ikatulo sa tag-iya kon siya mapildi.

Una, magsulat kita og usa ka yano nga pagsulay. Aron mahimo kini, kinahanglan namon ang usa ka adres sa pagsulay sa intelihenteng kontrata diin ipadala namon ang mga gramo sa smart nga kontrata.

Ang intelihente nga adres sa kontrata naglangkob sa duha ka numero, usa ka 32-bit integer nga responsable sa workchain ug usa ka 256-bit non-negative nga integer nga talagsaon nga numero sa account sa kini nga workchain. Pananglitan, -1 ug 12345, kini ang adres nga among i-save sa usa ka file.

Gikopya nako ang function alang sa pagtipig sa adres gikan sa 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

Atong tan-awon kung giunsa ang paglihok, maghatag kini usa ka pagsabut kung giunsa ang paglihok sa Fift. Ilunsad ang Fift sa interactive mode.

~/TON/build/crypto/fift -i 

Una atong iduso ang -1, 12345 ug ang ngalan sa umaabot nga file nga "sender.addr" ngadto sa stack:

-1 12345 "sender.addr" 

Ang sunod nga lakang mao ang pagpatuman sa function -rot, nga nagbalhin sa stack sa paagi nga sa ibabaw sa stack adunay usa ka talagsaon nga smart nga numero sa kontrata:

"sender.addr" -1 12345

256 u>B nag-convert sa 256-bit non-negative integer ngadto sa bytes.

"sender.addr" -1 BYTES:0000000000000000000000000000000000000000000000000000000000003039

swap gibaylo ang nag-una nga duha ka elemento sa stack.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 -1

32 i>B nag-convert sa 32-bit integer ngadto sa bytes.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 BYTES:FFFFFFFF

B+ nagkonektar sa duha ka han-ay sa bytes.

 "sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF

Pag-usab swap.

BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF "sender.addr" 

Ug sa katapusan ang mga byte gisulat sa file B>file. Human niini walay sulod ang among stack. Nihunong mi Fift. Usa ka file ang nahimo sa kasamtangan nga folder sender.addr. Atong ibalhin ang file sa gihimo nga folder test/addresses/.

Magsulat kita usa ka yano nga pagsulay nga magpadala mga gramo sa usa ka intelihenteng kontrata. Ania ang pasalig.

Karon atong tan-awon ang lohika sa loterya.

Ang una natong buhaton mao ang pagsusi sa mensahe bounced o dili kung bounced, unya ato kining gibaliwala. bounced nagpasabot nga ang kontrata ibalik ang mga gramo kung adunay mahitabo nga sayup. Dili namo ibalik ang mga gramo kung adunay kalit nga mahitabo.

Atong susihon, kung ang balanse dili moubos sa tunga sa gramo, unya dawaton lang nato ang mensahe ug ibaliwala kini.

Sunod, among gi-parse ang adres sa smart contract diin gikan ang mensahe.

Gibasa namon ang datos gikan sa pagtipig ug dayon gitangtang ang mga daan nga pusta gikan sa kasaysayan kung adunay sobra sa kawhaan niini. Alang sa kasayon, nagsulat ako og tulo ka dugang nga mga gimbuhaton pack_order(), unpack_order(), remove_old_orders().

Sunod, atong tan-awon kung ang balanse dili igo alang sa pagbayad, unya atong hunahunaon nga kini dili usa ka pusta, apan usa ka pagpuno ug i-save ang pagpuno sa orders.

Unya sa katapusan ang esensya sa smart nga kontrata.

Una, kung mapildi ang magdudula, gitipigan namon kini sa kasaysayan sa pagpusta ug kung ang kantidad labaw pa sa 3 gramo, ipadala namon ang 1/3 sa tag-iya sa smart nga kontrata.

Kung ang magdudula makadaog, dayon ipadala namon ang doble nga kantidad sa adres sa magdudula ug dayon i-save ang kasayuran bahin sa pusta sa kasaysayan.

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

Kana tanan. Katugbang nga pasalig.

Karon ang tanan nga nahabilin yano ra, maghimo kita og mga pamaagi sa pagkuha aron makakuha kita og kasayuran bahin sa kahimtang sa kontrata gikan sa gawas sa kalibutan (sa tinuud, basaha ang datos gikan sa ilang pagtipig sa smart contract).

Atong idugang ang get method. Isulat namon sa ubos kung giunsa pagdawat ang kasayuran bahin sa usa ka intelihenteng kontrata.

Nakalimot usab ko sa pagdugang sa code nga magproseso sa pinakaunang hangyo nga mahitabo sa dihang mag-publish ug smart contract. Katugbang nga pasalig. Ug dugang pa gitul-id bug sa pagpadala sa 1/3 sa kantidad sa account sa tag-iya.

Ang sunod nga lakang mao ang pagmantala sa smart contract. Magbuhat ta ug folder requests.

Gikuha nako ang code sa publikasyon isip basehan simple-wallet-code.fc nga makapangita sa opisyal nga repositoryo.

Usa ka butang nga angay hatagan ug pagtagad. Naghimo kami usa ka intelihente nga pagtipig sa kontrata ug usa ka mensahe sa input. Human niini, ang adres sa smart nga kontrata nahimo, nga mao, ang adres nahibal-an bisan sa wala pa imantala sa TON. Pagkahuman kinahanglan nimo nga magpadala daghang mga gramo sa kini nga adres, ug pagkahuman kinahanglan nimo magpadala usa ka file nga adunay kaugalingon nga smart contract, tungod kay ang network nagkuha usa ka komisyon alang sa pagtipig sa intelihente nga kontrata ug mga operasyon niini (mga validator nga nagtipig ug nagpatuman sa mga smart nga kontrata. ). Ang code mahimong tan-awon dinhi.

Sunod among ipatuman ang code sa pagmantala ug makuha lottery-query.boc smart contract file ug address.

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

Ayaw kalimti nga i-save ang nahimo nga mga file: lottery-query.boc, lottery.addr, lottery.pk.

Lakip sa ubang mga butang, atong makita ang adres sa smart contract sa execution logs.

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

Para lingaw lang, mangayo ta ni TON

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

Ug atong makita nga ang account nga adunay kini nga adres walay sulod.

account state is empty

Atong ipadala sa adres 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd 2 Gram ug pagkahuman sa pipila ka segundo gipatuman namon ang parehas nga mando. Sa pagpadala sa mga gramo akong gigamit opisyal nga pitaka, ug makapangutana ka sa usa ka tawo gikan sa chat alang sa mga gramo sa pagsulay, nga akong hisgutan sa katapusan sa artikulo.

> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Murag uninitialized (state:account_uninit) usa ka intelihente nga kontrata nga adunay parehas nga adres ug balanse nga 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

Karon atong imantala ang smart contract. Atong ilunsad ang lite-client ug i-execute.

> 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 

Atong susihon nga ang kontrata napublikar na.

> last
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Lakip sa ubang mga butang nga atong makuha.

  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

Atong makita kana account_active.

Katugbang nga pasalig sa mga pagbag-o dinhi mismo.

Karon maghimo kita og mga hangyo aron makig-uban sa smart nga kontrata.

Sa mas tukma, biyaan namo ang una alang sa pag-usab sa adres isip usa ka independenteng trabaho, ug among buhaton ang ikaduha alang sa pagpadala sa mga gramo sa adres sa tag-iya. Sa tinuud, kinahanglan naton buhaton ang parehas nga butang sama sa pagsulay sa pagpadala sa mga gramo.

Kini ang mensahe nga among ipadala sa smart contract, diin msg_seqno 165, action 2 ug 9.5 gramos alang sa pagpadala.

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

Ayaw kalimti ang pagpirma sa mensahe gamit ang imong pribadong yawe lottery.pk, nga namugna sa sayo pa sa paghimo sa smart contract. Ania ang katugbang nga pasalig.

Pagdawat og impormasyon gikan sa usa ka smart contract gamit ang get method

Karon tan-awon naton kung giunsa ang pagpadagan sa mga pamaagi sa pagkuha sa smart contract.

Paglusad lite-client ug pagdagan ang get method nga among gisulat.

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

Π’ result naglangkob sa kantidad nga gibalik sa function balance() gikan sa among smart contract.
Buhaton usab namo ang sama sa daghang mga pamaagi.

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

Mangutana ta sa imong kasaysayan sa pusta.

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

Magamit namon ang lite-client ug makakuha mga pamaagi aron ipakita ang kasayuran bahin sa intelihenteng kontrata sa site.

Pagpakita sa datos sa intelihente nga kontrata sa website

Nagsulat ako usa ka yano nga website sa Python aron ipakita ang datos gikan sa smart contract sa usa ka kombenyente nga paagi. Dinhi dili ako maghisgot niini sa detalye ug imantala ang site sa usa ka pasalig.

Ang mga hangyo sa TON gihimo gikan sa Python sa panabang lite-client. Alang sa kasayon, ang site giputos sa Docker ug gipatik sa Google Cloud. Link.

Naningkamot

Karon atong sulayan nga ipadala ang mga gramo didto alang sa pagpuno gikan sa pitaka. Magpadala kami ug 40 gramos. Ug maghimo kita og duha ka pusta para sa katin-awan. Nakita namon nga gipakita sa site ang kasaysayan sa mga pusta, ang karon nga porsyento sa kadaugan ug uban pang mapuslanon nga kasayuran.

Kita natonnga midaog kami sa una, napildi sa ikaduha.

Pagkahuman

Ang artikulo nahimo nga labi ka taas kaysa sa akong gilauman, tingali kini mahimong mas mubo, o tingali alang lamang sa usa ka tawo nga wala’y nahibal-an bahin sa TON ug gusto nga magsulat ug magmantala sa usa ka dili kaayo yano nga smart nga kontrata nga adunay kaarang nga makig-uban. kini. Tingali ang pipila ka mga butang mahimong ipasabut nga mas yano.

Tingali ang pipila ka mga aspeto sa pagpatuman mahimo unta nga mas episyente ug elegante, apan kinahanglan pa nga magkinahanglan og dugang nga panahon sa pag-andam sa artikulo. Posible usab nga nasayop ko sa usa ka dapit o wala makasabut sa usa ka butang, mao nga kung ikaw adunay gibuhat nga seryoso, kinahanglan ka nga mosalig sa opisyal nga dokumentasyon o sa opisyal nga repository nga adunay TON code.

Kinahanglan nga matikdan nga tungod kay ang TON mismo anaa pa sa aktibong yugto sa pag-uswag, ang mga pagbag-o mahimong mahitabo nga makaguba sa bisan unsang mga lakang niini nga artikulo (nga nahitabo samtang ako nagsulat, kini natul-id na), apan ang kinatibuk-ang pamaagi mao ang dili tingali mausab.

Dili ko maghisgot bahin sa kaugmaon sa TON. Tingali ang plataporma mahimong usa ka butang nga dako ug kinahanglan naton nga mogahin ug oras sa pagtuon niini ug pun-on ang usa ka niche sa atong mga produkto karon.

Anaa usab ang Libra gikan sa Facebook, nga adunay potensyal nga mamiminaw sa mga tiggamit nga mas dako kaysa TON. Halos wala ako nahibal-an bahin sa Libra, kung gihukman sa forum adunay daghang kalihokan didto kaysa sa komunidad sa TON. Bisan kung ang mga developer ug komunidad sa TON mas sama sa ilawom sa yuta, nga cool usab.

mga pakisayran

  1. Opisyal nga dokumentasyon sa TON: https://test.ton.org
  2. Opisyal nga TON repository: https://github.com/ton-blockchain/ton
  3. Opisyal nga pitaka alang sa lainlaing mga plataporma: https://wallet.ton.org
  4. Smart contract repository gikan niini nga artikulo: https://github.com/raiym/astonished
  5. Pag-link sa website sa smart contract: https://ton-lottery.appspot.com
  6. Repository alang sa extension alang sa Visual Studio Code alang sa FunC: https://github.com/raiym/func-visual-studio-plugin
  7. Pag-chat bahin sa TON sa Telegram, nga nakatabang gyud nga mahibal-an kini sa una nga yugto. Sa akong hunahuna dili kini usa ka sayup kung ako moingon nga ang tanan nga nagsulat alang sa TON naa. Mahimo ka usab mangayo alang sa pagsulay nga mga gramo didto. https://t.me/tondev_ru
  8. Laing chat bahin sa TON diin nakit-an nako ang mapuslanon nga kasayuran: https://t.me/TONgramDev
  9. Unang yugto sa kompetisyon: https://contest.com/blockchain
  10. Ikaduha nga yugto sa kompetisyon: https://contest.com/blockchain-2

Source: www.habr.com

Idugang sa usa ka comment