Mabapi le mokhoa oa ho ngola le ho phatlalatsa konteraka e bohlale ho Telegraph Open Network (TON)

Mabapi le mokhoa oa ho ngola le ho phatlalatsa konteraka e bohlale ho TON

Sengoliloeng see se bua ka eng?

Sehloohong seo ke tla bua ka hore na ke ile ka kenya letsoho joang tlhōlisanong ea pele (ea tse peli) ea "Telegram" blockchain, ha kea ka ka nka moputso, 'me ka etsa qeto ea ho ngola phihlelo ea ka sehloohong se seng e le hore se se ke sa teba le ho lebala, mohlomong, ho thusa. motho.

Kaha ke ne ke sa batle ho ngola khoutu e sa utloahaleng, empa ho etsa ntho e sebetsang, bakeng sa sehlooho seo ke se ngotseng konteraka e bohlale bakeng sa lotho ea hang-hang le websaeteng e bontšang boitsebiso bo bohlale ba konteraka ka ho toba ho tloha TON ntle le ho sebelisa polokelo ea bohareng.

Sehlooho sena se tla ba molemo ho ba batlang ho etsa konteraka ea bona ea pele e bohlale ho TON, empa ba sa tsebe hore na ba qale hokae.

Ka ho sebelisa lotho e le mohlala, ke tla tloha ho kenya tikoloho ho ea ho hatisa konteraka e bohlale, ho sebelisana le eona, le ho ngola sebaka sa marang-rang bakeng sa ho amohela le ho hatisa data.

Mabapi le ho kenya letsoho tlhōlisanong

Mphalane o fetileng, Telegraph e phatlalalitse tlholisano ea blockchain ka lipuo tse ncha Fift и FunC. Ho ne ho hlokahala ho khetha ho ngola leha e le efe ea likonteraka tse hlano tse sisintsoeng tse bohlale. Ke ne ke nahana hore ho tla ba monate ho etsa ntho e fapaneng, ho ithuta puo le ho etsa ntho e itseng, le haeba ke sa tlameha ho ngola ntho leha e le efe nakong e tlang. Ho feta moo, sehlooho se lula se le molomong.

Ke habohlokoa ho bolela hore ke ne ke se na phihlelo ea ho hlahisa likonteraka tse bohlale.

Ke ile ka rera ho kopanela ho fihlela qetellong ho fihlela ke khona ebe ke ngola sehlooho sa tlhahlobo, empa ke ile ka hlōleha hang-hang ho ea pele. I ngotse sepache e nang le li-signature tse ngata FunC mme ka kakaretso e ile ya sebetsa. Ke ile ka e nka e le motheo konteraka e bohlale mabapi le Solidity.

Ka nako eo, ke ne ke nahana hore sena se ne se lekane hore bonyane ke nke sebaka se itseng sa moputso. Ka lebaka leo, ba nkang karolo ba 40 ho ba 60 ba ile ba fetoha bahapi ba meputso ’me ke ne ke se har’a bona. Ka kakaretso, ha ho letho le phoso ka sena, empa ntho e le 'ngoe e ile ea ntšoenya. Nakong ea phatlalatso ea liphetho, tlhahlobo ea tlhahlobo ea konteraka ea ka e ne e e-s'o etsoe, ke ile ka botsa barupeluoa moqoqong hore na ho na le motho e mong ea neng a se na eona, ho ne ho se na.

Kamoo ho bonahalang kateng ho ela hloko melaetsa ea ka, matsatsi a mabeli hamorao baahloli ba ile ba hatisa maikutlo 'me ke ntse ke sa utloisise hore na ka phoso ba ile ba hloloheloa konteraka ea ka e bohlale nakong ea ho ahlola kapa ba nahana feela hore e ne e le mpe hoo e sa hlokeng tlhaloso. Ke ile ka botsa potso leqepheng, empa ha kea ka ka fumana karabo. Le hoja e se lekunutu hore na ke mang ea ahlolang, ke ne ke nka ho sa hlokahale ho ngola melaetsa ea botho.

Nako e ngata e ne e sebelisoa ho utloisisa, kahoo ho ile ha etsoa qeto ea ho ngola sehlooho. Kaha ha ho na boitsebiso bo bongata, sehlooho sena se tla thusa ho boloka nako bakeng sa bohle ba thahasellang.

Khopolo ea likonteraka tse bohlale ho TON

Pele u ngola ntho leha e le efe, u lokela ho fumana hore na u atamela ntho ena ka lehlakoreng lefe. Ka hona, joale ke tla u bolella hore na tsamaiso e na le likarolo life. Hantle-ntle, ke likarolo life tseo u lokelang ho li tseba e le hore u ngole bonyane mofuta o itseng oa konteraka ea ho sebetsa.

Re tla tsepamisa maikutlo ho ngola konteraka e bohlale le ho sebetsa le TON Virtual Machine (TVM), Fift и FunC, kahoo sehlooho sena se tšoana le tlhaloso ea tsoelo-pele ea lenaneo le tloaelehileng. Re ke ke ra lula re bua ka hore na sethala ka bosona se sebetsa joang mona.

Ka kakaretso mabapi le hore na e sebetsa joang TVM le puo Fift ho na le litokomane tse ntle tsa semmuso. Ha ke ntse ke kopanela tlhōlisanong 'me hona joale ha ke ntse ke ngola konteraka ea hona joale, ke ne ke atisa ho retelehela ho eena.

Puo e ka sehloohong eo likonteraka tse bohlale li ngotsoeng ka eona ke FunC. Ha ho na litokomane ho eona hona joale, e le hore u ngole ntho eo u lokelang ho ithuta mehlala ea likonteraka tse bohlale ho tloha polokelong ea molao le ts'ebetsong ea puo ka boeona moo, 'me u ka sheba mehlala ea likonteraka tse bohlale ho tloha lilemong tse peli tse fetileng. litlholisano. Lihokelo qetellong ea sengoloa.

