E pili ana i ke kākau ʻana a me ka hoʻolaha ʻana i kahi ʻaelike akamai ma ka Telegram Open Network (TON)

E pili ana i ke kākau ʻana a me ka hoʻolaha ʻana i kahi ʻaelike akamai ma TON

He aha kēia ʻatikala?

Ma ka ʻatikala e kamaʻilio wau e pili ana i koʻu komo ʻana i ka mua (o ʻelua) Telegram blockchain hoʻokūkū, ʻaʻole i lawe i kahi makana, a ua hoʻoholo e hoʻopaʻa i koʻu ʻike i loko o kahi ʻatikala i ʻole e komo i loko o ka poina a, kōkua paha. kekahi.

No ka mea ʻaʻole wau i makemake e kākau i nā code abstract, akā e hana i kahi hana, no ka ʻatikala ua kākau wau i kahi ʻaelike akamai no ka loteri koke a me kahi pūnaewele e hōʻike pololei ana i ka ʻikepili aelike mai TON me ka ʻole o ka hoʻohana ʻana i ka mālama waena.

Pono ka ʻatikala i ka poʻe makemake e hana i kā lākou ʻaelike akamai mua ma TON, akā ʻaʻole ʻike i kahi e hoʻomaka ai.

Ke hoʻohana nei i ka loteri ma ke ʻano he laʻana, e hele wau mai ka hoʻokomo ʻana i ke kaiapuni i ka paʻi ʻana i kahi ʻaelike akamai, ka launa pū ʻana me ia, a me ke kākau ʻana i kahi pūnaewele no ka loaʻa ʻana a me ka paʻi ʻana i ka ʻikepili.

E pili ana i ke komo ʻana i ka hoʻokūkū

ʻO ʻOkakopa i hala, ua hoʻolaha ʻo Telegram i kahi hoʻokūkū blockchain me nā ʻōlelo hou Fift и FunC. Pono e koho mai ke kākau ʻana i kekahi o nā ʻaelike akamai ʻelima i manaʻo ʻia. Manaʻo wau he mea maikaʻi ke hana ʻokoʻa, aʻo i ka ʻōlelo a hana i kekahi mea, ʻoiai inā ʻaʻole pono wau e kākau i kekahi mea ʻē aʻe i kēia mua aku. Eia kekahi, aia mau ke kumuhana ma nā lehelehe.

Pono e ʻōlelo ʻaʻohe oʻu ʻike i ka hoʻomohala ʻana i nā ʻaelike akamai.

Ua hoʻolālā wau e komo a hiki i ka hopena a hiki iaʻu ke kākau i kahi ʻatikala loiloi, akā hāʻule koke wau i ka mea mua. I kākau i ʻeke kālā me nā pūlima lehulehu FunC a ua hana maʻamau. Ua lawe au i kumu ʻaelike akamai ma Solidity.

I kēlā manawa, manaʻo wau ua lawa kēia no ka lawe ʻana i kahi wahi makana. ʻO ka hopena, ma kahi o 40 o 60 mau mea komo i lilo i makana a ʻaʻole wau i waena o lākou. Ma keʻano laulā, ʻaʻohe hewa o kēia, akā hoʻokahi mea i hoʻopilikia iaʻu. I ka manawa o ka hoʻolaha ʻana o nā hopena, ʻaʻole i hana ʻia ka loiloi o ka hoʻāʻo no kaʻu ʻaelike, ua nīnau au i ka poʻe i komo i ke kamaʻilio inā aia kekahi i loaʻa ʻole, ʻaʻohe.

Me he mea lā e hoʻolohe ana i kaʻu mau ʻōlelo, ʻelua lā ma hope mai ua paʻi nā luna kānāwai i kahi ʻōlelo a ʻaʻole maopopo iaʻu inā ua poina lākou i kaʻu ʻaelike akamai i ka wā o ka hoʻokolokolo ʻana a i ʻole manaʻo wale ʻia he mea ʻino loa ia ʻaʻole pono ka manaʻo. Ua nīnau au i kahi nīnau ma ka ʻaoʻao, ʻaʻole i loaʻa ka pane. ʻOiai ʻaʻole ia he mea huna nāna i hoʻokolokolo, ua manaʻo wau he mea pono ʻole ke kākau i nā leka pilikino.

Nui ka manawa i hoʻohana ʻia no ka hoʻomaopopo ʻana, no laila ua hoʻoholo ʻia e kākau i kahi ʻatikala. No ka mea ʻaʻole nui ka ʻike, e kōkua kēia ʻatikala e mālama i ka manawa no ka poʻe makemake.

ʻO ka manaʻo o nā ʻaelike akamai ma TON

Ma mua o kou kākau ʻana i kekahi mea, pono ʻoe e noʻonoʻo i ka ʻaoʻao hea e hoʻokokoke ai i kēia mea. No laila, i kēia manawa e haʻi aku wau iā ʻoe i nā ʻāpana o ka ʻōnaehana. ʻOi aku ka pololei, he aha nā ʻāpana āu e pono ai e ʻike i mea e kākau ai ma kahi liʻiliʻi o kekahi ʻano ʻaelike hana.

E kālele mākou i ke kākau ʻana i kahi ʻaelike akamai a me ka hana pū me TON Virtual Machine (TVM), Fift и FunC, no laila ua like ka ʻatikala me ka wehewehe ʻana i ka hoʻomohala ʻana i kahi papahana maʻamau. ʻAʻole mākou e noʻonoʻo i ka hana ʻana o ka paepae ma aneʻi.

Ma ka laulā e pili ana i ka hana TVM a me ka ʻōlelo Fift aia nā palapala kūhelu maikaʻi. ʻOiai e komo ana i ka hoʻokūkū a i kēia manawa ke kākau nei au i ka ʻaelike o kēia manawa, huli pinepine wau iā ia.

ʻO ka ʻōlelo nui i kākau ʻia ai nā ʻaelike akamai FunC. ʻAʻohe palapala e pili ana iā ia i kēia manawa, no laila, i mea e kākau ai i kahi mea pono ʻoe e aʻo i nā hiʻohiʻona o nā ʻaelike akamai mai ka waihona kūhelu a me ka hoʻokō ʻana o ka ʻōlelo ponoʻī ma laila, a hiki iā ʻoe ke nānā i nā hiʻohiʻona o nā ʻaelike akamai mai nā mea ʻelua i hala. nā hoʻokūkū. Nā loulou ma ka hope o ka ʻatikala.

E ʻōlelo mākou ua kākau mua mākou i kahi ʻaelike akamai no FunC, Ma hope o kēlā, hoʻohui mākou i ke code i Fift assembler.

