Banyere otu esi ede ma bipụta nkwekọrịta smart na Telegram Open Network (TON)

Banyere otu esi ede ma bipụta nkwekọrịta smart na TON

Kedu ihe akụkọ a gbasara?

N'isiokwu ahụ, m ga-ekwu banyere otu m si soro na nke mbụ (nke abụọ) Telegram asọmpi blockchain, na-enwetaghị ihe nrite, ma kpebie ịdekọ ahụmahụ m na isiokwu ka ọ ghara ịdaba na nchefu na, ikekwe, nyere aka. onye.

Ebe ọ bụ na achọghị m ide koodu abstract, mana ime ihe na-arụ ọrụ, maka isiokwu ahụ, edere m nkwekọrịta smart maka ngwa ngwa ngwa ngwa na ebe nrụọrụ weebụ na-egosi data nkwekọrịta smart ozugbo site na TON na-enweghị iji nchekwa etiti.

Isiokwu ahụ ga-aba uru nye ndị chọrọ ịme nkwekọrịta smart mbụ ha na TON, mana ha amaghị ebe ha ga-amalite.

N'iji lọtrị dị ka ihe atụ, m ga-esi na ịwụnye gburugburu ebe obibi gaa na-ebipụta nkwekọrịta smart, na-emekọrịta ihe na ya, na ide weebụsaịtị maka ịnata na ibipụta data.

Banyere isonye na asọmpi

Ọktoba gara aga, Telegram kwupụtara asọmpi blockchain nwere asụsụ ọhụrụ Fift и FunC. Ọ dị mkpa ịhọrọ site na ịde ihe ọ bụla n'ime nkwekọrịta smart smart ise a tụrụ aro. Echere m na ọ ga-adị mma ka m mee ihe dị iche, mụta asụsụ na ime ihe, ọ bụrụgodị na agaghị m ede ihe ọ bụla ọzọ n'ọdịnihu. Na mgbakwunye, isiokwu ahụ na-adị n'egbugbere ọnụ mgbe niile.

Ọ bara uru ịsị na enweghị m ahụmahụ ịzụlite smart contracts.

M mere atụmatụ isonye ruo ọgwụgwụ ruo mgbe m nwere ike wee dee akụkọ ntụleghachi, mana m dara ozugbo na nke mbụ. I dere obere akpa na multi-mbinye aka na FunC ọ na-arụkwa ọrụ n'ozuzu ya. M weere ya dị ka ndabere smart nkwekọrịta na Solidity.

N'oge ahụ, echere m na nke a zuru ezu iji were opekata mpe ebe ihe nrite. N’ihi ya, ihe dị ka mmadụ 40 n’ime mmadụ iri isii so na ya ghọrọ ndị nwetara ihe nrite ma anọghị m n’ime ha. N'ozuzu, ọ dịghị ihe dị njọ na nke a, ma otu ihe na-ewute m. N'oge a mara ọkwa nke nsonaazụ, nyocha nke ule maka nkwekọrịta m emebeghị, ajụrụ m ndị sonyere na nkata ma ọ bụrụ na ọ dị onye ọzọ na-enweghị ya, ọ dịghị.

O doro anya na ị na-aṅa ntị na ozi m, ụbọchị abụọ ka e mesịrị, ndị ọkàikpe bipụtara nkwupụta na m ka na-aghọtaghị ma ha na mberede tụfuru m smart nkwekọrịta n'oge ikpe ma ọ bụ nanị na-eche na ọ dị njọ nke na ọ dịghị mkpa ikwu. Ajụrụ m ajụjụ na ibe ahụ, mana enwetaghị m azịza ya. Ọ bụ ezie na ọ bụghị ihe nzuzo onye kpere ikpe, echere m na ọ dịghị mkpa ide ozi nkeonwe.

A na-etinye oge dị ukwuu na nghọta, ya mere e kpebiri ide edemede. Ebe ọ bụ na enwebeghị ọtụtụ ozi, isiokwu a ga-enyere aka ịchekwa oge maka onye ọ bụla nwere mmasị.

Echiche nke smart contracts na TON

Tupu ị dee ihe ọ bụla, ịkwesịrị ịchọpụta akụkụ nke ị ga-esi bịaruo ihe a nso. Ya mere, ugbu a, m ga-agwa gị ihe akụkụ nke usoro mejupụtara. Kpọmkwem, kedu akụkụ ị kwesịrị ịma ka ị dee ma ọ dịkarịa ala ụdị nkwekọrịta ọrụ.

Anyị ga-elekwasị anya na-ede a smart nkwekọrịta na-arụ ọrụ na TON Virtual Machine (TVM), Fift и FunC, yabụ isiokwu ahụ dị ka nkọwa nke mmepe nke mmemme mgbe niile. Anyị agaghị echere ka ikpo okwu n'onwe ya si arụ ọrụ ebe a.

N'ozuzu banyere otú o si arụ ọrụ TVM na asụsụ Fift enwere ezigbo akwụkwọ gọọmentị. Mgbe m na-ekere òkè na asọmpi na ugbu a mgbe m na-ede nkwekọrịta ugbu a, m na-atụgharịkarị ya.

Asụsụ bụ isi nke a na-ede nkwekọrịta smart bụ FunC. Enweghị akwụkwọ ọ bụla na ya ugbu a, ya mere, iji dee ihe ị ga-amụ ihe atụ nke smart contracts si na ukara repository na mmejuputa asụsụ n'onwe ya n'ebe ahụ, gbakwunyere na ị nwere ike na-ele anya na ihe atụ nke smart contracts site n'oge gara aga abụọ. asọmpi. Njikọ na njedebe nke akụkọ.

Ka anyị kwuo na anyị edeelarị nkwekọrịta smart maka FunC, mgbe ahụ, anyị na-achịkọta koodu n'ime Fift assembler.

Nkwekọrịta smart achịkọtara ka ga-ebipụta. Iji mee nke a, ịkwesịrị ide ọrụ na ya Fift, nke ga-ewere koodu nkwekọrịta smart na ụfọdụ paramita ndị ọzọ dị ka ntinye, na mmepụta ga-abụ faịlụ nwere ndọtị .boc (nke pụtara "akpa cell"), na, dabere n'otú anyị si ede ya, igodo nzuzo na adreesị, nke a na-emepụta dabere na koodu nkwekọrịta smart. Ị nwere ike izipu gram na adreesị nke nkwekọrịta smart nke na-ebipụtabeghị.

