Nezve manyorero uye kushambadza kondirakiti yakangwara muTeregiramu Vhura Network (TON)

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 akanyora chikwama ine multi-siginicha pa FunC uye zvaiwanzoshanda. Ndakazvitora sehwaro smart contract paSolidity.

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-clientasi 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 codekuti 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 saizvozvo yepakati kodhi ye 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 batanidzo.

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

Pano chaipo Iwe unogona kuona chibvumirano chinoenderana nemhedzisiro yazvino.

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 commit.

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. Batanidza kune shanduko dzakakodzera.

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 saizvozvo mhedzisiro yepakati.

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 muFift zvinyorwa.

Uye kumhanya bvunzo tinodaidza zvakare.

message_to_send @ 
recv_external 
code 
storage @
c7
runvmctx

Pano saizvozvo Iyo faira ine bvunzo inofanirwa kutaridzika seizvi panguva ino.

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 pano pano.

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. Pano saizvozvo iyo faira ine bvunzo inoita senge panguva ino.

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. Commit panguva ino.

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.

Commit link nekapfu yakawedzerwa.

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. pano zvipira kuchinja. Hukuru.

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 muchibvumirano ichi.

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

Pano saizvozvo inotaridzika sechibvumirano chakangwara panguva ino. Ngatimhanyei bvunzo tione kuti dzapasa.

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. Heino chibvumirano.

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. Chibvumirano chinowirirana.

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

Ngatiwedzere kuwana nzira. Isu tichanyora pazasi nezve nzira yekugamuchira ruzivo nezve smart kontrakiti.

Ini ndakanganwawo kuwedzera kodhi inozogadzirisa iyo yekutanga chikumbiro inoitika kana ichidhinda smart kontrakiti. Chibvumirano chinowirirana. Uye mberi kugadziriswa bug nekutumira 1/3 yehuwandu kuaccount yemuridzi.

Nhanho inotevera ndeyekuburitsa smart contract. Ngatigadzire folda requests.

Ndakatora kodhi yekushambadzira sehwaro simple-wallet-code.fc izvo anogona kuwana mudura repamutemo.

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). Iyo kodhi inogona kutariswa pano.

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 official chikwama, uye iwe unogona kubvunza mumwe munhu kubva muhurukuro yekuongorora magiramu, izvo zvandichataura pamusoro pekupedzisira kwechinyorwa.

> 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 pano pano.

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. Heino chibvumirano chinoenderana.

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 muchibvumirano chimwe.

Zvikumbiro kuTON zvinogadzirwa kubva Python nerubatsiro lite-client. Kuti zvive nyore, saiti yacho yakarongedzwa muDocker uye yakaburitswa paGoogle Cloud. Link.

Kuedza

Zvino ngatiedze kutumira magiramu ipapo kuti adzorerwe kubva wallet. Tichatumira 40 gramu. Uye ngatiite mabheti akati wandei kuti ajekese. Isu tinoona kuti saiti inoratidza nhoroondo yemabheti, iyo iripo yekuhwina muzana uye rumwe ruzivo runobatsira.

Tinoonakuti takakunda yekutanga, takakundwa yechipiri.

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

  1. Zvinyorwa zveTON zviri pamutemo: https://test.ton.org
  2. Official TON repository: https://github.com/ton-blockchain/ton
  3. Official wallet yemapuratifomu akasiyana: https://wallet.ton.org
  4. Smart contract repository kubva kuchinyorwa ichi: https://github.com/raiym/astonished
  5. Batanidza kune iyo smart contract webhusaiti: https://ton-lottery.appspot.com
  6. Repository yekuwedzera kweVisual Studio Code yeFunC: https://github.com/raiym/func-visual-studio-plugin
  7. 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
  8. Imwe hurukuro nezveTON yandakawana ruzivo rwakakosha: https://t.me/TONgramDev
  9. Danho rekutanga remakwikwi: https://contest.com/blockchain
  10. Chikamu chechipiri chemakwikwi: https://contest.com/blockchain-2

Source: www.habr.com

Voeg