E hoʻopuka ʻia ka ʻaelike akamai i hui ʻia. No ka hana ʻana i kēia, pono ʻoe e kākau i kahi hana ma Fift, ka mea e lawe i ke code ʻaelike akamai a me kekahi mau ʻāpana ʻē aʻe ma ke ʻano he hoʻokomo, a ʻo ka hopena e lilo i faila me ka hoʻonui .boc (ʻo ia hoʻi "ʻeke o nā cell"), a, ma muli o ke ʻano o kā mākou kākau ʻana, kahi kī pilikino a me ka helu wahi, i hana ʻia ma muli o ke code aelike akamai. Hiki iā ʻoe ke hoʻouna i nā grams i ka helu wahi o kahi ʻaelike akamai i paʻi ʻole ʻia.

No ka hoʻolaha ʻana i kahi ʻaelike akamai ma TON i loaʻa .boc Pono e hoʻouna ʻia ka faila i ka blockchain me ka hoʻohana ʻana i kahi mea kūʻai māmā (ʻoi aku ma lalo). Akā ma mua o ka paʻi ʻana, pono ʻoe e hoʻololi i nā grams i ka helu i hana ʻia, inā ʻaʻole e paʻi ʻia ka ʻaelike akamai. Ma hope o ka paʻi ʻana, hiki iā ʻoe ke launa pū me ka ʻaelike akamai ma ka hoʻouna ʻana iā ia i nā memo mai waho (e laʻana, me ka hoʻohana ʻana i ka mea kūʻai māmā) a i ʻole mai loko mai (no ka laʻana, hoʻouna kekahi ʻaelike akamai i kekahi memo i loko o TON).

Ke hoʻomaopopo mākou i ka paʻi ʻia ʻana o ke code, e maʻalahi ia. ʻIke maopopo mākou i kā mākou makemake e kākau a pehea e hana ai kā mākou papahana. A i ke kākau ʻana, ʻimi mākou i ke ʻano o ka hoʻokō ʻia ʻana o kēia i nā ʻaelike akamai i kēia manawa, a i ʻole mākou e nānā i ke code hoʻokō Fift и FunC i loko o ka waihona kūhelu, a i ʻole e nānā i ka palapala kūhelu.

Ua ʻimi pinepine au i nā huaʻōlelo ma ke kamaʻilio Telegram kahi i ʻākoakoa ai nā mea hoʻokūkū āpau a me nā limahana Telegram, a ua hiki mai i ka wā o ka hoʻokūkū ua ʻākoakoa nā mea a pau ma laila a hoʻomaka e kūkākūkā ʻo Fift a me FunC. Ka loulou ma ka hope o ka ʻatikala.

ʻO ka manawa kēia e neʻe ai mai ka manaʻo a i ka hoʻomaʻamaʻa.

Hoʻomākaukau i ke kaiapuni no ka hana pū me TON

Ua hana au i nā mea a pau e wehewehe ʻia ma ka ʻatikala ma MacOS a ʻelua-helu ʻia ma ka Ubuntu 18.04 LTS maʻemaʻe ma Docker.

ʻO ka mea mua e pono ai ʻoe e hoʻoiho a hoʻouka lite-client hiki iā ʻoe ke hoʻouna i nā noi iā TON.

ʻO nā ʻōlelo aʻoaʻo ma ka pūnaewele official e wehewehe i ke kaʻina hana i ka kikoʻī a me ka maopopo a haʻalele i kekahi mau kikoʻī. Maanei mākou e hahai ai i nā ʻōlelo aʻoaʻo, e kau ana i nā mea hilinaʻi i nalowale ma ke ala. ʻAʻole wau i hōʻuluʻulu i kēlā me kēia papahana iaʻu iho a hoʻokomo ʻia mai ka waihona waihona ʻo Ubuntu (ma MacOS aʻu i hoʻohana ai 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 

Ke kau ʻia nā mea hilinaʻi a pau hiki iā ʻoe ke hoʻouka lite-client, Fift, FunC.

ʻO ka mea mua, hoʻopili mākou i ka waihona TON me kona mau hilinaʻi. No ka maʻalahi, e hana mākou i nā mea a pau i loko o kahi waihona ~/TON.

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

Mālama pū ka waihona i nā hoʻokō Fift и FunC.

I kēia manawa ua mākaukau mākou e hōʻuluʻulu i ka papahana. Hoʻopili ʻia ka code waihona i loko o kahi waihona ~/TON/ton. ka ~/TON hana i ka waihona build a hōʻiliʻili i ka papahana i loko.

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

No ka mea e kākau ana mākou i kahi ʻaelike akamai, ʻaʻole pono mākou lite-clientaka, Fift с FunC, no laila e hoʻohui kākou i nā mea a pau. ʻAʻole ia he hana wikiwiki, no laila ke kali nei mākou.

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

A laila, e hoʻoiho i ka faila hoʻonohonoho i loaʻa ka ʻikepili e pili ana i ka node kahi lite-client e hoʻohui.

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

Ke hana nei i nā noi mua iā TON

E hoʻomaka kākou lite-client.

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

Inā holomua ka kūkulu ʻana, a laila ma hope o ka hoʻomaka ʻana e ʻike ʻoe i kahi log o ka pilina o ka mea kūʻai māmā i ka 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)
...

Hiki iā ʻoe ke holo i ke kauoha help a ʻike i nā kauoha i loaʻa.

help

E papa inoa i nā kauoha a mākou e hoʻohana ai ma kēia ʻatikala.

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

I kēia manawa ua mākaukau mākou e kākau i ka ʻaelike ponoʻī.

Ka hoʻokō

Manaʻo

E like me kaʻu i kākau ai ma luna, ʻo ka ʻaelike akamai a mākou e kākau nei he lotiri.

Eia kekahi, ʻaʻole kēia he loteri kahi e pono ai ʻoe e kūʻai i kahi tiketi a kali i hoʻokahi hola, lā a i ʻole mahina, akā i kahi manawa e hoʻololi ai ka mea hoʻohana i ka helu ʻaelike. N grams, a hoʻihoʻi koke mai 2 * N grama a poho paha. E hana mākou i ka hiki ke lanakila ma kahi o 40%. Inā ʻaʻole lawa ka grams no ka uku, a laila e noʻonoʻo mākou i ke kālepa ma ke ʻano he top-up.