Iji bipụta nkwekọrịta smart na TON natara .boc A ga-eziga faịlụ ahụ na blockchain site na iji onye ahịa ọkụ (karịa na nke dị n'okpuru). Ma tupu ibipụta, ịkwesịrị ịnyefe gram na adreesị emepụtara, ma ọ bụghị ya, a gaghị ebipụta nkwekọrịta smart. Mgbe e bipụtachara, ị nwere ike ịmekọrịta na nkwekọrịta smart site na izipu ozi site na mpụga (dịka ọmụmaatụ, iji onye ahịa ọkụ) ma ọ bụ n'ime (dịka ọmụmaatụ, otu nkwekọrịta smart na-eziga ozi ọzọ n'ime TON).

Ozugbo anyị ghọtara ka esi ebipụta koodu ahụ, ọ na-adị mfe. Anyị maara nke ọma ihe anyị chọrọ ide yana ka mmemme anyị ga-esi arụ ọrụ. Ma ka anyị na-ede akwụkwọ, anyị na-achọ ka esi etinye nke a na nkwekọrịta smart dị ugbu a, ma ọ bụ anyị na-eleba anya na koodu mmejuputa Fift и FunC n'ime ebe nchekwa gọọmentị, ma ọ bụ lee anya na akwụkwọ gọọmentị.

Ọtụtụ mgbe, m na-achọ isi okwu na mkparịta ụka Telegram ebe ndị niile sonyere asọmpi na ndị ọrụ Telegram gbakọtara, o wee mee na n'oge asọmpi ahụ onye ọ bụla gbakọtara ebe ahụ wee malite mkparịta ụka Fift na FunC. Njikọ na njedebe nke akụkọ.

Ọ bụ oge ịkwaga site na tiori gaa na omume.

Na-akwado gburugburu maka ịrụ ọrụ na TON

Emere m ihe niile a ga-akọwa n'isiokwu na MacOS wee lelee ya ugboro abụọ na Ubuntu 18.04 LTS dị ọcha na Docker.

Ihe mbụ ị ga-eme bụ nbudata na wụnye lite-client nke ị nwere ike izipu arịrịọ na TON.

Ntuziaka dị na webụsaịtị gọọmentị na-akọwa usoro nrụnye n'ụzọ zuru ezu na nke doro anya ma hapụ ụfọdụ nkọwa. N'ebe a, anyị na-agbaso ntuziaka ahụ, na-etinye ihe ndabere na-efu efu n'ụzọ. Anaghị m achịkọta ọrụ ọ bụla n'onwe m wee tinye ya na ebe nchekwa Ubuntu gọọmentị (na MacOS m jiri 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 

Ozugbo etinyere ndabere niile ị nwere ike ịwụnye lite-client, Fift, FunC.

Nke mbụ, anyị na-emechi ebe nchekwa TON yana ndabere ya. Maka ịdị mma, anyị ga-eme ihe niile na nchekwa ~/TON.

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

Ebe nchekwa ahụ na-echekwa mmejuputa iwu Fift и FunC.

Ugbu a, anyị dị njikere ikpokọta oru ngo. A na-emechi koodu nchekwa ahụ n'ime nchekwa ~/TON/ton. The ~/TON mepụta nchekwa build ma chịkọta ọrụ ahụ n'ime ya.

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

Ebe ọ bụ na anyị ga-ede nkwekọrịta smart, ọ bụghị naanị anyị chọrọ lite-clientMa Fift с FunC, yabụ ka anyị chịkọta ihe niile. Ọ bụghị usoro ngwa ngwa, yabụ anyị na-eche.

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

Na-esote, budata faịlụ nhazi nke nwere data gbasara ọnụ nke lite-client ga-ejikọta.

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

Na-eme arịrịọ mbụ na TON

Ugbu a, ka malite lite-client.

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

Ọ bụrụ na ụlọ ahụ gara nke ọma, mgbe ahụ mgbe ịmalitechara, ị ga-ahụ ndekọ nke njikọ nke onye ahịa ọkụ na ọnụ.

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

Ị nwere ike ịme iwu ahụ help ma hụ ihe iwu dị.

help

Ka anyị depụta iwu ndị anyị ga-eji n'isiokwu a.

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

Ugbu a, anyị dị njikere ide nkwekọrịta n'onwe ya.

Mmejuputa iwu

Echiche

Dịka m dere n'elu, nkwekọrịta smart nke anyị na-ede bụ lotiri.

Ọzọkwa, nke a abụghị lọtrị nke ịchọrọ ịzụta tiketi wee chere otu awa, ụbọchị ma ọ bụ ọnwa, mana otu ntabi anya nke onye ọrụ na-ebufe na adreesị nkwekọrịta. N gram, wee nwetaghachi ya ozugbo 2 * N gram ma ọ bụ tụfuo. Anyị ga-enwe ike imeri ihe dịka 40%. Ọ bụrụ na enweghi gram zuru ezu maka ịkwụ ụgwọ, mgbe ahụ, anyị ga-atụle azụmahịa ahụ dị ka n'elu.

Ọzọkwa, ọ dị mkpa na nzo nwere ike hụrụ na ozugbo na a adaba ụdị, nke mere na onye ọrụ nwere ike ozugbo ịghọta ma ọ meriri ma ọ bụ furu efu. Yabụ, ịkwesịrị ịme weebụsaịtị nke ga-egosi nzọ na nsonaazụ ozugbo sitere na TON.

Na-ede nkwekọrịta smart

Maka ịdị mma, akọwapụtala m koodu maka FunC; enwere ike ịchọta ngwa mgbakwunye ma tinye ya na ọchụchọ Visual Studio Code; ọ bụrụ na ịchọrọ ịgbakwunye ihe na mberede, emewo m ngwa mgbakwunye ahụ n'ihu ọha. Ọzọkwa, onye na-emebu ngwa mgbakwunye maka ịrụ ọrụ na Fift, ị nwekwara ike ịwụnye ya wee chọta ya na VSC.

Ka anyị mepụta ebe nchekwa ozugbo ebe anyị ga-eme nsonaazụ etiti.

Iji mee ka ndụ anyị dịkwuo mfe, anyị ga-ede nkwekọrịta smart wee nwalee ya na mpaghara ruo mgbe ọ dị njikere. Naanị mgbe nke ahụ gasịrị, anyị ga-ebipụta ya na TON.

Nkwekọrịta smart nwere ụzọ abụọ dị na mpụga nke enwere ike ịnweta. Nke mbụ, recv_external() A na-arụ ọrụ a mgbe arịrịọ maka nkwekọrịta ahụ si n'èzí pụta, ya bụ, ọ bụghị site na TON, dịka ọmụmaatụ, mgbe anyị onwe anyị na-emepụta ozi ma zipụ ya site na onye na-azụ ahịa. Nke abụọ, recv_internal() Nke a bụ mgbe, n'ime TON n'onwe ya, nkwekọrịta ọ bụla na-ezo aka na nke anyị. N'okwu abụọ ahụ, ịnwere ike ịnyefe paramita na ọrụ ahụ.

Ka anyị malite na ihe atụ dị mfe nke ga-arụ ọrụ ma ọ bụrụ na ebipụta ya, ma ọ dịghị ibu ọrụ na ya.

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

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

N'ebe a, anyị kwesịrị ịkọwa ihe ọ bụ slice. Data niile echekwara na TON Blockchain bụ mkpokọta TVM cell ma ọ bụ nanị cell, na cell dị otú ahụ ị nwere ike ịchekwa ihe ruru 1023 bit nke data na ruo 4 njikọ na sel ndị ọzọ.

TVM cell slice ma ọ bụ slice nke a bụ akụkụ nke dị adị cell a na-eji atụgharị ya, ọ ga-edo anya ma emechaa. Isi ihe maka anyị bụ na anyị nwere ike ịnyefe slice na dabere n'ụdị ozi, hazie data n'ime recv_external() ma ọ bụ recv_internal().

impure - isiokwu nke na-egosi na ọrụ ahụ na-agbanwe data nkwekọrịta smart.

Ka anyị chekwaa koodu nkwekọrịta n'ime lottery-code.fc na ikpokọta.

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

Enwere ike ịhụ ihe ọkọlọtọ pụtara site na iji iwu ahụ

~/TON/build/crypto/func -help

Anyị achịkọtala koodu mgbakọ Fift in 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

Enwere ike ịmalite ya na mpaghara, maka nke a anyị ga-akwadebe gburugburu ebe obibi.

Mara na ahịrị nke mbụ na-ejikọ Asm.fif, nke a bụ koodu e dere na Fift for the Fift assembler.

Ebe ọ bụ na anyị chọrọ ịgba ọsọ ma nwalee nkwekọrịta smart na mpaghara, anyị ga-emepụta faịlụ lottery-test-suite.fif ma detuo koodu a chịkọtara n'ebe ahụ, dochie akara ikpeazụ n'ime ya, nke na-ede koodu nkwekọrịta smart na mgbe niile codeka nyefee ya na igwe mebere:

"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

Ka ọ dị ugbu a ọ dị ka o doro anya, ugbu a, ka anyị tinye n'otu faịlụ ahụ koodu anyị ga-eji malite 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 anyị na-edekọ ihe gbara ya gburugburu, ya bụ, data nke TVM (ma ọ bụ steeti netwọk) ga-eji malite. Ọbụna n'oge asọmpi ahụ, otu n'ime ndị mmepe gosipụtara otu esi emepụta c7 na m depụtaghachiri. N'isiokwu a, anyị nwere ike ịgbanwe rand_seed ebe ọ bụ na ọgbọ nke ọnụọgụ ọnụọgụ na-adabere na ya ma ọ bụrụ na agbanweghị, otu ọnụ ọgụgụ ahụ ga-eweghachi oge ọ bụla.

recv_internal и recv_external ndị na-agbanwe agbanwe nwere ụkpụrụ 0 na -1 ga-ahụ maka ịkpọ ọrụ kwekọrọ na nkwekọrịta smart.

Ugbu a, anyị dị njikere ịmepụta ule mbụ maka nkwekọrịta smart smart anyị efu. Maka idoanya, maka ugbu a, anyị ga-agbakwunye ule niile n'otu faịlụ ahụ lottery-test-suite.fif.

Ka anyị mepụta mgbanwe storage ma dee ihe efu n'ime ya cell, nke a ga-abụ nchekwa nkwekọrịta smart.

message Nke a bụ ozi anyị ga-ebuga na kọntaktị smart site na mpụga. Anyị ga-emekwa ka ọ tọgbọrọ chakoo ugbu a.

variable storage 
<b b> storage ! 

variable message 
<b b> message ! 

Mgbe anyị kwadochara ndị na-agbanwe agbanwe na mgbanwe, anyị na-eji iwu ahụ malite TVM runvmctx ma nyefee paramita emepụtara na ntinye.

message @ 
recv_external 
code 
storage @ 
c7 
runvmctx 

N'ikpeazụ anyị ga-aga nke ọma dị ka nke a koodu etiti maka Fift.

Ugbu a, anyị nwere ike ịgba ọsọ koodu na-apụta.

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

Ihe omume ahụ kwesịrị ịgba ọsọ na-enweghị njehie na na mmepụta anyị ga-ahụ ndekọ mkpochapụ:

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

Ọ dị mma, anyị edeela ụdị ọrụ mbụ nke nkwekọrịta smart.

Ugbu a, anyị kwesịrị ịgbakwunye ọrụ. Mbụ ka anyị na-emeso ozi na-abịa site n'èzí ụwa recv_external()

Onye nrụpụta n'onwe ya na-ahọrọ usoro ozi nke nkwekọrịta nwere ike ịnakwere.

Ma na-emekarị

  • Nke mbụ, anyị chọrọ ichebe nkwekọrịta anyị site na mpụga ụwa ma mee ka ọ bụrụ naanị onye nwe nkwekọrịta nwere ike iziga ya ozi mpụga.
  • Nke abuo, mgbe anyị zigara TON ozi ziri ezi, anyị chọrọ ka nke a mee otu ugboro na mgbe anyị zigakwara otu ozi ọzọ, nkwekọrịta smart jụrụ ya.

Ya mere, ihe fọrọ nke nta ka ọ bụrụ nkwekọrịta ọ bụla na-edozi nsogbu abụọ a, ebe ọ bụ na nkwekọrịta anyị na-anabata ozi mpụga, anyị kwesịkwara ilekọta nke ahụ.

Anyị ga-eme ya n'usoro ọzọ. Nke mbụ, ka anyị dozie nsogbu ahụ site na ikwugharị, ma ọ bụrụ na nkwekọrịta ahụ enwetalarị ozi dị otú ahụ ma hazie ya, ọ gaghị eme ya nke ugboro abụọ. Na mgbe ahụ, anyị ga-edozi nsogbu ahụ nke mere na ọ bụ naanị ụfọdụ okirikiri ndị mmadụ nwere ike izipu ozi na smart nkwekọrịta.

Enwere ụzọ dị iche iche isi dozie nsogbu ahụ site na iji ozi oyiri. Nke a bụ ka anyị ga-esi mee ya. N'ime nkwekọrịta smart, anyị na-amalite counter nke ozi natara na uru mbụ 0. Na ozi ọ bụla na nkwekọrịta smart, anyị ga-agbakwunye uru counter ugbu a. Ọ bụrụ na ọnụ ahịa counter dị na ozi ahụ adabaghị uru dị na nkwekọrịta smart, mgbe ahụ anyị anaghị ahazi ya; ọ bụrụ na ọ na-eme ya, anyị na-edozi ya ma mụbaa counter na nkwekọrịta smart site na 1.

Ka anyị laghachi lottery-test-suite.fif ma tinye ule nke abụọ na ya. Ọ bụrụ na anyị ezipụ nọmba ezighi ezi, koodu ahụ kwesịrị ịtụfu ihe dị iche. Dịka ọmụmaatụ, hapụ data nkwekọrịta ahụ 166, anyị ga-eziga 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"

Ka anyị malite.

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

Anyị ga-ahụkwa na e ji njehie mee ule ahụ.

[ 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

N'oge a lottery-test-suite.fif kwesịrị ịdị ka njikọ.

Ugbu a, ka anyị tinye mgbanaka counter na nkwekọrịta smart n'ime 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 ụgha ozi anyị na-ezi.

Ihe mbụ anyị na-eme bụ ịlele ma ọ bụrụ na ozi ahụ nwere data, ọ bụrụ na ọ bụghị, anyị ga-apụ naanị.

Ọzọ, anyị na-atụgharị ozi ahụ. in_msg~load_uint(32) na-ebu nọmba 165, 32-bit unsigned int site na ozi ezigara.

Ọzọ anyị na-ebufe 32 bits site na nchekwa nkwekọrịta smart. Anyị na-eleba anya na nọmba eburu ibu dabara na nke gafere; ọ bụrụ na ọ bụghị, anyị na-atụfu ihe dị iche. N'ọnọdụ anyị, ebe ọ bụ na anyị na-agafe enweghị egwuregwu, a ga-atụfu ihe dị iche.

Ugbu a, ka anyị chịkọta.

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

Detuo koodu arụpụtara na ya lottery-test-suite.fif, na-echefughị ​​iji dochie akara ikpeazụ.

Anyị na-enyocha na ule ahụ gafere:

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

Ebe a Ị nwere ike ịhụ nkwekọrịta kwekọrọ na nsonaazụ dị ugbu a.

Rịba ama na ọ dịghị mkpa ka ị na-edegharị koodu a chịkọtara nke nkwekọrịta smart n'ime faịlụ nwere ule, yabụ anyị ga-ede edemede nke ga-edepụta koodu ahụ n'ime anyị mgbe niile, anyị ga-ejikọta koodu agbakọtara na ule anyị site na iji. "include".

Mepụta faịlụ na nchekwa ọrụ build.sh ya na ọdịnaya ndị a.

#!/bin/bash

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

Ka anyị mee ya executable.

chmod +x ./build.sh

Ugbu a, mee naanị edemede anyị iji chịkọta nkwekọrịta ahụ. Ma e wezụga nke a, anyị kwesịrị ide ya n'ime a mgbe nile code. Ya mere, anyị ga-emepụta faịlụ ọhụrụ lotter-compiled-for-test.fif, nke anyị ga-etinye na faịlụ lottery-test-suite.fif.

Ka anyị tinye koodu skirpt na sh, nke ga-emegharị faịlụ achịkọtara na ya lotter-compiled-for-test.fif ma gbanwee ahịrị ikpeazụ n'ime ya.

# 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

Ugbu a, ka ịlele, ka anyị na-agba ọsọ edemede na-arụpụta na a ga-emepụta faịlụ lottery-compiled-for-test.fif, nke anyị ga-agụnye na nke anyị lottery-test-suite.fif

В lottery-test-suite.fif hichapụ koodu nkwekọrịta wee tinye ahịrị "lottery-compiled-for-test.fif" include.

Anyị na-agba ule iji lelee na ha gafere.

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

Ọ dị mma, ugbu a iji megharịa mmalite nke ule, ka anyị mepụta faịlụ test.sh, nke ga-ebu ụzọ mee build.sh, wee gbaa ule.

touch test.sh
chmod +x test.sh

Anyị na-ede n'ime

./build.sh 

echo "nCompilation completedn"

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

Ka anyị mee ya test.sh ma mee ya ka ọ hụ na ule na-arụ ọrụ.

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

Anyị na-elele na nkwekọrịta na-achịkọta ma na-eme ule ndị ahụ.

Ọ dị mma, ugbu a na mmalite test.sh A ga-achịkọta ule ndị a wee gbaa ọsọ ozugbo. Nke a bụ njikọ maka eme.

Ọ dị mma, tupu anyị aga n'ihu, ka anyị mee otu ihe ọzọ maka ịdị mma.

Ka anyị mepụta nchekwa build ebe anyị ga-echekwa nkwekọrịta e depụtaghachiri na mmepụta oyiri ya edere n'ime oge niile lottery-compiled.fif, lottery-compiled-for-test.fif. Ka anyị mepụtakwa folda test Ebee ka a ga-echekwa faịlụ ule? lottery-test-suite.fif yana faịlụ ndị ọzọ na-akwado. Njikọ na mgbanwe ndị dị mkpa.

Ka anyị gaa n'ihu na-emepụta nkwekọrịta smart.

Na-esote, ekwesịrị inwe ule nke na-enyocha na enwetara ozi ahụ yana emelite counter na ụlọ ahịa mgbe anyị zipụrụ nọmba ziri ezi. Mana anyị ga-eme nke ahụ ma emechaa.

Ugbu a, ka anyị chee echiche banyere nhazi data na ihe data kwesịrị ịchekwa na nkwekọrịta smart.

M ga-akọwa ihe niile anyị na-echekwa.

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

Ọzọ ị ga-ede ọrụ abụọ. Ka anyị kpọọ nke mbụ pack_state(), nke ga-ebukọ data maka ịzọpụta na-esote na nchekwa nkwekọrịta smart. Ka anyị kpọọ nke abụọ unpack_state() ga-agụ ma weghachite data site na nchekwa.

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

Anyị na-agbakwunye ọrụ abụọ a na mmalite nke nkwekọrịta smart. Ọ ga-arụ ọrụ dị ka nke a nsonaazụ etiti.

Ka ịchekwaa data ị ga-achọ ịkpọ ọrụ arụnyere set_data() na ọ ga-ede data si pack_state() na smart nkwekọrịta nchekwa.

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

Ugbu a anyị nwere ọrụ dị mma maka ide na ịgụ data, anyị nwere ike ịga n'ihu.

Anyị kwesịrị ịlele na ozi na-esi n'èzí bịanyere aka na onye nwe nkwekọrịta ahụ (ma ọ bụ onye ọrụ ọzọ nwere ohere ịnweta igodo nzuzo).

Mgbe anyị bipụtara nkwekọrịta smart, anyị nwere ike ịmalite ya na data anyị chọrọ na nchekwa, nke a ga-echekwa maka ojiji n'ọdịnihu. Anyị ga-edekọ igodo ọha ebe ahụ ka anyị nwee ike ịchọpụta na ejiri igodo nzuzo bịanyere aka na ozi mbata.

Tupu ịga n'ihu, ka anyị mepụta igodo nzuzo wee dee ya test/keys/owner.pk. Iji mee nke a, ka anyị malite Fift na ọnọdụ mmekọrịta wee mee iwu anọ.

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

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

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

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

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

Ka anyị mepụta nchekwa keys n'ime nchekwa test wee dee igodo nzuzo ebe ahụ.

mkdir test/keys
cd test/keys
~/TON/build/crypto/fift -i 
newkeypair
 ok
.s 
BYTES:128DB222CEB6CF5722021C3F21D4DF391CE6D5F70C874097E28D06FCE9FD6917 BYTES:DD0A81AAF5C07AAAA0C7772BB274E494E93BB0123AA1B29ECE7D42AE45184128 
drop 
 ok
"owner.pk" B>file
 ok
bye

Anyị na-ahụ faịlụ na nchekwa dị ugbu a owner.pk.

Anyị na-ewepụ igodo ọha na ngwugwu ma mgbe ọ dị mkpa anyị nwere ike nweta ya na nkeonwe.

Ugbu a, anyị kwesịrị ide nkwenye mbinye aka. Ka anyị jiri ule malite. Mbụ anyị na-agụ igodo nzuzo site na faịlụ site na iji ọrụ ahụ file>B ma dee ya na mgbanwe owner_private_key, wee jiri ọrụ ahụ priv>pub tọghata igodo nzuzo ka ọ bụrụ igodo ọha wee dee nsonaazụ ya 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 !

Anyị ga-achọ igodo abụọ ahụ.

Anyị na-eji data aka ike malite nchekwa nkwekọrịta smart n'otu usoro dị na ọrụ ahụ pack_state()ma dee ya n'ime mgbanwe 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 !

Na-esote, anyị ga-edepụta ozi mbinye aka, ọ ga-enwe naanị mbinye aka na ọnụ ahịa counter.

Nke mbụ, anyị na-emepụta data anyị chọrọ ibunye, mgbe ahụ, anyị na-eji igodo nzuzo bịanye aka na ya ma n'ikpeazụ anyị na-ewepụta ozi bịanyere aka na ya.

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 !  

N'ihi ya, a na-edekọ ozi anyị ga-eziga na nkwekọrịta smart na mgbanwe message_to_send, gbasara ọrụ hashu, ed25519_sign_uint ị nwere ike ịgụ na akwụkwọ nke ise.

Na ịgba ọsọ ule anyị na-akpọ ọzọ.

message_to_send @ 
recv_external 
code 
storage @
c7
runvmctx

N'ebe a Faịlụ nwere ule kwesịrị ịdị ka nke a n'oge a.

Ka anyị na-agba ọsọ ule na ọ ga-ada, otú anyị ga-agbanwe smart nkwekọrịta nke mere na ọ nwere ike nata ozi nke a format na nyochaa mbinye aka.

Mbụ, anyị na-agụ 512 ibe n'ibe nke mbinye aka site na ozi wee dee ya na mgbanwe, mgbe ahụ anyị na-agụ 32 ibe n'ibe nke counter variable.

Ebe anyị nwere ọrụ maka ịgụ data sitere na nchekwa nkwekọrịta smart, anyị ga-eji ya.

Ọzọ bụ ịlele counter bufee na nchekwa na ịlele mbinye aka. Ọ bụrụ na ihe adabaghị, mgbe ahụ, anyị na-atụfu mwepu na koodu kwesịrị ekwesị.

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

Nkwenye dị mkpa ebe a.

Ka anyị gbaa ule wee hụ na ule nke abụọ dara. N'ihi ihe abụọ kpatara ya, ezughị oke n'ime ozi ahụ ma enweghi oke n'ime nchekwa ahụ, ya mere koodu na-akụda mgbe ị na-atụgharị. Anyị kwesịrị ịgbakwunye mbinye aka na ozi anyị na-eziga ma detuo nchekwa ahụ site na ule ikpeazụ.

Na ule nke abụọ, anyị ga-agbakwunye mbinye aka ozi ma gbanwee nchekwa nkwekọrịta smart. N'ebe a faịlụ nwere ule dị ka ọ dị ugbu a.

Ka anyị dee ule nke anọ, nke anyị ga-eziga ozi jiri igodo nzuzo nke onye ọzọ bịanyere aka na ya. Ka anyị mepụta igodo nzuzo ọzọ wee chekwaa ya na faịlụ not-owner.pk. Anyị ga-eji igodo nzuzo a bịanye aka na ya. Ka anyị gbaa ule ma hụ na ule niile gafere. Nkwenye n'oge a.

Ugbu a, anyị nwere ike mechaa gaa n'ihu na-emejuputa echiche nkwekọrịta smart.
В recv_external() anyị ga-anabata ụdị ozi abụọ.

Ebe ọ bụ na nkwekọrịta anyị ga-akwakọba mfu nke ndị egwuregwu, a ga-ebufe ego a n'aka onye kere lotrị ahụ. A na-edekọ adreesị obere akpa nke onye na-emepụta lọtrị na nchekwa mgbe emepụtara nkwekọrịta ahụ.

Naanị bụrụ na, anyị chọrọ ikike ịgbanwe adreesị nke anyị na-ezigara gram nke ndị na-efunahụ ya. Anyị kwesịkwara inwe ike izipu gram site na lọtrị gaa na adreesị onye nwe ya.

Ka anyị were nke mbụ malite. Ka anyị buru ụzọ dee ule nke ga-elele na mgbe izipu ozi ahụ, nkwekọrịta smart ahụ zọpụtara adreesị ọhụrụ na nchekwa. Biko mara na na ozi, na mgbakwunye na counter na adreesị ọhụrụ, anyị na-ebufe action Ọnụ ọgụgụ 7-bit na-abụghị nke na-adịghị mma, dabere na ya, anyị ga-ahọrọ otu esi edozi ozi na nkwekọrịta smart.

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

Na ule ị nwere ike ịhụ ka smartcontract nchekwa na-deserialized storage na ise. A kọwara nbibi nke mgbanwe dị iche iche na akwụkwọ Fift.

Tinye njikọ na agbakwunyere mgwakota agwa.

Ka anyị gbaa ule ma hụ na ọ dara. Ugbu a, ka anyị gbakwunye mgbagha iji gbanwee adreesị onye nwe lọtrị.

Na nkwekọrịta smart anyị na-aga n'ihu na-atụgharị message, gụọ n'ime action. Ka anyị chetara gị na anyị ga-enwe abụọ action: gbanwee adreesị wee zipu gram.

Mgbe ahụ, anyị na-agụ adreesị ọhụrụ nke onye nwe nkwekọrịta ma chekwaa ya na nchekwa.
Anyị na-agba ule ahụ wee hụ na ule nke atọ dara. Ọ na-akụda n'ihi na nkwekọrịta ahụ na-atụgharịkwa 7 ibe n'ibe site na ozi ahụ, nke na-efu na ule ahụ. Tinye nke na-adịghị adị na ozi ahụ action. Ka anyị gbaa ule wee hụ na ihe niile gafere. ebe a kwenye na mgbanwe. Akwa.

Ugbu a, ka anyị dee ezi uche maka izipu ọnụ ọgụgụ gram akọwapụtara na adreesị echekwara na mbụ.

Mbụ, ka anyị dee ule. Anyị ga-ede ule abụọ, otu mgbe enweghị nguzozi zuru oke, nke abụọ mgbe ihe niile kwesịrị ịga nke ọma. Enwere ike ịlele ule n'okwu a.

Ugbu a, ka anyị tinye koodu. Nke mbụ, ka anyị dee ụzọ enyemaka abụọ. Ụzọ nweta mbụ bụ ịchọpụta nguzozi dị ugbu a nke nkwekọrịta smart.

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

Na nke abụọ bụ maka izipu gram na nkwekọrịta smart ọzọ. Edepụtaghachiri m usoro a kpamkpam site na nkwekọrịta smart ọzọ.

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

Ka anyị tinye ụzọ abụọ a na nkwekọrịta smart wee dee ezi uche. Nke mbụ, anyị na-atụgharị ọnụ ọgụgụ gram site na ozi ahụ. Ọzọ anyị na-elele itule, ma ọ bụrụ na ọ bụ ezughi oke anyị na-atụfu ewepụrụ. Ọ bụrụ na ihe niile dị mma, mgbe ahụ, anyị na-eziga gram na adreesị echekwara ma melite 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));

N'ebe a dị ka nkwekọrịta smart n'oge a. Ka anyị gbaa ule ma hụ na ha gafere.

Site n'ụzọ, a na-ewepụ ọrụ na nkwekọrịta smart oge ọ bụla maka ozi edoziziri. Ka smart nkwekọrịta ozi mebie arịrịọ, mgbe isi ego mkpa ka ị na-akpọ accept_message().

Ugbu a, ka anyị gaa n'ihu na ozi ime. N'ezie, anyị ga-anabata naanị gram wee zighachi onye ọkpụkpọ ahụ okpukpu abụọ ma ọ bụrụ na ọ merie na nke atọ nye onye nwe ya ma ọ bụrụ na ọ tụfuru.

Mbụ, ka anyị dee a mfe ule. Iji mee nke a, anyị chọrọ adreesị nnwale nke nkwekọrịta smart nke anyị chere na anyị na-eziga gram na nkwekọrịta smart.

Adreesị nkwekọrịta smart ahụ nwere ọnụọgụ abụọ, ọnụọgụ 32-bit na-ahụ maka ọrụ ọrụ yana nọmba akaụntụ pụrụ iche nke 256-bit na-abụghị nke adịghị mma na chain ọrụ a. Dịka ọmụmaatụ, -1 na 12345, nke a bụ adreesị anyị ga-echekwa na faịlụ.

M depụtaghachiri ọrụ maka ichekwa adreesị na 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

Ka anyị lee ka ọrụ ahụ si arụ ọrụ, nke a ga-enye nghọta ka Fift si arụ ọrụ. Mwepụta Fift na ọnọdụ mmekọrịta.

~/TON/build/crypto/fift -i 

Mbụ anyị na-atụgharị -1, 12345 na aha faịlụ n'ọdịnihu "sender.addr" n'elu nchịkọta:

-1 12345 "sender.addr" 

Nzọụkwụ ọzọ bụ ịrụ ọrụ ahụ -rot, nke na-agbanwe nchịkọta ahụ n'ụzọ nke na n'elu nchịkọta ahụ nwere nọmba nkwekọrịta smart pụrụ iche:

"sender.addr" -1 12345

256 u>B na-atụgharị ọnụọgụ 256-bit na-abụghị nke adịghị njọ ka ọ bụrụ bytes.

"sender.addr" -1 BYTES:0000000000000000000000000000000000000000000000000000000000003039

swap swaps n'elu abụọ ọcha nke tojupụtara.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 -1

32 i>B na-atụgharị integer 32-bit ka ọ bụrụ bytes.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 BYTES:FFFFFFFF

B+ na-ejikọta usoro abụọ nke bytes.

 "sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF

Ọzọ swap.

BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF "sender.addr" 

Na n'ikpeazụ, bytes na-dere na faịlụ B>file. Mgbe nke a gasịrị, ngwugwu anyị tọgbọ chakoo. Anyị na-akwụsị Fift. Emepụtala faịlụ na nchekwa dị ugbu a sender.addr. Ka anyị bugharịa faịlụ ahụ na folda emepụtara test/addresses/.

Ka anyị dee ule dị mfe nke ga-eziga gram na nkwekọrịta smart. Nke a bụ nkwa ahụ.

Ugbu a, ka anyị leba anya n'echiche nke lotiri ahụ.

Ihe mbụ anyị na-eme bụ ịlele ozi bounced ma ọ bụrụ na ọ bụghị bounced, mgbe ahụ anyị na-eleghara ya anya. bounced pụtara na nkwekọrịta ga-eweghachi gram ma ọ bụrụ na ụfọdụ njehie emee. Anyị agaghị eweghachi gram ma ọ bụrụ na njehie emee na mberede.

Anyị na-elele, ma ọ bụrụ na itule bụ ihe na-erughị ọkara gram, mgbe ahụ, anyị na-anabata nnọọ ozi na-eleghara ya.

Ọzọ, anyị na-atụgharị adreesị nke nkwekọrịta smart nke ozi ahụ si bịa.

Anyị na-agụ data sitere na nchekwa wee hichapụ nzo ochie na akụkọ ihe mere eme ma ọ bụrụ na e nwere ihe karịrị iri abụọ n'ime ha. Maka ịdị mma, edere m ọrụ atọ ọzọ pack_order(), unpack_order(), remove_old_orders().

Ọzọ, anyị na-ele anya ma ọ bụrụ na itule ezughị maka ịkwụ ụgwọ, mgbe ahụ, anyị na-atụle na nke a abụghị a nzọ, ma a replenishment na-azọpụta replenishment na. orders.

Mgbe ahụ n'ikpeazụ isi ihe nke nkwekọrịta smart.

Nke mbụ, ọ bụrụ na onye ọkpụkpọ ahụ efunahụ, anyị na-echekwa ya na akụkọ ịkụ nzọ ma ọ bụrụ na ego ahụ karịrị gram 3, anyị na-ezigara onye nwe nkwekọrịta smart 1/3 XNUMX/XNUMX.

Ọ bụrụ na onye ọkpụkpọ ahụ meriri, anyị na-eziga ego okpukpu abụọ na adreesị onye ọkpụkpọ wee chekwaa ozi gbasara nzọ na akụkọ ihe mere eme.

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

Nke ahụ bụ ihe niile. Nkwekọrịta kwekọrọ.

Ugbu a, ihe niile fọdụrụ dị mfe, ka anyị mepụta ụzọ-esi nweta ozi gbasara ọnọdụ nkwekọrịta site na ụwa dị n'èzí (n'ezie, gụọ data site na nchekwa nkwekọrịta smart ha).

Ka anyị gbakwunye nweta ụzọ. Anyị ga-ede n'okpuru ebe a gbasara otu esi enweta ozi gbasara nkwekọrịta smart.

Echefuru m ịgbakwunye koodu nke ga-edozi arịrịọ mbụ nke na-eme mgbe a na-ebipụta nkwekọrịta smart. Nkwekọrịta kwekọrọ. Na n'ihu emeziri ahụhụ na izipu 1/3 nke ego ahụ na akaụntụ onye nwe ya.

Nzọụkwụ ọzọ bụ ibipụta smart nkwekọrịta. Ka anyị mepụta nchekwa requests.

Ewere m koodu mbipụta dịka ntọala simple-wallet-code.fc nke nwere ike ịchọta n'ime ebe nchekwa gọọmentị.

Ihe kwesịrị ịṅa ntị. Anyị na-ewepụta nchekwa nkwekọrịta smart yana ozi ntinye. Mgbe nke a gasịrị, a na-emepụta adreesị nke nkwekọrịta smart, ya bụ, a maara adreesị ahụ ọbụna tupu e bipụta ya na TON. Na-esote, ịkwesịrị iziga gram dị iche iche na adreesị a, naanị mgbe nke ahụ gasịrị, ịkwesịrị iziga faịlụ na nkwekọrịta smart n'onwe ya, ebe ọ bụ na netwọk ahụ na-arụ ọrụ maka ịchekwa nkwekọrịta smart na arụ ọrụ n'ime ya (ndị na-akwado ma na-echekwa smart). nkwekọrịta). Enwere ike ịlele koodu ahụ ebe a.

