Дар бораи чӣ гуна навиштан ва нашр кардани шартномаи интеллектуалӣ дар Telegram Open Network (TON)

Дар бораи чӣ гуна навиштан ва нашр кардани шартномаи интеллектуалӣ дар ТОН

Ин мақола дар бораи чӣ аст?

Дар мақола ман дар бораи он сӯҳбат мекунам, ки чӣ гуна ман дар озмуни аввалин (аз ду) Telegram blockchain иштирок кардаам, ҷоиза нагирифтаам ва тасмим гирифтам, ки таҷрибаи худро дар мақола сабт кунам, то он фаромӯш нашавад ва шояд кӯмак кунад. касе.

Азбаски ман намехостам рамзи абстрактӣ нависам, балки барои коре кор кунам, барои мақола ман шартномаи оқилона барои лотереяи фаврӣ ва вебсайте навиштам, ки маълумоти шартномаи интеллектуалиро мустақиман аз TON бе истифодаи нигаҳдории фосилавӣ нишон медиҳад.

Мақола барои онҳое муфид хоҳад буд, ки мехоҳанд аввалин шартномаи интеллектуалии худро дар TON созанд, аммо намедонанд аз куҷо оғоз кунанд.

Бо истифода аз лотерея ҳамчун намуна, ман аз насби муҳит ба нашри шартномаи оқилона, ҳамкорӣ бо он ва навиштани вебсайт барои қабул ва нашри маълумот меравам.

Дар бораи иштирок дар конкурс

Моҳи октябри соли гузашта Telegram озмуни blockchain бо забонҳои нав эълон кард Fift и FunC. Аз навиштани яке аз панҷ шартномаи интеллектуалии пешниҳодшуда интихоб кардан лозим буд. Фикр мекардам, ки дигар коре карда, забон омӯзам ва коре созам, ҳатто агар дар оянда чизи дигаре нанависам, хуб аст. Илова бар ин, мавзӯъ ҳамеша дар лаб аст.

Бояд гуфт, ки ман дар таҳияи шартномаҳои интеллектуалӣ таҷриба надоштам.

Ман ният доштам, ки то ба охир то охир иштирок кунам ва сипас мақолаи барраси нависам, аммо дарҳол дар аввал натавонистам. И ҳамён навишт бо имзои чандкарата FunC ва он умуман кор кард. Ман онро ҳамчун асос гирифтам шартномаи интеллектуалӣ оид ба Solidity.

Он вақт ман фикр мекардам, ки ин бешубҳа кифоя аст, ки ҳадди аққал ҷои ҷоизаро ишғол кунад. Дар натича аз 40 нафар иштирокчиён кариб 60 нафарашон сохиби мукофот шуданд ва ман дар байни онхо набудам. Умуман, дар ин бобат чизе нест, вале як чиз маро ба ташвиш овард. Ҳангоми эълони натиҷаҳо, баррасии санҷиши шартномаи ман анҷом дода нашудааст, ман аз иштирокчиёни чат пурсидам, ки оё ягон каси дигаре нест, ки онро надошт, вуҷуд надорад.

Эҳтимол ба паёмҳои ман таваҷҷӯҳ карда, пас аз ду рӯз доварон шарҳе нашр карданд ва ман то ҳол намефаҳмам, ки онҳо тасодуфан ҳангоми доварӣ шартномаи оқилонаи маро аз даст доданд ё танҳо фикр карданд, ки ин хеле бад аст, ки ба шарҳ ниёз надорад. Дар саҳифа савол додам, аммо ҷавоб нагирифтам. Ҳарчанд пӯшида нест, ки кӣ доварӣ кардааст, ман навиштани паёмҳои шахсиро нолозим медонистам.

Барои фаҳмиш вақти зиёд сарф шуд, бинобар ин тасмим гирифта шуд, ки мақола нависад. Азбаски то ҳол маълумоти зиёде мавҷуд нест, ин мақола барои сарфаи вақт барои ҳама манфиатдор кӯмак хоҳад кард.

Консепсияи шартномаҳои интеллектуалӣ дар ТОН

Пеш аз навиштани чизе, шумо бояд бифаҳмед, ки аз кадом тараф ба ин чиз муроҷиат кунед. Аз ин рӯ, ҳоло ман ба шумо мегӯям, ки система аз кадом қисмҳо иборат аст. Аниқтараш, шумо бояд кадом қисмҳоро донед, то ҳадди аққал як навъ шартномаи меҳнатӣ нависед.

Мо ба навиштани шартномаи оқилона ва кор бо он таваҷҷӯҳ хоҳем кард TON Virtual Machine (TVM), Fift и FunC, бинобар ин мақола бештар ба тавсифи таҳияи барномаи муқаррарӣ монанд аст. Мо дар бораи он ки чӣ тавр худи платформа дар ин ҷо кор мекунад, таваққуф намекунем.

Умуман дар бораи он ки чӣ тавр кор мекунад TVM ва забон Fift хуччатхои хуби расмй мавчуданд. Ҳангоми иштирок дар озмун ва ҳоло ҳангоми навиштани шартномаи ҷорӣ ман зуд-зуд ба ӯ муроҷиат мекардам.

Забони асосие, ки дар он шартномаҳои интеллектуалӣ навишта мешаванд, ин аст FunC. Дар айни замон ҳеҷ ҳуҷҷате дар бораи он вуҷуд надорад, бинобар ин барои навиштани чизе шумо бояд намунаҳои шартномаҳои интеллектуалиро аз анбори расмӣ ва татбиқи худи забон омӯзед, инчунин шумо метавонед мисолҳои шартномаҳои интеллектуалиро аз ду соли гузашта дида бароед. мусобикахо. Истинодҳо дар охири мақола.

Фарз мекунем, ки мо аллакай шартномаи оқилона навиштаем FunC, пас аз он мо кодро ба Assembler Fift тартиб медиҳем.