Ha re re re se re ngotse konteraka e bohlale bakeng sa FunC, ka mor'a moo re bokella khoutu ho Fift assembler.

Konteraka e hlophisitsoeng e bohlale e ntse e tla phatlalatsoa. Ho etsa sena o hloka ho ngola tšebetso ho Fift, e tla nka khoutu ea konteraka e bohlale le likarolo tse ling e le ho kenya letsoho, 'me tlhahiso e tla ba faele e nang le katoloso. .boc (e bolelang "mokotla oa lisele"), 'me, ho itšetlehile ka hore na re e ngola joang, senotlolo sa botho le aterese, e hlahisoang ho latela khoutu ea konteraka e bohlale. U ka se u romela ligrama atereseng ea konteraka e bohlale e e-s'o hatisoe.

Ho phatlalatsa konteraka e bohlale ho TON e amohetse .boc faele e tla hloka ho romelloa ho blockchain ho sebelisa mofani oa leseli (ho feta ka tlase). Empa pele o phatlalatsa, o hloka ho fetisetsa ligrama ho aterese e hlahisitsoeng, ho seng joalo konteraka e bohlale e ke ke ea hatisoa. Ka mor'a ho hatisoa, u ka sebelisana le konteraka e bohlale ka ho e romella melaetsa e tsoang ka ntle (mohlala, ho sebelisa mofani oa leseli) kapa ho tsoa ka hare (mohlala, konteraka e le 'ngoe e bohlale e romella e' ngoe molaetsa ka hare ho TON).

Hang ha re utloisisa hore na khoutu e hatisoa joang, e ba bonolo. Re batla re tseba seo re batlang ho se ngola le hore na lenaneo la rona le tla sebetsa joang. 'Me ha re ntse re ngola, re sheba hore na sena se se se ntse se sebelisoa joang likonteraka tse bohlale tse teng, kapa re sheba khoutu ea ts'ebetsong Fift и FunC sebakeng sa polokelo ea semmuso, kapa sheba litokomaneng tsa semmuso.

Hangata ke ne ke batla mantsoe a sehlooho moqoqong oa Telegraph moo barupeluoa bohle ba tlholisano le basebetsi ba Telegraph ba neng ba bokane, mme ho ile ha etsahala hore nakong ea tlholisano e mong le e mong a bokane moo mme a qale ho buisana ka Fift le FunC. Link qetellong ea sengoloa.

Ke nako ea ho tloha ho khopolo-taba ho ea ho ikwetlisa.

Ho lokisa tikoloho bakeng sa ho sebetsa le TON

Ke entse ntho e 'ngoe le e' ngoe e tla hlalosoa sehloohong se mabapi le MacOS 'me ka e hlahloba habeli ho Ubuntu 18.04 LTS e hloekileng ho Docker.

Ntho ea pele eo u lokelang ho e etsa ke ho jarolla le ho kenya lite-client eo ka eona u ka romellang likopo ho TON.

Litaelo tse fumanehang webosaeteng ea semmuso li hlalosa ts'ebetso ea ho kenya ka botlalo le ka ho hlaka ebile e siea lintlha tse ling. Mona re latela litaelo, re kenya litšepe tse sieo tseleng. Ha kea bokella morero o mong le o mong mme ke kentse ho tsoa polokelong ea semmuso ea Ubuntu (ho MacOS eo ke e sebelisitseng 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 

Hang ha li- dependencies tsohle li kentsoe u ka kenya lite-client, Fift, FunC.

Taba ea pele, re kopanya polokelo ea TON hammoho le litšepiso tsa eona. Bakeng sa boiketlo, re tla etsa ntho e 'ngoe le e' ngoe ka foldareng ~/TON.

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

Sebaka sa polokelo se boetse se boloka ts'ebetsong Fift и FunC.

Hona joale re se re loketse ho kopanya morero. Khoutu ea polokelo e entsoe ka foldareng ~/TON/ton. The ~/TON etsa foldara build le ho bokella morero ho eona.

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

Kaha re tlil'o ngola konteraka e bohlale, ha re hloke feela lite-clientempa Fift с FunC, kahoo a re bokelleng tsohle. Ha se ts'ebetso e potlakileng, kahoo re emetse.

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

E latelang, khoasolla faele ea tlhophiso e nang le data mabapi le node eo ho eona lite-client tla hokela.

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

Ho etsa likopo tsa pele ho TON

Joale ha re qaleng lite-client.

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

Haeba mohaho o ne o atlehile, joale ka mor'a ho qala u tla bona logi ea ho hokahanya ha mofani oa leseli ho 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)
...

O ka tsamaisa taelo help 'me u bone hore na ke litaelo life tse fumanehang.

help

A re thathamiseng litaelo tseo re tla li sebelisa sehloohong sena.

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-методы смартконтракта. 

Hona joale re itokiselitse ho ngola konteraka ka boeona.

Ts'ebetsong

Boemo

Joalokaha ke ngotse ka holimo, konteraka e bohlale eo re e ngolang ke lotho.

Ho feta moo, ena ha se lotho eo ho eona u hlokang ho reka tekete ebe u ema hora, letsatsi kapa khoeli, empa ke hang-hang moo mosebelisi a fetisetsang atereseng ea konteraka. N dikgerama, 'me hang-hang oa e khutlisa 2 * N dikgerama kapa tahlehelo. Re tla etsa monyetla oa ho hapa hoo e ka bang 40%. Haeba ho se na ligrama tse lekaneng bakeng sa tefo, joale re tla nka transaction e le top-up.

Ho feta moo, ho bohlokoa hore ho becha ho ka bonoa ka nako ea nnete le ka mokhoa o loketseng, e le hore mosebelisi a ka utloisisa hang-hang hore na o hlotse kapa o lahlile. Ka hona, o hloka ho etsa sebaka sa marang-rang se tla bonts'a libethe le liphetho ka kotloloho ho tsoa ho TON.

Ho ngola konteraka e bohlale