Eia kekahi, he mea nui e ʻike ʻia nā bets i ka manawa maoli a ma kahi ʻano kūpono, i hiki i ka mea hoʻohana ke hoʻomaopopo koke inā lanakila a nalowale paha. No laila, pono ʻoe e hana i kahi pūnaewele e hōʻike pololei i nā bets a me nā hopena mai TON.

Ke kākau ʻana i kahi ʻaelike akamai

No ka maʻalahi, ua hōʻike wau i ke code no FunC; hiki ke loaʻa a hoʻokomo ʻia ka plugin ma ka ʻimi Visual Studio Code; inā makemake koke ʻoe e hoʻohui i kekahi mea, ua hoʻolaha au i ka plugin. Eia kekahi, ua hana mua kekahi i kahi plugin no ka hana ʻana me Fift, hiki iā ʻoe ke hoʻouka a loaʻa iā ia ma VSC.

E hana koke mākou i kahi waihona kahi e hana ai mākou i nā hopena waena.

I mea e maʻalahi ai ko mākou ola, e kākau mākou i kahi ʻaelike akamai a hoʻāʻo iā ia ma ka ʻāina a hiki i ka mākaukau. Ma hope wale nō e hoʻolaha mākou ma TON.

Loaʻa i ka ʻaelike akamai ʻelua mau ala waho e hiki ke kiʻi ʻia. Ka mua, recv_external() Hoʻokō ʻia kēia hana ke hele mai kahi noi i ka ʻaelike mai ka honua waho, ʻo ia hoʻi, ʻaʻole mai TON, no ka laʻana, ke hoʻopuka nei mākou i kahi leka a hoʻouna ʻia ma o ka lite-client. Ka lua, recv_internal() ʻO kēia ka manawa, i loko o TON ponoʻī, pili kekahi ʻaelike i kā mākou. I nā hihia ʻelua, hiki iā ʻoe ke hāʻawi i nā ʻāpana i ka hana.

E hoʻomaka kākou me kahi hiʻohiʻona maʻalahi e hana inā paʻi ʻia, akā ʻaʻohe ukana hana i loko.

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

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

Maanei pono mākou e wehewehe i ke ʻano slice. ʻO nā ʻikepili āpau i mālama ʻia ma TON Blockchain he hōʻiliʻili TVM cell ole 'ole cell, i loko o ia pūnaewele hiki iā ʻoe ke mālama i 1023 bits o ka ʻikepili a hiki i 4 mau loulou i nā pūnaewele ʻē aʻe.

TVM cell slice ai ole ia, slice he hapa keia o ka mea e ku nei cell hoʻohana ʻia no ka hoʻopaʻa ʻana, e akaka ma hope. ʻO ka mea nui iā mākou, hiki iā mākou ke hoʻololi slice a ma muli o ke ʻano o ka memo, e hana i ka ʻikepili i loko recv_external() ai ole ia, recv_internal().

impure - he huaʻōlelo e hōʻike ana e hoʻololi ka hana i ka ʻikepili aelike akamai.

E mālama kākou i ke code aelike i loko lottery-code.fc a houluulu.

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

Hiki ke nānā ʻia ke ʻano o nā hae me ke kauoha

~/TON/build/crypto/func -help

Ua hōʻuluʻulu mākou i Fift assembler code 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

Hiki ke hoʻokuʻu ʻia ma ka ʻāina, no kēia mea mākou e hoʻomākaukau ai i ke kaiapuni.

E hoʻomaopopo e pili ana ka laina mua Asm.fif, he code kēia i kākau ʻia ma Fift no ka Fift assembler.

No ka mea makemake mākou e holo a hoʻāʻo i ka ʻaelike akamai ma ka ʻāina, e hana mākou i kahi faila lottery-test-suite.fif a kope i ke code i hui ʻia ma laila, e hoʻololi i ka laina hope i loko, e kākau ana i ke code aelike akamai i kahi mau. codea laila e hoʻololi iā ia i ka mīkini virtual:

"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

I kēia manawa ua maopopo, ʻānō e hoʻohui i ka faila hoʻokahi i ke code a mākou e hoʻohana ai e hoʻomaka i ka 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 hoʻopaʻa mākou i ka pōʻaiapili, ʻo ia hoʻi, ka ʻikepili e hoʻomaka ai ka TVM (a i ʻole ka mokuʻāina pūnaewele). ʻOiai i ka wā o ka hoʻokūkū, ua hōʻike kekahi o nā mea hoʻomohala pehea e hana ai c7 a ua kope au. Ma kēia ʻatikala pono mākou e hoʻololi rand_seed no ka mea, ua pili ka hanauna o kahi helu maʻamau a inā ʻaʻole hoʻololi ʻia, e hoʻihoʻi ʻia ka helu like i kēlā me kēia manawa.

recv_internal и recv_external ʻO nā constants me nā waiwai 0 a me -1 ke kuleana no ke kāhea ʻana i nā hana pili i ka ʻaelike akamai.

I kēia manawa ua mākaukau mākou e hana i ka hoʻāʻo mua no kā mākou ʻaelike akamai ʻole. No ka akaka, i kēia manawa e hoʻohui mākou i nā hoʻokolohua āpau i ka faila hoʻokahi lottery-test-suite.fif.

E hana kākou i mea hoʻololi storage a e kakau i ka mea nele iloko cell, ʻo ia ka mālama ʻaelike akamai.

message ʻO kēia ka ʻōlelo a mākou e hoʻouna aku ai i ke kelepona akamai mai waho. E hoʻonele mākou i kēia manawa.

variable storage 
<b b> storage ! 

variable message 
<b b> message ! 

Ma hope o ka hoʻomākaukau ʻana i nā mea mau a me nā mea hoʻololi, hoʻomaka mākou i ka TVM me ka hoʻohana ʻana i ke kauoha runvmctx a hāʻawi i nā ʻāpana i hana ʻia i ka hoʻokomo.

message @ 
recv_external 
code 
storage @ 
c7 
runvmctx 

I ka hopena e lanakila mākou like kela code waena no Fift.

I kēia manawa hiki iā mākou ke holo i ka code hopena.

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

Pono e holo ka polokalamu me ka hewa ʻole a ma ka hopena e ʻike mākou i ka log execution:

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

Nui, ua kākau mākou i ka mana hana mua o ka ʻaelike akamai.

I kēia manawa pono mākou e hoʻohui i ka hana. E hana mua kākou i nā memo e hele mai ana mai ka honua aku i recv_external()

Na ka mea hoʻomohala ponoʻī e koho i ke ʻano memo i hiki i ka ʻaelike ke ʻae.