Ọzọ anyị na-emezu koodu mbipụta wee nweta lottery-query.boc smart nkwekọrịta faịlụ na adreesị.

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

Echefula ịchekwa faịlụ ndị emepụtara: lottery-query.boc, lottery.addr, lottery.pk.

Tinyere ihe ndị ọzọ, anyị ga-ahụ adreesị nke nkwekọrịta smart na ndekọ igbu.

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

Naanị maka ntụrụndụ, ka anyị rịọ TON arịrịọ

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

Anyị ga-ahụkwa na akaụntụ nwere adreesị a tọgbọ chakoo.

account state is empty

Anyị na-eziga na adreesị 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd 2 Gram ma mgbe sekọnd ole na ole gachara, anyị na-eme otu iwu ahụ. Iji zipu gram m na-eji akpa ego, ma ị nwere ike ịjụ onye si na nkata maka ule gram, nke m ga-ekwu maka ya na njedebe nke isiokwu ahụ.

> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Ọ dị ka onye na-amaghị aha (state:account_uninit) nkwekọrịta smart nke nwere otu adreesị yana nguzozi nke 1 nanogram.

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

Ugbu a, ka anyị bipụta smart nkwekọrịta. Ka anyị malite lite-client wee gbuo.

> 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 

Ka anyị lelee na ebipụtala nkwekọrịta ahụ.