Bakeng sa boiketlo, ke totobalitse khoutu ea FunC; plugin e ka fumanoa 'me ea kenngoa ho Visual Studio Code search; haeba ka tšohanyetso u batla ho eketsa ho hong, ke entse hore plugin e fumanehe phatlalatsa. Hape, motho e mong o kile a etsa plugin bakeng sa ho sebetsa le Fift, o ka e kenya hape mme oa e fumana ho VSC.

Ha re theheng hang-hang sebaka sa polokelo moo re tla fana ka liphetho tsa mahareng.

Ho nolofatsa bophelo ba rona, re tla ngola konteraka e bohlale le ho e hlahloba sebakeng sa heno ho fihlela e se e loketse. Ke feela ka mor'a moo re tla e phatlalatsa ka TON.

Konteraka e bohlale e na le mekhoa e 'meli ea ka ntle e ka fumanoang. Pele, recv_external() mosebetsi ona o etsoa ha kopo ea konteraka e tsoa lefats'eng le ka ntle, ke hore, eseng ho tloha TON, ka mohlala, ha rona re hlahisa molaetsa le ho o romella ka lite-client. Ea bobeli, recv_internal() ke ha, ka hare ho TON ka boeona, konteraka leha e le efe e bua ka ea rona. Maemong ana ka bobeli, o ka fetisa liparamente ho ts'ebetso.

A re qaleng ka mohlala o bonolo o tla sebetsa haeba o hatisoa, empa ha ho na mojaro o sebetsang ho oona.

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

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

Mona re hloka ho hlalosa hore na ke eng slice. Lintlha tsohle tse bolokiloeng ho TON Blockchain ke pokello TVM cell kapa e le feela cell, ka seleng e joalo u ka boloka likotoana tse 1023 tsa data le lihokelo tse fihlang ho tse 4 ho isa liseleng tse ling.

TVM cell slice kapa slice ena ke karolo ea e teng cell e sebelisoa ho e hlalosa, e tla hlaka hamorao. Ntho e ka sehloohong ho rona ke hore re ka fetisetsa slice 'me ho itšetlehile ka mofuta oa molaetsa, sebetsa data ho recv_external() kapa recv_internal().

impure - lentsoe la sehlooho le bontšang hore mosebetsi o fetola lintlha tsa konteraka tse bohlale.

Ha re bolokeng khoutu ea konteraka ho eona lottery-code.fc le bokella.

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

Moelelo oa lifolakha o ka bonoa ho sebelisoa taelo

~/TON/build/crypto/func -help

Re hlophisitse khoutu ea Fift assembler ho 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

E ka thakholoa sebakeng sa heno, bakeng sa sena re tla lokisa tikoloho.

Hlokomela hore mola oa pele oa hokahana Asm.fif, ena ke khoutu e ngotsoeng ka Fift bakeng sa Fift assembler.

Kaha re batla ho matha le ho leka konteraka e bohlale sebakeng sa heno, re tla etsa faele lottery-test-suite.fif 'me u kopitse khoutu e hlophisitsoeng moo, ho nkela mohala oa ho qetela ho eona, o ngolang khoutu ea konteraka e bohlale ho ea kamehla codeho e fetisetsa mochineng oa sebele:

"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

Ho fihlela hajoale ho bonahala ho hlakile, joale a re kenyelle faeleng e tšoanang khoutu eo re tla e sebelisa ho tsebisa 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 re rekota moelelo oa taba, ke hore, data eo TVM (kapa boemo ba marang-rang) e tla qalisoa ka eona. Esita le nakong ea tlhōlisano, e mong oa bahlahisi o ile a bontša mokhoa oa ho bopa c7 mme ke ile ka qopitsa. Sehloohong sena ho ka ’na ha hlokahala hore re fetohe rand_seed kaha tlhahiso ea palo e sa reroang e itšetlehile ka eona 'me haeba e sa fetoloe, palo e tšoanang e tla khutlisetsoa nako le nako.

recv_internal и recv_external li-constants tse nang le boleng 0 le -1 li tla ikarabella bakeng sa ho bitsa mesebetsi e tsamaellanang ho konteraka e bohlale.

Hona joale re itokiselitse ho etsa tlhahlobo ea pele bakeng sa konteraka ea rona e se nang letho e bohlale. Bakeng sa ho hlaka, hajoale re tla eketsa liteko tsohle faeleng e le 'ngoe lottery-test-suite.fif.

Ha re theheng phetoho storage ebe u ngola e se nang letho ho eona cell, ena e tla ba polokelo ea konteraka e bohlale.

message Ona ke molaetsa oo re tla o fetisetsa ho motho ea bohlale ea tsoang kantle. Hape re tla e etsa e se na letho hajoale.

variable storage 
<b b> storage ! 

variable message 
<b b> message ! 

Ka mor'a hore re lokise li-constants le mefuta-futa, re qala TVM re sebelisa taelo runvmctx 'me u fetise li-parameter tse entsoeng ho kenya letsoho.

message @ 
recv_external 
code 
storage @ 
c7 
runvmctx 

Qetellong re tla atleha joalo ka khoutu e mahareng bakeng sa Fift.

Hona joale re ka tsamaisa khoutu e hlahisoang.

export FIFTPATH=~/TON/ton/crypto/fift/lib // выполняем один раз для удобства 
~/TON/build/crypto/fift -s lottery-test-suite.fif 

Lenaneo le lokela ho sebetsa ntle le liphoso 'me ka tlhahiso re tla bona tlaleho ea ts'ebetso:

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

E kholo, re ngotse mofuta oa pele o sebetsang oa konteraka e bohlale.

Joale re hloka ho eketsa ts'ebetso. Pele a re sebetsaneng le melaetsa e tsoang lefats'eng la kantle ho ea ho recv_external()

Moqapi ka boeena o khetha mokhoa oa molaetsa oo konteraka e ka o amohelang.