Akā ma ka maʻamau

  • ʻO ka mea mua, makemake mākou e pale i kā mākou ʻaelike mai ka honua i waho a hana ia i hiki i ka mea nona ka ʻaelike ke hoʻouna i nā leka waho iā ia.
  • ʻO ka lua, ke hoʻouna mākou i kahi leka kūpono iā TON, makemake mākou e hana kēia i hoʻokahi manawa a ke hoʻouna hou mākou i ka leka like, hōʻole ka ʻaelike akamai.

No laila, kokoke i kēlā me kēia ʻaelike e hoʻoponopono i kēia mau pilikia ʻelua, no ka mea e ʻae kā mākou ʻaelike i nā leka o waho, pono mākou e mālama pū kekahi.

E hana mākou ma ka ʻaoʻao hope. ʻO ka mea mua, e hoʻoponopono i ka pilikia me ka hana hou ʻana; inā ua loaʻa i ka ʻaelike i kēlā memo a hoʻoponopono ʻia, ʻaʻole ia e hoʻokō i ka lua o ka manawa. A laila e hoʻoponopono mākou i ka pilikia i hiki i kahi pōʻai o nā kānaka ke hoʻouna i nā leka i ka ʻaelike akamai.

Aia nā ala ʻokoʻa e hoʻoponopono ai i ka pilikia me nā leka pālua. Eia pehea mākou e hana ai. Ma ka ʻaelike akamai, hoʻomaka mākou i ka counter o nā memo i loaʻa me ka waiwai mua 0. Ma kēlā me kēia memo i ka ʻaelike akamai, e hoʻohui mākou i ka waiwai kūʻē i kēia manawa. Inā ʻaʻole i kūlike ka waiwai kūʻē i ka memo i ka waiwai i loko o ka ʻaelike akamai, a laila ʻaʻole mākou e hana; inā pēlā, a laila mākou e hana a hoʻonui i ka counter ma ka ʻaelike akamai e 1.

E hoʻi kāua i lottery-test-suite.fif a hoʻohui i kahi hoʻāʻo ʻelua iā ia. Inā hoʻouna mākou i kahi helu hewa, pono e hoʻolei ke code i kahi ʻokoʻa. No ka laʻana, e waiho i ka waihona ʻikepili aelike 166, a e hoʻouna mākou iā 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"

E hoʻomaka kākou.

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

A e ʻike mākou ua hoʻokō ʻia ka hoʻāʻo me kahi hewa.