> last
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Tinyere ihe ndị ọzọ anyị na-enweta.

  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

Anyị na-ahụ nke ahụ account_active.

Nkwekọrịta kwekọrọ na mgbanwe ebe a.

Ugbu a, ka anyị mepụta arịrịọ iji soro nkwekọrịta smart na-emekọrịta ihe.

Kpọmkwem, anyị ga-ahapụ nke mbụ maka ịgbanwe adreesị dị ka ọrụ nọọrọ onwe ya, anyị ga-eme nke abụọ maka iziga gram na adreesị onye nwe ya. N'ezie, ọ ga-adị anyị mkpa ime otu ihe ahụ dị na ule maka izipu gram.

Nke a bụ ozi anyị ga-eziga na smart nkwekọrịta, ebe msg_seqno 165, action 2 na 9.5 grams maka izipu.

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

Echefula iji igodo nzuzo gị bịanye aka na ozi ahụ lottery.pk, nke emepụtara na mbụ mgbe ị na-emepụta nkwekọrịta smart. Nke a bụ nkwa kwekọrọ.

Ịnata ozi site na nkwekọrịta smart site na iji nweta ụzọ

Ugbu a, ka anyị leba anya ka esi agba ọsọ nkwekọrịta smart nweta ụzọ.

Mwepụta lite-client ma na-agba ọsọ nweta usoro na anyị dere.

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