Empa hangata

  • pele, re batla ho sireletsa konteraka ea rona ho tsoa lefats'eng le ka ntle le ho e etsa e le hore feela mong'a konteraka a ka romela melaetsa ea ka ntle ho eona.
  • ea bobeli, ha re romela molaetsa o nepahetseng ho TON, re batla hore sena se etsahale hantle hang le ha re romela molaetsa o tšoanang hape, konteraka e bohlale e e hana.

Kahoo hoo e batlang e le konteraka e 'ngoe le e' ngoe e rarolla mathata ana a mabeli, kaha konteraka ea rona e amohela melaetsa ea kantle, re hloka ho hlokomela seo le rona.

Re tla e etsa ka tatellano ea morao. Taba ea pele, a re rarolleng bothata ka ho pheta-pheta; haeba konteraka e se e fumane molaetsa o joalo le ho o sebetsa, e ke ke ea e phethahatsa lekhetlo la bobeli. 'Me joale re tla rarolla bothata e le hore feela sedikadikwe se itseng sa batho se ka romela melaetsa ho konteraka e bohlale.

Ho na le mekhoa e fapaneng ea ho rarolla bothata ka melaetsa e kopitsoang. Mona ke kamoo re tla e etsa kateng. Ka konteraka e bohlale, re qala k'haontara ea melaetsa e amohetsoeng ka boleng ba pele ba 0. Molaetseng o mong le o mong ho konteraka e bohlale, re tla eketsa boleng ba counter ea hajoale. Haeba boleng ba k'hamera molaetseng bo sa ts'oane le boleng ba konteraka e bohlale, ha re e sebetse; haeba e etsa joalo, rea e sebetsa ebe re eketsa k'haontara ka konteraka e bohlale ka 1.

Ha re khutleleng ho lottery-test-suite.fif mme o eketse teko ya bobedi ho yona. Haeba re romella nomoro e fosahetseng, khoutu e tlameha ho etsa mokhelo. Mohlala, tlohella data ea konteraka e boloke 166, 'me re tla romella 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"

Ha re qaleng.

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

'Me re tla bona hore tlhahlobo e etsoa ka phoso.