[ 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

Ma kēia kahua lottery-test-suite.fif pono ke nana aku loulou.

I kēia manawa, e hoʻohui kākou i ka loiloi counter i ka ʻaelike akamai i loko 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 aia ka leka a mākou e hoʻouna ai.

ʻO ka mea mua a mākou e hana ai, ʻo ia ke nānā inā loaʻa ka ʻikepili i ka memo, inā ʻaʻole, a laila haʻalele wale mākou.

A laila hoʻopau mākou i ka memo. in_msg~load_uint(32) hoʻouka i ka helu 165, 32-bit unsigned int mai ka leka i hoʻouna ʻia.

A laila hoʻouka mākou i nā 32 bits mai ka mālama ʻaelike akamai. Nānā mākou i ka helu i hoʻouka ʻia i ka helu i hala; inā ʻaʻole, hoʻolei mākou i kahi ʻokoʻa. I kā mākou hihia, no ka mea ke hele nei mākou i kahi hoʻokūkū ʻole, pono ke kiola ʻia kahi ʻokoʻa.

I kēia manawa e hōʻuluʻulu kāua.

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

E kope i ke code i loaʻa lottery-test-suite.fif, mai poina e pani i ka laina hope.

ʻIke mākou ua hala ka hōʻike:

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

Ma ʻaneʻi Hiki iā ʻoe ke ʻike i ka commit pili me nā hopena o kēia manawa.

E hoʻomaopopo he mea paʻakikī ke kope mau i ke code i hōʻuluʻulu ʻia o kahi ʻaelike akamai i loko o kahi faila me nā hoʻāʻo, no laila e kākau mākou i kahi palapala e kākau i ke code i mea mau no mākou, a e hoʻopili wale mākou i ke code i hōʻuluʻulu ʻia i kā mākou hoʻāʻo me ka hoʻohana ʻana. "include".

E hana i kahi faila ma ka waihona papahana build.sh me keia mau mea.

#!/bin/bash

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

E hoʻokō kākou.

chmod +x ./build.sh

I kēia manawa, e holo wale i kā mākou palapala e hōʻuluʻulu i ka ʻaelike. Akā ma waho aʻe o kēia, pono mākou e kākau iā ia i kahi mau code. No laila e hana mākou i kahi faila hou lotter-compiled-for-test.fif, a mākou e hoʻokomo i loko o ka faila lottery-test-suite.fif.

E hoʻohui i ka code skirpt i sh, e hoʻopālua wale i ka faila i hoʻohui ʻia lotter-compiled-for-test.fif a hoʻololi i ka laina hope i loko.

# 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

I kēia manawa, e nānā, e holo kāua i ka ʻatikala hopena a e hana ʻia kahi faila lottery-compiled-for-test.fif, a mākou e hoʻokomo i loko o kā mākou lottery-test-suite.fif

В lottery-test-suite.fif holoi i ke code aelike a hoʻohui i ka laina "lottery-compiled-for-test.fif" include.

Holo mākou i nā hoʻāʻo e ʻike ua hala lākou.

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

Nui, i kēia manawa no ka hoʻomaka ʻana i nā hoʻokolohua, e hana mākou i faila test.sh, ka mea e hoʻokō mua build.sh, a laila holo i nā hoʻokolohua.

touch test.sh
chmod +x test.sh

Kākau mākou i loko

./build.sh 

echo "nCompilation completedn"

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

E hana kāua test.sh a holo ia e hōʻoia i ka holo ʻana o nā hoʻokolohua.

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

Nānā mākou i ka hui ʻana o ka ʻaelike a ua hoʻokō ʻia nā hoʻokolohua.

Nui, i kēia manawa i ka hoʻomaka test.sh E hōʻuluʻulu ʻia nā hoʻokolohua a holo koke. Eia ka loulou i hoʻopaʻa.

ʻAe, ma mua o ka hoʻomau ʻana, e hana hou kāua no ka maʻalahi.

E hana kākou i waihona build kahi e mālama ai mākou i ka ʻaelike i kope ʻia a me kāna clone i kākau ʻia i loko o kahi mea mau lottery-compiled.fif, lottery-compiled-for-test.fif. E hana pū kākou i waihona test ma hea e waiho ai ka waihona hoʻāʻo? lottery-test-suite.fif a me nā faila kākoʻo ʻē aʻe paha. loulou i nā hoʻololi pili.

E hoʻomau kākou i ka hoʻomohala ʻana i ka ʻaelike akamai.

A laila pono e hoʻāʻo e nānā i ka loaʻa ʻana o ka leka a hoʻonui ʻia ka counter ma ka hale kūʻai ke hoʻouna mākou i ka helu pololei. Akā e hana mākou ma hope.

I kēia manawa, e noʻonoʻo kākou i ke ʻano o ka ʻikepili a me nā ʻikepili e pono e mālama ʻia i loko o ka ʻaelike akamai.

E wehewehe au i nā mea a pau a mākou e mālama ai.

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

A laila pono ʻoe e kākau i ʻelua mau hana. E kāhea kākou i ka mea mua pack_state(), ka mea e hoʻopaʻa i ka ʻikepili no ka mālama ʻana ma hope o ka waihona ʻaelike akamai. E kāhea kākou i ka lua unpack_state() e heluhelu a hoʻihoʻi i ka ʻikepili mai kahi waihona.

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

Hoʻohui mākou i kēia mau hana ʻelua i ka hoʻomaka ʻana o ka ʻaelike akamai. E holo pono ana like kela hopena waena.

No ka mālama ʻana i ka ʻikepili pono ʻoe e kāhea i ka hana i kūkulu ʻia set_data() a e kakau i ka ikepili mai pack_state() ma ka waihona aelike akamai.

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

I kēia manawa ua loaʻa iā mākou nā hana kūpono no ke kākau ʻana a me ka heluhelu ʻana i ka ʻikepili, hiki iā mākou ke neʻe.

Pono mākou e hōʻoia i ka hōʻailona o ka memo mai waho mai e ka mea nona ka ʻaelike (a i ʻole mea hoʻohana ʻē aʻe i loaʻa i ke kī pilikino).

Ke hoʻopuka mākou i kahi ʻaelike akamai, hiki iā mākou ke hoʻomaka me ka ʻikepili a mākou e pono ai i ka waiho ʻana, e mālama ʻia no ka hoʻohana e hiki mai ana. E hoʻopaʻa mākou i ke kī lehulehu ma laila i hiki iā mākou ke hōʻoia ua kau inoa ʻia ka memo e komo mai me ke kī pilikino pili.

Ma mua o ka hoʻomau ʻana, e hana kāua i kahi kī pilikino a kākau iā ia test/keys/owner.pk. No ka hana ʻana i kēia, e hoʻomaka kākou iā Fift ma ke ʻano pāʻani a hoʻokō i ʻehā mau kauoha.

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

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

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

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

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

E hana kākou i waihona keys i loko o ka waihona test a kākau i ke kī pilikino ma laila.

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

ʻIke mākou i kahi faila ma ka waihona o kēia manawa owner.pk.

Wehe mākou i ke kī lehulehu mai ka waihona a i ka wā e pono ai hiki iā mākou ke kiʻi mai ke kī pilikino.

I kēia manawa pono mākou e kākau i kahi hōʻoia pūlima. E hoʻomaka kākou me ka hoʻāʻo. Heluhelu mua mākou i ke kī pilikino mai ka faila me ka hoʻohana ʻana i ka hana file>B a e kakau ia mea ma kahi hoololi owner_private_key, a laila hoʻohana i ka hana priv>pub e hoʻololi i ke kī pilikino i kī lehulehu a kākau i ka hopena i loko 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 !

Pono mākou i nā kī ʻelua.

Hoʻomaka mākou i ka mālama ʻana i ka ʻaelike akamai me ka ʻikepili arbitrary ma ke ʻano like me ka hana pack_state()a e kakau iho i mea hoololi 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 !

Ma hope aʻe, e haku mākou i kahi memo i hoʻopaʻa inoa ʻia, aia wale nō ka pūlima a me ke kumu kūʻai.

ʻO ka mea mua, hana mākou i ka ʻikepili a mākou e makemake ai e hoʻouna, a laila hoʻopaʻa inoa mākou me kahi kī pilikino a hope mākou e hoʻopuka i kahi leka i kau inoa ʻia.

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 !  

ʻO ka hopena, ua hoʻopaʻa ʻia ka memo a mākou e hoʻouna ai i ka ʻaelike akamai i kahi loli message_to_send, e pili ana i na hana hashu, ed25519_sign_uint hiki iā ʻoe ke heluhelu ma ka palapala ʻelima.

A no ka holo ʻana i ka hoʻāʻo e kāhea hou mākou.

message_to_send @ 
recv_external 
code 
storage @
c7
runvmctx

Eia nō Pono ke ʻano o ka faila me nā hoʻāʻo ma kēia pae.

E holo kāua i ka hoʻāʻo a hāʻule, no laila e hoʻololi mākou i ka ʻaelike akamai i hiki iā ia ke loaʻa nā memo o kēia ʻano a hōʻoia i ka pūlima.

ʻO ka mea mua, helu mākou i 512 mau ʻāpana o ka pūlima mai ka memo a kākau iā ia i kahi loli, a laila helu mākou i 32 mau ʻāpana o ka mea hoʻololi counter.

No ka mea he hana ko mākou no ka heluhelu ʻana i ka ʻikepili mai ka waihona ʻaelike akamai, e hoʻohana mākou.

ʻO ka mea aʻe e nānā i ka counter i hoʻoili ʻia me ka waiho ʻana a nānā i ka pūlima. Inā like ʻole kekahi mea, a laila hoʻolei mākou i kahi ʻokoʻa me ke code kūpono.

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

Pili pili Aia maanei.

E holo kāua i nā hoʻāʻo a ʻike i ka hāʻule ʻole o ka lua. No nā kumu ʻelua, ʻaʻole lawa nā bits i ka memo a ʻaʻole lawa nā bits i loko o ka waihona, no laila, hāʻule ke code i ka wā e hoʻopau ai. Pono mākou e hoʻohui i kahi pūlima i ka leka a mākou e hoʻouna nei a kope i ka waiho ʻana mai ka hōʻike hope loa.

Ma ka hoʻāʻo ʻelua, e hoʻohui mākou i kahi pūlima memo a hoʻololi i ka mālama ʻaelike akamai. Eia nō ʻO ka faila me nā hoʻāʻo e like me kēia manawa.

E kākau kākou i ka hā o ka ho'āʻo, kahi e hoʻouna aku ai mākou i kahi leka i pūlima ʻia me ke kī pilikino o kekahi. E hana kāua i kahi kī pilikino ʻē aʻe a mālama iā ia i kahi faila not-owner.pk. E pūlima mākou i ka memo me kēia kī pilikino. E holo kāua i nā hoʻāʻo a e hōʻoia i ka holo ʻana o nā hoʻokolohua āpau. Hāʻawi i keia manawa.

I kēia manawa hiki iā mākou ke neʻe hope i ka hoʻokō ʻana i ka logic contract smart.
В recv_external() e ʻae mākou i ʻelua ʻano memo.

No ka mea e hōʻiliʻili kā mākou ʻaelike i nā poho o nā mea pāʻani, pono e hoʻoili ʻia kēia kālā i ka mea nāna i hana i ka loteri. Hoʻopaʻa ʻia ka helu ʻeke kālā o ka mea nāna i hana i ka hailona ma ka waihona i ka wā i hana ʻia ai ka ʻaelike.

I ka hihia wale nō, pono mākou i ka hiki ke hoʻololi i ka helu wahi a mākou e hoʻouna ai i nā grams o ka poʻe nalo. Pono mākou e hoʻouna i nā grams mai ka loteri i ka helu o ka mea nona.

E hoʻomaka kākou me ka mea mua. E kākau mua i kahi ho'āʻo e nānā ai ma hope o ka hoʻouna ʻana i ka leka, ua mālama ka ʻaelike akamai i ka helu hou i loko o ka waihona. E ʻoluʻolu e hoʻomaopopo i ka memo, ma kahi o ka counter a me ka helu helu hou, hoʻouna pū mākou action ʻO kahi helu 7-bit integer non-negative, ma muli o ia, e koho mākou i ka hana ʻana i ka leka ma ka ʻaelike akamai.

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

I ka hoʻāʻo ʻana hiki iā ʻoe ke ʻike i ke ʻano o ka deserialized storage smartcontract storage i ʻElima. Hōʻike ʻia ka deserialization o nā ʻano like ʻole ma ka palapala ʻelima.

Hoʻohui i ka loulou me ka palaoa hou.

E holo kāua i ka hoʻāʻo a e hōʻoia i ka hāʻule. I kēia manawa, e hoʻohui kākou i ka loiloi e hoʻololi i ka helu wahi o ka mea nona ka loteri.

Ma ka ʻaelike akamai hoʻomau mākou i ka parse message, heluhelu mai action. E hoʻomanaʻo kākou e loaʻa iā kāua ʻelua action: hoʻololi i ka helu wahi a hoʻouna i nā grams.

A laila heluhelu mākou i ka helu hou o ka mea nona ka ʻaelike a mālama iā ia i loko o kahi waihona.
Holo mākou i nā ho'āʻo a ʻike ua hāʻule ke kolu o ka hoʻāʻo. Hāʻule ʻo ia ma muli o ka hoʻopili ʻana o ka ʻaelike i kēia manawa i nā 7 bits mai ka memo, i nalowale i ka hoʻāʻo. Hoʻohui i kahi mea ʻole i ka memo action. E holo kāua i nā hoʻokolohua a ʻike ua hala nā mea a pau. maanei hoʻopaʻa i nā hoʻololi. Nui.

I kēia manawa e kākau mākou i ka loiloi no ka hoʻouna ʻana i ka helu o nā grams i ka helu i mālama ʻia ma mua.

ʻO ka mua, e kākau kāua i hōʻike. E kākau mākou i ʻelua mau hoʻāʻo, hoʻokahi inā ʻaʻole lawa ke koena, ʻo ka lua ke holo pono nā mea āpau. Hiki ke nānā 'ia nā ho'ā'o ma keia hana.

I kēia manawa e hoʻohui i ke code. ʻO ka mua, e kākau kākou i ʻelua ala kōkua. ʻO ke ala loaʻa mua ka ʻike ʻana i ke koena o kēia manawa o kahi ʻaelike akamai.

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

A ʻo ka lua no ka hoʻouna ʻana i nā grams i kahi ʻaelike akamai ʻē aʻe. Ua kope loa au i kēia ʻano hana mai kahi ʻaelike akamai ʻē aʻe.

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

E hoʻohui kākou i kēia mau ʻano ʻelua i ka ʻaelike akamai a kākau i ka loiloi. ʻO ka mua, hoʻokaʻawale mākou i ka helu o nā grams mai ka memo. A laila nānā mākou i ke koena, inā ʻaʻole lawa mākou e hoʻolei i kahi ʻokoʻa. Inā maikaʻi nā mea a pau, a laila hoʻouna mākou i nā grams i ka helu i mālama ʻia a hoʻonui i ka 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));