В result nwere uru nke ọrụ na-eweghachi balance() site na nkwekọrịta smart anyị.
Anyị ga-eme otu ihe ahụ maka ọtụtụ ụzọ ndị ọzọ.

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

Ka anyị jụọ maka akụkọ nzọ gị.

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

Anyị ga-eji ndị ahịa na-akwụghị ụgwọ wee nweta ụzọ iji gosipụta ozi gbasara nkwekọrịta smart na saịtị ahụ.

Na-egosipụta data nkwekọrịta smart na webụsaịtị

Edere m weebụsaịtị dị mfe na Python iji gosipụta data sitere na nkwekọrịta smart n'ụzọ dabara adaba. N'ebe a, agaghị m ebi na ya n'ụzọ zuru ezu ma ga-ebipụta saịtị ahụ n'otu aka.

Arịrịọ maka TON sitere na Python site n'enyemaka lite-client. Maka ịdị mma, etinyere saịtị ahụ na Docker wee bipụta ya na Google Cloud. Njikọ.

Ka anyị gbalịa

Ugbu a, ka anyị gbalịa iziga gram n'ebe ahụ maka replenishment si obere akpa. Anyị ga-ezite gram 40. Ka anyị mee nzọ abụọ maka idoanya. Anyị na-ahụ na saịtị ahụ na-egosi akụkọ ihe mere eme nke nzo, pasent mmeri ugbu a na ozi ndị ọzọ bara uru.

