Nipa bii o ṣe le kọ ati ṣe atẹjade iwe adehun ọlọgbọn ni Telegram Open Network (TON)

Nipa bii o ṣe le kọ ati ṣe atẹjade iwe adehun ọlọgbọn ni TON

Kini nkan yii nipa?

Ninu nkan naa Emi yoo sọrọ nipa bii MO ṣe kopa ninu idije akọkọ (ti meji) Telegram blockchain idije, ko gba ẹbun kan, ati pinnu lati ṣe igbasilẹ iriri mi ninu nkan kan ki o ma ba rì sinu igbagbe ati, boya, iranlọwọ. ẹnikan.

Niwọn igba ti Emi ko fẹ lati kọ koodu áljẹbrà, ṣugbọn lati ṣe nkan ti n ṣiṣẹ, fun nkan naa Mo kowe adehun ọlọgbọn kan fun lotiri lẹsẹkẹsẹ ati oju opo wẹẹbu kan ti o ṣafihan data adehun smart taara lati TON laisi lilo ibi ipamọ agbedemeji.

Nkan naa yoo wulo fun awọn ti o fẹ lati ṣe adehun ọlọgbọn akọkọ wọn ni TON, ṣugbọn ko mọ ibiti o bẹrẹ.

Lilo lotiri gẹgẹbi apẹẹrẹ, Emi yoo lọ lati fifi sori ẹrọ ayika si titẹjade iwe adehun ọlọgbọn kan, ibaraenisepo pẹlu rẹ, ati kikọ oju opo wẹẹbu kan fun gbigba ati titẹjade data.

Nipa ikopa ninu idije

Oṣu Kẹwa to kọja, Telegram kede idije blockchain kan pẹlu awọn ede tuntun Fift и FunC. O jẹ dandan lati yan lati kikọ eyikeyi ninu awọn iwe adehun ọlọgbọn marun ti a dabaa. Mo ro pe yoo dara lati ṣe nkan ti o yatọ, kọ ede kan ati ṣe nkan, paapaa ti Emi ko ni lati kọ ohunkohun miiran ni ọjọ iwaju. Pẹlupẹlu, koko-ọrọ naa wa nigbagbogbo lori awọn ète.

O tọ lati sọ pe Emi ko ni iriri idagbasoke awọn adehun ọlọgbọn.

Mo gbero lati kopa titi di opin titi emi o fi le ati lẹhinna kọ nkan atunyẹwo kan, ṣugbọn Mo kuna lẹsẹkẹsẹ ni akọkọ. I kowe kan apamọwọ pẹlu olona-Ibuwọlu lori FunC ati pe o ṣiṣẹ ni gbogbogbo. Mo ti mu bi ipilẹ smart guide on Solidity.

Ni akoko yẹn, Mo ro pe eyi ni pato to lati gba o kere ju aaye ere kan. Bi abajade, nipa 40 ninu 60 awọn olukopa di olubori-ere ati pe emi ko si laarin wọn. Ni gbogbogbo, ko si ohun ti ko tọ si pẹlu eyi, ṣugbọn ohun kan yọ mi lẹnu. Ni akoko ikede ti awọn abajade, atunyẹwo idanwo fun adehun mi ko ti ṣe, Mo beere lọwọ awọn olukopa ninu iwiregbe boya ẹnikan wa ti ko ni, ko si.

Nkqwe akiyesi awọn ifiranṣẹ mi, ọjọ meji lẹhinna awọn onidajọ ṣe atẹjade asọye kan ati pe Emi ko loye boya wọn lairotẹlẹ padanu adehun ọlọgbọn mi lakoko idajọ tabi nirọrun ro pe o buru pupọ pe ko nilo asọye kan. Mo beere ibeere kan lori oju-iwe, ṣugbọn emi ko gba idahun. Biotilẹjẹpe kii ṣe aṣiri ti o ṣe idajọ, Mo ro pe ko ṣe pataki lati kọ awọn ifiranṣẹ ti ara ẹni.

A lo akoko pupọ lori oye, nitorinaa o pinnu lati kọ nkan kan. Niwon ko si alaye pupọ sibẹsibẹ, nkan yii yoo ṣe iranlọwọ lati fi akoko pamọ fun gbogbo eniyan ti o nifẹ.

Awọn Erongba ti smati siwe ni TON

Ṣaaju ki o to kọ ohunkohun, o nilo lati ro ero iru ẹgbẹ lati sunmọ nkan yii lati. Nitorinaa, ni bayi Emi yoo sọ fun ọ kini awọn apakan ti eto naa jẹ. Ni deede diẹ sii, kini awọn apakan ti o nilo lati mọ lati kọ o kere ju iru adehun iṣẹ kan.

A yoo idojukọ lori kikọ a smati guide ati ṣiṣẹ pẹlu awọn TON Virtual Machine (TVM), Fift и FunC, nitorina nkan naa jẹ diẹ sii bi apejuwe ti idagbasoke ti eto deede. A kii yoo gbe lori bii pẹpẹ funrararẹ ṣiṣẹ nibi.

Ni gbogbogbo nipa bi o ti ṣiṣẹ TVM ati язык Fift iwe aṣẹ osise ti o dara wa. Lakoko ti o ṣe alabapin ninu idije ati ni bayi lakoko kikọ iwe adehun lọwọlọwọ, Mo nigbagbogbo yipada si ọdọ rẹ.

Ede akọkọ ninu eyiti a ti kọ awọn adehun ọlọgbọn ni FunC. Ko si iwe lori rẹ ni akoko, nitorinaa lati le kọ nkan kan o nilo lati ṣe iwadi awọn apẹẹrẹ ti awọn adehun smart lati ibi ipamọ osise ati imuse ti ede funrararẹ nibẹ, pẹlu o le wo awọn apẹẹrẹ ti awọn adehun ọlọgbọn lati awọn meji ti o ti kọja. awọn idije. Awọn ọna asopọ ni opin nkan naa.

Jẹ ká sọ a ti tẹlẹ kọ kan smati guide fun FunC, lẹhin eyi a ṣajọ koodu naa sinu Apejọ Fift.

Iwe adehun ijafafa ti a ṣajọpọ wa lati ṣe atẹjade. Lati ṣe eyi o nilo lati kọ iṣẹ kan sinu Fift, eyi ti yoo gba awọn smart guide koodu ati diẹ ninu awọn miiran sile bi input, ati awọn ti o wu yoo jẹ faili kan pẹlu awọn itẹsiwaju .boc (eyi ti o tumo si "apo ti awọn sẹẹli"), ati, da lori bi a ti kọ o, a ikọkọ bọtini ati ki o adirẹsi, eyi ti o ti ipilẹṣẹ da lori awọn smati guide koodu. O le fi awọn giramu ranṣẹ tẹlẹ si adirẹsi ti iwe adehun ọlọgbọn ti ko tii tẹjade.

Lati ṣe atẹjade iwe adehun ọlọgbọn ni TON ti gba .boc faili naa yoo nilo lati firanṣẹ si blockchain nipa lilo alabara ina (diẹ sii lori iyẹn ni isalẹ). Ṣugbọn ṣaaju ki o to tẹjade, o nilo lati gbe awọn giramu si adiresi ti ipilẹṣẹ, bibẹẹkọ, adehun ọlọgbọn kii yoo ṣe atẹjade. Lẹhin ti atẹjade, o le ṣe ajọṣepọ pẹlu adehun ọlọgbọn nipa fifiranṣẹ awọn ifiranṣẹ lati ita (fun apẹẹrẹ, lilo alabara ina) tabi lati inu (fun apẹẹrẹ, adehun ọlọgbọn kan firanṣẹ ifiranṣẹ miiran si inu TON).

Ni kete ti a ba loye bi a ṣe gbejade koodu naa, o di rọrun. A ni aijọju mọ ohun ti a fẹ kọ ati bii eto wa yoo ṣe ṣiṣẹ. Ati lakoko kikọ, a wa bii eyi ṣe ti ṣe imuse tẹlẹ ninu awọn adehun ọlọgbọn ti o wa, tabi a wo koodu imuse naa Fift и FunC ni ibi ipamọ osise, tabi wo ninu iwe aṣẹ osise.

Nigbagbogbo Mo wa awọn koko-ọrọ ni iwiregbe Telegram nibiti gbogbo awọn olukopa idije ati awọn oṣiṣẹ Telegram pejọ, ati pe o ṣẹlẹ pe lakoko idije gbogbo eniyan pejọ sibẹ o bẹrẹ ijiroro Fift ati FunC. Ọna asopọ ni opin nkan naa.

O to akoko lati gbe lati ẹkọ si adaṣe.

Ngbaradi ayika fun ṣiṣẹ pẹlu TON

Mo ṣe ohun gbogbo ti yoo ṣe apejuwe ninu nkan lori MacOS ati ṣayẹwo ni ilopo ni Ubuntu 18.04 LTS mimọ lori Docker.

Ohun akọkọ ti o nilo lati ṣe ni igbasilẹ ati fi sori ẹrọ lite-client pẹlu eyiti o le fi awọn ibeere ranṣẹ si TON.

Awọn itọnisọna lori oju opo wẹẹbu osise ṣe apejuwe ilana fifi sori ẹrọ ni awọn alaye pupọ ati kedere ati fi awọn alaye diẹ silẹ. Nibi ti a tẹle awọn ilana, fifi awọn sonu gbára pẹlú awọn ọna. Emi ko ṣe akopọ iṣẹ akanṣe kọọkan funrararẹ ati fi sori ẹrọ lati ibi ipamọ Ubuntu osise (lori MacOS Mo lo 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 

Ni kete ti gbogbo awọn igbẹkẹle ti fi sori ẹrọ o le fi sii lite-client, Fift, FunC.

Ni akọkọ, a ṣe ẹda ibi ipamọ TON pẹlu awọn igbẹkẹle rẹ. Fun irọrun, a yoo ṣe ohun gbogbo ninu folda kan ~/TON.

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

Ibi ipamọ naa tun tọju awọn imuse Fift и FunC.

Bayi a ti ṣetan lati ṣajọpọ iṣẹ naa. Awọn koodu ibi ipamọ ti wa ni cloned sinu folda kan ~/TON/ton. awọn ~/TON ṣẹda folda build ki o si gba ise agbese na ninu rẹ.

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

Niwọn igba ti a yoo kọ iwe adehun ọlọgbọn, a nilo kii ṣe nikan lite-client, sugbon pelu Fift с FunC, nitorina jẹ ki a ṣajọ ohun gbogbo. Kii ṣe ilana iyara, nitorinaa a n duro de.

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

Nigbamii, ṣe igbasilẹ faili iṣeto ni eyiti o ni data nipa ipade si eyiti lite-client yoo sopọ.

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

Ṣiṣe awọn ibeere akọkọ si TON

Bayi jẹ ki a lọlẹ lite-client.

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

Ti ikole ba ṣaṣeyọri, lẹhinna lẹhin ifilọlẹ iwọ yoo rii log ti asopọ ti alabara ina si ipade naa.

[ 1][t 2][1582054822.963129282][lite-client.h:201][!testnode]   conn ready
[ 2][t 2][1582054823.085654020][lite-client.cpp:277][!testnode] server version is 1.1, capabilities 7
[ 3][t 2][1582054823.085725069][lite-client.cpp:286][!testnode] server time is 1582054823 (delta 0)
...

O le ṣiṣe aṣẹ naa help ati ki o wo iru awọn aṣẹ ti o wa.

help

Jẹ ki a ṣe atokọ awọn aṣẹ ti a yoo lo ninu nkan yii.

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

Bayi a ti ṣetan lati kọ iwe adehun funrararẹ.

Imuse

Agutan

Bi mo ti kowe loke, smart guide ti a ti wa ni kikọ ni a lotiri.

Pẹlupẹlu, eyi kii ṣe lotiri ninu eyiti o nilo lati ra tikẹti kan ati duro de wakati kan, ọjọ tabi oṣu, ṣugbọn ọkan lẹsẹkẹsẹ ninu eyiti olumulo n gbe lọ si adirẹsi adehun N giramu, ati ki o lesekese gba o pada 2 * N giramu tabi padanu. A yoo ṣe iṣeeṣe ti bori nipa 40%. Ti ko ba si giramu ti o to fun isanwo, lẹhinna a yoo gbero idunadura naa bi oke-oke.

Jubẹlọ, o jẹ pataki ki bets le wa ni ti ri ni akoko gidi ati ni a rọrun fọọmu, ki olumulo le lẹsẹkẹsẹ ni oye boya o gba tabi sọnu. Nitorinaa, o nilo lati ṣe oju opo wẹẹbu kan ti yoo ṣafihan awọn tẹtẹ ati awọn abajade taara lati TON.

Kikọ kan smati guide

Fun irọrun, Mo ti ṣe afihan koodu naa fun FunC; ohun itanna le ṣee rii ati fi sii ninu wiwa koodu Studio Visual; ti o ba fẹ ṣafikun nkankan lojiji, Mo ti jẹ ki ohun itanna naa wa ni gbangba. Paapaa, ẹnikan ti ṣe ohun itanna kan tẹlẹ fun ṣiṣẹ pẹlu Fift, o tun le fi sii ati rii ni VSC.

Jẹ ki a ṣẹda ibi ipamọ lẹsẹkẹsẹ nibiti a yoo ṣe awọn abajade agbedemeji.

Lati jẹ ki igbesi aye wa rọrun, a yoo kọ iwe adehun ọlọgbọn kan ati idanwo ni agbegbe titi ti o fi ṣetan. Lẹhin iyẹn a yoo gbejade ni TON.

Iwe adehun ọlọgbọn ni awọn ọna ita meji ti o le wọle si. Akoko, recv_external() Iṣẹ yii jẹ ṣiṣe nigbati ibeere kan si adehun ba wa lati ita ita, iyẹn ni, kii ṣe lati TON, fun apẹẹrẹ, nigba ti a funrara wa ni ipilẹṣẹ ifiranṣẹ ati firanṣẹ nipasẹ alabara-lite. Èkejì, recv_internal() eyi ni nigbati, laarin TON funrararẹ, eyikeyi adehun tọka si tiwa. Ni awọn ọran mejeeji, o le kọja awọn paramita si iṣẹ naa.

Jẹ ki a bẹrẹ pẹlu apẹẹrẹ ti o rọrun ti yoo ṣiṣẹ ti o ba tẹjade, ṣugbọn ko si ẹru iṣẹ ninu rẹ.

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

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

Nibi ti a nilo lati se alaye ohun ti o jẹ slice. Gbogbo data ti a fipamọ sinu TON Blockchain jẹ ikojọpọ kan TVM cell tabi nìkan cell, ninu iru sẹẹli kan o le fipamọ to awọn bits 1023 ti data ati to awọn ọna asopọ 4 si awọn sẹẹli miiran.

TVM cell slice tabi slice eyi jẹ apakan ti ọkan ti o wa tẹlẹ cell ti a lo lati pa a, yoo di mimọ nigbamii. Ohun akọkọ fun wa ni pe a le gbe slice ati da lori iru ifiranṣẹ, ṣe ilana data sinu recv_external() tabi recv_internal().

impure - Koko kan ti o tọkasi pe iṣẹ naa ṣe atunṣe data adehun adehun ọlọgbọn.

Jẹ ki a fi koodu adehun pamọ sinu lottery-code.fc ati akopọ.

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

Itumọ awọn asia le ṣee wo nipa lilo aṣẹ naa

~/TON/build/crypto/func -help

A ti ṣajọ koodu apejọ Fift sinu 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

O le ṣe ifilọlẹ ni agbegbe, fun eyi a yoo mura agbegbe naa.

Ṣe akiyesi pe ila akọkọ sopọ Asm.fif, Eyi jẹ koodu ti a kọ si Fift fun olupejọ marun.

Niwọn igba ti a fẹ ṣiṣe ati idanwo adehun smart ni agbegbe, a yoo ṣẹda faili kan lottery-test-suite.fif ki o si da awọn compiled koodu nibẹ, rirọpo awọn ti o kẹhin ila ni o, eyi ti o kọ awọn smati guide koodu to kan ibakan codelẹhinna gbe lọ si ẹrọ foju:

"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

Nitorinaa o dabi pe o han, ni bayi jẹ ki a ṣafikun si faili kanna koodu ti a yoo lo lati ṣe ifilọlẹ 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 a ṣe igbasilẹ ọrọ-ọrọ, iyẹn ni, data pẹlu eyiti TVM (tabi ipo nẹtiwọọki) yoo ṣe ifilọlẹ. Paapaa lakoko idije naa, ọkan ninu awọn olupilẹṣẹ fihan bi o ṣe le ṣẹda c7 mo si daakọ. Ninu nkan yii a le nilo lati yipada rand_seed niwon awọn iran ti a ID nọmba da lori o ati ti o ba ko yi pada, awọn nọmba kanna yoo wa ni pada ni gbogbo igba.

recv_internal и recv_external awọn iṣiro pẹlu awọn iye 0 ati -1 yoo jẹ iduro fun pipe awọn iṣẹ ti o baamu ni adehun ọlọgbọn.

Bayi a ti ṣetan lati ṣẹda idanwo akọkọ fun adehun ọlọgbọn ṣofo wa. Fun mimọ, fun bayi a yoo ṣafikun gbogbo awọn idanwo si faili kanna lottery-test-suite.fif.

Jẹ ki a ṣẹda oniyipada storage kí o sì kọ òfo sínú rẹ̀ cell, yi yoo jẹ awọn smati guide ipamọ.

message Eyi ni ifiranṣẹ ti a yoo firanṣẹ si olubasọrọ ọlọgbọn lati ita. A yoo tun sọ di ofo fun bayi.

variable storage 
<b b> storage ! 

variable message 
<b b> message ! 

Lẹhin ti a ti pese awọn iduro ati awọn oniyipada, a ṣe ifilọlẹ TVM nipa lilo aṣẹ naa runvmctx ki o si kọja awọn paramita ti a ṣẹda si titẹ sii.

message @ 
recv_external 
code 
storage @ 
c7 
runvmctx 

Ni ipari a yoo ṣe aṣeyọri bi eleyi agbedemeji koodu fun Fift.

Bayi a le ṣiṣẹ koodu abajade.

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

Eto naa yẹ ki o ṣiṣẹ laisi awọn aṣiṣe ati ninu iṣelọpọ a yoo rii iwe ipaniyan:

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

Nla, a ti kọ ẹya akọkọ ṣiṣẹ ti adehun ọlọgbọn.

Bayi a nilo lati ṣafikun iṣẹ ṣiṣe. Akọkọ jẹ ki ká wo pẹlu awọn ifiranṣẹ ti o wa lati ita aye si recv_external()

Olùgbéejáde funrararẹ yan ọna kika ifiranṣẹ ti adehun le gba.

Sugbon nigbagbogbo

  • Ni akọkọ, a fẹ lati daabobo adehun wa lati ita ita ati jẹ ki o jẹ ki eni to ni adehun nikan le firanṣẹ awọn ifiranṣẹ ita si rẹ.
  • keji, nigba ti a ba fi kan wulo ifiranṣẹ to TON, a fẹ yi lati ṣẹlẹ gangan ni kete ti ati nigba ti a ba fi kanna ifiranṣẹ lẹẹkansi, awọn smati guide kọ o.

Nitorinaa gbogbo adehun ni o yanju awọn iṣoro meji wọnyi, niwọn igba ti adehun wa gba awọn ifiranṣẹ ita, a nilo lati tọju iyẹn paapaa.

A yoo ṣe ni ọna yiyipada. Ni akọkọ, jẹ ki a yanju iṣoro naa pẹlu atunwi; ti adehun ba ti gba iru ifiranṣẹ bẹ tẹlẹ ti o ṣe ilana, kii yoo ṣiṣẹ ni igba keji. Ati lẹhinna a yoo yanju iṣoro naa ki ẹgbẹ kan ti eniyan nikan le firanṣẹ awọn ifiranṣẹ si adehun ọlọgbọn naa.

Awọn ọna oriṣiriṣi lo wa lati yanju iṣoro naa pẹlu awọn ifiranṣẹ ẹda-ẹda. Eyi ni bii a yoo ṣe. Ninu adehun ọlọgbọn, a ṣe ipilẹṣẹ counter ti awọn ifiranṣẹ ti a gba pẹlu iye ibẹrẹ 0. Ninu ifiranṣẹ kọọkan si adehun smati, a yoo ṣafikun iye counter lọwọlọwọ. Ti iye counter ti o wa ninu ifiranṣẹ ko baamu iye ti o wa ninu adehun ọlọgbọn, lẹhinna a ko ṣe ilana rẹ; ti o ba ṣe bẹ, lẹhinna a ṣe ilana rẹ ati mu counter naa pọ si ninu adehun ọlọgbọn nipasẹ 1.

Jẹ ki a pada si lottery-test-suite.fif kí o sì fi ìdánwò kejì kún un. Ti a ba firanṣẹ nọmba ti ko tọ, koodu yẹ ki o jabọ imukuro. Fun apẹẹrẹ, jẹ ki data adehun naa tọju 166, ati pe a yoo firanṣẹ 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"

Jẹ ki a ṣe ifilọlẹ.

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

Ati pe a yoo rii pe a ṣe idanwo naa pẹlu aṣiṣe kan.

[ 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

Ni ipele yii lottery-test-suite.fif yẹ ki o dabi asopọ.

Bayi jẹ ki a ṣafikun kannaa counter si adehun ọlọgbọn ni 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 iro ifiranṣẹ ti a fi.

Ohun akọkọ ti a ṣe ni ṣayẹwo boya ifiranṣẹ naa ba ni data ninu, ti kii ba ṣe bẹ, lẹhinna a jade nirọrun.

Nigbamii ti a pin ifiranṣẹ naa. in_msg~load_uint(32) èyà awọn nọmba 165, 32-bit unsigned int lati ifiranṣẹ ti a firanṣẹ.

Nigbamii ti a fifuye 32 die-die lati smati guide ipamọ. A ṣayẹwo pe nọmba ti kojọpọ baamu ọkan ti o kọja; ti kii ba ṣe bẹ, a jabọ imukuro kan. Ninu ọran wa, niwọn bi a ti n kọja ti kii ṣe baramu, iyasọtọ yẹ ki o ju silẹ.

Bayi jẹ ki a ṣe akopọ.

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

Daakọ koodu abajade si lottery-test-suite.fif, ko gbagbe lati ropo awọn ti o kẹhin ila.

A ṣayẹwo pe idanwo naa kọja:

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

Nibi gangan O le wo adehun ti o baamu pẹlu awọn abajade lọwọlọwọ.

Ṣe akiyesi pe ko ṣe aibalẹ lati daakọ nigbagbogbo koodu ti a ṣakojọ ti adehun ọlọgbọn sinu faili kan pẹlu awọn idanwo, nitorinaa a yoo kọ iwe afọwọkọ kan ti yoo kọ koodu naa sinu igbagbogbo fun wa, ati pe a yoo sopọ nikan koodu ti o ṣajọ si awọn idanwo wa ni lilo "include".

Ṣẹda faili kan ninu folda ise agbese build.sh pẹlu awọn wọnyi akoonu.

#!/bin/bash

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

Jẹ ká ṣe awọn ti o executable.

chmod +x ./build.sh

Bayi, kan ṣiṣẹ iwe afọwọkọ wa lati ṣajọ adehun naa. Ṣugbọn Yato si eyi, a nilo lati kọ sinu igbagbogbo code. Nitorinaa a yoo ṣẹda faili tuntun kan lotter-compiled-for-test.fif, eyiti a yoo fi sii ninu faili naa lottery-test-suite.fif.

Jẹ ki a ṣafikun koodu skirpt si sh, eyiti yoo rọrun ṣe ẹda faili ti o ṣajọ sinu lotter-compiled-for-test.fif ki o si yi awọn ti o kẹhin ila ni o.

# 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

Bayi, lati ṣayẹwo, jẹ ki a ṣiṣẹ iwe afọwọkọ abajade ati pe faili kan yoo ṣe ipilẹṣẹ lottery-compiled-for-test.fif, eyi ti a yoo fi sinu wa lottery-test-suite.fif

В lottery-test-suite.fif pa awọn guide koodu ki o si fi ila "lottery-compiled-for-test.fif" include.

A ṣe awọn idanwo lati ṣayẹwo pe wọn kọja.

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

Nla, ni bayi lati ṣe adaṣe ifilọlẹ awọn idanwo, jẹ ki a ṣẹda faili kan test.sh, eyi ti yoo kọkọ ṣiṣẹ build.sh, ati lẹhinna ṣiṣe awọn idanwo naa.

touch test.sh
chmod +x test.sh

A kọ inu

./build.sh 

echo "nCompilation completedn"

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

Jẹ ká ṣe o test.sh ati ṣiṣe rẹ lati rii daju pe awọn idanwo naa ṣiṣẹ.

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

A ṣayẹwo pe awọn iwe adehun ṣe akopọ ati pe awọn idanwo naa ti ṣiṣẹ.

O dara, bayi ni ibẹrẹ test.sh Awọn idanwo naa yoo ṣe akopọ ati ṣiṣe lẹsẹkẹsẹ. Eyi ni ọna asopọ si .

O dara, ṣaaju ki a to tẹsiwaju, jẹ ki a ṣe ohun kan diẹ sii fun irọrun.

Jẹ ki a ṣẹda folda kan build nibi ti a ti fipamọ iwe adehun ti a daakọ ati ẹda oniye ti a kọ sinu igbagbogbo lottery-compiled.fif, lottery-compiled-for-test.fif. Jẹ ki a tun ṣẹda folda kan test nibo ni faili idanwo naa yoo wa ni ipamọ? lottery-test-suite.fif ati awọn faili atilẹyin miiran. Ọna asopọ si awọn iyipada ti o yẹ.

Jẹ ki a tẹsiwaju idagbasoke adehun ọlọgbọn naa.

Nigbamii yẹ ki o jẹ idanwo kan ti o ṣayẹwo pe o ti gba ifiranṣẹ naa ati pe a ṣe imudojuiwọn counter ni ile itaja nigba ti a ba fi nọmba to pe. Ṣugbọn a yoo ṣe iyẹn nigbamii.

Bayi jẹ ki a ronu nipa iru eto data ati kini data nilo lati wa ni fipamọ sinu adehun ọlọgbọn.

Emi yoo ṣe apejuwe ohun gbogbo ti a fipamọ.

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

Nigbamii o nilo lati kọ awọn iṣẹ meji. Jẹ ki a pe akọkọ pack_state(), eyi ti yoo ṣe akopọ data fun fifipamọ atẹle ni ibi ipamọ adehun ọlọgbọn. Jẹ ki a pe keji unpack_state() yoo ka ati da data pada lati ibi ipamọ.

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

A ṣafikun awọn iṣẹ meji wọnyi si ibẹrẹ ti adehun ọlọgbọn. Yoo ṣiṣẹ jade bi eleyi agbedemeji esi.

Lati fipamọ data iwọ yoo nilo lati pe iṣẹ ti a ṣe sinu rẹ set_data() ati awọn ti o yoo kọ data lati pack_state() ni awọn smati guide ipamọ.

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

Ni bayi pe a ni awọn iṣẹ irọrun fun kikọ ati kika data, a le tẹsiwaju.

A nilo lati ṣayẹwo pe ifiranṣẹ ti nwọle lati ita ti fowo si nipasẹ eni ti o ni adehun (tabi olumulo miiran ti o ni iwọle si bọtini ikọkọ).

Nigba ti a ba ṣe atẹjade iwe adehun ọlọgbọn, a le ṣe ipilẹṣẹ rẹ pẹlu data ti a nilo ni ibi ipamọ, eyiti yoo wa ni fipamọ fun lilo ọjọ iwaju. A yoo ṣe igbasilẹ bọtini gbangba nibẹ ki a le rii daju pe ifiranṣẹ ti nwọle ti fowo si pẹlu bọtini ikọkọ ti o baamu.

Ṣaaju ki o to tẹsiwaju, jẹ ki a ṣẹda bọtini ikọkọ ki o kọ si test/keys/owner.pk. Lati ṣe eyi, jẹ ki a ṣe ifilọlẹ Fift ni ipo ibaraenisepo ati ṣiṣẹ awọn ofin mẹrin.

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

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

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

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

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

Jẹ ki a ṣẹda folda kan keys inu folda test ki o si kọ awọn ikọkọ bọtini nibẹ.

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

A rii faili kan ninu folda lọwọlọwọ owner.pk.

A yọ bọtini gbangba kuro lati akopọ ati nigbati o nilo a le gba lati ikọkọ.

Bayi a nilo lati kọ ijẹrisi ibuwọlu kan. Jẹ ki a bẹrẹ pẹlu idanwo naa. Ni akọkọ a ka bọtini ikọkọ lati faili nipa lilo iṣẹ naa file>B ki o si kọ o si a oniyipada owner_private_key, lẹhinna lilo iṣẹ naa priv>pub yi bọtini ikọkọ pada si bọtini ita gbangba ki o kọ abajade sinu 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 !

A yoo nilo awọn bọtini mejeeji.

A ṣe ipilẹṣẹ ibi ipamọ adehun smati pẹlu data lainidii ni ọna kanna bi ninu iṣẹ naa pack_state()ki o si kọ o sinu kan oniyipada 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 !

Nigbamii ti, a yoo ṣajọ ifiranṣẹ ti o fowo si, yoo ni ibuwọlu nikan ati iye counter.

Ni akọkọ, a ṣẹda data ti a fẹ gbejade, lẹhinna a forukọsilẹ pẹlu bọtini ikọkọ ati nikẹhin a ṣe agbekalẹ ifiranṣẹ ti o fowo si.

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 !  

Bi abajade, ifiranṣẹ ti a yoo firanṣẹ si adehun ọlọgbọn ni a gbasilẹ ni oniyipada kan message_to_send, nipa awọn iṣẹ hashu, ed25519_sign_uint o le ka ninu awọn Fift iwe.

Ati lati ṣiṣe idanwo naa a tun pe lẹẹkansi.

message_to_send @ 
recv_external 
code 
storage @
c7
runvmctx

Bi eleyi Faili pẹlu awọn idanwo yẹ ki o dabi eyi ni ipele yii.

Jẹ ki a ṣiṣẹ idanwo naa ati pe yoo kuna, nitorinaa a yoo yi adehun ọlọgbọn pada ki o le gba awọn ifiranṣẹ ti ọna kika yii ki o rii daju ibuwọlu naa.

Ni akọkọ, a ka awọn iwọn 512 ti ibuwọlu lati ifiranṣẹ ki o kọ si oniyipada kan, lẹhinna a ka awọn bit 32 ti oniyipada counter.

Niwọn igba ti a ni iṣẹ kan fun kika data lati ibi ipamọ adehun smart, a yoo lo.

Nigbamii ti n ṣayẹwo counter ti o ti gbe pẹlu ibi ipamọ ati ṣayẹwo ibuwọlu naa. Ti nkan ko ba baramu, lẹhinna a jabọ imukuro pẹlu koodu ti o yẹ.

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

Ifarabalẹ ti o yẹ nibi gangan.

Jẹ ki a ṣiṣẹ awọn idanwo naa ki o rii pe idanwo keji kuna. Fun idi meji, ko si awọn die-die ti o to ninu ifiranṣẹ ati pe ko si awọn die-die ti o wa ninu ibi ipamọ, nitorina koodu naa kọlu nigbati o ba n ṣalaye. A nilo lati ṣafikun ibuwọlu kan si ifiranṣẹ ti a nfiranṣẹ ati daakọ ibi ipamọ lati idanwo to kẹhin.

Ninu idanwo keji, a yoo ṣafikun ibuwọlu ifiranṣẹ ki o yi ibi ipamọ adehun smart pada. Bi eleyi faili pẹlu awọn idanwo dabi ni akoko.

Jẹ ki a kọ idanwo kẹrin, ninu eyiti a yoo fi ifiranṣẹ kan ranṣẹ pẹlu bọtini ikọkọ ti elomiran. Jẹ ki a ṣẹda bọtini ikọkọ miiran ki o fi pamọ si faili kan not-owner.pk. A yoo fowo si ifiranṣẹ pẹlu bọtini ikọkọ yii. Jẹ ki a ṣiṣẹ awọn idanwo ati rii daju pe gbogbo awọn idanwo kọja. Ṣe adehun ni akoko yii.

Bayi a le nipari tẹsiwaju si imuse ọgbọn adehun adehun ọlọgbọn.
В recv_external() a yoo gba meji orisi ti awọn ifiranṣẹ.

Niwọn igba ti adehun wa yoo ṣajọpọ awọn adanu awọn oṣere, owo yii gbọdọ gbe lọ si ọdọ ẹlẹda ti lotiri naa. Adirẹsi apamọwọ ti olupilẹṣẹ lotiri ti wa ni igbasilẹ ni ibi ipamọ nigbati a ṣẹda adehun naa.

O kan ni ọran, a nilo agbara lati yi adirẹsi pada si eyiti a firanṣẹ awọn giramu ti awọn olofo. A yẹ ki o tun ni anfani lati fi giramu lati lotiri si adirẹsi eni.

Jẹ ká bẹrẹ pẹlu awọn akọkọ ọkan. Jẹ ki a kọkọ kọ idanwo kan ti yoo ṣayẹwo pe lẹhin fifiranṣẹ ifiranṣẹ naa, adehun ọlọgbọn ti fipamọ adirẹsi tuntun ni ibi ipamọ. Jọwọ ṣe akiyesi pe ninu ifiranṣẹ naa, ni afikun si counter ati adirẹsi tuntun, a tun gbejade action Nọmba 7-bit ti kii ṣe odi, ti o da lori rẹ, a yoo yan bi a ṣe le ṣe ilana ifiranṣẹ naa ninu adehun ọlọgbọn.

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

Ninu idanwo naa o le rii bii ibi ipamọ smartcontract ṣe jẹ deserialized storage ni Karun. Deserialization ti awọn oniyipada ti wa ni apejuwe ninu awọn Fift iwe.

Ifaramọ ọna asopọ pẹlu fi kun esufulawa.

Jẹ ki a ṣiṣẹ idanwo naa ki o rii daju pe o kuna. Bayi jẹ ki ká fi kannaa lati yi awọn adirẹsi ti awọn lotiri eni.

Ninu adehun ọlọgbọn a tẹsiwaju lati ṣe itupalẹ message, ka sinu action. Jẹ ki a leti pe a yoo ni meji action: yi adirẹsi ati fi giramu.

Lẹhinna a ka adirẹsi tuntun ti oniwun adehun ati fipamọ sinu ibi ipamọ.
A ṣiṣe awọn idanwo ati rii pe idanwo kẹta kuna. O kọlu nitori otitọ pe adehun ni bayi ni afikun awọn ipin 7 lati ifiranṣẹ, eyiti o nsọnu ninu idanwo naa. Fi eyi ti ko si tẹlẹ kun ifiranṣẹ naa action. Jẹ ki a ṣiṣẹ awọn idanwo ati rii pe ohun gbogbo kọja. nibi dá si awọn ayipada. Nla.

Bayi jẹ ki a kọ ọgbọn-ọrọ fun fifiranṣẹ nọmba kan ti awọn giramu si adirẹsi ti o ti fipamọ tẹlẹ.

Ni akọkọ, jẹ ki a kọ idanwo kan. A yoo kọ awọn idanwo meji, ọkan nigbati iwọntunwọnsi ko ba to, keji nigbati ohun gbogbo yẹ ki o kọja ni aṣeyọri. Awọn idanwo le ṣee wo ninu adehun yii.

Bayi jẹ ki ká fi awọn koodu. Ni akọkọ, jẹ ki a kọ awọn ọna oluranlọwọ meji. Ọna gbigba akọkọ ni lati wa iwọntunwọnsi lọwọlọwọ ti adehun ọlọgbọn kan.

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

Ati awọn keji ọkan ni fun fifiranṣẹ awọn giramu si miiran smati guide. Mo ti daakọ patapata yi ọna lati miiran smati guide.

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

Jẹ ki a ṣafikun awọn ọna meji wọnyi si adehun ọlọgbọn ki o kọ ọgbọn naa. Ni akọkọ, a pin nọmba awọn giramu lati ifiranṣẹ naa. Nigbamii ti a ṣayẹwo dọgbadọgba, ti o ba ti o jẹ ko to a jabọ ohun sile. Ti ohun gbogbo ba dara, lẹhinna a firanṣẹ awọn giramu si adirẹsi ti o fipamọ ati ṣe imudojuiwọn counter naa.

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

Bi eleyi wulẹ bi awọn smati guide ni akoko. Jẹ ki a ṣiṣẹ awọn idanwo naa ki o rii daju pe wọn kọja.

Nipa ọna, a yọkuro igbimọ kan lati inu adehun ọlọgbọn ni gbogbo igba fun ifiranṣẹ ti a ti ni ilọsiwaju. Ni ibere fun awọn ifiranṣẹ adehun ọlọgbọn lati ṣiṣẹ ibeere naa, lẹhin awọn sọwedowo ipilẹ o nilo lati pe accept_message().

Bayi jẹ ki a lọ si awọn ifiranṣẹ inu. Ni pato, a yoo nikan gba giramu ki o si fi pada ė iye si ẹrọ orin ti o ba AamiEye ati kẹta si eni ti o ba ti o padanu.

Ni akọkọ, jẹ ki a kọ idanwo ti o rọrun. Lati ṣe eyi, a nilo adirẹsi idanwo kan ti adehun ọlọgbọn lati eyiti a ro pe a fi awọn giramu ranṣẹ si adehun ọlọgbọn naa.

Adirẹsi adehun ijafafa naa ni awọn nọmba meji, odidi 32-bit kan ti o ni iduro fun iṣẹ-iṣẹ ati nọmba akọọlẹ alailẹgbẹ odidi 256-bit kan ti kii ṣe odi ni iṣẹ ṣiṣe yii. Fun apẹẹrẹ, -1 ati 12345, eyi ni adirẹsi ti a yoo fipamọ si faili kan.

Mo daakọ iṣẹ naa fun fifipamọ adirẹsi naa lati 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

Jẹ ki a wo bii iṣẹ naa ṣe n ṣiṣẹ, eyi yoo fun ni oye bi Fift ṣiṣẹ. Lọlẹ Fift ni ipo ibaraenisepo.

~/TON/build/crypto/fift -i 

Ni akọkọ a Titari -1, 12345 ati orukọ faili iwaju "sender.addr" sori akopọ:

-1 12345 "sender.addr" 

Igbese ti o tẹle ni lati mu iṣẹ naa ṣiṣẹ -rot, eyiti o yi akopọ naa pada ni ọna ti o wa ni oke ti akopọ naa nọmba adehun ọlọgbọn alailẹgbẹ kan wa:

"sender.addr" -1 12345

256 u>B ṣe iyipada odidi 256-bit ti kii ṣe odi si awọn baiti.

"sender.addr" -1 BYTES:0000000000000000000000000000000000000000000000000000000000003039

swap swaps oke meji eroja ti akopọ.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 -1

32 i>B iyipada odidi 32-bit si awọn baiti.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 BYTES:FFFFFFFF

B+ so meji lesese ti awọn baiti.

 "sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF

Lẹẹkansi swap.

BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF "sender.addr" 

Ati nikẹhin awọn baiti ti kọ si faili naa B>file. Lẹhin eyi akopọ wa ti ṣofo. A duro Fift. A ti ṣẹda faili kan ninu folda lọwọlọwọ sender.addr. Jẹ ki a gbe faili lọ si folda ti o ṣẹda test/addresses/.

Jẹ ki a kọ idanwo ti o rọrun ti yoo firanṣẹ awọn giramu si adehun ọlọgbọn kan. Eyi ni adehun naa.

Bayi jẹ ki ká wo ni kannaa ti awọn lotiri.

Ohun akọkọ ti a ṣe ni ṣayẹwo ifiranṣẹ naa bounced tabi ko ba ti bounced, lẹhinna a foju rẹ. bounced tumo si wipe awọn guide yoo pada giramu ti o ba ti diẹ ninu awọn aṣiṣe waye. A kii yoo da giramu pada ti aṣiṣe kan ba waye lojiji.

A ṣayẹwo, ti iwọntunwọnsi ba kere ju idaji giramu, lẹhinna a kan gba ifiranṣẹ naa ki o foju parẹ.

Nigbamii ti, a pin adirẹsi ti adehun ọlọgbọn lati eyiti ifiranṣẹ naa ti wa.

A ka awọn data lati ibi ipamọ ati ki o si pa awọn atijọ bets lati awọn itan ti o ba ti wa ni siwaju sii ju ogun ninu wọn. Fun irọrun, Mo kọ awọn iṣẹ afikun mẹta pack_order(), unpack_order(), remove_old_orders().

Nigbamii ti, a wo ti iwọntunwọnsi ko ba to fun sisanwo, lẹhinna a ro pe eyi kii ṣe tẹtẹ, ṣugbọn atunṣe ati ṣafipamọ atunṣe ni orders.

Lẹhinna nikẹhin pataki ti adehun ọlọgbọn naa.

Ni akọkọ, ti ẹrọ orin ba padanu, a fipamọ sinu itan tẹtẹ ati ti iye naa ba ju giramu 3 lọ, a firanṣẹ 1/3 si oluwa ti adehun ọlọgbọn naa.

Ti ẹrọ orin ba ṣẹgun, lẹhinna a firanṣẹ iye meji si adirẹsi ẹrọ orin ati lẹhinna fi alaye pamọ nipa tẹtẹ ninu itan-akọọlẹ.

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

Gbogbo ẹ niyẹn. Ifarabalẹ ti o baamu.

Bayi gbogbo ohun ti o ku ni o rọrun, jẹ ki a ṣẹda awọn ọna gbigba ki a le gba alaye nipa ipo ti adehun lati ita (ni otitọ, ka data lati ibi ipamọ adehun ọlọgbọn wọn).

Jẹ ká fi gba awọn ọna. A yoo kọ ni isalẹ nipa bi o ṣe le gba alaye nipa adehun ọlọgbọn kan.

Mo tun gbagbe lati ṣafikun koodu ti yoo ṣe ilana ibeere akọkọ ti o waye nigbati o ṣe atẹjade adehun ọlọgbọn kan. Ifarabalẹ ti o baamu. Ati siwaju sii atunse kokoro pẹlu fifiranṣẹ 1/3 ti iye naa si akọọlẹ oniwun naa.

Igbesẹ ti o tẹle ni lati ṣe agbejade adehun ọlọgbọn naa. Jẹ ki a ṣẹda folda kan requests.

Mo mu koodu atẹjade bi ipilẹ simple-wallet-code.fc eyi ti le ri ninu awọn osise ibi ipamọ.

Nkankan tọ san ifojusi si. A ṣe ipilẹṣẹ ibi ipamọ adehun ọlọgbọn ati ifiranṣẹ titẹ sii. Lẹhin eyi, adiresi ti adehun ọlọgbọn ti wa ni ipilẹṣẹ, eyini ni, a mọ adirẹsi naa paapaa ṣaaju ki o to tẹjade ni TON. Ni atẹle, o nilo lati firanṣẹ awọn giramu pupọ si adirẹsi yii, ati lẹhin iyẹn o nilo lati firanṣẹ faili kan pẹlu iwe adehun ọlọgbọn funrararẹ, nitori nẹtiwọọki n gba igbimọ kan fun titoju adehun ọlọgbọn ati awọn iṣẹ inu rẹ (awọn afọwọsi ti o fipamọ ati ṣiṣẹ ọlọgbọn. awọn adehun). Awọn koodu le ṣee wo nibi.

Nigbamii a ṣiṣẹ koodu titẹjade ati gba lottery-query.boc smart guide faili ati adirẹsi.

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

Maṣe gbagbe lati ṣafipamọ awọn faili ti ipilẹṣẹ: lottery-query.boc, lottery.addr, lottery.pk.

Lara awọn ohun miiran, a yoo rii adirẹsi ti adehun smart ni awọn iwe ipaniyan.

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

Kan fun igbadun, jẹ ki a ṣe ibeere si TON

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

Ati pe a yoo rii pe akọọlẹ pẹlu adirẹsi yii jẹ ofo.

account state is empty

A firanṣẹ si adirẹsi naa 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd 2 Giramu ati lẹhin iṣẹju diẹ a ṣiṣẹ aṣẹ kanna. Lati firanṣẹ giramu Mo lo osise apamọwọ, ati pe o le beere ẹnikan lati iwiregbe fun awọn giramu idanwo, eyiti Emi yoo sọrọ nipa ni ipari nkan naa.

> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

O dabi ẹni ti ko ni ibẹrẹ (state:account_uninit) adehun ọlọgbọn pẹlu adirẹsi kanna ati iwọntunwọnsi ti 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

Bayi jẹ ki ká jade awọn smati guide. Jẹ ki ká lọlẹ Lite-onibara ati ki o ṣiṣẹ.

> 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 

Jẹ ki a ṣayẹwo pe a ti gbejade adehun naa.

> last
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Lara ohun miiran ti a gba.

  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

A ri iyẹn account_active.

Iṣeduro ibamu pẹlu awọn iyipada nibi gangan.

Bayi jẹ ki a ṣẹda awọn ibeere lati ṣe ajọṣepọ pẹlu adehun ọlọgbọn naa.

Ni deede diẹ sii, a yoo lọ kuro ni akọkọ fun iyipada adirẹsi bi iṣẹ ominira, ati pe a yoo ṣe ọkan keji fun fifiranṣẹ awọn giramu si adirẹsi eni. Ni otitọ, a yoo nilo lati ṣe ohun kanna bi ninu idanwo fun fifiranṣẹ awọn giramu.

Eyi ni ifiranṣẹ ti a yoo firanṣẹ si adehun ọlọgbọn, nibo msg_seqno 165, action 2 ati 9.5 giramu fun fifiranṣẹ.

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

Maṣe gbagbe lati fowo si ifiranṣẹ pẹlu bọtini ikọkọ rẹ lottery.pk, eyi ti a ti ipilẹṣẹ sẹyìn nigba ṣiṣẹda awọn smati guide. Eyi ni adehun ti o baamu.

Gbigba alaye lati inu adehun ọlọgbọn nipa lilo awọn ọna gba

Bayi jẹ ki ká wo ni bi o si ṣiṣe smart guide gba awọn ọna.

Ifilọlẹ lite-client ati ṣiṣe awọn ọna gba ti a kọ.

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

В result ni iye ti iṣẹ naa pada balance() lati wa smati guide.
A yoo ṣe kanna fun awọn ọna pupọ diẹ sii.

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

Jẹ ki a beere fun itan tẹtẹ rẹ.

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

A yoo lo Lite-onibara ati ki o gba awọn ọna lati han alaye nipa awọn smati guide lori ojula.

Ifihan data adehun smart lori oju opo wẹẹbu

Mo kọ oju opo wẹẹbu ti o rọrun ni Python lati ṣafihan data lati inu adehun ọlọgbọn ni ọna irọrun. Nibi Emi kii yoo gbe lori rẹ ni awọn alaye ati pe yoo gbejade aaye naa ninu ọkan ṣẹ.

Awọn ibeere si TON jẹ lati Python pẹlu iranlọwọ lite-client. Fun irọrun, aaye naa jẹ akopọ ni Docker ati titẹjade lori Google Cloud. Ọna asopọ.

Jẹ ká gbiyanju

Bayi jẹ ki a gbiyanju lati fi giramu nibẹ fun replenishment lati apamọwọ. A yoo firanṣẹ 40 giramu. Ati pe jẹ ki a ṣe awọn tẹtẹ meji kan fun asọye. A ri pe awọn ojula fihan awọn itan ti bets, awọn ti isiyi gba ogorun ati awọn miiran wulo alaye.

A riwipe a gba akọkọ, padanu keji.

Lẹhin Ọrọ

Nkan naa wa ni pipẹ pupọ ju ti Mo nireti lọ, boya o le ti kuru, tabi boya o kan fun eniyan ti ko mọ nkankan nipa TON ti o fẹ lati kọ ati ṣe atẹjade iwe adehun ọlọgbọn ti kii rọrun-rọrun pẹlu agbara lati ṣe ajọṣepọ pẹlu rẹ. o. Boya diẹ ninu awọn nkan le ti ni alaye diẹ sii ni irọrun.

Boya diẹ ninu awọn abala ti imuse naa le ti ṣee ṣe daradara ati didara, ṣugbọn lẹhinna yoo ti gba akoko diẹ sii paapaa lati mura nkan naa. O tun ṣee ṣe pe Mo ṣe aṣiṣe kan ni ibikan tabi ko loye nkan kan, nitorinaa ti o ba n ṣe nkan to ṣe pataki, o nilo lati gbẹkẹle iwe aṣẹ tabi ibi ipamọ osise pẹlu koodu TON.

O yẹ ki o ṣe akiyesi pe niwọn igba ti TON tikararẹ tun wa ni ipele ti nṣiṣe lọwọ ti idagbasoke, awọn ayipada le waye ti yoo fọ eyikeyi awọn igbesẹ ninu nkan yii (eyiti o ṣẹlẹ lakoko ti Mo nkọ, o ti ṣe atunṣe tẹlẹ), ṣugbọn ọna gbogbogbo jẹ išẹlẹ ti lati yi.

Emi kii yoo sọrọ nipa ọjọ iwaju ti TON. Boya pẹpẹ naa yoo di ohun nla ati pe o yẹ ki a lo akoko ikẹkọ ki o kun onakan pẹlu awọn ọja wa ni bayi.

Libra tun wa lati Facebook, eyiti o ni awọn olugbo ti o pọju ti awọn olumulo ti o tobi ju TON lọ. Mo ti mọ nkankan nipa Libra, idajọ nipasẹ awọn forum nibẹ ni Elo siwaju sii aṣayan iṣẹ-ṣiṣe nibẹ ju ni TON awujo. Botilẹjẹpe awọn olupilẹṣẹ ati agbegbe ti TON jẹ diẹ sii bi ipamo, eyiti o tun dara.

jo

  1. Iwe aṣẹ TON osise: https://test.ton.org
  2. Ibi ipamọ TON osise: https://github.com/ton-blockchain/ton
  3. Apamọwọ osise fun awọn iru ẹrọ oriṣiriṣi: https://wallet.ton.org
  4. Ibi ipamọ adehun Smart lati nkan yii: https://github.com/raiym/astonished
  5. Ọna asopọ si oju opo wẹẹbu adehun ọlọgbọn: https://ton-lottery.appspot.com
  6. Ibi ipamọ fun itẹsiwaju fun koodu Studio wiwo fun FunC: https://github.com/raiym/func-visual-studio-plugin
  7. Wiregbe nipa TON ni Telegram, eyiti o ṣe iranlọwọ gaan lati ro ero rẹ ni ipele ibẹrẹ. Mo ro pe kii yoo jẹ aṣiṣe ti MO ba sọ pe gbogbo eniyan ti o kọ nkan fun TON wa nibẹ. O tun le beere fun awọn giramu idanwo nibẹ. https://t.me/tondev_ru
  8. Iwiregbe miiran nipa TON ninu eyiti Mo rii alaye to wulo: https://t.me/TONgramDev
  9. Ipele akọkọ ti idije: https://contest.com/blockchain
  10. Ipele keji ti idije: https://contest.com/blockchain-2

orisun: www.habr.com

Fi ọrọìwòye kun