Eia nō e like me ka ʻaelike akamai i kēia manawa. E holo kāua i nā hoʻāʻo a e hōʻoia i ko lākou hele ʻana.

Ma ke ala, ua unuhi ʻia kahi komisina mai ka ʻaelike akamai i kēlā me kēia manawa no kahi leka i hana ʻia. I mea e hoʻokō ai nā memo aelike akamai i ka noi, ma hope o nā loiloi kumu pono ʻoe e kelepona accept_message().

E neʻe kākou i nā memo kūloko. ʻO ka ʻoiaʻiʻo, e ʻae wale mākou i nā grams a hoʻihoʻi pālua i ka nui i ka mea pāʻani inā lanakila ʻo ia a ʻo ka hapakolu i ka mea nona ke nalo.

ʻO ka mua, e kākau kāua i kahi hoʻāʻo maʻalahi. No ka hana ʻana i kēia, pono mākou i kahi helu hoʻāʻo o ka ʻaelike akamai kahi e hoʻouna ai mākou i nā grams i ka ʻaelike akamai.

ʻElua mau helu ka helu ʻaelike akamai, he 32-bit integer kuleana no ka workchain a me ka 256-bit non-negative integer unique account number in this workchain. No ka laʻana, -1 a me 12345, ʻo ia ka helu wahi a mākou e mālama ai i kahi faila.

Ua kope au i ka hana no ka mālama ʻana i ka helu wahi mai 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

E nānā kākou i ka hana ʻana o ka hana, e hāʻawi kēia i ka hoʻomaopopo ʻana i ka hana ʻana o Fift. E hoʻolele i ka Fift ma ke ʻano pāʻani.

~/TON/build/crypto/fift -i 

ʻO ka mua mākou e paʻi -1, 12345 a me ka inoa o ka faila e hiki mai ana "sender.addr" ma ka waihona:

-1 12345 "sender.addr" 