Anyị na-ahụna anyị meriri nke mbụ, tụfuru nke abụọ.

Afterword

Akụkọ ahụ wee bụrụ ogologo oge karịa ka m tụrụ anya ya, ikekwe ọ ga-adị mkpụmkpụ, ma ọ bụ ma eleghị anya naanị maka onye na-amaghị ihe ọ bụla gbasara TON ma chọọ ide ma bipụta nkwekọrịta smart na-adịghị mfe nke nwere ikike imekọrịta ihe. ya. Ikekwe a pụrụ ịkọwara ihe ụfọdụ n'ụzọ dị mfe karị.

Ikekwe akụkụ ụfọdụ nke mmejuputa a ga-emerịrị nke ọma na nke ọma, ma mgbe ahụ, ọ ga-ewe oge karịa iji kwadebe isiokwu ahụ. Ọ ga-ekwe omume na m mehiere ebe ma ọ bụ na aghọtaghị ihe ọ bụla, yabụ ọ bụrụ na ị na-eme ihe dị njọ, ịkwesịrị ịdabere na akwụkwọ ikike ma ọ bụ ebe nchekwa ọrụ na koodu TON.

Ekwesiri iburu n'uche na ebe ọ bụ na TON n'onwe ya ka nọ na-arụsi ọrụ ike nke mmepe, mgbanwe nwere ike ime nke ga-emebi usoro ọ bụla dị na isiokwu a (nke mere mgbe m na-ede akwụkwọ, e dezielarị ya), mana usoro izugbe bụ. eleghi anya ịgbanwe.