Шартномаи интеллектуалии тартибдодашуда бояд нашр шавад. Барои ин ба шумо лозим аст, ки функсияро дар Fift, ки рамзи шартномаи интеллектуалӣ ва баъзе параметрҳои дигарро ҳамчун вуруд қабул мекунад ва натиҷа як файл бо тамдид хоҳад буд. .boc (ки маънои "халтаи ҳуҷайраҳо" -ро дорад) ва вобаста аз он ки мо онро чӣ тавр менависем, калиди хусусӣ ва суроғае, ки дар асоси рамзи шартномаи интеллектуалӣ тавлид мешавад. Шумо аллакай метавонед граммҳоро ба суроғаи шартномаи интеллектуалӣ, ки ҳанӯз нашр нашудааст, фиристед.

Барои нашр кардани шартномаи интеллектуалӣ дар ТОН гирифта шудааст .boc файл бояд ба blockchain бо истифода аз муштарии сабук фиристода шавад (бештар дар бораи он дар зер). Аммо пеш аз интишор, шумо бояд граммҳоро ба суроғаи тавлидшуда интиқол диҳед, вагарна шартномаи интеллектуалӣ нашр намешавад. Пас аз интишор, шумо метавонед бо шартномаи интеллектуалӣ тавассути фиристодани паёмҳо аз берун (масалан, бо истифода аз муштарии сабук) ё аз дарун ҳамкорӣ кунед (масалан, як шартномаи интеллектуалӣ ба дигаре дар дохили TON паём мефиристад).

Вақте ки мо мефаҳмем, ки код чӣ гуна нашр мешавад, он осонтар мешавад. Мо тахминан медонем, ки чӣ менависем ва барномаи мо чӣ гуна кор хоҳад кард. Ва ҳангоми навиштан, мо мефаҳмем, ки чӣ гуна ин аллакай дар шартномаҳои интеллектуалии мавҷуда татбиқ карда мешавад ё мо ба рамзи татбиқ назар мекунем Fift и FunC дар анбори расмӣ ё ба ҳуҷҷатҳои расмӣ нигаред.

Бисёр вақт ман дар чати Telegram калимаҳои калидиро ҷустуҷӯ мекардам, ки дар он ҳама иштирокчиёни озмун ва кормандони Telegram ҷамъ омада буданд ва чунин шуд, ки дар ҷараёни озмун ҳама дар он ҷо ҷамъ омада, ба муҳокимаи Fift ва FunC шурӯъ карданд. Истинод дар охири мақола.

Вакти аз назария ба амалия гузаштан расидааст.

Омода кардани шароит барои кор бо ТОН

Ман ҳама чизеро, ки дар мақола дар MacOS тавсиф карда мешавад, иҷро кардам ва онро дар Ubuntu 18.04 LTS-и тоза дар Docker дубора тафтиш кардам.

Аввалин чизе, ки шумо бояд анҷом диҳед, зеркашӣ ва насб кардан аст lite-client ки бо он шумо метавонед ба ТОН дархост фиристед.