ʻO ka hana aʻe e hoʻokō i ka hana -rot, ka mea e hoʻololi i ka hoʻopaʻa ʻana ma ke ʻano i loaʻa kahi helu aelike akamai kūʻokoʻa ma luna o ka waihona:

"sender.addr" -1 12345

256 u>B hoohuli i ka 256-bit non-negative integer i bytes.

"sender.addr" -1 BYTES:0000000000000000000000000000000000000000000000000000000000003039

swap hoʻololi i nā mea ʻelua ma luna o ka waihona.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 -1

32 i>B hoohuli i ka 32-bit integer i bytes.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 BYTES:FFFFFFFF

B+ hoʻohui i ʻelua mau kaʻina paita.

 "sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF

Eia hou swap.

BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF "sender.addr" 

A i ka hope ua kākau ʻia nā bytes i ka faila B>file. Ma hope o kēia, ua nele kā mākou waihona. Kū mākou Fift. Ua hana ʻia kahi faila ma ka waihona o kēia manawa sender.addr. E hoʻoneʻe i ka faila i ka waihona i hana ʻia test/addresses/.

E kākau mākou i kahi ho'āʻo maʻalahi e hoʻouna i nā grams i kahi ʻaelike akamai. Eia ka hana.

I kēia manawa, e nānā kākou i ke kumu o ka hailona.

ʻO ka mea mua a mākou e hana ai, ʻo ia ke nānā i ka memo bounced a i ole ina bounced, a laila haʻalele mākou iā ia. bounced 'o ia ho'i, e ho'iho'i ka 'aelike i ka grams inā loa'a kekahi hewa. ʻAʻole mākou e hoʻihoʻi i nā grams inā hiki koke mai kahi hewa.

Nānā mākou, inā ʻoi aku ka liʻiliʻi o ke koena ma mua o ka hapalua gram, a laila e ʻae wale mākou i ka leka a nānā ʻole.

A laila, hoʻokaʻawale mākou i ka helu o ka ʻaelike akamai kahi i hele mai ai ka leka.

Heluhelu mākou i ka ʻikepili mai ka waiho ʻana a laila holoi i nā bets kahiko mai ka mōʻaukala inā ʻoi aku ma mua o iwakālua o lākou. No ka maʻalahi, ua kākau wau i ʻekolu mau hana hou pack_order(), unpack_order(), remove_old_orders().

A laila, nānā mākou inā ʻaʻole lawa ke koena no ka uku, a laila manaʻo mākou ʻaʻole kēia he bet, akā he hoʻopiha a mālama i ka hoʻopiha ʻana i loko. orders.

A laila ʻo ke kumu o ka ʻaelike akamai.

ʻO ka mea mua, inā nalowale ka mea pāʻani, mālama mākou iā ia i ka mōʻaukala pili a inā ʻoi aku ka nui ma mua o 3 grams, hoʻouna mākou i ka 1/3 i ka mea nona ka ʻaelike akamai.

Inā lanakila ka mea pāʻani, a laila hoʻouna mākou i pālua i ka nui i ka helu o ka mea pāʻani a laila mālama i ka ʻike e pili ana i ka bet i ka mōʻaukala.

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

ʻO kēlā mea. Hoʻoholo pili.

I kēia manawa he mea maʻalahi nā mea i koe, e hana mākou i nā ala kiʻi i hiki iā mākou ke loaʻa ka ʻike e pili ana i ke kūlana o ka ʻaelike mai ka honua waho (ʻoiaʻiʻo, heluhelu i ka ʻikepili mai kā lākou mālama ʻaelike akamai).

E hoʻohui i nā ala kiʻi. E kākau mākou ma lalo e pili ana i ka loaʻa ʻana o ka ʻike e pili ana i kahi ʻaelike akamai.

Ua poina iaʻu e hoʻohui i ke code e hoʻoponopono i ka noi mua loa i hana ʻia i ka wā e paʻi ana i kahi ʻaelike akamai. Hoʻoholo pili. A ʻoi aku hooponoponoia hewa me ka hoʻouna ʻana i ka 1/3 o ka nui i ka moʻokāki o ka mea nona.

ʻO ka hana aʻe e hoʻolaha i ka ʻaelike akamai. E hana kākou i waihona requests.

Ua lawe au i ke code hoʻolaha i kumu simple-wallet-code.fc ia hiki ke loaʻa i loko o ka waihona kūhelu.

He mea pono e hoʻolohe. Hoʻokumu mākou i kahi mālama ʻaelike akamai a me kahi memo hoʻokomo. Ma hope o kēia, hana ʻia ka helu o ka ʻaelike akamai, ʻo ia hoʻi, ʻike ʻia ka helu ma mua o ka paʻi ʻana ma TON. A laila pono ʻoe e hoʻouna i kekahi mau grams i kēia helu wahi, a ma hope wale nō e pono ʻoe e hoʻouna i kahi faila me ka ʻaelike akamai ponoʻī, no ka mea, lawe ka pūnaewele i kahi komisina no ka mālama ʻana i ka ʻaelike akamai a me nā hana i loko (nā mea hōʻoia e mālama a hoʻokō i nā ʻaelike akamai. ). Hiki ke ʻike ʻia ke code ma aneʻi.

A laila hoʻokō mākou i ka code hoʻopuka a loaʻa lottery-query.boc waihona ʻaelike akamai a me ka helu wahi.

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

Mai poina e mālama i nā faila i hana ʻia: lottery-query.boc, lottery.addr, lottery.pk.

Ma waena o nā mea ʻē aʻe, e ʻike mākou i ka helu o ka ʻaelike akamai i nā log hoʻokō.

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

No ka leʻaleʻa wale, e noi kāua iā TON

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

A e ʻike mākou ua nele ka moʻokāki me kēia helu wahi.

account state is empty

Hoʻouna mākou i ka helu wahi 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd 2 Gram a ma hope o kekahi mau kekona hoʻokō mākou i ke kauoha like. No ka hoʻouna ʻana i nā grams aʻu e hoʻohana ai pēke kūhelu, a hiki iā ʻoe ke nīnau i kekahi mai ke kamaʻilio ʻana no nā grams hoʻāʻo, aʻu e kamaʻilio e pili ana ma ka hopena o ka ʻatikala.

> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Me he mea lā i ʻike ʻole ʻia (state:account_uninit) he aelike akamai me ka helu helu like a me ke koena o 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

I kēia manawa e hoʻolaha kākou i ka ʻaelike akamai. E hoʻomaka kākou i ka lite-client a hoʻokō.

> 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 

E nānā kākou ua paʻi ʻia ka ʻaelike.

> last
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Ma waena o nā mea ʻē aʻe e loaʻa iā mākou.

  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