[ 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

Mothating ona lottery-test-suite.fif e lokela ho shebahala joalo link tsa.

Joale ha re kenyelleng logic ea counter ho konteraka e bohlale ho 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 leshano molaetsa oo re o romelang.

Ntho ea pele eo re e etsang ke ho hlahloba hore na molaetsa o na le data, haeba ho se joalo, ebe rea tsoa.

Ka mor'a moo re fetisa molaetsa. in_msg~load_uint(32) e jara nomoro ea 165, 32-bit unsigned int ho tsoa molaetseng o fetisoang.

Ka mor'a moo re kenya li-bits tse 32 ho tloha polokelong ea konteraka e bohlale. Re hlahloba hore nomoro e laetsoeng e lumellana le e fetileng; haeba ho se joalo, re etsa mokhelo. Tabeng ea rona, kaha re feta papali e sa bapaleng, mokhelo o lokela ho etsoa.

Joale ha re bokelleng.

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

Kopitsa khoutu e hlahisoang ho lottery-test-suite.fif, re sa lebale ho khutlisa mola oa ho qetela.

Re hlahloba hore na tlhahlobo e ea atleha:

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

Hantle mona U ka bona boitlamo bo lumellanang le liphetho tsa hajoale.

Hlokomela hore ha ho na tšitiso ho lula re kopitsa khoutu e hlophisitsoeng ea konteraka e bohlale faeleng e nang le liteko, ka hona, ha re ngoleng mongolo o tla re ngolla khoutu hore e be ntho e sa fetoheng bakeng sa rona, 'me re tla hokahanya khoutu e hlophisitsoeng litekong tsa rona re sebelisa. "include".

Theha faele foldareng ea projeke build.sh ka litaba tse latelang.

#!/bin/bash

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

Ha re e etse hore e phethahale.

chmod +x ./build.sh

Joale, matha script ea rona ho bokella konteraka. Empa ntle le sena, re hloka ho e ngola ka mokhoa o tsitsitseng code. Kahoo re tla theha faele e ncha lotter-compiled-for-test.fif, eo re tla e kenyelletsa faeleng lottery-test-suite.fif.

Ha re kenye khoutu ea skirpt ho sh, e tla qopitsa faele e hlophisitsoeng ho eona lotter-compiled-for-test.fif mme o fetole mola wa ho qetela ho yona.

# 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

Joale, ho hlahloba, a re tsamaise sengoloa se hlahisoang mme faele e tla hlahisoa lottery-compiled-for-test.fif, eo re tla e kenyelletsa ho rona lottery-test-suite.fif

В lottery-test-suite.fif hlakola khoutu ea konteraka mme u kenye mola "lottery-compiled-for-test.fif" include.

Re etsa liteko ho bona hore na baa atleha.

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

E kholo, joale ho qala liteko, ha re theheng faele test.sh, e tla qala ho phethahatsa build.sh, ebe o tsamaisa liteko.

touch test.sh
chmod +x test.sh

Re ngola ka hare

./build.sh 

echo "nCompilation completedn"

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

Ha re e etse test.sh 'me u e tsamaise ho etsa bonnete ba hore liteko lia sebetsa.

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

Re hlahloba hore na konteraka e bokella le liteko li etsoa.

E kholo, joale e qala test.sh Liteko li tla hlophisoa 'me li sebetse hang-hang. Sehokelo sa ho itlama.

Ho lokile, pele re tsoela pele, ha re etseng ntho e 'ngoe hape bakeng sa boiketlo.

Ha re theheng sephutheli build moo re tla boloka konteraka e kopilitsoeng le clone ea eona e ngotsoeng ka mokhoa o tsitsitseng lottery-compiled.fif, lottery-compiled-for-test.fif. Hape ha re theheng foldara test faele ea teko e tla bolokoa hokae? lottery-test-suite.fif le lifaele tse ling tse tšehetsang. Kopana le liphetoho tse amehang.

Ha re tsoeleng pele ho ntlafatsa konteraka e bohlale.

Ka mor'a moo ho lokela ho ba le teko e hlahlobang hore na molaetsa o amohetsoe le hore counter e nchafatsoa ka lebenkeleng ha re romela nomoro e nepahetseng. Empa re tla etsa seo hamorao.

Joale a re nahaneng ka sebopeho sa data le hore na ke data efe e lokelang ho bolokoa konteraka e bohlale.

Ke tla hlalosa tsohle tseo re li bolokang.

`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` переменная типа словарь, хранит последние двадцать ставок. 

Ka mor'a moo o hloka ho ngola mesebetsi e 'meli. Ha re bitse oa pele pack_state(), e tla paka lintlha bakeng sa ho boloka ka mor'a moo polokelong ea konteraka e bohlale. Ha re bitse oa bobeli unpack_state() e tla bala le ho khutlisa data ho tsoa polokelong.

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

Re kenyelletsa mesebetsi ena e 'meli qalong ea konteraka e bohlale. E tla sebetsa joalo ka sephetho sa mahareng.

Ho boloka data o tla hloka ho letsetsa ts'ebetso e hahelletsoeng set_data() 'me e tla ngola data ho tloha pack_state() polokelong ea konteraka e bohlale.

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

Kaha joale re na le mesebetsi e bonolo ea ho ngola le ho bala data, re ka tsoela pele.

Re hloka ho hlahloba hore na molaetsa o tsoang kantle o saennoe ke mong'a konteraka (kapa mosebelisi e mong ea nang le monyetla oa ho fumana senotlolo sa lekunutu).

Ha re phatlalatsa konteraka e bohlale, re ka e qala ka data eo re e hlokang polokelong, e tla bolokeha bakeng sa tšebeliso ea nako e tlang. Re tla hatisa senotlolo sa sechaba moo e le hore re ka netefatsa hore molaetsa o kenang o ne o saennoe ka senotlolo sa lekunutu se tsamaellanang le sona.

Pele re tsoela pele, ha re theheng senotlolo sa lekunutu ebe re se ngolla test/keys/owner.pk. Ho etsa sena, ha re qaleng Fift ka mokhoa o kopanetsoeng 'me re phethe litaelo tse' nè.

`newkeypair` генерация публичного и приватного ключа и запись их в стек. 

`drop` удаления из стека верхнего элемента (в данном случае публичный ключ)  

`.s` просто посмотреть что лежит в стеке в данный момент 

`"owner.pk" B>file` запись приватного ключа в файл с именем `owner.pk`. 

`bye` завершает работу с Fift. 

Ha re theheng sephutheli keys ka hare ho foldara test ebe u ngola senotlolo sa poraefete moo.

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

Re bona faele foldareng ea hajoale owner.pk.

Re tlosa senotlolo sa sechaba ka har'a stack 'me ha ho hlokahala re ka e fumana ho ea poraefete.

Hona joale re hloka ho ngola netefatso ea signature. Ha re qaleng ka teko. Pele re bala senotlolo sa poraefete ho tsoa faeleng re sebelisa ts'ebetso file>B ebe o e ngola ho feto-fetoha owner_private_key, ebe o sebelisa ts'ebetso priv>pub fetola senotlolo sa poraefete ho senotlolo sa sechaba ebe u ngola sephetho ho 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 !

Re tla hloka linotlolo ka bobeli.

Re qala polokelo ea konteraka e bohlale ka data e sa reroang ka tatellano e ts'oanang le ts'ebetsong pack_state()ebe o e ngola ho feto-fetoha 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 !

Ka mor'a moo, re tla ngola molaetsa o saenneng, o tla ba le signature le boleng ba counter.

Taba ea pele, re theha data eo re batlang ho e fetisetsa, ebe re e saena ka senotlolo sa lekunutu mme qetellong re hlahisa molaetsa o saenneng.

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 !  

Ka lebaka leo, molaetsa oo re tla o romella ho konteraka e bohlale o ngotsoe ka mokhoa o feto-fetohang message_to_send, mabapi le mesebetsi hashu, ed25519_sign_uint o ka bala litokomaneng tsa Bohlano.

Le ho matha teko re bitsa hape.

message_to_send @ 
recv_external 
code 
storage @
c7
runvmctx

Mona ho joalo Faele e nang le liteko e lokela ho shebahala tjena nakong ena.

Ha re sebetseng tlhahlobo mme e tla hloleha, kahoo re tla fetola konteraka e bohlale e le hore e ka amohela melaetsa ea sebopeho sena le ho netefatsa tekeno.

Taba ea pele, re bala li-bits tse 512 tsa signature ho tsoa molaetsa ebe re o ngola ho feto-fetoha, ebe re bala li-bits tse 32 tsa phapang ea counter.

Kaha re na le ts'ebetso ea ho bala data ho tsoa polokelong ea konteraka e bohlale, re tla e sebelisa.

E latelang ke ho hlahloba k'haontara e fetisitsoeng le polokelo le ho hlahloba tekeno. Haeba ho hong ho sa lumellane, joale re lahlela mokhelo ka khoutu e nepahetseng.

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

Boitlamo bo loketseng hona mona.

Ha re mathe liteko 'me re bone hore tlhahlobo ea bobeli e hloleha. Ka mabaka a mabeli, ha ho na likotoana tse lekaneng molaetsa 'me ha ho na likotoana tse lekaneng polokelong, kahoo khoutu e senyeha ha e arola. Re hloka ho kenya tekeno ho molaetsa oo re o romellang le ho kopitsa polokelo ho tsoa tekong ea ho qetela.

Tekong ea bobeli, re tla eketsa tekeno ea molaetsa le ho fetola polokelo ea konteraka e bohlale. Mona ho joalo faele e nang le liteko e shebahala joalo ka nako eo.

Ha re ngole teko ea bone, eo ho eona re tla romella molaetsa o saennoeng ka senotlolo sa lekunutu sa motho e mong. Ha re theheng senotlolo se seng sa poraefete 'me re se boloke faeleng not-owner.pk. Re tla saena molaetsa ka senotlolo sena sa lekunutu. Ha re sebetseng liteko mme re netefatse hore liteko tsohle lia feta. Boitlamo ka nako ena.

Hona joale re ka qetella re tsoela pele ho kenya ts'ebetsong logic ea konteraka e bohlale.
В recv_external() re tla amohela mefuta e 'meli ea melaetsa.

Kaha konteraka ea rona e tla bokella tahlehelo ea libapali, chelete ena e tlameha ho fetisetsoa ho moetsi oa lotho. Aterese ea sepache ea moetsi oa lotho e ngotsoe polokelong ha konteraka e thehoa.

Feela haeba ho ka etsahala, re hloka bokhoni ba ho fetola aterese eo re romellang ligrama tsa ba lahlehileng. Hape re lokela ho khona ho romela ligrama ho tloha lotho ho ea atereseng ea mong'a tsona.

A re qaleng ka ea pele. A re qaleng ho ngola tlhahlobo e tla hlahloba hore ka mor'a ho romela molaetsa, konteraka e bohlale e bolokile aterese e ncha sebakeng sa polokelo. Ka kopo hlokomela hore molaetsa, ho phaella ho counter le aterese e ncha, re boetse re fetisetsa action Nomoro ea 7-bit e seng e mpe, ho itšetlehile ka eona, re tla khetha mokhoa oa ho sebetsana le molaetsa konteraka e bohlale.

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

Tekong u ka bona hore na polokelo ea smartcontract e felisitsoe joang storage ho ea Bohlano. Deserialization ea mefuta e fapaneng e hlalositsoe litokomaneng tsa Fift.

Khokahano ea boitlamo ka hlama e ekelitsoeng.

Ha re sebetseng tlhahlobo mme re netefatse hore e hloleha. Joale a re kenyelleng logic ho fetola aterese ea mong'a lotho.

Ka konteraka e bohlale re tsoela pele ho e hlalosa message, bala ka action. A re u hopotse hore re tla ba le tse peli action: fetola aterese 'me u romelle ligrama.

Ebe re bala aterese e ncha ea mong'a konteraka mme re e boloka polokelong.
Re tsamaisa liteko mme re bona hore tlhahlobo ea boraro e hloleha. E senyeha ka lebaka la hore konteraka hona joale e fetisa likotoana tse 7 tsa molaetsa, tse sieo tekong. Kenya e seng teng molaetseng action. Ha re mathe liteko 'me re bone hore tsohle lia feta. mona itlama ka liphetoho. E kholo.

Joale a re ngoleng mohopolo oa ho romella palo e boletsoeng ea ligrama atereseng e bolokiloeng pele.

Pele, ha re ngoleng teko. Re tla ngola liteko tse peli, e 'ngoe ha ho se na tekanyo e lekaneng, ea bobeli ha ntho e' ngoe le e 'ngoe e lokela ho feta ka katleho. Liteko li ka bonoa boitlamong bona.

Joale ha re kenye khoutu. Pele, a re ngoleng mekhoa e 'meli ea bathusi. Mokhoa oa pele oa ho fumana ke ho fumana tekanyo ea hona joale ea konteraka e bohlale.

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

'Me ea bobeli ke ea ho romela ligrama ho konteraka e' ngoe e bohlale. Ke ile ka kopitsa mokhoa ona ka ho feletseng ho tloha konteraka e 'ngoe e bohlale.

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

Ha re kenyelle mekhoa ena e 'meli ho konteraka e bohlale ebe re ngola logic. Taba ea pele, re bapisa palo ea ligrama tse tsoang molaetseng. Ka mor'a moo re hlahloba tekanyo, haeba e sa lekana re lahlela mokhelo. Haeba ntho e 'ngoe le e' ngoe e le hantle, joale re romela ligrama ho aterese e bolokiloeng ebe re ntlafatsa 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));