Agaghị m ekwu maka ọdịnihu TON. Ikekwe ikpo okwu ga-aghọ ihe buru ibu na anyị kwesịrị itinye oge na-amụ ya ma jupụta niche na ngwaahịa anyị ugbu a.

Enwekwara Libra sitere na Facebook, nke nwere ike na-ege ntị nke ndị ọrụ karịa TON. Amaghị m ihe ọ bụla gbasara Libra, na-ekpe ikpe site na nnọkọ enwere ọtụtụ ọrụ ebe ahụ karịa na obodo TON. Ọ bụ ezie na ndị mmepe na obodo TON dị ka n'okpuru ala, nke dịkwa mma.

zoro

  1. Akwụkwọ TON gọọmentị: https://test.ton.org
  2. Ebe nchekwa TON gọọmentị: https://github.com/ton-blockchain/ton
  3. Akpa akwụkwọ ozi maka nyiwe dị iche iche: https://wallet.ton.org
  4. Ebe nchekwa nkwekọrịta smart sitere na edemede a: https://github.com/raiym/astonished
  5. Njikọ na webụsaịtị nkwekọrịta smart: https://ton-lottery.appspot.com
  6. Ebe nchekwa maka ndọtị maka Visual Studio Code maka FunC: https://github.com/raiym/func-visual-studio-plugin
  7. Kpaa nkata gbasara TON na Telegram, nke nyere aka chọpụta ya na mbido mbụ. Echere m na ọ gaghị abụ mmejọ ma ọ bụrụ na m kwuo na onye ọ bụla dere ihe maka TON nọ ebe ahụ. Ị nwekwara ike ịrịọ maka gram ule ebe ahụ. https://t.me/tondev_ru
  8. Mkparịta ụka ọzọ gbasara TON nke m chọtara ozi bara uru na ya: https://t.me/TONgramDev
  9. Agba mbụ nke asọmpi ahụ: https://contest.com/blockchain
  10. Agba nke abụọ nke asọmpi: https://contest.com/blockchain-2

isi: www.habr.com

Tinye a comment