ʻIke mākou i kēlā account_active.

Hoʻopili pili me nā hoʻololi Aia maanei.

E hana kākou i nā noi e launa pū me ka ʻaelike akamai.

ʻOi aku ka pololei, e haʻalele mākou i ka mea mua no ka hoʻololi ʻana i ka helu wahi ma ke ʻano he hana kūʻokoʻa, a e hana mākou i ka lua no ka hoʻouna ʻana i nā grams i ka helu o ka mea nona. ʻOiaʻiʻo, pono mākou e hana like me ka hoʻāʻo no ka hoʻouna ʻana i nā grams.

ʻO kēia ka leka a mākou e hoʻouna ai i ka ʻaelike akamai, kahi msg_seqno 165, action 2 a me 9.5 grams no ka hoʻouna ʻana.

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

Mai poina e kau inoa i ka memo me kāu kī pilikino lottery.pk, i hana ʻia ma mua i ka wā e hana ana i ka ʻaelike akamai. Eia ka hana pili.

Loaʻa ka ʻike mai kahi ʻaelike akamai me ka hoʻohana ʻana i nā ala get

I kēia manawa, e nānā kākou pehea e holo ai i nā ʻano hana kiʻi kiʻi akamai.

Hoʻolana lite-client a holo i ka get method a mākou i kākau ai.

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

В result aia ka waiwai i hoʻihoʻi ʻia e ka hana balance() mai kā mākou ʻaelike akamai.
E hana like mākou no nā ʻano hana ʻē aʻe.

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

E nīnau kāua i kāu moʻolelo pili.

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

E hoʻohana mākou i ka lite-client a loaʻa nā ala e hōʻike i ka ʻike e pili ana i ka ʻaelike akamai ma ka pūnaewele.

Hōʻike i ka ʻikepili aelike akamai ma ka pūnaewele

Ua kākau wau i kahi pūnaewele maʻalahi ma Python e hōʻike i ka ʻikepili mai ka ʻaelike akamai ma kahi ala kūpono. Maʻaneʻi,ʻaʻole wau e noʻonoʻo i ka kiko'ī a e hoʻolaha i ka pūnaewele ma ka hana hookahi.

Ua noi ʻia iā TON mai Python me ke kōkuaʻana o lite-client. No ka maʻalahi, ua hoʻopili ʻia ka pūnaewele ma Docker a paʻi ʻia ma Google Cloud. loulou.

Ke hoʻāʻo nei

I kēia manawa e ho'āʻo kāua e hoʻouna i nā grams i laila no ka hoʻopiha hou ʻana mai polopa. E hoʻouna mākou i 40 grams. A e hana kākou i ʻelua mau pili no ka maopopo. ʻIke mākou e hōʻike ana ka pūnaewele i ka mōʻaukala o nā bets, ka pākēneka lanakila o kēia manawa a me nā ʻike pono ʻē aʻe.

ʻIke mākouua lanakila mākou i ka mua, ua eo ka lua.

Ma hope o ka'ōlelo

Ua ʻoi aku ka lōʻihi o ka ʻatikala ma mua o kaʻu i manaʻo ai, ʻoi aku paha ka pōkole, a i ʻole no ke kanaka ʻike ʻole e pili ana iā TON a makemake e kākau a hoʻolaha i kahi ʻaelike akamai ʻaʻole maʻalahi me ka hiki ke launa pū me. ia. Ua wehewehe maʻalahi paha kekahi mau mea.

Malia paha ua hiki ke hana maikaʻi a nani hoʻi kekahi mau ʻano o ka hoʻokō ʻana, akā ua ʻoi aku ka nui o ka manawa e hoʻomākaukau ai i ka ʻatikala. Hiki paha iaʻu ke kuhi hewa ma kahi a ʻaʻole maopopo i kekahi mea, no laila inā e hana ana ʻoe i kahi mea koʻikoʻi, pono ʻoe e hilinaʻi i ka palapala mana a i ʻole ka waihona kūhelu me ka code TON.

Pono e hoʻomaopopo ʻia ʻoiai ʻo TON ponoʻī i loko o ka pae ikaika o ka hoʻomohala ʻana, hiki ke hoʻololi ʻia e wāwahi i kekahi o nā ʻanuʻu o kēia ʻatikala (i hana ʻia i koʻu kākau ʻana, ua hoʻoponopono ʻia ia), akā ʻo ke ala maʻamau. hiki ole ke loli.

ʻAʻole wau e kamaʻilio e pili ana i ka wā e hiki mai ana o TON. Malia paha e lilo ka paepae i mea nui a pono mākou e hoʻolimalima manawa e aʻo ai a hoʻopiha i kahi niche me kā mākou huahana i kēia manawa.

Aia pū kekahi Libra mai Facebook, nona ka lehulehu o nā mea hoʻohana ma mua o TON. ʻAʻohe oʻu ʻike e pili ana i ka Libra, no ka hoʻoholo ʻana ma ka ʻaha kūkā, ʻoi aku ka nui o nā hana ma laila ma mua o ke kaiāulu TON. ʻOiai ʻoi aku ka like o nā mea hoʻomohala a me ke kaiāulu o TON ma lalo o ka honua, ʻo ia hoʻi ka ʻoluʻolu.

kūmole

  1. Palapala TON kūhelu: https://test.ton.org
  2. Hale waihona TON kūhelu: https://github.com/ton-blockchain/ton
  3. Puke kūhelu no nā paepae like ʻole: https://wallet.ton.org
  4. ʻO ka waihona ʻaelike akamai mai kēia ʻatikala: https://github.com/raiym/astonished
  5. loulou i ka pūnaewele aelike akamai: https://ton-lottery.appspot.com
  6. Waihona no ka hoʻonui no Visual Studio Code no FunC: https://github.com/raiym/func-visual-studio-plugin
  7. E kamaʻilio e pili ana iā TON ma Telegram, i kōkua maoli e noʻonoʻo i ka pae mua. Manaʻo wau ʻaʻole ia he kuhihewa inā ʻōlelo wau aia nā mea a pau i kākau i kekahi mea no TON. Hiki iā ʻoe ke noi i nā grams hoʻāʻo ma laila. https://t.me/tondev_ru
  8. ʻO kahi kamaʻilio hou e pili ana iā TON i loaʻa iaʻu ka ʻike pono: https://t.me/TONgramDev
  9. ʻO ka pae mua o ka hoʻokūkū: https://contest.com/blockchain
  10. Ka lua o ka hoʻokūkū: https://contest.com/blockchain-2

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka