Nezve manyorero uye kuburitsa smart kontrakiti muTON
Nyaya iyi ndeyei?
Muchinyorwa ini ndichataura nezve matorero andakaita mumakwikwi ekutanga (evaviri) eTeregiramu blockchain, haana kutora mubairo, uye ndakafunga kurekodha ruzivo rwangu mune chinyorwa kuti chirege kunyura mukukanganisika uye, pamwe, kubatsira. mumwe munhu.
Sezvo ndakanga ndisingadi kunyora abstract code, asi kuti ndiite chimwe chinhu chinoshanda, nokuda kwechinyorwa chandakanyora chibvumirano chekuchenjera chelottery yekukurumidza uye webhusaiti inoratidza ruzivo rwechibvumirano chakangwara kubva kuTON pasina kushandisa kuchengetedza kwepakati.
Chinyorwa chichabatsira kune avo vanoda kuita yavo yekutanga smart kontrakiti muTON, asi vasingazive pekutangira.
Ndichishandisa lottery semuenzaniso, ini ndichabva pakuisa nharaunda kusvika pakuburitsa smart kontrakiti, kushamwaridzana nayo, nekunyora webhusaiti yekugamuchira uye kuburitsa data.
Nezvekupinda mumakwikwi
Gumiguru apfuura, Teregiramu yakazivisa makwikwi e blockchain nemitauro mitsva Fift
ΠΈ FunC
. Zvaive zvakakodzera kuti usarudze kubva pakunyora chero chezvibvumirano zvishanu zvakarongwa zvine hungwaru. Ndakafunga kuti zvingava zvakanaka kuita chimwe chinhu chakasiyana, kudzidza mutauro uye kuita chimwe chinhu, kunyange kana ndisingafaniri kunyora chimwe chinhu mune ramangwana. Uyezve, musoro wacho unogara uri pamiromo.
Zvakakodzera kutaura kuti ndakanga ndisina ruzivo rwekugadzira zvibvumirano zvakangwara.
Ndakaronga kutora rutivi kusvikira kumugumo chaiko kutozosvikira ndagona ndokuzonyora chinyorwa chehwirudzuro, asi ndakakundikana pakarepo pane yokutanga. I FunC
uye zvaiwanzoshanda. Ndakazvitora sehwaro
Panguva iyoyo, ndaifunga kuti izvi zvakanga zvakakwana kuti nditore imwe nzvimbo yemubayiro. Somugumisiro, vanenge 40 muvatori vechikamu 60 vakava vahwina mibayiro uye ini ndakanga ndisiri pakati pavo. Kazhinji, hapana chakaipa neizvi, asi chimwe chinhu chakandinetsa. Panguva yekuziviswa kwemigumisiro, kuongororwa kwekuedzwa kwekontrakiti yangu kwakanga kusati kwaitwa, ndakabvunza vatori vechikamu muhurukuro kana paiva nemumwe munhu asina, pakanga pasina.
Sezviri pachena ndichiteerera mameseji angu, mazuva maviri gare gare vatongi vakaburitsa chirevo uye ini handisati ndanzwisisa kuti vakapotsa netsaona kondirakiti yangu yakangwara panguva yekutonga kana kungofunga kuti yaive yakaipa zvekuti yaisada mhinduro. Ndakabvunza mubvunzo papeji, asi handina kuwana mhinduro. Kunyangwe chisiri chakavanzika kuti ndiani anotonga, ndakazviona zvisina basa kunyora mameseji ega.
Nguva yakawanda yakashandiswa pakunzwisisa, saka zvakasarudzwa kunyora chinyorwa. Sezvo kusati kwave neruzivo rwakawanda, chinyorwa ichi chichabatsira kuchengetedza nguva kune wese anofarira.
Pfungwa yezvibvumirano zvakangwara muTON
Usati wanyora chero chinhu, iwe unofanirwa kufunga kuti ndeupi rutivi rwekusvika chinhu ichi kubva. Naizvozvo, ikozvino ini ndichakuudza kuti ndedzipi zvikamu iyo system ine. Kunyanya, ndezvipi zvikamu zvaunoda kuziva kuti unyore ingangoita imwe mhando yekontrakiti yekushanda.
Tichatarisa pakunyora kontrakiti yakangwara uye kushanda nayo TON Virtual Machine (TVM)
, Fift
ΠΈ FunC
, saka chinyorwa chakanyanya kufanana netsanangudzo yekuvandudzwa kwechirongwa chenguva dzose. Isu hatizogara pamusoro pekuti chikuva pachacho chinoshanda sei pano.
In general nezve kuti inoshanda sei TVM
uye mutauro Fift
pane zvakanaka zvinyorwa zvepamutemo. Ndichitora chikamu mumakwikwi uye zvino ndichinyora chibvumirano chazvino, ndaiwanzotendeukira kwaari.
Mutauro mukuru unonyorwa zvibvumirano zvakangwara ndewe FunC
. Iko hakuna zvinyorwa pairi panguva ino, saka kuti unyore chimwe chinhu iwe unofanirwa kudzidza mienzaniso yeakangwara zvibvumirano kubva kune yepamutemo repository uye kuitiswa kwemutauro pachayo ipapo, uye iwe unogona kutarisa mienzaniso yezvibvumirano zvakangwara kubva kune maviri apfuura. makwikwi. Links pakupera kwechinyorwa.
Ngatitii takatonyora kondirakiti yakangwara ye FunC
, mushure mezvo isu tinonyora kodhi muFift assembler.
Iyo yakabatanidzwa smart kontrakiti inoramba ichiburitswa. Kuti uite izvi unofanirwa kunyora basa mukati Fift
, iyo inotora iyo smart kontrakiti kodhi uye mamwe ma paramita sekuisa, uye inobuda ichava faira ine kuwedzera. .boc
(zvinoreva "bhegi remasero"), uye, zvichienderana nemanyorero atinoita, kiyi yega yega nekero, iyo inogadzirwa zvichienderana nekodhi yekontrakiti yakangwara. Iwe unogona kutotumira magiramu kukero yekontrakiti yakangwara iyo isati yaburitswa.
Kuburitsa smart kontrakiti muTON yakagamuchirwa .boc
iyo faira inoda kutumirwa ku blockchain uchishandisa mwenje mutengi (zvimwe pane izvo pazasi). Asi usati washambadzira, unofanirwa kuendesa magiramu kukero yakagadzirwa, zvikasadaro smart contract haizoburitswa. Mushure mekudhindwa, unogona kutaurirana nekontrakiti yakangwara nekuitumira mameseji kubva kunze (somuenzaniso, uchishandisa mutengi wechiedza) kana kubva mukati (somuenzaniso, imwe smart contract inotumira imwe meseji mukati meTON).
Kana tikangonzwisisa kuti kodhi inoburitswa sei, zvinova nyore. Isu tinoziva zvatinoda kunyora uye kuti chirongwa chedu chichashanda sei. Uye tichinyora, tinotarisa kuti izvi zvakatoitwa sei mumakondirakiti aripo akangwara, kana isu tinotarisa mukodhi yekushandisa Fift
ΠΈ FunC
mune yepamutemo repository, kana tarisa mune zviri pamutemo zvinyorwa.
Nguva zhinji ndaitsvaga mazwi akakosha mukukurukurirana kweTeregiramu kwakaungana vese vatori vemakwikwi nevashandi veTeregiramu, uye zvakaitika kuti panguva yemakwikwi munhu wese akaungana ipapo ndokutanga kukurukura nezveFift neFunC. Link panoperera chinyorwa.
Yave nguva yekusimuka kubva padzidziso kuenda kukudzidzira.
Kugadzirira nharaunda yekushanda neTON
Ndakaita zvese zvichatsanangurwa muchinyorwa paMacOS uye kaviri-ndakatarisa mukati yakachena Ubuntu 18.04 LTS paDocker.
Chinhu chekutanga chaunofanirwa kuita kurodha uye kuisa lite-client
iyo yaunogona kutumira nayo zvikumbiro kuTON.
Mirayiridzo iri pawebhusaiti yepamutemo inotsanangura maitiro ekuisa mune zvakadzama uye zvakajeka uye inosiya zvimwe zvinhu. Pano isu tinotevera mirairo, tichiisa zvisizvo zvinotsamira munzira. Ini handina kuunganidza purojekiti yega yega uye ndakaiswa kubva kune yepamutemo Ubuntu repository (paMacOS yandaishandisa 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
Kana zvese zvinotsamira zvaiswa iwe unogona kuisa lite-client
, Fift
, FunC
.
Chekutanga, isu tinogadzirisa iyo TON repository pamwe chete nekutsamira kwayo. Kuti zvive nyore, tichaita zvese mune folda ~/TON
.
cd ~/TON
git clone https://github.com/ton-blockchain/ton.git
cd ./ton
git submodule update --init --recursive
Iyo repository inochengetawo kuita Fift
ΠΈ FunC
.
Iye zvino tagadzirira kuunganidza chirongwa. Iyo repository kodhi inogadzirwa kuita folda ~/TON/ton
. The ~/TON
gadzira folda build
uye unganidza purojekiti mairi.
mkdir ~/TON/build
cd ~/TON/build
cmake ../ton
Sezvo tichizonyora chibvumirano chakangwara, hatidi chete lite-client
asi Fift
Ρ FunC
, saka ngatiunganidze zvese. Haisi kukurumidza kuita, saka takamirira.
cmake --build . --target lite-client
cmake --build . --target fift
cmake --build . --target func
Tevere, dhawunirodha iyo faira yekumisikidza iyo ine data nezve node kwairi lite-client
ichabatana.
wget https://test.ton.org/ton-lite-client-test1.config.json
Kuita zvikumbiro zvekutanga kuTON
Zvino ngatitangei lite-client
.
cd ~/TON/build
./lite-client/lite-client -C ton-lite-client-test1.config.json
Kana iyo kuvaka yakabudirira, saka mushure mekutangisa iwe uchaona danda rekubatanidza kwemwenje mutengi kune 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)
...
Unogona kumhanya kuraira help
uye ona mirairo iripo.
help
Ngatinyorei mirairo yatichashandisa munyaya ino.
list of available commands:
last Get last block and state info from server
sendfile <filename> Load a serialized message from <filename> and send it to server
getaccount <addr> [<block-id-ext>] Loads the most recent state of specified account; <addr> is in [<workchain>:]<hex-or-base64-addr> format
runmethod <addr> [<block-id-ext>] <method-id> <params>... Runs GET method <method-id> of account <addr> with specified parameters
last ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Π±Π»ΠΎΠΊ Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°.
sendfile <filename> ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π² TON ΡΠ°ΠΉΠ» Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΠΌ, ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΏΡΠ±Π»ΠΈΠΊΡΠ΅ΡΡΡ ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ ΠΈ Π·Π°ΠΏΡΡΠΎΡΡ ΠΊ Π½Π΅ΠΌΡ.
getaccount <addr> Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ ΡΠ΅ΠΊΡΡΠ΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ° Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΌ Π°Π΄ΡΠ΅ΡΠΎΠΌ.
runmethod <addr> [<block-id-ext>] <method-id> <params> Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ get-ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΠΌΠ°ΡΡΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ°.
Iye zvino takagadzirira kunyora kondirakiti pachayo.
Kutevedzera
Idea
Sezvandanyora pamusoro, kondirakiti yakangwara yatiri kunyora irotari.
Uyezve, iyi haisi lottery yaunoda kutenga tikiti uye kumirira awa, zuva kana mwedzi, asi pakarepo iyo mushandisi anoendesa kukero yechibvumirano. N
magiramu, uye ipapo anoitora zvakare 2 * N
magiramu kana kurasikirwa. Tichaita mukana wekuhwina angangoita 40%. Kana pasina magiramu akakwana ekubhadhara, saka isu tichaona kutengeserana seyepamusoro-kumusoro.
Uyezve, zvakakosha kuti mabheti aonekwe munguva chaiyo uye mune fomu iri nyore, kuitira kuti mushandisi anzwisise nekukurumidza kana akahwina kana kurasikirwa. Naizvozvo, iwe unofanirwa kugadzira webhusaiti inoratidza mabheti uye mhedzisiro zvakananga kubva kuTON.
Kunyora chibvumirano chakangwara
Kuti zvive nyore, ndakasimbisa kodhi yeFunC; iyo plugin inogona kuwanikwa uye kuiswa muVisual Studio Code yekutsvaga; kana iwe ukangoerekana wada kuwedzera chimwe chinhu, ndaita kuti plugin iwanikwe pachena. Zvakare, mumwe munhu akambogadzira plugin yekushanda neFift, unogona zvakare kuiisa uye kuiwana muVSC.
Ngatitangei nekukasika repository apo isu tichaisa mhedzisiro yepakati.
Kuita kuti hupenyu hwedu huve nyore, tichanyora kontrakiti yakangwara uye toiedza munharaunda kusvika yagadzirira. Chete mushure meizvozvo tichazviburitsa muTON.
Chibvumirano chakangwara chine nzira mbiri dzekunze dzinogona kuwanikwa. Chekutanga, recv_external()
basa iri rinoitwa kana chikumbiro chechibvumirano chichibva kunze kwenyika, kureva, kwete kubva kuTON, semuenzaniso, isu pachedu patinenge tichigadzira meseji uye tinoitumira kuburikidza ne-lite-client. Chepiri, recv_internal()
iyi ndiyo apo, mukati meTON pachayo, chero kontrakiti inoreva yedu. Muzviitiko zvese izvi, unogona kupfuudza paramita kune basa.
Ngatitangei nemuenzaniso wakapfava unozoshanda kana ukadhindwa, asi hapana basa rekuita mariri.
() recv_internal(slice in_msg) impure {
;; TODO: implementation
}
() recv_external(slice in_msg) impure {
;; TODO: implementation
}
Pano tinofanira kutsanangura kuti chii slice
. Yese data yakachengetwa muTON Blockchain muunganidzwa TVM cell
kana kungoita cell
, musero yakadaro unogona kuchengeta kusvika ku1023 bits yedata uye kusvika ku 4 links kune mamwe masero.
TVM cell slice
kana slice
ichi chikamu cheiyo iripo cell
inoshandiswa kuitsanangura, inozobuda pachena gare gare. Chinhu chikuru kwatiri ndechekuti tinokwanisa kutamisa slice
uye zvichienderana nerudzi rwemeseji, gadzira iyo data mukati recv_external()
kana recv_internal()
.
impure
-izwi rinokosha rinoratidza kuti basa racho rinoshandura data rechibvumirano chekuchenjera.
Ngatichengetedzei kodhi yekondirakiti mukati lottery-code.fc
uye unganidza.
~/TON/build/crypto/func -APSR -o lottery-compiled.fif ~/TON/ton/crypto/smartcont/stdlib.fc ./lottery-code.fc
Zvinoreva mireza zvinogona kutariswa uchishandisa murairo
~/TON/build/crypto/func -help
Isu takanyora Fift assembler kodhi mukati 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
Inogona kutangwa munharaunda, nekuda kweizvi tichagadzirira zvakatipoteredza.
Ziva kuti mutsara wekutanga unobatanidza Asm.fif
, iyi kodhi yakanyorwa muFift yeFift assembler.
Sezvo isu tichida kumhanya uye kuyedza smart kontrakiti munharaunda, isu tichagadzira faira lottery-test-suite.fif
uye kukopa kodhi yakabatanidzwa ipapo, ichitsiva mutsara wekupedzisira mairi, iyo inonyora yakangwara kodhi kodhi kune imwe nguva code
kuti wozoiendesa kumuchina chaiwo:
"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
Parizvino zvinoita sezviri pachena, ikozvino ngatiwedzerei kune imwechete faira iyo kodhi yatichashandisa kuvhura 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
isu tinorekodha mamiriro, ndiko kuti, iyo data iyo iyo TVM (kana network network) ichavhurwa. Kunyangwe panguva yemakwikwi, mumwe wevagadziri akaratidza nzira yekugadzira c7
uye ndakakopa. Munyaya ino tingada kuchinja rand_seed
sezvo chizvarwa chenhamba isina kurongeka inotsamira pairi uye kana isina kuchinjwa, nhamba imwe cheteyo inodzoserwa nguva dzose.
recv_internal
ΠΈ recv_external
maconstants ane kukosha 0 uye -1 achave nebasa rekudaidza mabasa anoenderana muchibvumirano chakangwara.
Iye zvino tagadzirira kugadzira bvunzo yekutanga kune yedu isina chinhu smart kontrakiti. Kuti zvive pachena, ikozvino tichawedzera bvunzo dzese kune imwechete faira lottery-test-suite.fif
.
Ngatigadzire shanduko storage
uye nyora isina chinhu mairi cell
, iyi ichava smart contract storage.
message
Iyi ndiyo meseji yatinozoendesa kune yakangwara kuonana kubva kunze. Tichaitawo kuti ive isina chinhu ikozvino.
variable storage
<b b> storage !
variable message
<b b> message !
Mushure mekunge tagadzirira zvinogara uye zvinosiyana, tinotanga TVM tichishandisa murairo runvmctx
uye pfuudza iyo yakagadzirwa parameter kune yekuisa.
message @
recv_external
code
storage @
c7
runvmctx
Pakupedzisira tichabudirira Fift
.
Iye zvino tinogona kumhanyisa kodhi inobuda.
export FIFTPATH=~/TON/ton/crypto/fift/lib // Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Π΄Π»Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²Π°
~/TON/build/crypto/fift -s lottery-test-suite.fif
Iyo purogiramu inofanira kushanda isina zvikanganiso uye mune zvakabuda tichaona danda rekuuraya:
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
Zvakanaka, isu takanyora yekutanga kushanda shanduro yekontrakiti yakangwara.
Zvino tinofanira kuwedzera kushanda. Chekutanga ngatibatanei nemameseji anobva kunze kwenyika kuenda recv_external()
Mugadziri pachake anosarudza fomati yemeseji iyo kontrakiti inogona kugamuchira.
Asi kazhinji
- chekutanga, tinoda kuchengetedza kontrakiti yedu kubva kune imwe nyika uye kuigadzira kuitira kuti chete muridzi wekontrakiti anogona kutumira mameseji ekunze kwairi.
- chechipiri, patinotumira shoko rakakodzera kuTON, tinoda kuti izvi zviitike kamwe chete uye patinotumira shoko rimwe chete zvakare, chibvumirano chekuchenjera chinochiramba.
Saka dzinenge chibvumirano chega chega chinogadzirisa matambudziko maviri aya, sezvo kondirakiti yedu ichitambira mameseji ekunze, isu tinofanirwa kuzvitarisirawo.
Tichazviita munhevedzano. Kutanga, ngatigadzirise dambudziko nekudzokorora; kana kontrakiti yakatogamuchira meseji yakadaro uye yakagadziridzwa, haizoite kechipiri. Uye ipapo isu tichagadzirisa dambudziko kuitira kuti chete denderedzwa revanhu rinogona kutumira mameseji kune smart kontrakiti.
Pane nzira dzakasiyana dzekugadzirisa dambudziko neduplicate meseji. Heano maitiro atichaita. Muchibvumirano chekuchenjera, tinotanga counter yemashoko akagamuchirwa nehuwandu hwekutanga 0. Mumashoko ega ega kune smart contract, tichawedzera ikozvino counter value. Kana iyo counter value iri mumeseji isingaenderane nekukosha kuri muchibvumirano chakangwara, saka isu hatizvigadzirise; kana zvikadaro, tobva tazvigadzirisa uye towedzera counter muchibvumirano chakangwara ne1.
Ngatidzokere ku lottery-test-suite.fif
uye wedzera bvunzo yechipiri kwairi. Kana tikatumira nhamba isiriyo, kodhi yacho inofanira kusiya imwe. Semuyenzaniso, rega kondirakiti data ichengete 166, uye isu tichatumira 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"
Ngatitangei.
~/TON/build/crypto/fift -s lottery-test-suite.fif
Uye isu tichaona kuti bvunzo inoitwa nekukanganisa.
[ 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
Panguva ino lottery-test-suite.fif
inofanira kutaridzika
Zvino ngatiwedzerei counter logic kune smart kontrakiti mukati 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
nhema meseji yatinotumira.
Chinhu chekutanga chatinoita kutarisa kana meseji ine data, kana zvisiri, tobva tabuda.
Tevere tinoparadzira meseji. in_msg~load_uint(32)
inotakura nhamba 165, 32-bit unsigned int
kubva kune meseji yakatumirwa.
Tevere tinotakura 32 bits kubva kune smart contract kuchengetedza. Isu tinotarisa kuti nhamba yakatakurwa inoenderana neyapfuura; kana zvisiri, tinokanda mutsauko. Kwatiri isu, sezvo isu tichipfuura isingaite, kusarudzika kunofanirwa kukandwa.
Zvino ngatiunganidzei.
~/TON/build/crypto/func -APSR -o lottery-compiled.fif ~/TON/ton/crypto/smartcont/stdlib.fc ./lottery-code.fc
Kopira kodhi yabuda ku lottery-test-suite.fif
, tisingakanganwi kutsiva mutsara wekupedzisira.
Tinotarisa kuti bvunzo yakapfuura:
~/TON/build/crypto/fift -s lottery-test-suite.fif
Ziva kuti hazviitike kugara uchikopa kodhi yakaunganidzwa yekontrakiti yakangwara mufaira ine bvunzo, saka isu tichanyora script inozonyora iyo kodhi mune yenguva dzose kwatiri, uye isu tichangobatanidza iyo yakaunganidzwa kodhi kumiedzo yedu tichishandisa. "include"
.
Gadzira faira mufolda yeprojekiti build.sh
nezvinotevera zvirimo.
#!/bin/bash
~/TON/build/crypto/func -SPA -R -o lottery-compiled.fif ~/TON/ton/crypto/smartcont/stdlib.fc ./lottery-code.fc
Ngatiite kuti iite executable.
chmod +x ./build.sh
Iye zvino, ingomhanya script yedu kuunganidza kontrakiti. Asi kunze kweizvi, isu tinofanirwa kuinyora mune inongogara code
. Saka isu tichagadzira faira idzva lotter-compiled-for-test.fif
, yatichaisa mufaira lottery-test-suite.fif
.
Ngatiwedzerei skirpt kodhi kune sh, iyo inongodzokorora iyo yakaunganidzwa faira mukati lotter-compiled-for-test.fif
uye shandura mutsara wekupedzisira mairi.
# 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
Zvino, kuti titarise, ngatimhanyei mhedzisiro script uye faira richagadzirwa lottery-compiled-for-test.fif
, izvo zvatichabatanidza mune yedu lottery-test-suite.fif
Π lottery-test-suite.fif
bvisa kodhi yekondirakiti uye wedzera mutsara "lottery-compiled-for-test.fif" include
.
Tinoita bvunzo kuona kuti vakapasa.
~/TON/build/crypto/fift -s lottery-test-suite.fif
Hukuru, ikozvino kuitisa kutangwa kwebvunzo, ngatigadzire faira test.sh
, iyo inotanga kuita build.sh
, wobva wamhanya ma test.
touch test.sh
chmod +x test.sh
Tinonyora mukati
./build.sh
echo "nCompilation completedn"
export FIFTPATH=~/TON/ton/crypto/fift/lib
~/TON/build/crypto/fift -s lottery-test-suite.fif
Ngatizviite test.sh
uye imhanye kuti uone kuti bvunzo dzinoshanda.
chmod +x ./test.sh
./test.sh
Isu tinotarisa kuti kontrakiti inounganidza uye bvunzo dzinoitwa.
Zvakanaka, ikozvino panotanga test.sh
Iwo maedzo anozounganidzwa oitwa nekukasika. Heino link ye
Zvakanaka, tisati taenderera mberi, ngatiitei chimwezve chinhu kuti tive nyore.
Ngatigadzire folda build
kwatinozochengeta kondirakiti yakakopwa uye clone yayo yakanyorwa kuita nguva dzose lottery-compiled.fif
, lottery-compiled-for-test.fif
. Ngatigadzirireiwo folda test
iyo test file ichachengetwa kupi? lottery-test-suite.fif
uye pamwe nemamwe mafaira anotsigira.
Ngatirambei tichigadzira kondirakiti yakangwara.
Tevere panofanirwa kuve nemuyedzo unotarisa kuti meseji yakagamuchirwa here uye iyo counter inogadziridzwa muchitoro patinotumira nhamba chaiyo. Asi tichazviita gare gare.
Iye zvino ngatifungei nezve chimiro che data uye kuti ndeipi data inoda kuchengetwa muchibvumirano chakangwara.
Ini ndichatsanangura zvese zvatinochengeta.
`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` ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠΈΠΏΠ° ΡΠ»ΠΎΠ²Π°ΡΡ, Ρ
ΡΠ°Π½ΠΈΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π΄Π²Π°Π΄ΡΠ°ΡΡ ΡΡΠ°Π²ΠΎΠΊ.
Next unofanira kunyora mabasa maviri. Ngatishevedze wekutanga pack_state()
, iyo inotakura iyo data yekuzotevera kuchengetedza mune smart kontrakiti yekuchengetedza. Ngatishevedze wechipiri unpack_state()
achaverenga uye kudzosa data kubva mudura.
_ 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;
}
Isu tinowedzera aya maviri mabasa pakutanga kwechibvumirano chakangwara. Zvichashanda
Kuti uchengetedze data iwe uchafanirwa kufonera yakavakirwa-mukati basa set_data()
uye ichanyora data kubva pack_state()
mune smart contract storage.
cell packed_state = pack_state(arg_1, .., arg_n);
set_data(packed_state);
Iye zvino zvatine mabasa ari nyore ekunyora nekuverenga data, tinogona kuenderera mberi.
Isu tinofanirwa kutarisa kuti meseji inouya kubva kunze yakasainwa nemuridzi wekondirakiti (kana mumwe mushandisi anokwanisa kuwana kiyi yakavanzika).
Patinoburitsa kontrakiti yakangwara, tinogona kuitanga nedata ratinoda mukuchengetedza, iro rinozochengetwa kuti rizoshandiswa mune ramangwana. Isu ticharekodha kiyi yeruzhinji ipapo kuti tigone kuona kuti meseji iri kuuya yakasainwa nekiyi yakavanzika inoenderana.
Tisati taenderera mberi, ngatigadzire kiyi yakavanzika toinyorera test/keys/owner.pk
. Kuti tiite izvi, ngatitangei Fift mune inopindirana modhi uye tiite mirairo mina.
`newkeypair` Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎΠ³ΠΎ ΠΈ ΠΏΡΠΈΠ²Π°ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ° ΠΈ Π·Π°ΠΏΠΈΡΡ ΠΈΡ
Π² ΡΡΠ΅ΠΊ.
`drop` ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΈΠ· ΡΡΠ΅ΠΊΠ° Π²Π΅ΡΡ
Π½Π΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° (Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠΉ ΠΊΠ»ΡΡ)
`.s` ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΡΠΎ Π»Π΅ΠΆΠΈΡ Π² ΡΡΠ΅ΠΊΠ΅ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ
`"owner.pk" B>file` Π·Π°ΠΏΠΈΡΡ ΠΏΡΠΈΠ²Π°ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ° Π² ΡΠ°ΠΉΠ» Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ `owner.pk`.
`bye` Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ Ρ Fift.
Ngatigadzire folda keys
mukati mefolda test
wonyora kiyi yakavanzika ipapo.
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
Isu tinoona faira mune yazvino folda owner.pk
.
Isu tinobvisa kiyi yeruzhinji kubva mustack uye pazvinenge zvichidikanwa tinogona kuitora kubva kune yakavanzika.
Iye zvino tinoda kunyora siginecha verification. Ngatitange nemuyedzo. Kutanga tinoverenga kiyi yakavanzika kubva mufaira uchishandisa basa file>B
woinyora kune chinja owner_private_key
, wozoshandisa basa racho priv>pub
shandura kiyi yakavanzika kukiyi yeruzhinji wonyora mhinduro mukati 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 !
Tichada makiyi ese ari maviri.
Isu tinotangisa iyo smart kondirakiti kuchengetedza neabirary data mune imwechete kutevedzana senge mune basa pack_state()
wobva wanyora muchidimbu 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 !
Tevere, isu tichanyora meseji yakasainwa, inongove iine siginecha uye kukosha kwekupikisa.
Kutanga, tinogadzira iyo data yatinoda kufambisa, tozoisaina nekiyi yakavanzika uye pakupedzisira tinoburitsa meseji yakasainwa.
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 !
Nekuda kweizvozvo, meseji yatinozotumira kune smart kontrakiti inorekodhwa mune inoshanduka message_to_send
, nezvemabasa hashu
, ed25519_sign_uint
unogona kuverenga
Uye kumhanya bvunzo tinodaidza zvakare.
message_to_send @
recv_external
code
storage @
c7
runvmctx
Ngatimhanyei bvunzo uye ichafoira, saka tichachinja smart contract kuti igamuchire mameseji efomati iyi uye ione siginicha.
Kutanga, tinoverenga 512 bits ye siginicha kubva kune meseji uye toinyora kune inoshanduka, tobva taverenga 32 bits eiyo counter variable.
Sezvo isu tine basa rekuverenga data kubva kune smart contract kuchengetedza, isu tichaishandisa.
Inotevera ndeyekutarisa iyo counter inotamiswa nekuchengetedza uye kutarisa siginecha. Kana chimwe chinhu chisingaenderane, saka tinokanda mutsauko nekodhi yakakodzera.
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));
Kuzvipira kwakakodzera
Ngatimhanyei bvunzo tione kuti bvunzo yechipiri yakundikana. Nezvikonzero zviviri, hapana mabheti akakwana mumeseji uye hapana mabheti akakwana mukuchengetedza, saka kodhi inopunzika kana ichipfuura. Isu tinofanirwa kuwedzera siginecha kune meseji yatiri kutumira uye kukopa chengetedzo kubva muyedzo yekupedzisira.
Muyedzo yechipiri, isu tichawedzera siginecha yemeseji uye nekuchinja iyo smart contract yekuchengetedza.
Ngatinyorei bvunzo yechina, yatinozotumira meseji yakasainwa nekiyi yega yega yemumwe munhu. Ngatigadzire imwe kiyi yakavanzika toichengeta kufaira not-owner.pk
. Tichasaina meseji nekiyi yakavanzika iyi. Ngatimhanyei bvunzo uye tive nechokwadi chekuti bvunzo dzese dzapfuura.
Iye zvino isu tinogona pakupedzisira kuenderera mberi nekushandisa iyo smart contract logic.
Π recv_external()
tichagamuchira marudzi maviri emashoko.
Sezvo kondirakiti yedu ichizounganidza kurasikirwa kwevatambi, mari iyi inofanirwa kuendeswa kumusiki werotari. Kero yechikwama yemugadziri welottery inonyorwa mudura kana kontrakiti yagadzirwa.
Zvingoitika, tinoda kugona kushandura kero kwatinotumira magiramu evakarasika. Tinofanirawo kukwanisa kutumira magiramu kubva kurotari kuenda kukero yemuridzi.
Ngatitangei neyokutanga. Ngatitangei kunyora bvunzo inozotarisa kuti mushure mekutumira meseji, kondirakiti yakangwara yakachengetedza kero nyowani mudura. Ndokumbira utarise kuti mune meseji, kuwedzera kune iyo counter uye kero nyowani, isu tinotumirawo action
A 7-bit integer isiri-negative nhamba, zvichienderana nayo, isu tichasarudza magadzirirwo emashoko muchibvumirano chekuchenjera.
<b 0 32 u, 1 @ 7 u, new_owner_wc @ 32 i, new_owner_account_id @ 256 u, b> message_to_sign !
Muyedzo iwe unogona kuona kuti smartcontract yekuchengetedza yakaderedzwa sei storage
muFift. Deserialization yezvakasiyana zvinotsanangurwa muFift zvinyorwa.
Ngatimhanyei bvunzo uye tione kuti yakundikana. Zvino ngatiwedzerei pfungwa yekuchinja kero yemuridzi welottery.
Muchibvumirano chakangwara tinoenderera mberi nekuenzanisa message
, verenga mukati action
. Rega tikuyeuchidze kuti tichava maviri action
: shandura kero uye tumira magiramu.
Zvadaro tinoverenga kero itsva yemuridzi wekontrakiti uye tinoichengeta mukuchengetedza.
Tinomhanya bvunzo toona kuti bvunzo yechitatu yakundikana. Inopunzika nekuda kwekuti kondirakiti ikozvino inowedzera 7 bits kubva kune meseji, iyo isipo muyedzo. Wedzera chisipo kune meseji action
. Ngatimhanyei bvunzo tione kuti zvese zvapfuura.
Iye zvino ngatinyorei pfungwa yekutumira nhamba yakatarwa yemagiramu kune kero yakambochengetwa.
Kutanga, ngatinyore bvunzo. Tichanyora miedzo miviri, imwe kana pasina kukwana kwakakwana, yechipiri apo zvinhu zvose zvinofanira kubudirira kubudirira. Miedzo inogona kuonekwa
Zvino ngatiwedzere kodhi. Kutanga, ngatinyore nzira mbiri dzevabatsiri. Yekutanga yekuwana nzira ndeyekutsvaga iyo yazvino chiyero che smart kontrakiti.
int balance() inline_ref method_id {
return get_balance().pair_first();
}
Uye yechipiri ndeyekutumira magiramu kune imwe chibvumirano chakangwara. Ndakanyatsotevedzera nzira iyi kubva kune imwe chibvumirano chakangwara.
() 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
}
Ngatiwedzerei idzi nzira mbiri kune smart kontrakiti uye tinyore pfungwa. Kutanga, tinosiyanisa nhamba yemagiramu kubva kune meseji. Zvadaro tinotarisa chiyero, kana chisina kukwana tinokanda kunze. Kana zvinhu zvose zvakanaka, saka tinotumira magiramu kune kero yakachengetwa uye nekuvandudza 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));
Nenzira, komisheni inobviswa kubva kune smart kontrakiti nguva dzese kune yakagadziriswa meseji. Kuti iyo smart contract meseji iite chikumbiro, mushure mekutanga cheki iwe unofanirwa kufona accept_message()
.
Zvino ngatienderere mberi kune mameseji emukati. Muchokwadi, isu tinongogamuchira magiramu uye todzosera zvakapetwa kaviri kuwanda kumutambi kana akahwina uye chetatu kumuridzi kana akarasikirwa.
Kutanga, ngatinyore bvunzo iri nyore. Kuti tiite izvi, tinoda kero yekuyedza yekontrakiti yakangwara kubva kwatinoti tinotumira magiramu kune smart kontrakiti.
Kero yekondirakiti yakangwara ine nhamba mbiri, 32-bit integer inotarisira workchain uye 256-bit isiri-negative integer yakasarudzika nhamba yeakaundi mune ino workchain. Semuenzaniso, -1 uye 12345, iyi ndiyo kero yatichachengeta kufaira.
Ndakakopa basa rekuchengetedza kero kubva 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
Ngatitarisei kuti basa rinoshanda sei, izvi zvinopa kunzwisisa kwekuti Fift inoshanda sei. Tangisa Fift mune inopindirana modhi.
~/TON/build/crypto/fift -i
Kutanga tinosundira -1, 12345 uye zita reramangwana faira "sender.addr" pamurwi:
-1 12345 "sender.addr"
Nhanho inotevera ndeyekuita basa racho -rot
, iyo inoshandura stack nenzira yekuti pamusoro peiyo stack pane yakasarudzika smart contract nhamba:
"sender.addr" -1 12345
256 u>B
inoshandura 256-bit isiri-negative integer kuita mabhaiti.
"sender.addr" -1 BYTES:0000000000000000000000000000000000000000000000000000000000003039
swap
inochinjanisa zvinhu zviviri zvepamusoro zve stack.
"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 -1
32 i>B
inoshandura 32-bit integer kuita mabhayithi.
"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 BYTES:FFFFFFFF
B+
inobatanidza mitsetse miviri yemabhaiti.
"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF
Zvekare swap
.
BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF "sender.addr"
Uye pakupedzisira ma byte anonyorwa kune faira B>file
. Mushure meizvi stack yedu haina chinhu. Tinomira Fift
. Faera rakagadzirwa mune yazvino folda sender.addr
. Ngatiendesei faira kune yakasikwa forodha test/addresses/
.
Ngatinyorei bvunzo yakapusa iyo inotumira magiramu kune smart kontrakiti.
Zvino ngatitarisei pfungwa yerotari.
Chinhu chekutanga chatinoita kutarisa meseji bounced
kana kwete kana bounced
, tobva tazvifuratira. bounced
zvinoreva kuti kondirakiti ichadzosa magiramu kana kumwe kukanganisa kukaitika. Hatizodzose magiramu kana kukanganisa kwangoerekana kwaitika.
Isu tinotarisa, kana chiyero chiri pasi pehafu yegiramu, saka isu tinongogamuchira meseji uye kuifuratira.
Tevere, tinoparura kero yechibvumirano chakangwara kwakabva meseji.
Isu tinoverenga iyo data kubva mudura uye todzima mabheti ekare kubva munhoroondo kana paine anopfuura makumi maviri awo. Kuti zvive nyore, ndakanyora mamwe mabasa matatu pack_order()
, unpack_order()
, remove_old_orders()
.
Tevere, isu tinotarisa kana chiyero chisina kukwana kubhadhara, tobva tafunga kuti iyi haisi bheti, asi kuzadza uye kuchengetedza kuzadza mukati. orders
.
Zvadaro pakupedzisira kukosha kwechibvumirano chakangwara.
Kutanga, kana mutambi akarasikirwa, tinoichengetedza munhoroondo yekubheja uye kana mari yacho inopfuura magiramu matatu, tinotumira 3/1 kumuridzi wechibvumirano chakangwara.
Kana mutambi akahwina, tobva tatumira zvakapetwa kaviri kero yemutambi uye tozochengeta ruzivo nezve bheti munhoroondo.
() 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));
}
Ndizvozvo chete.
Iye zvino zvese zvasara zviri nyore, ngatigadzirei nzira dzekuwana kuitira kuti tiwane ruzivo nezve mamiriro echibvumirano kubva kunze kwenyika (chaizvoizvo, verenga data kubva kune yavo smart kontrakiti yekuchengetedza).
Ini ndakanganwawo kuwedzera kodhi inozogadzirisa iyo yekutanga chikumbiro inoitika kana ichidhinda smart kontrakiti.
Nhanho inotevera ndeyekuburitsa smart contract. Ngatigadzire folda requests
.
Ndakatora kodhi yekushambadzira sehwaro simple-wallet-code.fc
Chinhu chakakosha kutarisisa. Isu tinogadzira smart kontrakiti yekuchengetedza uye meseji yekupinda. Mushure meizvi, kero yekontrakiti yakangwara inogadzirwa, ndiko kuti, kero inozivikanwa kunyange isati yabudiswa muTON. Tevere, iwe unofanirwa kutumira akati wandei magiramu kune iyi kero, uye chete mushure meizvozvo iwe unofanirwa kutumira faira ine smart kontrakiti pachayo, sezvo network inotora komisheni yekuchengetedza iyo smart kontrakiti uye mashandiro mairi (vagadziri vanochengeta uye vanoita smart. zvibvumirano).
Tevere isu tinoita kodhi yekushambadzira uye titore lottery-query.boc
smart contract file uye kero.
~/TON/build/crypto/fift -s requests/new-lottery.fif 0
Usakanganwa kuchengetedza mafaira akagadzirwa: lottery-query.boc
, lottery.addr
, lottery.pk
.
Pakati pezvimwe zvinhu, tichaona kero yekontrakiti yakangwara mumatanda ekuuraya.
new wallet address = 0:044910149dbeaf8eadbb2b28722e7d6a2dc6e264ec2f1d9bebd6fb209079bc2a
(Saving address to file lottery.addr)
Non-bounceable address (for init): 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd
Bounceable address (for later access): kQAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8KpFY
Kungonakidzwa, ngatiite chikumbiro kuTON
$ ./lite-client/lite-client -C ton-lite-client-test1.config.json
getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd
Uye isu tichaona kuti account ine kero iyi haina chinhu.
account state is empty
Tinotumira kukero 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd
2 Gram uye mushure memasekondi mashoma isu tinoita iwo iwo iwo murairo. Kutumira magiramu ndinoshandisa
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd
Inoratidzika kunge isina kurongeka (state:account_uninit
) kondirakiti yakangwara ine kero imwechete uye chiyero che1 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
Zvino ngatiburitsei smart contract. Ngatitangei lite-client uye tiite.
> 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
Ngatitarisei kuti kondirakiti yaburitswa here.
> last
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd
Pakati pezvimwe zvinhu zvatinowana.
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
Tinozviona izvozvo account_active
.
Chibvumirano chinoenderana nekuchinja
Zvino ngatigadzirei zvikumbiro zvekudyidzana nekontrakiti yakangwara.
Kunyanya, tichasiya yekutanga yekushandura kero sebasa rakazvimirira, uye tichaita yechipiri yekutumira magiramu kune kero yemuridzi. Muchokwadi, isu tichada kuita chinhu chimwe chete semuyedzo yekutumira magiramu.
Iyi ndiyo meseji yatinozotumira kune smart kontrakiti, kupi msg_seqno
165, action
2 uye 9.5 magiramu ekutumira.
<b 165 32 u, 2 7 u, 9500000000 Gram, b>
Usakanganwa kusaina meseji nekiyi yako yakavanzika lottery.pk
, iyo yakagadzirwa kare pakugadzira kontrakiti yakachenjera.
Kugamuchira ruzivo kubva kune smart kontrakiti uchishandisa kuwana nzira
Zvino ngatitarisei maitiro ekuita akangwara kontrakiti kuwana nzira.
Kutanga lite-client
uye mhanya kuwana nzira dzatakanyora.
$ ./lite-client/lite-client -C ton-lite-client-test1.config.json
> runmethod 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd balance
arguments: [ 104128 ]
result: [ 64633878952 ]
...
Π result
ine kukosha kunodzoserwa nebasa racho balance()
kubva kune yedu smart contract.
Tichaita zvakafanana kune dzimwe nzira dzakawanda.
> runmethod 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd get_seqno
...
arguments: [ 77871 ]
result: [ 1 ]
Ngatibvunzei nhoroondo yako yekubheja.
> 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]) ]
Isu tichashandisa lite-mutengi uye titore nzira dzekuratidza ruzivo nezve smart kontrakiti pane saiti.
Kuratidza smart contract data pane webhusaiti
Ndakanyora saiti yakapusa muPython kuratidza iyo data kubva kune smart kontrakiti nenzira iri nyore. Pano handisi kuzogara pazviri zvakadzama uye ndichashambadza saiti
Zvikumbiro kuTON zvinogadzirwa kubva Python
nerubatsiro lite-client
. Kuti zvive nyore, saiti yacho yakarongedzwa muDocker uye yakaburitswa paGoogle Cloud.
Kuedza
Zvino ngatiedze kutumira magiramu ipapo kuti adzorerwe kubva
Afterword
Chinyorwa chacho chakazove chakareba kupfuura zvandaitarisira, pamwe chingave chakapfupika, kana kuti zvimwe kumunhu asingazivi chinhu nezveTON uye anoda kunyora uye kushambadza kwete-sa-nyore-yakareruka chibvumirano nekugona kudyidzana nayo. it. Zvimwe zvimwe zvinhu zvingadai zvakatsanangurwa zviri nyore.
Zvichida mamwe maitiro ekushandiswa angadai akaitwa zvakanyanya uye neunyanzvi, asi zvino zvingadai zvakatora nguva yakawanda kugadzirira chinyorwa. Zvinogonawo kuti ndakakanganisa pane imwe nzvimbo kana kuti handina kunzwisisa chimwe chinhu, saka kana uri kuita chimwe chinhu chakakomba, unofanira kuvimba nemagwaro epamutemo kana kuti repository yepamutemo neTON code.
Zvinofanira kucherechedzwa kuti sezvo TON pachayo ichiri mudanho rinoshanda rebudiriro, shanduko dzinogona kuitika dzinogona kutyora chero nhanho dziri muchinyorwa chino (zvakaitika pandakanga ndichinyora, zvakatogadziriswa), asi nzira yakajairika ndeye. zvisingaiti kuchinja.
Ini handisi kuzotaura nezveramangwana reTON. Zvichida chikuva chichava chinhu chikuru uye tinofanira kupedza nguva tichiidzidza uye kuzadza niche nezvigadzirwa zvedu ikozvino.
Kune zvakare Libra kubva kuFacebook, iyo ine mukana wevateereri vevashandisi vakakura kupfuura TON. Ini handizive chero chinhu nezveLibra, tichitonga neforamu kune zvakawanda zviitiko ipapo kupfuura munharaunda yeTON. Kunyangwe ivo vanogadzira uye nharaunda yeTON yakafanana nepasi pevhu, inotonhorera zvakare.
nezvakanyorwa
- Zvinyorwa zveTON zviri pamutemo:
https://test.ton.org - Official TON repository:
https://github.com/ton-blockchain/ton - Official wallet yemapuratifomu akasiyana:
https://wallet.ton.org - Smart contract repository kubva kuchinyorwa ichi:
https://github.com/raiym/astonished - Batanidza kune iyo smart contract webhusaiti:
https://ton-lottery.appspot.com - Repository yekuwedzera kweVisual Studio Code yeFunC:
https://github.com/raiym/func-visual-studio-plugin - Kurukurai nezveTON muTeregiramu, iyo yakabatsira chaizvo kuzviona padanho rekutanga. Ndinofunga kuti hazvizove kukanganisa kana ndikataura kuti munhu wose akanyora chimwe chinhu cheTON aripo. Iwe unogona zvakare kukumbira bvunzo magiramu ipapo.
https://t.me/tondev_ru - Imwe hurukuro nezveTON yandakawana ruzivo rwakakosha:
https://t.me/TONgramDev - Danho rekutanga remakwikwi:
https://contest.com/blockchain - Chikamu chechipiri chemakwikwi:
https://contest.com/blockchain-2
Source: www.habr.com