Дастурҳо дар вебсайти расмӣ раванди насбкуниро ба таври муфассал ва равшан тавсиф мекунанд ва баъзе тафсилотро дар бар намегиранд. Дар ин ҷо мо дастурҳоро иҷро карда, вобастагии гумшударо дар роҳ насб мекунем. Ман ҳар як лоиҳаро худам тартиб надодаам ва аз анбори расмии Ubuntu насб кардам (дар MacOS ман 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 

Пас аз насб кардани ҳама вобастагӣ шумо метавонед насб кунед lite-client, Fift, FunC.

Аввалан, мо анбори TON-ро бо вобастагии он клон мекунем. Барои роҳат, мо ҳама чизро дар ҷузвдон иҷро мекунем ~/TON.

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

Анбор инчунин татбиқҳоро нигоҳ медорад Fift и FunC.

Ҳоло мо барои ҷамъ кардани лоиҳа омодаем. Рамзи анбор ба ҷузвдон клон карда мешавад ~/TON/ton. Дар ~/TON папка эҷод кунед build ва лоиҳаро дар он ҷамъ кунед.

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

Азбаски мо шартномаи оқилона навиштанӣ ҳастем, ба мо на танҳо лозим аст lite-clientаммо Fift с FunC, пас биёед ҳама чизро тартиб диҳем. Ин як раванди зуд нест, бинобар ин мо интизорем.

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

Баъдан, файли конфигуратсияро зеркашӣ кунед, ки дорои маълумот дар бораи гиреҳе мебошад lite-client пайваст мешавад.

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

Дархостхои аввалинро ба ТОН

Акнун биёед оғоз кунем lite-client.

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

Агар сохтмон бомуваффақият анҷом дода шуда бошад, пас пас аз оғоз шумо сабти пайвасти муштарии рӯшноиро ба гиреҳ хоҳед дид.

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

Шумо метавонед фармонро иҷро кунед help ва бубинед, ки кадом фармонҳо мавҷуданд.

help

Биёед фармонҳоеро номбар кунем, ки мо дар ин мақола истифода хоҳем кард.

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

Акнун мо тайёрем худи шартномаро нависем.

Реализация

Idea

Тавре ки ман дар боло навишта будам, шартномаи оқилонае, ки мо менависем, лотерея аст.

Гузашта аз ин, ин лотерея нест, ки дар он шумо бояд чипта харед ва як соат, рӯз ё моҳ интизор шавед, балки як лотереяест, ки дар он корбар ба суроғаи шартнома интиқол медиҳад. N грамм аст ва дарҳол онро бармегардонад 2 * N грамм ё талаф мешавад. Мо эҳтимолияти ғолиб шуданро тақрибан 40% мекунем. Агар барои пардохт граммҳо нокифоя бошад, пас мо транзаксияро ҳамчун пуркунӣ ҳисоб мекунем.

Илова бар ин, муҳим аст, ки шартгузориҳо дар вақти воқеӣ ва дар шакли қулай дидан мумкин аст, то корбар дарҳол фаҳмад, ки вай бурд мекунад ё бохт. Аз ин рӯ, шумо бояд вебсайте созед, ки шартҳо ва натиҷаҳоро мустақиман аз ТОН нишон диҳад.

Навиштани шартномаи оқилона

Барои роҳат, ман рамзи FunC-ро таъкид кардам; плагинро дар ҷустуҷӯи Visual Studio Code ёфта ва насб кардан мумкин аст; агар шумо ногаҳон хоҳед, ки чизе илова кунед, ман плагинро дастраси умум кардам. Инчунин, касе қаблан барои кор бо Fift плагин сохтааст, шумо инчунин метавонед онро насб кунед ва дар VSC пайдо кунед.

Биёед фавран анборе созем, ки дар он мо натиҷаҳои мобайнӣ содир мекунем.

Барои осон кардани зиндагии мо, мо шартномаи оқилона менависем ва то омода шуданаш онро дар маҳал месанҷем. Танхо баъд аз он мо онро дар ТОН чоп мекунем.

Шартномаи интеллектуалӣ ду усули беруна дорад, ки онҳоро дастрас кардан мумкин аст. Аввал, recv_external() ин функсия вақте иҷро мешавад, ки дархост ба шартнома аз ҷаҳони беруна меояд, яъне на аз ТОН, масалан, вақте ки мо худамон паём тавлид мекунем ва онро тавассути lite-client мефиристем. Дуюм, recv_internal() ин вакте ки дар худи ТОН хар як шартнома ба шартномаи мо дахл дорад. Дар ҳарду ҳолат, шумо метавонед параметрҳоро ба функсия гузаронед.

Биёед бо як мисоли оддӣ оғоз кунем, ки агар интишор шавад, кор хоҳад кард, аммо дар он сарбории функсионалӣ вуҷуд надорад.

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

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

Дар ин ҷо мо бояд фаҳмонем, ки он чӣ аст slice. Ҳама маълумоте, ки дар TON Blockchain нигоҳ дошта мешаванд, маҷмӯа мебошанд TVM cell ё танҳо cell, дар чунин ячейка шумо метавонед то 1023 бит маълумот ва то 4 пайвандро ба ячейкаҳои дигар нигоҳ доред.

TVM cell slice ё slice ин як қисми мавҷуда аст cell барои тахлил истифода мешавад, баъдтар маълум мешавад. Барои мо чизи асосӣ ин аст, ки мо метавонем интиқол ёбем slice ва вобаста ба намуди паём, коркарди маълумот дар recv_external() ё recv_internal().

impure — калимаи калидӣ, ки нишон медиҳад, ки функсия маълумоти шартномаи интеллектуалиро тағир медиҳад.

Биёед рамзи шартномаро дар lottery-code.fc ва тартиб додан.

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

Маънои парчамҳоро бо ёрии фармон дидан мумкин аст

~/TON/build/crypto/func -help

Мо Fift рамзи ассемблерро тартиб додем 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

Онро ба таври маҳаллӣ ба кор андохтан мумкин аст, барои ин мо муҳити атрофро омода мекунем.

Дар хотир доред, ки хати аввал пайваст мешавад Asm.fif, ин кодест, ки дар Fift барои монтажчии Fift навишта шудааст.

Азбаски мо мехоҳем шартномаи интеллектуалиро ба таври маҳаллӣ иҷро кунем ва санҷем, мо файл эҷод мекунем lottery-test-suite.fif ва рамзи тартибдодашударо дар он ҷо нусхабардорӣ карда, сатри охиринро дар он иваз кунед, ки рамзи шартномаи интеллектуалиро ба як доимӣ менависад codeпас онро ба мошини виртуалӣ интиқол диҳед:

"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

То ҳол равшан ба назар мерасад, ҳоло биёед ба ҳамон файл кодеро илова кунем, ки мо барои оғоз кардани 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 мо контекст, яъне маълумотеро, ки бо он TVM (ё ҳолати шабака) оғоз мешавад, сабт мекунем. Ҳатто дар рафти озмун яке аз таҳиягарон чӣ гуна эҷод карданро нишон дод c7 ва нусхабардорӣ кардам. Дар ин мақола шояд мо бояд тағир диҳем rand_seed зеро тавлиди рақами тасодуфӣ аз он вобаста аст ва агар тағир наёбад, ҳар дафъа ҳамон адад баргардонида мешавад.

recv_internal и recv_external доимӣ бо арзишҳои 0 ва -1 барои даъват кардани функсияҳои мувофиқ дар шартномаи интеллектуалӣ масъул хоҳанд буд.

Ҳоло мо омодаем, ки озмоиши аввалинро барои шартномаи интеллектуалии холии худ созем. Барои равшанӣ, ҳоло мо ҳама санҷишҳоро ба як файл илова мекунем lottery-test-suite.fif.

Биёед як тағирёбанда эҷод кунем storage ва дар он як чизи холӣ нависед cell, ин нигаҳдории шартномаи интеллектуалӣ хоҳад буд.

message Ин паёмест, ки мо аз берун ба тамоси интеллектуалӣ интиқол медиҳем. Мо онро низ ҳоло холӣ мекунем.

variable storage 
<b b> storage ! 

variable message 
<b b> message ! 

Пас аз омода кардани константаҳо ва тағирёбандаҳо мо бо истифода аз фармон TVM-ро оғоз мекунем runvmctx ва параметрҳои сохташударо ба вуруд гузаронед.

message @ 
recv_external 
code 
storage @ 
c7 
runvmctx 

Дар натиҷа, мо муваффақ хоҳем шуд монанди рамзи миёнарав барои Fift.

Акнун мо метавонем рамзи натиҷаро иҷро кунем.

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

Барнома бояд бе хато кор кунад ва дар натиҷа мо сабти иҷроро мебинем:

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

Аҷоиб, мо версияи якуми кории шартномаи интеллектуалиро навиштем.

Ҳоло мо бояд функсияҳоро илова кунем. Аввалан, биёед бо паёмҳое, ки аз ҷаҳони беруна ба он меоянд, сарукор кунем recv_external()

Худи таҳиякунанда формати паёмро интихоб мекунад, ки шартнома метавонад қабул кунад.

Аммо одатан

  • аввалан, мо мехоҳем шартномаи худро аз ҷаҳони беруна муҳофизат кунем ва онро тавре созем, ки танҳо соҳиби шартнома ба он паёмҳои беруна фиристад.
  • дуюм, вақте ки мо ба ТОН паёми дуруст мефиристем, мо мехоҳем, ки ин маҳз як маротиба рӯй диҳад ва вақте ки мо бори дигар ҳамон паёмро мефиристем, шартномаи оқил онро рад мекунад.

Ҳамин тавр, қариб ҳар як шартнома ин ду мушкилотро ҳал мекунад, зеро шартномаи мо паёмҳои берунаро қабул мекунад, мо бояд дар ин бора низ ғамхорӣ кунем.

Мо онро бо тартиби баръакс иҷро мекунем. Аввалан, масъаларо бо такрор хал кунем, агар шартнома аллакай чунин хабар гирифта, онро коркард карда бошад, бори дуюм онро ичро намекунад. Ва он гоҳ мо мушкилотро ҳал мекунем, то танҳо як доираи муайяни одамон ба шартномаи интеллектуалӣ паём фиристанд.

Роҳҳои гуногуни ҳалли мушкилот бо паёмҳои такрорӣ мавҷуданд. Ин аст, ки мо инро чӣ тавр иҷро хоҳем кард. Дар шартномаи интеллектуалӣ мо ҳисобкунаки паёмҳои қабулшударо бо арзиши ибтидоии 0 оғоз мекунем. Дар ҳар як паём ба шартномаи интеллектуалӣ мо арзиши ҳисобкунаки ҷорӣро илова мекунем. Агар арзиши ҳисобкунак дар паём ба арзиши шартномаи интеллектуалӣ мувофиқат накунад, мо онро коркард намекунем; агар ин тавр бошад, мо онро коркард мекунем ва ҳисобкунакро дар шартномаи интеллектуалӣ ба 1 зиёд мекунем.

Баргардем ба lottery-test-suite.fif ва ба он санҷиши дуюм илова кунед. Агар мо рақами нодуруст фиристем, рамзи бояд истисно бипартоед. Масалан, бигзор маълумоти шартнома 166-ро нигоҳ дорад ва мо 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"

Биёед оғоз кунем.

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

Ва мо мебинем, ки санҷиш бо хато иҷро шудааст.

[ 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

Дар ин марҳила lottery-test-suite.fif бояд монанд бошад пайванд.

Акнун биёед мантиқи муқобилро ба шартномаи интеллектуалӣ илова кунем 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 паёме, ки мо мефиристем, дурӯғ аст.

Аввалин чизе, ки мо мекунем, санҷидани он аст, ки оё паём дорои маълумот аст, агар не, мо танҳо мебароем.

Баъдан мо паёмро таҳлил мекунем. in_msg~load_uint(32) рақами 165, 32-битро бор мекунад unsigned int аз паёми интиқолшуда.

Минбаъд мо 32 битро аз анбори шартномаи интеллектуалӣ бор мекунем. Мо тафтиш мекунем, ки рақами боршуда ба рақами додашуда мувофиқат мекунад; агар не, мо истисно мегузорем. Дар ҳолати мо, азбаски мо як бозии ғайримуқаррарӣ мегузарем, истисно бояд партофта шавад.

Акнун биёед тартиб диҳем.

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

Рамзи натиҷаро ба он нусхабардорӣ кунед lottery-test-suite.fif, иваз кардани сатри охиринро фаромӯш накунед.

Мо тафтиш мекунем, ки санҷиш мегузарад:

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

Дар ин ҷо Шумо метавонед ӯҳдадории мувофиқро бо натиҷаҳои ҷорӣ бубинед.

Аҳамият диҳед, ки пайваста нусхабардории рамзи тартибдодашудаи шартномаи интеллектуалӣ ба файл бо санҷишҳо номувофиқ аст, аз ин рӯ мо скрипт менависем, ки кодро барои мо ба як доимӣ нависед ва мо коди тартибдодашударо бо истифода аз санҷишҳои худ пайваст мекунем. "include".

Дар ҷузвдони лоиҳа файл эҷод кунед build.sh бо мазмуни зерин.

#!/bin/bash

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

Биёед онро иҷрошаванда созем.

chmod +x ./build.sh

Акнун, танҳо скрипти моро барои тартиб додани шартнома иҷро кунед. Аммо ба ҷуз ин, мо бояд онро ба як доимӣ нависем code. Пас, мо файли нав эҷод мекунем lotter-compiled-for-test.fif, ки мо онро ба файл дохил мекунем lottery-test-suite.fif.

Биёед ба sh рамзи skirpt илова кунем, ки он танҳо файли тартибдодашударо дар он такрор мекунад lotter-compiled-for-test.fif ва сатри охирини онро иваз кунед.

# 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

Акнун, барои тафтиш, биёед скрипти натиҷаро иҷро кунем ва файл тавлид мешавад lottery-compiled-for-test.fif, ки мо онро ба худ дохил мекунем lottery-test-suite.fif

В lottery-test-suite.fif рамзи шартномаро нест кунед ва сатрро илова кунед "lottery-compiled-for-test.fif" include.

Мо санҷишҳо мегузаронем, то тафтиш кунанд, ки онҳо мегузаранд.

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

Аҷоиб, ҳоло барои автоматикунонии оғози санҷишҳо, биёед файл эҷод кунем test.sh, ки аввал ичро карда мешавад build.sh, ва сипас санҷишҳоро иҷро кунед.

touch test.sh
chmod +x test.sh

Мо дар дохили он менависем

./build.sh 

echo "nCompilation completedn"

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

Биёед test.sh ва онро иҷро кунед, то боварӣ ҳосил кунед, ки санҷишҳо кор мекунанд.

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

Мо тафтиш мекунем, ки шартнома тартиб дода шудааст ва санҷишҳо гузаронида мешаванд.

Аҷоиб, ҳоло дар оғозёбӣ test.sh Санҷишҳо фавран тартиб дода мешаванд ва иҷро карда мешаванд. Ин аст пайванд ба ӯҳдадор шавед.

Хуб, пеш аз он ки мо идома диҳем, биёед як чизи дигарро барои роҳат иҷро кунем.

Биёед папка эҷод кунем build Дар он ҷо мо шартномаи нусхабардорӣ ва клони онро ба як доимӣ сабт хоҳем кард lottery-compiled.fif, lottery-compiled-for-test.fif. Биёед инчунин папка эҷод кунем test файли санҷишӣ дар куҷо нигоҳ дошта мешавад? lottery-test-suite.fif ва эҳтимолан дигар файлҳои дастгирӣ. Истинод ба тағйироти дахлдор.

Биёед таҳияи шартномаи интеллектуалиро идома диҳем.

Минбаъд бояд санҷише бошад, ки ҳангоми фиристодани рақами дуруст дар мағоза санҷида шудани паём ва ҳисобкунак навсозӣ мешавад. Аммо мо инро дертар мекунем.

Акнун биёед дар бораи он фикр кунем, ки кадом сохтори додаҳо ва кадом маълумотро дар шартномаи интеллектуалӣ нигоҳ доштан лозим аст.

Ман ҳама чизеро, ки мо захира мекунем, тавсиф мекунам.

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

Минбаъд шумо бояд ду функсияро нависед. Биёед аввал занг занем pack_state(), ки маълумотро барои захираи минбаъда дар анбори шартномаи интеллектуалӣ ҷамъ мекунад. Биёед дуюмро даъват кунем unpack_state() маълумотро аз анбор хонда ва бармегардонад.

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

Мо ин ду функсияро ба оғози шартномаи интеллектуалӣ илова мекунем. Он кор хоҳад кард монанди натиҷаи миёна.

Барои захира кардани маълумот ба шумо лозим меояд, ки функсияи дарунсохтро даъват кунед set_data() ва он маълумотро аз pack_state() дар нигаҳдории шартномаи интеллектуалӣ.

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

Акнун, ки мо вазифаҳои мувофиқ барои навиштан ва хондани маълумот дорем, мо метавонем идома диҳем.

Мо бояд тафтиш кунем, ки паёми аз берун воридшаванда аз ҷониби соҳиби шартнома (ё корбари дигаре, ки ба калиди хусусӣ дастрасӣ дорад) имзо шудааст.

Вақте ки мо шартномаи оқилонаро нашр мекунем, мо метавонем онро бо маълумоте, ки дар нигаҳдорӣ лозим аст, оғоз кунем, ки барои истифодаи оянда захира карда мешаванд. Мо калиди ҷамъиятиро дар он ҷо сабт мекунем, то тафтиш кунем, ки паёми воридотӣ бо калиди махфии мувофиқ имзо шудааст.

Пеш аз идома додан, биёед калиди хусусиро эҷод кунем ва онро ба он нависед test/keys/owner.pk. Барои ин, биёед Fift-ро дар реҷаи интерактивӣ оғоз кунем ва чор фармонро иҷро кунем.

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

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

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

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

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

Биёед папка эҷод кунем keys дар дохили папка test ва дар он ҷо калиди хусусиро нависед.

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

Мо файлеро дар папкаи ҷорӣ мебинем owner.pk.

Мо калиди ҷамъиятиро аз стек хориҷ мекунем ва дар ҳолати зарурӣ мо метавонем онро аз калиди хусусӣ гирем.

Ҳоло мо бояд тасдиқи имзоро нависем. Биёед бо санҷиш оғоз кунем. Аввалан мо калиди хусусиро аз файл бо истифода аз функсия мехонем file>B ва онро ба тағирёбанда нависед owner_private_key, пас функсияро истифода баред priv>pub калиди хусусиро ба калиди ҷамъиятӣ табдил диҳед ва натиҷаро дар он нависед 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 !

Ба мо ҳарду калид лозим мешавад.

Мо нигаҳдории шартномаи интеллектуалиро бо маълумоти худсарона дар ҳамон пайдарпаии функсия оғоз мекунем pack_state()ва онро ба тағирёбанда нависед 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 !

Баъдан, мо паёми имзошударо тартиб медиҳем, он танҳо имзо ва арзиши ҳисобкунакро дар бар мегирад.

Аввалан, мо маълумотеро эҷод мекунем, ки мо мехоҳем интиқол диҳем, сипас онро бо калиди хусусӣ имзо мекунем ва дар ниҳоят паёми имзошударо тавлид мекунем.

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 !  

Дар натиҷа, паёме, ки мо ба шартномаи интеллектуалӣ мефиристем, дар тағирёбанда сабт карда мешавад message_to_send, дар бораи функсияҳо hashu, ed25519_sign_uint хонда метавонед дар ҳуҷҷатҳои Fift.

Ва барои гузаронидани санҷиш мо боз занг мезанем.

message_to_send @ 
recv_external 
code 
storage @
c7
runvmctx

Ҳамин тавр Файл бо санҷишҳо дар ин марҳила бояд чунин бошад.

Биёед озмоишро иҷро кунем ва он ноком мешавад, аз ин рӯ мо шартномаи интеллектуалиро иваз мекунем, то он метавонад паёмҳои ин форматро қабул кунад ва имзоро тафтиш кунад.

Аввалан, мо 512 бит имзоро аз паём ҳисоб мекунем ва онро ба тағирёбанда менависем, баъд 32 бит тағирёбандаи ҳисобкунакро ҳисоб мекунем.

Азбаски мо функсияи хондани маълумот аз анбори шартномаи интеллектуалӣ дорем, мо аз он истифода хоҳем кард.

Баъдан тафтиши ҳисобкунаки бо нигаҳдорӣ интиқолшуда ва санҷиши имзо мебошад. Агар чизе мувофиқат накунад, мо бо рамзи мувофиқ истисно мегузорем.

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

Ухдадории дахлдор дар ин ҷо.

Биёед санҷишҳоро иҷро кунем ва бубинем, ки санҷиши дуюм ноком мешавад. Бо ду сабаб, дар паём битҳои кофӣ вуҷуд надоранд ва дар анбор битҳо кофӣ нестанд, бинобар ин код ҳангоми таҳлил вайрон мешавад. Мо бояд ба паёме, ки мо мефиристем, имзо илова кунем ва захираро аз санҷиши охирин нусхабардорӣ кунем.

Дар санҷиши дуюм, мо имзои паёмро илова мекунем ва нигоҳдории шартномаи интеллектуалиро тағир медиҳем. Ҳамин тавр файл бо санҷишҳо дар айни замон ба назар мерасад.

Биёед санҷиши чорумро нависед, ки дар он мо паёмеро бо калиди шахсии шахси дигар имзо мекунем. Биёед калиди хусусии дигар эҷод кунем ва онро дар файл захира кунем not-owner.pk. Мо бо ин калиди махфӣ паёмро имзо мекунем. Биёед санҷишҳоро иҷро кунем ва боварӣ ҳосил кунем, ки ҳама санҷишҳо мегузаранд. Уҳдадор шавед дар ин лахза.

Ҳоло мо дар ниҳоят метавонем ба татбиқи мантиқи шартномаи интеллектуалӣ гузарем.
В recv_external() мо ду намуди паёмҳоро қабул мекунем.

Азбаски шартномаи мо талафоти бозигаронро ҷамъ мекунад, ин пул бояд ба созандаи лотерея интиқол дода шавад. Суроғаи ҳамёни созандаи лотерея ҳангоми бастани шартнома дар анбор сабт карда мешавад.

Дар ҳар сурат, ба мо қобилияти тағир додани суроғае лозим аст, ки ба он граммҳои зиёнкорон мефиристем. Мо инчунин бояд граммҳоро аз лотерея ба суроғаи соҳиби он фиристем.

Биёед бо аввалин сар кунем. Биёед аввал озмоишеро нависед, ки тафтиш мекунад, ки пас аз фиристодани паём, шартномаи интеллектуалӣ суроғаи навро дар анбор захира кардааст. Лутфан қайд кунед, ки дар паём, ба ғайр аз ҳисобкунак ва суроғаи нав, мо инчунин интиқол медиҳем action Рақами ғайриманфии бутуни 7-бит, вобаста ба он, мо интихоб мекунем, ки чӣ тавр коркарди паём дар шартномаи интеллектуалӣ.

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

Дар санҷиш шумо метавонед бубинед, ки чӣ гуна нигоҳдории контрактҳои интеллектуалӣ бесериалӣ карда шудааст storage дар панҷ. Десериализатсияи тағирёбандаҳо дар ҳуҷҷатҳои Fift тавсиф карда шудаанд.

Пайвастшавӣ бо илова кардани хамир.

Биёед озмоишро иҷро кунем ва боварӣ ҳосил кунем, ки он ноком мешавад. Акнун биёед мантиқро илова кунем, то суроғаи соҳиби лотереяро иваз кунем.

Дар шартномаи интеллектуалӣ мо таҳлилро идома медиҳем message, хонед action. Хотиррасон менамоем, ки мо ду хохем дошт action: суроғаро иваз кунед ва граммҳоро фиристед.

Баъд адреси нави сохиби шартномаро хонда, онро дар анбор захира мекунем.
Мо санҷишҳоро иҷро мекунем ва мебинем, ки санҷиши сеюм ноком мешавад. Он аз сабаби он, ки шартнома ҳоло ба таври илова 7 бит аз паёмро, ки дар санҷиш мавҷуд нестанд, вайрон мекунад. Ба паём як чизи вуҷуднадоштаро илова кунед action. Биёед санҷишҳоро иҷро кунем ва бубинем, ки ҳама чиз мегузарад. дар ин ҷо ба тагйирот уададор шаванд. бузург.

Акнун биёед мантиқи фиристодани миқдори муайяни граммро ба суроғаи қаблан захирашуда нависед.

Аввалан, биёед як санҷиш нависед. Мо ду санҷиш менависем, яке вақте ки мувозинат кофӣ нест, дуюмаш вақте ки ҳама чиз бояд бомуваффақият гузарад. Санҷишҳоро дидан мумкин аст дар ин ухдадорй.

Акнун биёед кодро илова кунем. Аввалан, биёед ду усули ёрирасонро нависед. Усули аввалини гирифтан ин муайян кардани тавозуни ҷории шартномаи интеллектуалӣ мебошад.

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

Ва дуюмаш барои фиристодани грамм ба дигар шартномаи интеллектуалӣ. Ман ин усулро аз дигар шартномаи интеллектуалӣ пурра нусхабардорӣ кардам.

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

Биёед ин ду усулро ба шартномаи интеллектуалӣ илова кунем ва мантиқро нависед. Аввалан, мо миқдори граммҳоро аз паём таҳлил мекунем. Баъдан мо бақияро тафтиш мекунем, агар он кофӣ набошад, мо истисно мегузорем. Агар ҳама чиз хуб бошад, пас мо граммҳоро ба суроғаи захирашуда мефиристем ва ҳисобкунакро нав мекунем.

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

Ҳамин тавр дар айни замон ба шартномаи интеллектуалӣ монанд аст. Биёед санҷишҳоро иҷро кунем ва боварӣ ҳосил кунем, ки онҳо мегузаранд.

Дар омади гап, ҳар дафъа барои паёми коркардшуда аз шартномаи интеллектуалӣ комиссия ситонида мешавад. Барои он ки паёмҳои шартномаи интеллектуалӣ дархостро иҷро кунанд, пас аз санҷишҳои асосӣ шумо бояд занг занед accept_message().

Акнун биёед ба паёмҳои дохилӣ гузарем. Дар асл, мо танҳо граммҳоро қабул мекунем ва агар ӯ пирӯз шавад, маблағи дукаратаро ба плеер бармегардонем ва сеякашро ба соҳиби он дар сурати аз даст додан.

Аввалан, биёед як санҷиши оддӣ нависед. Барои ин ба мо суроғаи санҷишии шартномаи интеллектуалӣ лозим аст, ки аз он гӯё мо граммҳоро ба шартномаи интеллектуалӣ мефиристем.

Суроғаи шартномаи интеллектуалӣ аз ду рақам иборат аст, як адади бутуни 32-битӣ барои занҷири корӣ ва рақами ягонаи ҳисоби бутуни 256-битии ғайриманфӣ дар ин занҷири корӣ. Масалан, -1 ва 12345, ин суроғаест, ки мо дар файл захира мекунем.

Ман функсияи захира кардани суроғаро аз он нусхабардорӣ кардам 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

Биёед бубинем, ки функсия чӣ гуна кор мекунад, ин фаҳмиши чӣ гуна кор кардани Fift медиҳад. Fift-ро дар реҷаи интерактивӣ оғоз кунед.

~/TON/build/crypto/fift -i 

Аввал мо -1, 12345 ва номи файли ояндаи "sender.addr" -ро ба стек тела медиҳем:

-1 12345 "sender.addr" 

Қадами навбатӣ иҷрои функсия аст -rot, ки стекро тавре иваз мекунад, ки дар болои стек рақами беназири шартномаи интеллектуалӣ мавҷуд аст:

"sender.addr" -1 12345

256 u>B адади ғайриманфии 256-битаро ба байт табдил медиҳад.

"sender.addr" -1 BYTES:0000000000000000000000000000000000000000000000000000000000003039

swap ду унсури болоии стекро иваз мекунад.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 -1

32 i>B адади 32-битаро ба байт табдил медиҳад.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 BYTES:FFFFFFFF

B+ ду пайдарпайи байтро мепайвандад.

 "sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF

Боз swap.

BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF "sender.addr" 

Ва ниҳоят байтҳо ба файл навишта мешаванд B>file. Пас аз ин стеки мо холӣ аст. Мо бас мекунем Fift. Дар ҷузвдони ҷорӣ файл сохта шудааст sender.addr. Биёед файлро ба ҷузвдони сохташуда интиқол диҳем test/addresses/.

Биёед як санҷиши оддиеро нависем, ки граммҳоро ба шартномаи интеллектуалӣ мефиристад. Ин аст ӯҳдадорӣ.

Акнун биёед ба мантиқи лотерея назар андозем.

Аввалин чизе, ки мо мекунем, тафтиш кардани паём аст bounced ё не, агар bounced, пас мо онро сарфи назар мекунем. bounced маънои онро дорад, ки шартнома грамм бармегардад, агар ягон хатогӣ рух диҳад. Агар ногаҳон хато рӯй диҳад, мо граммҳоро барнамегардонем.

Мо тафтиш мекунем, агар бақия камтар аз ним грамм бошад, пас мо танҳо паёмро қабул мекунем ва онро нодида мегирем.

Баъдан, мо суроғаи шартномаи интеллектуалиро, ки аз он паём омадааст, таҳлил мекунем.

Мо маълумотро аз анбор мехонем ва пас шартҳои кӯҳнаро аз таърих нест мекунем, агар зиёда аз бист нафар бошад. Барои роҳат, ман се функсияи иловагӣ навиштам pack_order(), unpack_order(), remove_old_orders().

Баъдан, мо мебинем, ки агар тавозуни пардохт барои пардохт кофӣ набошад, пас мо чунин мешуморем, ки ин шарт нест, балки пурракунӣ ва захира кардани пурракунӣ дар orders.

Сипас, ниҳоят моҳияти шартномаи интеллектуалӣ.

Аввалан, агар бозигар мағлуб шавад, мо онро дар таърихи букмекерӣ захира мекунем ва агар маблағи он аз 3 грамм зиёд бошад, мо 1/3-ро ба соҳиби шартномаи интеллектуалӣ мефиристем.

Агар бозигар бурд кунад, мо дучанд маблағро ба суроғаи бозигар мефиристем ва сипас маълумотро дар бораи шартгузорӣ дар таърих нигоҳ медорем.

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

Ин ҳама аст. Ухдадории дахлдор.

Ҳоло ҳама чизи оддӣ боқӣ мемонад, биёед усулҳои дастро эҷод кунем, то мо дар бораи ҳолати шартнома аз ҷаҳони беруна маълумот гирем (воқеан, маълумотро аз нигаҳдории шартномаи интеллектуалии онҳо хонед).

Биёед усулҳои дарёфтро илова кунем. Мо дар зер дар бораи чӣ гуна гирифтани маълумот дар бораи шартномаи интеллектуалӣ менависем.

Ман инчунин илова кардани кодро фаромӯш кардаам, ки дархости аввалини ҳангоми интишори шартномаи оқилонаро коркард мекунад. Ухдадории дахлдор. Ва минбаъд ислоҳ шудааст хато бо фиристодани 1/3 маблағ ба ҳисоби соҳиби.

Қадами навбатӣ интишори шартномаи интеллектуалӣ мебошад. Биёед папка эҷод кунем requests.

Ман рамзи нашрро асос гирифтам simple-wallet-code.fc ки он метавон ёфт дар анбори расмӣ.

Чизе, ки сазовори таваҷҷӯҳ аст. Мо нигаҳдории шартномаи интеллектуалӣ ва паёми воридотӣ тавлид мекунем. Пас аз ин, суроғаи шартномаи интеллектуалӣ тавлид мешавад, яъне суроға ҳатто пеш аз нашр дар ТОН маълум аст. Баъдан, шумо бояд ба ин суроға якчанд грамм фиристед ва танҳо пас аз он шумо бояд файлро бо худи шартномаи интеллектуалӣ фиристед, зеро шабака барои нигоҳ доштани шартномаи интеллектуалӣ ва амалиёт дар он комиссия мегирад (валидаторҳое, ки смартро нигоҳ медоранд ва иҷро мекунанд. шартномаҳо). Рамзро дар ин ҷо дидан мумкин аст.

Минбаъд мо рамзи нашрро иҷро мекунем ва мегирем lottery-query.boc файл ва суроғаи шартномаи интеллектуалӣ.

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

Захираи файлҳои тавлидшударо фаромӯш накунед: lottery-query.boc, lottery.addr, lottery.pk.

Дар байни чизҳои дигар, мо суроғаи шартномаи интеллектуалиро дар гузоришҳои иҷро мебинем.

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

Факат барои шавку завк, биёед ба ТОН мурочиат кунем

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

Ва мо мебинем, ки ҳисоб бо ин суроға холӣ аст.

account state is empty

Ба адрес мефиристем 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd 2 грамм ва пас аз чанд сония мо ҳамон фармонро иҷро мекунем. Барои фиристодани грамм ман истифода мекунам ҳамёни расмӣ, ва шумо метавонед аз касе аз чат граммҳои санҷиширо пурсед, ки ман дар бораи онҳо дар охири мақола сӯҳбат мекунам.

> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Чунин ба назар мерасад, ки оғознашуда (state:account_uninit) шартномаи оқилона бо ҳамон суроға ва тавозуни 1 нанограмма.

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

Акнун биёед шартномаи оқилонаро нашр кунем. Биёед lite-client-ро оғоз кунем ва иҷро кунем.

> 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 

Биёед тафтиш кунем, ки шартнома чоп шудааст.

> last
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Дар байни чизҳои дигар мо ба даст меорем.

  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

Мо инро мебинем account_active.

Ухдадории мувофиқ бо тағирот дар ин ҷо.

Акнун биёед дархостҳоро барои ҳамкорӣ бо шартномаи интеллектуалӣ эҷод кунем.

Аниқтараш, аввалро барои иваз кардани суроға ҳамчун кори мустақил мегузорем ва дуюмашро барои фиристодани грамм ба суроғаи соҳибаш мекунем. Дар асл, ба мо лозим меояд, ки ҳамон чизеро, ки дар санҷиш барои фиристодани грамм анҷом дода буд, иҷро кунем.

Ин паёмест, ки мо ба шартномаи интеллектуалӣ мефиристем, ки дар он ҷо msg_seqno 165, action 2 ва 9.5 грамм барои фиристодан.

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

Фаромӯш накунед, ки паёмро бо калиди шахсии худ имзо кунед lottery.pk, ки қаблан ҳангоми сохтани шартномаи интеллектуалӣ тавлид шуда буд. Ана ухдадории дахлдор.

Гирифтани маълумот аз шартномаи интеллектуалӣ бо истифода аз усулҳои get

Акнун биёед бубинем, ки чӣ гуна усулҳои гирифтани шартномаи интеллектуалиро иҷро кунем.

Оғози lite-client ва усулҳои дарёфти навиштаамонро иҷро кунед.

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

В result дорои арзишест, ки функсия бармегардонад balance() аз шартномаи оқилонаи мо.
Мо барои якчанд усулҳои дигар низ ҳамин тавр мекунем.

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

Биёед таърихи шартгузории шуморо пурсем.

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

Мо lite-client-ро истифода мебарем ва усулҳоро барои намоиш додани маълумот дар бораи шартномаи интеллектуалӣ дар сайт мегирем.

Намоиши маълумоти шартномаи интеллектуалӣ дар вебсайт

Ман дар Python як вебсайти оддӣ навиштам, то маълумотро аз шартномаи интеллектуалӣ ба таври қулай намоиш диҳад. Дар ин ҷо ман ба таври муфассал дар бораи он таваққуф намекунам ва сайтро нашр мекунам дар як ухдадорй.

Дархостҳо ба ТОН аз Python бо кӯмаки lite-client. Барои роҳат, сайт дар Docker бастабандишуда ва дар Google Cloud нашр шудааст. Истинод.

Кӯшиш

Акнун биёед кӯшиш кунем, ки граммҳоро барои пур кардан аз он ҷо фиристем ҳамён. 40 грамм мефиристем. Ва биёед барои возеҳият якчанд шартҳо кунем. Мо мебинем, ки сайт таърихи шартгузориҳо, фоизи ҷории бурднок ва дигар маълумоти муфидро нишон медиҳад.

Мо мебинемки мо дар якум голиб омадем, дуюмро бохт.

Пас аз он

Мақола хеле дарозтар аз он буд, ки ман интизор будам, шояд он кӯтоҳтар бошад ё шояд танҳо барои шахсе, ки дар бораи ТОН чизе намедонад ва мехоҳад як шартномаи интеллектуалии на он қадар оддиро бо қобилияти муошират кардан навишта ва нашр кунад он. Шояд баъзе чизҳоро соддатар шарҳ додан мумкин буд.

Шояд баъзе ҷанбаҳои татбиқро метавон самараноктар ва зеботар анҷом дод, аммо он вақт барои омода кардани мақола вақти бештаре лозим буд. Инчунин мумкин аст, ки ман дар ҷое иштибоҳ кардаам ё чизеро нафаҳмидам, аз ин рӯ, агар шумо кори ҷиддӣ дошта бошед, шумо бояд ба ҳуҷҷатҳои расмӣ ё анбори расмӣ бо рамзи ТОН такя кунед.

Бояд қайд кард, ки азбаски худи ТОН ҳанӯз дар марҳилаи фаъоли рушд қарор дорад, метавонад тағйироте рух диҳад, ки ҳама гуна қадамҳои ин мақоларо вайрон мекунанд (ки ҳангоми навиштани ман рӯй дод, аллакай ислоҳ шудааст), аммо бархӯрди умумӣ ин аст. тағир додан ба гумон аст.

Ман дар бораи ояндаи ТОН сухан намеронам. Шояд платформа як чизи бузурге шавад ва мо бояд вақтро барои омӯзиши он сарф кунем ва ҳоло як ҷойро бо маҳсулоти худ пур кунем.

Инчунин Libra аз Facebook мавҷуд аст, ки аудиторияи эҳтимолии корбарон аз ТОН калонтар дорад. Ман дар бораи Либра қариб ҳеҷ чизро намедонам, аз рӯи форум, дар он ҷо назар ба ҷомеаи ТОН фаъолият хеле бештар аст. Гарчанде ки таҳиягарон ва ҷомеаи ТОН бештар ба зеризаминӣ монанданд, ки ин ҳам олӣ аст.

мурожиат

  1. Ҳуҷҷатҳои расмии TON: https://test.ton.org
  2. Анбори расмии TON: https://github.com/ton-blockchain/ton
  3. Ҳамёни расмӣ барои платформаҳои гуногун: https://wallet.ton.org
  4. Анбори шартномаи интеллектуалӣ аз ин мақола: https://github.com/raiym/astonished
  5. Истинод ба вебсайти шартномаи интеллектуалӣ: https://ton-lottery.appspot.com
  6. Репозиторий барои тамдиди Visual Studio Code барои FunC: https://github.com/raiym/func-visual-studio-plugin
  7. Дар бораи TON дар Telegram сӯҳбат кунед, ки воқеан барои фаҳмидани он дар марҳилаи аввал кӯмак кард. Фикр мекунам, агар гӯям, ки ҳар касе, ки барои ТОН чизе навишт, дар он ҷост, хато намекунам. Шумо инчунин метавонед дар он ҷо граммҳои санҷиширо пурсед. https://t.me/tondev_ru
  8. Сӯҳбати дигар дар бораи TON, ки дар он ман маълумоти муфид пайдо кардам: https://t.me/TONgramDev
  9. Марҳилаи аввали озмун: https://contest.com/blockchain
  10. Марҳилаи дуюми озмун: https://contest.com/blockchain-2

Манбаъ: will.com

Илова Эзоҳ