Mona ho joalo e shebahala joalo ka konteraka e bohlale hajoale. Ha re mathe liteko 'me re netefatse hore lia feta.

Ka tsela, komisi e tlosoa ho konteraka e bohlale nako le nako bakeng sa molaetsa o sebetsitsoeng. E le hore melaetsa ea konteraka e bohlale e phethe kopo, ka mor'a licheke tsa motheo tseo u lokelang ho li letsetsa accept_message().

Joale ha re feteleng pele ho melaetsa e ka hare. Ha e le hantle, re tla amohela ligrama feela ebe re khutlisetsa chelete e imenneng habeli ho sebapali haeba se ka hlola le karolo ea boraro ho mong'a sona haeba a hloloa.

Pele, ha re ngoleng teko e bonolo. Ho etsa sena, re hloka aterese ea tlhahlobo ea konteraka e bohlale eo ho thoeng re romella ligrama ho konteraka e bohlale.

Aterese ea konteraka e bohlale e na le linomoro tse peli, palo e felletseng ea 32-bit e ikarabellang bakeng sa ketane ea mosebetsi le nomoro e ikhethang ea 256-bit non-negative palo e ikhethang ea ketane ena ea mosebetsi. Mohlala, -1 le 12345, ena ke aterese eo re tla e boloka faeleng.

Ke kopitsitse tšebetso ea ho boloka aterese ho tsoa 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

Ha re shebeng hore na mosebetsi o sebetsa joang, sena se tla fana ka kutloisiso ea hore na Fift e sebetsa joang. Qala Fift ka mokhoa oa ho sebelisana.

~/TON/build/crypto/fift -i 

Pele re sutumelletsa -1, 12345 le lebitso la faele ea kamoso "sender.addr" holim'a stack:

-1 12345 "sender.addr" 

Mohato o latelang ke ho kenya tshebetsong -rot, e fetolang stack ka tsela eo ka holim'a stack ho nang le nomoro e ikhethang ea konteraka e bohlale:

"sender.addr" -1 12345

256 u>B e fetolela 256-bit non-negative integer ho li-byte.

"sender.addr" -1 BYTES:0000000000000000000000000000000000000000000000000000000000003039

swap e fetola likarolo tse peli tse ka holimo tsa stack.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 -1

32 i>B e fetolela palo e felletseng ea 32-bit ho li-byte.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 BYTES:FFFFFFFF

B+ e kopanya tatellano e 'meli ea li-byte.

 "sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF

Hape swap.

BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF "sender.addr" 

'Me qetellong li-byte li ngolloa faeleng B>file. Ka mor'a sena qubu ea rona ha e na letho. Re emisa Fift. Faele e entsoe sephuthelong sa hajoale sender.addr. Ha re ise faele foldareng e entsoeng test/addresses/.

Ha re ngole teko e bonolo e tla romella ligrama ho konteraka e bohlale. Boitlamo ke bona.

Joale ha re shebeng mabaka a lotho.

Ntho ea pele eo re e etsang ke ho hlahloba molaetsa bounced kapa che haeba bounced, ebe rea e hlokomoloha. bounced ho bolela hore konteraka e tla khutlisa ligrama haeba phoso e itseng e etsahala. Re ke ke ra khutlisa ligrama haeba phoso e etsahala ka tšohanyetso.

Re hlahloba, haeba tekanyo e ka tlase ho halofo ea gram, joale re amohela molaetsa feela ebe re o hlokomoloha.

Ka mor'a moo, re hlalosa aterese ea konteraka e bohlale eo molaetsa o tsoang ho eona.

Re bala lintlha tse tsoang polokelong ebe re hlakola libeche tsa khale nalaneng haeba ho na le tse fetang mashome a mabeli. Bakeng sa boiketlo, ke ngotse mesebetsi e meng e meraro pack_order(), unpack_order(), remove_old_orders().

Ka mor'a moo, re sheba hore na chelete e sa lekana bakeng sa tefo, joale re nka hore sena ha se bet, empa ke ho tlatsa le ho boloka ho tlatsoa ho orders.

Ebe qetellong moelelo oa konteraka e bohlale.

Ntlha ea pele, haeba sebapali se lahleheloa, re se boloka historing ea ho becha 'me haeba chelete e feta ligrama tse 3, re romela 1/3 ho mong'a konteraka e bohlale.

Haeba sebapali se hapa, re romella chelete e habeli atereseng ea sebapali ebe re boloka tlhahisoleseling mabapi le bethe nalaneng.

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

Ke tsohle. Boitlamo bo tsamaellanang.

Hona joale tsohle tse setseng li bonolo, ha re theheng mekhoa ea ho fumana e le hore re ka fumana tlhahisoleseding mabapi le boemo ba konteraka ho tsoa lefats'eng le ka ntle (ha e le hantle, bala lintlha tse tsoang polokelong ea bona ea konteraka e bohlale).

Ha re eketse fumana mekhoa. Re tla ngola ka tlase mabapi le mokhoa oa ho fumana tlhahisoleseling mabapi le konteraka e bohlale.

Ke boetse ke lebetse ho kenya khoutu e tla sebetsana le kopo ea pele e hlahang ha ho phatlalatsoa konteraka e bohlale. Boitlamo bo tsamaellanang. Le ho feta lokisitsoe kokoanyana ka ho romella 1/3 ea chelete eo akhaonteng ea mong'a eona.

Mohato o latelang ke ho phatlalatsa konteraka e bohlale. Ha re theheng sephutheli requests.

Ke ile ka nka khoutu ea khatiso e le motheo simple-wallet-code.fc e leng ka fumana polokelong ea molao.

Ntho ea bohlokoa ho ela hloko. Re etsa polokelo e bohlale ea konteraka le molaetsa oa ho kenya. Ka mor'a sena, aterese ea konteraka e bohlale e hlahisoa, ke hore, aterese e tsejoa le pele ho phatlalatsoa TON. Ka mor'a moo, o lokela ho romela ligrama tse 'maloa atereseng ena,' me feela ka mor'a moo o hloka ho romela faele e nang le konteraka e bohlale ka boeona, kaha marang-rang a nka komisi ea ho boloka konteraka e bohlale le ts'ebetso ho eona (li-validators tse bolokang le ho phethahatsa bohlale. likonteraka). Khoutu e ka bonoa mona.

Ka mor'a moo re kenya khoutu ea khatiso ebe re fumana lottery-query.boc bohlale konteraka faele le aterese.

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

Se ke oa lebala ho boloka lifaele tse hlahisitsoeng: lottery-query.boc, lottery.addr, lottery.pk.

Har'a tse ling, re tla bona aterese ea konteraka e bohlale litlalehong tsa ho phethahatsa.

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

Bakeng sa monate feela, ha re etseng kopo ho TON

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

Mme re tla bona hore ak'haonte e nang le aterese ena ha e na letho.

account state is empty

Re romela atereseng 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd 2 Gram 'me ka mor'a metsotsoana e seng mekae re phethahatsa taelo e tšoanang. Ho romela ligrama tseo ke li sebelisang sepache sa semmuso, 'me u ka botsa motho e mong moqoqong bakeng sa ligrama tsa teko, tseo ke tla bua ka tsona qetellong ea sehlooho.

> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

E shebahala joaloka ntho e sa tsejoeng (state:account_uninit) konteraka e bohlale e nang le aterese e tšoanang le tekanyo ea 1 nanograms.

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

Joale ha re phatlalatseng konteraka e bohlale. Ha re qaleng lite-client 'me re phethe.

> 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 

Ha re hlahlobeng hore na konteraka e hatisitsoe.

> last
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Har'a tse ling tseo re li fumanang.

  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

Re bona seo account_active.

Boitlamo bo lumellanang le liphetoho hona mona.

Joale ha re theheng likopo tsa ho sebelisana le konteraka e bohlale.

Ha e le hantle, re tla tlohela ea pele bakeng sa ho fetola aterese e le mosebetsi o ikemetseng, 'me re tla etsa ea bobeli bakeng sa ho romela ligrama atereseng ea mong'a lona. Ha e le hantle, re tla hloka ho etsa ntho e tšoanang le tekong ea ho romela ligrama.

Ona ke molaetsa oo re tla o romella ho konteraka e bohlale, moo msg_seqno 165, action 2 le 9.5 dikgerama bakeng sa ho romela.

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

Se ke oa lebala ho saena molaetsa ka senotlolo sa hau sa lekunutu lottery.pk, e ileng ea hlahisoa pejana ha ho etsoa konteraka e bohlale. Mona ke boitlamo bo tšoanang.

Ho fumana lintlha ho tsoa konteraka e bohlale ka ho sebelisa mekhoa ea ho fumana

Joale a re shebeng mokhoa oa ho tsamaisa konteraka e bohlale fumana mekhoa.

Qala lite-client 'me u tsamaise fumana mekhoa eo re e ngotseng.

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

В result e na le boleng boo mosebetsi o bo khutlisang balance() ho tsoa konteraka ea rona e bohlale.
Re tla etsa se tšoanang ka mekhoa e meng e mengata.

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

Ha re u botse nalane ea hau ea ho becha.

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

Re tla sebelisa lite-client mme re fumane mekhoa ea ho bonts'a tlhahisoleseling mabapi le konteraka e bohlale setšeng.

Ho hlahisa lintlha tsa kontraka e bohlale webosaeteng

Ke ngotse webosaete e bonolo ho Python ho bonts'a data ho tsoa konteraka e bohlale ka tsela e bonolo. Mona nke ke ka lula ho eona ka botlalo mme ke tla phatlalatsa sebaka seo boitlamong bo le bong.

Likopo ho TON li entsoe ho tsoa ho Python ka thuso lite-client. Bakeng sa boiketlo, sebaka sa marang-rang se pakiloe ho Docker mme se phatlalatsoa ho Google Cloud. Sehokelo.

Ho leka

Joale ha re lekeng ho romella ligrama moo bakeng sa ho tlatsa hape ho tloha sepache. Re tla romela ligrama tse 40. 'Me re etse li-bets tse peli bakeng sa ho hlaka. Rea bona hore sebaka sa marang-rang se bonts'a nalane ea libeche, liperesente tse hapileng hajoale le lintlha tse ling tsa bohlokoa.

Rea bonahore re hlotse ea pele, ra lahleheloa ke ea bobeli.

Afterword

Sehlooho sena se ile sa fetoha nako e telele ho feta kamoo ke neng ke lebeletse kateng, mohlomong e ka be e le khutšoanyane, kapa mohlomong feela bakeng sa motho ea sa tsebeng letho ka TON 'me a batla ho ngola le ho phatlalatsa konteraka e bohlale e seng bonolo le bokhoni ba ho sebelisana le bona. eona. Mohlomong lintho tse ling li ka be li hlalositsoe habonolo haholoanyane.

Mohlomong likarolo tse ling tsa ts'ebetsong li ka be li entsoe ka mokhoa o atlehileng le ka bokhabane, empa joale ho ne ho tla nka nako e eketsehileng ho lokisetsa sehlooho. Hape ho ka etsahala hore ebe ke entse phoso kae-kae kapa ke sa utloisise ntho e itseng, kahoo haeba u etsa ntho e tebileng, u lokela ho itšetleha ka litokomane tsa molao kapa polokelo ea molao e nang le khoutu ea TON.

Hoa lokela ho hlokomeloa hore kaha TON ka boeona e ntse e le sethaleng se sebetsang sa tsoelo-pele, liphetoho li ka 'na tsa etsahala tse tla senya leha e le efe ea mehato e hlahang sehloohong sena (e ileng ea etsahala ha ke ntse ke ngola, e se e lokisitsoe), empa mokhoa o akaretsang ke hore. e sa kgoneng ho fetoha.

Nke ke ka bua ka bokamoso ba TON. Mohlomong sethala se tla fetoha ntho e kholo 'me re lokela ho qeta nako re ithuta eona le ho tlatsa niche ka lihlahisoa tsa rona hona joale.

Ho boetse ho na le Libra e tsoang ho Facebook, e nang le bamameli ba ka bang kholo ho feta TON. Ha ke tsebe letho ka Libra, ho ahlola ka foramo ho na le ts'ebetso e ngata ho feta sechabeng sa TON. Leha bahlahisi le sechaba sa TON se tšoana le sekhukhu, seo le sona se pholileng.

litšupiso

  1. Litokomane tsa TON tsa semmuso: https://test.ton.org
  2. Sebaka sa semmuso sa TON: https://github.com/ton-blockchain/ton
  3. Sepache sa semmuso bakeng sa li-platform tse fapaneng: https://wallet.ton.org
  4. Sebaka sa polokelo ea kontraka e bohlale ho tsoa sengoloa sena: https://github.com/raiym/astonished
  5. Khokahano ea webosaete e bohlale ea kontraka: https://ton-lottery.appspot.com
  6. Sebaka sa katoloso ea Visual Studio Code bakeng sa FunC: https://github.com/raiym/func-visual-studio-plugin
  7. Buisana ka TON ho Telegram, e hlileng e thusitseng ho e tseba qalong. Ke nahana hore e ke ke ea e-ba phoso haeba ke re motho e mong le e mong ea ngotseng ntho e itseng bakeng sa TON o teng. U ka boela ua kopa ligrama tsa teko moo. https://t.me/tondev_ru
  8. Puisano e 'ngoe ka TON eo ho eona ke fumaneng lintlha tse molemo: https://t.me/TONgramDev
  9. Mokhahlelo oa pele oa tlholisano: https://contest.com/blockchain
  10. Mokhahlelo oa bobeli oa tlholisano: https://contest.com/blockchain-2

Source: www.habr.com

Eketsa ka tlhaloso