Momba ny fomba fanoratana sy famoahana fifanarahana marani-tsaina ao amin'ny Telegram Open Network (TON)

Momba ny fomba hanoratana sy famoahana fifanarahana marani-tsaina amin'ny TON

Momba inona ity lahatsoratra ity?

Ao amin'ny lahatsoratra dia hiresaka momba ny fomba nandraisako anjara tamin'ny fifaninanana blockchain Telegram voalohany (amin'ny roa) aho, tsy naka loka, ary nanapa-kevitra ny hanoratra ny traikefako amin'ny lahatsoratra iray mba tsy hilentika ao anaty fanadinoana ary, angamba, manampy. olona.

Satria tsy te hanoratra kaody abstract aho, fa hanao zavatra miasa, ho an'ny lahatsoratra dia nanoratra fifanarahana marani-tsaina ho an'ny loteria eo noho eo aho ary tranonkala iray mampiseho ny angon-drakitra fifanarahana marani-tsaina mivantana avy amin'ny TON nefa tsy mampiasa fitahirizana mpanelanelana.

Ny lahatsoratra dia mahasoa ho an'ireo izay te hanao ny fifanarahana marani-tsaina voalohany ao amin'ny TON, nefa tsy mahalala hoe aiza no hanombohana.

Amin'ny fampiasana ny loteria ho ohatra, dia handeha amin'ny fametrahana ny tontolo iainana aho mba hamoahana fifanarahana marani-tsaina, hifanerasera aminy, ary hanoratra tranonkala handraisana sy famoahana angon-drakitra.

Momba ny fandraisana anjara amin'ny fifaninanana

Tamin'ny volana oktobra lasa teo, Telegram dia nanambara fifaninanana blockchain miaraka amin'ny fiteny vaovao Fift ΠΈ FunC. Nilaina ny nisafidy tamin'ny fanoratana ny iray amin'ireo fifanarahana marani-tsaina dimy natolotra. Nihevitra aho fa tsara ny manao zavatra hafa, mianatra fiteny ary manao zavatra, na dia tsy voatery hanoratra zavatra hafa aza aho amin'ny ho avy. Fanampin'izany, tsy mitsaha-mitombo ny lohahevitra.

Tsara ny milaza fa tsy nanana traikefa tamin'ny famolavolana fifanarahana marani-tsaina aho.

Nikasa ny handray anjara hatramin'ny farany aho mandra-pahavitako ary avy eo nanoratra lahatsoratra famerenana, saingy tsy nahomby avy hatrany aho tamin'ny voalohany. aho nanoratra poketra miaraka amin'ny sonia maro FunC ary niasa tamin'ny ankapobeny izany. Noraisiko ho fototra fifanarahana smart amin'ny Solidity.

Tamin'izany fotoana izany dia nihevitra aho fa tena ampy izany mba hahazoana loka farafaharatsiny. Vokany, 40 teo ho eo amin’ny 60 ny mpandray anjara no nahazo loka ary tsy anisan’izy ireo aho. Amin'ny ankapobeny, tsy misy maharatsy izany, fa zavatra iray no nanelingelina ahy. Tamin'ny fotoana nanambarana ny vokatra dia tsy mbola vita ny famerenana ny andrana momba ny fifanarahana nataoko, nanontany ny mpandray anjara tamin'ny chat aho raha misy olona tsy manana izany, tsy misy.

Toa nihaino ny hafatro, roa andro taty aoriana dia namoaka fanehoan-kevitra ireo mpitsara ary mbola tsy azoko na tsy nahy ny fifanarahana marani-tsaina nataoko nandritra ny fitsarana na nihevitra tsotra izao fa ratsy be izany ka tsy mila fanehoan-kevitra. Nametraka fanontaniana tao amin'ny pejy aho, saingy tsy nahazo valiny. Na dia tsy tsiambaratelo aza izay nitsara, dia nihevitra aho fa tsy ilaina ny manoratra hafatra manokana.

Be dia be ny fotoana lany tamin'ny fahatakarana, ka nanapa-kevitra ny hanoratra lahatsoratra. Koa satria tsy mbola misy fampahalalana be dia be, ity lahatsoratra ity dia hanampy amin'ny fitsitsiana fotoana ho an'ny rehetra liana.

Ny foto-kevitry ny fifanarahana marani-tsaina ao TON

Alohan'ny hanoratanao na inona na inona dia mila fantarinao hoe avy aiza no hanatonana an'io zavatra io. Noho izany, ankehitriny dia holazaiko aminao hoe inona no ampahany misy ny rafitra. Ny marimarina kokoa, inona no ampahany tokony ho fantatrao mba hanoratana karazana fifanarahana miasa farafaharatsiny.

Hifantoka amin'ny fanoratana fifanarahana marani-tsaina sy ny fiaraha-miasa amin'izany izahay TON Virtual Machine (TVM), Fift ΠΈ FunC, noho izany ny lahatsoratra dia mitovy kokoa amin'ny famaritana ny fivoaran'ny programa mahazatra. Tsy hiresaka momba ny fomba fiasan'ny sehatra mihitsy izahay eto.

Amin'ny ankapobeny momba ny fomba fiasa TVM ary fiteny Fift misy antontan-taratasy ofisialy tsara. Raha nandray anjara tamin'ny fifaninanana aho ary ankehitriny teo am-panoratana ny fifanarahana ankehitriny, dia matetika aho no nitodika tany aminy.

Ny fiteny fototra hanoratana fifanarahana marani-tsaina dia FunC. Tsy misy antontan-taratasy momba izany amin'izao fotoana izao, ka raha te hanoratra zavatra ianao dia mila mianatra ohatra momba ny fifanarahana marani-tsaina avy amin'ny tahiry ofisialy sy ny fampiharana ny fiteny ao, ary azonao atao ny mijery ohatra momba ny fifanarahana marani-tsaina tamin'ny roa lasa. fifaninanana. Rohy any amin'ny faran'ny lahatsoratra.

Andeha atao hoe efa nanoratra fifanarahana smart izahay FunC, aorian'izay dia manangona ny kaody ho Fift assembler.

Mbola havoaka ny fifanarahana smart natambatra. Mba hanaovana izany dia mila manoratra asa ianao Fift, izay haka ny kaody fifanarahana marani-tsaina sy ny masontsivana hafa ho fampidirana, ary ny vokatra dia ho rakitra miaraka amin'ny fanitarana .boc (izay midika hoe "kitapo misy sela"), ary, miankina amin'ny fomba hanoratantsika azy, fanalahidy manokana sy adiresy, izay novolavolaina mifototra amin'ny kaody fifanarahana marani-tsaina. Azonao atao sahady ny mandefa grama amin'ny adiresin'ny fifanarahana marani-tsaina izay tsy mbola navoaka.

Mba hamoahana fifanarahana marani-tsaina amin'ny TON nahazo .boc ny rakitra dia mila alefa any amin'ny blockchain mampiasa mpanjifa maivana (bebe kokoa momba izany etsy ambany). Saingy alohan'ny famoahana dia mila mamindra grama amin'ny adiresy novokarina ianao, raha tsy izany dia tsy havoaka ny fifanarahana marani-tsaina. Aorian'ny famoahana dia afaka mifandray amin'ny fifanarahana marani-tsaina ianao amin'ny alΓ lan'ny fandefasana hafatra avy any ivelany (ohatra, amin'ny fampiasana mpanjifa maivana) na avy ao anatiny (ohatra, ny fifanarahana marani-tsaina iray dia mandefa hafatra iray hafa ao anatin'ny TON).

Rehefa takatsika ny fomba namoahana ny kaody dia lasa mora kokoa izany. Fantatray amin'ny ankapobeny izay tiana hosoratana sy ny fomba fiasan'ny fandaharan'asanay. Ary rehefa manoratra isika dia mitady ny fomba efa nampiharana izany amin'ny fifanarahana marani-tsaina efa misy, na mijery ny fehezan-dalΓ na fampiharana Fift ΠΈ FunC ao amin'ny tahiry ofisialy, na jereo ao amin'ny antontan-taratasy ofisialy.

Matetika aho no nitady teny fanalahidy tao amin'ny chat Telegram izay nivorian'ny mpandray anjara rehetra amin'ny fifaninanana sy ny mpiasan'ny Telegram, ary nitranga izany fa nandritra ny fifaninanana dia nivory teo ny rehetra ary nanomboka niresaka momba ny Fift sy FunC. Rohy any amin'ny faran'ny lahatsoratra.

Fotoana hifindra avy amin'ny teoria mankany amin'ny fampiharana.

Fanomanana ny tontolo iarahana amin'ny TON

Nanao izay rehetra hofaritana ao amin'ny lahatsoratra momba ny MacOS aho ary nanamarina izany tamin'ny Ubuntu 18.04 LTS madio amin'ny Docker.

Ny zavatra voalohany tokony hataonao dia ny misintona sy mametraka lite-client izay ahafahanao mandefa fangatahana amin'ny TON.

Ny torolalana ao amin'ny tranokala ofisialy dia manoritsoritra ny fizotran'ny fametrahana amin'ny antsipiriany sy mazava tsara ary manala ny antsipiriany sasany. Eto isika dia manaraka ny torolalana, mametraka ireo fiankinan-doha tsy hita eny an-dalana. Tsy nanangona ny tetikasa tsirairay ny tenako ary nametraka tao amin'ny tahiry ofisialy Ubuntu (amin'ny MacOS nampiasaiko 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 

Rehefa tafapetraka ny dependencies rehetra dia azonao atao ny mametraka lite-client, Fift, FunC.

Voalohany, ataontsika clone ny tahiry TON miaraka amin'ny fiankinany. Ho fanamorana dia hanao ny zava-drehetra ao anaty lahatahiry iray izahay ~/TON.

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

Ny repository koa dia mitahiry fampiharana Fift ΠΈ FunC.

Ankehitriny isika dia vonona ny hanangona ny tetikasa. Ny kaody fitehirizana dia klΓ΄nina ao anaty lahatahiry iray ~/TON/ton. The ~/TON mamorona lahatahiry build ary manangona ny tetikasa ao anatiny.

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

Satria hanoratra fifanarahana marani-tsaina isika dia tsy mila fotsiny lite-clientsaingy Fift с FunC, ka ndao hanangona ny zava-drehetra. Tsy dingana haingana izany, ka miandry.

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

Avy eo, alaivo ny rakitra fanamafisana izay misy angona momba ny node izay lite-client hifandray.

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

Manao ny fangatahana voalohany amin'ny TON

Andeha isika hanomboka lite-client.

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

Raha nahomby ny fananganana, dia aorian'ny fandefasana dia ho hitanao ny lisitry ny fifandraisan'ny mpanjifa maivana amin'ny node.

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

Azonao atao ny manatanteraka ny baiko help ary jereo izay baiko misy.

help

Andeha hotanisaintsika ireo baiko hampiasaina ato amin’ity lahatsoratra ity.

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-ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ смартконтракта. 

Ankehitriny dia vonona ny hanoratra ny fifanarahana izahay.

fanatanterahana

hevitra

Araka ny nosoratako etsy ambony dia loteria ny fifanarahana marani-tsaina izay soratanay.

Ankoatr'izay, tsy loteria izay mila mividy tapakila ianao ary miandry adiny iray, andro na volana, fa fotoana iray izay ahafahan'ny mpampiasa mamindra ny adiresin'ny fifanarahana. N grama, ary averina avy hatrany 2 * N grama na very. Ataontsika 40% ny mety ho fandresena. Raha tsy ampy ny grama ho an'ny fandoavam-bola, dia horaisinay ho toy ny top-up ny fifanakalozana.

Fanampin'izay, zava-dehibe ny hahitana ny filokana amin'ny fotoana tena izy sy amin'ny endrika mety, mba hahafahan'ny mpampiasa mahazo avy hatrany na nandresy izy na resy. Noho izany, mila manao tranokala ianao izay hampiseho ny filokana sy ny valiny mivantana avy amin'ny TON.

Manoratra fifanarahana marani-tsaina

Ho fanamorana dia nanasongadina ny kaody ho an'ny FunC aho; azo jerena sy apetraka ao amin'ny fikarohana Visual Studio Code ny plugin; raha te-hanampy zavatra tampoka ianao dia nataoko ampahibemaso ilay plugin. Ary koa, nisy olona nanao plugin teo aloha ho an'ny fiaraha-miasa amin'ny Fift, azonao atao koa ny mametraka izany ary mahita azy ao amin'ny VSC.

Andao hamorona tahiry avy hatrany izay hametrahantsika ny valiny manelanelana.

Mba hanamora ny fiainantsika dia hanoratra fifanarahana marani-tsaina isika ary hizaha toetra izany eo an-toerana mandra-pahavitany. Aorian'izay vao havoakanay amin'ny TON.

Ny fifanarahana smart dia manana fomba roa ivelany azo idirana. Voalohany, recv_external() io asa io dia tanterahina rehefa avy any ivelany ny fangatahana ny fifanarahana, izany hoe, tsy avy amin'ny TON, ohatra, rehefa ny tenantsika no mamorona hafatra ary mandefa izany amin'ny alalan'ny lite-client. Faharoa, recv_internal() Izany dia rehefa ao anatin'ny TON mihitsy, ny fifanarahana rehetra dia manondro ny anay. Amin'ireo tranga roa ireo, azonao atao ny mampita paramètre amin'ilay asa.

Andeha isika hanomboka amin'ny ohatra tsotra iray izay hahomby raha avoaka, saingy tsy misy entana miasa ao anatiny.

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

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

Eto isika dia mila manazava hoe inona izany slice. Ny angon-drakitra rehetra voatahiry ao amin'ny TON Blockchain dia fanangonana TVM cell na tsotra fotsiny cell, amin'ny sela toy izany dia afaka mitahiry angona hatramin'ny 1023 bits sy rohy hatramin'ny 4 mankany amin'ny sela hafa ianao.

TVM cell slice na slice anisan'ny efa misy io cell ampiasaina hamakiana azy, dia ho hita eo aoriana. Ny zava-dehibe ho antsika dia ny hoe afaka mamindra slice ary miankina amin'ny karazana hafatra, alaivo ny angona ao recv_external() na recv_internal().

impure - teny fanalahidy izay manondro fa ny fiasa dia manova ny angon-drakitra fifanarahana marani-tsaina.

Andao hotehirizina ao ny kaody fifanarahana lottery-code.fc ary manangona.

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

Ny dikan'ny saina dia azo jerena amin'ny alalan'ny baiko

~/TON/build/crypto/func -help

Nanangona code assembler Fift izahay 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

Azo atomboka eto an-toerana izany, hanomanana ny tontolo iainana.

Mariho fa mifandray ny andalana voalohany Asm.fif, ity dia code voasoratra ao amin'ny Fift for the Fift assembler.

Koa satria te hihazakazaka sy hitsapa ny fifanarahana marani-tsaina eo an-toerana izahay, dia hamorona rakitra lottery-test-suite.fif ary kopia ny kaody natambatra ao, soloy ny andalana farany ao, izay manoratra ny kaody fifanarahana marani-tsaina amin'ny tsy tapaka. codehamindra izany amin'ny milina virtoaly:

"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

Toa mazava aloha hatreto fa aleo ampidirina ao anatin’io dossier io ihany ny kaody hampiasaina amin’ny fandefasana ny 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 raketinay ny contexte, izany hoe ny angon-drakitra izay hanombohan'ny TVM (na ny tambazotra). Na dia nandritra ny fifaninanana aza dia nampiseho ny fomba famoronana ny iray amin'ireo mpamorona c7 ary nadikako. Mety mila miova isika ato amin'ity lahatsoratra ity rand_seed satria miankina amin'io ny famoronana isa kisendrasendra ary raha tsy ovaina dia haverina isaky ny misy io isa io.

recv_internal ΠΈ recv_external Constants miaraka amin'ny soatoavina 0 sy -1 dia ho tompon'andraikitra amin'ny fiantsoana ireo asa mifandraika amin'ny fifanarahana marani-tsaina.

Ankehitriny izahay dia vonona ny hamorona ny fitsapana voalohany ho an'ny fifanarahana marani-tsaina foana. Mba hanazavana, amin'izao fotoana izao dia hampidirinay amin'ny rakitra iray ihany ny fitsapana rehetra lottery-test-suite.fif.

Andao hamorona fari-piainana storage ary soraty ao ny iray foana cell, ity no fitahirizana fifanarahana marani-tsaina.

message Ity no hafatra ampitainay any amin'ny smart contact avy any ivelany. Hofoanantsika ihany koa izany amin'izao fotoana izao.

variable storage 
<b b> storage ! 

variable message 
<b b> message ! 

Rehefa avy nanomana ny constants sy variables izahay dia manomboka ny TVM mampiasa ny baiko runvmctx ary ampidiro ao amin'ny fampidirana ireo paramètre noforonina.

message @ 
recv_external 
code 
storage @ 
c7 
runvmctx 

Amin'ny farany dia hahomby isika toa izao code intermediate ho an'ny Fift.

Ankehitriny dia afaka mihazakazaka ny kaody vokatra.

export FIFTPATH=~/TON/ton/crypto/fift/lib // выполняСм ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для удобства 
~/TON/build/crypto/fift -s lottery-test-suite.fif 

Ny programa dia tokony handeha tsy misy hadisoana ary amin'ny famoahana dia ho hitantsika ny log de execution:

execute SETCP 0
execute DICTPUSHCONST 19 (xC_,1)
execute DICTIGETJMPZ
execute DROP
execute implicit RET
[ 3][t 0][1582281699.325381279][vm.cpp:479]     steps: 5 gas: used=304, max=9223372036854775807, limit=9223372036854775807, credit=0

Tsara, nanoratra ny dikan-teny voalohany miasa amin'ny fifanarahana marani-tsaina izahay.

Ankehitriny dia mila manampy fampiasa. Andeha aloha hiresaka amin'ny hafatra avy any ivelany mankany recv_external()

Ny mpamorona mihitsy no misafidy ny endrika hafatra azon'ny fifanarahana ekena.

Fa matetika

  • Voalohany indrindra, tianay ny hiaro ny fifanarahanay amin'ny tontolo ivelany ary hanao izany mba tsy ny tompon'ny fifanarahana ihany no afaka mandefa hafatra avy any ivelany any.
  • Faharoa, rehefa mandefa hafatra manan-kery amin'ny TON izahay dia tianay ny hitrangan'izany indray mandeha ary rehefa mandefa hafatra mitovy indray izahay dia mandΓ  izany ny fifanarahana smart.

Ka saika ny fifanarahana rehetra dia mamaha ireo olana roa ireo, satria ny fifanarahanay dia manaiky ny hafatra ivelany, dia mila mikarakara izany koa izahay.

Atao amin'ny filaharana mivadika. Aleo aloha hamaha ny olana amin'ny famerimberenana, raha efa naharay hafatra toy izany ny fifanarahana ary nanamboatra azy io, dia tsy hanatanteraka izany fanindroany izany. Ary avy eo dia hamaha ny olana isika ka vondron'olona sasantsasany ihany no afaka mandefa hafatra amin'ny fifanarahana marani-tsaina.

Misy fomba samihafa hamahana ny olana amin'ny hafatra duplicate. Toy izao no hataontsika. Ao amin'ny fifanarahana marani-tsaina, dia manomboka ny kaontera amin'ny hafatra voaray miaraka amin'ny sanda voalohany 0. Amin'ny hafatra tsirairay amin'ny fifanarahana marani-tsaina, dia ampianay ny sandan'ny counter ankehitriny. Raha toa ka tsy mifanaraka amin'ny sanda ao amin'ny fifanarahana smart ny sandan'ny fifanandrinana amin'ny hafatra, dia tsy karakarainay izany; raha izany no izy, dia ampitomboinay 1 ny kaontera ao amin'ny fifanarahana marani-tsaina.

Andao hiverina amin'ny lottery-test-suite.fif ary ampio fitsapana faharoa izany. Raha mandefa laharana diso isika, dia tokony hanipy exception ny code. Ohatra, avelao ny angon-drakitra momba ny fifanarahana mitahiry 166, ary handefa 165 izahay.

<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"

Andao hanomboka.

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

Ary ho hitantsika fa ny fitsapana dia tanterahina amin'ny fahadisoana.

[ 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

Amin'ity dingana ity lottery-test-suite.fif tokony ho tahaka rohy.

Andeha isika hanampy ny counter logic amin'ny smart contract in 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 mipetraka ny hafatra alefantsika.

Ny zavatra voalohany ataontsika dia ny manamarina raha misy angon-drakitra ny hafatra, raha tsy izany dia mivoaka fotsiny isika.

Manaraka izany dia vakio ny hafatra. in_msg~load_uint(32) mitondra ny isa 165, 32-bit unsigned int avy amin'ny hafatra nampitaina.

Avy eo dia mitondra 32 bits avy amin'ny fitahirizana fifanarahana marani-tsaina izahay. Hamarininay fa mifanandrify amin'ilay laharan-tseza ny laharana voarakitra; raha tsy izany dia manipy fanavahana izahay. Amin'ny tranga misy antsika, satria mandalo tsy misy lalao isika, dia tokony hatsipy ny exception.

Andeha isika hanangona.

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

Adikao amin'ny lottery-test-suite.fif, tsy adino ny manolo ny andalana farany.

Manamarina izahay fa mandalo ny fitsapana:

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

Eto mihitsy Azonao atao ny mahita ny fanoloran-tena mifanaraka amin'ny valiny ankehitriny.

Mariho fa tsy mahasosotra ny mandika tsy tapaka ny kaody voaangona amin'ny fifanarahana marani-tsaina ao anaty rakitra misy fitsapana, koa andao hanoratra script izay hanoratra ny kaody ho tsy miova ho antsika, ary hampifandray fotsiny ny code voaangona amin'ny fitsapana ataontsika. "include".

Mamorona rakitra ao amin'ny lahatahiry tetikasa build.sh miaraka amin'ny votoaty manaraka.

#!/bin/bash

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

Aleo atao executable.

chmod +x ./build.sh

Ankehitriny, mandehana fotsiny ny script mba hanangonana ny fifanarahana. Saingy ankoatr'izay dia mila manoratra izany ho tsy miova isika code. Noho izany dia hamorona rakitra vaovao isika lotter-compiled-for-test.fif, izay hampidirinay ao anaty rakitra lottery-test-suite.fif.

Andao ampidiro ny code skirpt amin'ny sh, izay handikana ny rakitra voaangona fotsiny lotter-compiled-for-test.fif ary ovay ny andalana farany ao.

# 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

Ankehitriny, mba hanamarinana, andeha hojerentsika ny script vokatra ary hisy rakitra iray hipoitra lottery-compiled-for-test.fif, izay ho ampidirintsika ao amin'ny antsika lottery-test-suite.fif

Π’ lottery-test-suite.fif esory ny kaody fifanarahana ary ampio ny tsipika "lottery-compiled-for-test.fif" include.

Manao fitiliana izahay mba hanamarinana fa lany izy ireo.

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

Tsara, izao mba ho tonga ho azy ny fandefasana ny fitsapana, andao hamorona rakitra test.sh, izay hotanterahina voalohany build.sh, ary avy eo dia ataovy ny fitsapana.

touch test.sh
chmod +x test.sh

Manoratra izahay ao anatiny

./build.sh 

echo "nCompilation completedn"

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

Andao hatao test.sh ary tanteraho izany mba hahazoana antoka fa mandeha ny fitsapana.

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

Izahay dia manamarina fa ny fifanarahana dia manangona ary ny fitsapana dia tanterahina.

Tsara, manomboka izao test.sh Ny fitsapana dia hangonina ary handeha avy hatrany. Ity ny rohy mankany manao.

Eny ary, alohan'ny hanohizantsika, andao hanao zavatra iray hafa ho fanamorana.

Andao hamorona lahatahiry build izay hitehirizana ny fifanarahana voadika sy ny kloneny voasoratra ao anaty tsy miova lottery-compiled.fif, lottery-compiled-for-test.fif. Andao koa hamorona lahatahiry test aiza no hotehirizina ny fichier test? lottery-test-suite.fif ary mety ho rakitra fanohanana hafa. Rohy amin'ny fanovana mifandraika.

Andao hanohy ny fampivelarana ny fifanarahana marani-tsaina.

Manaraka izany dia tokony hisy andrana manamarina fa voaray ny hafatra ary havaozina ao amin'ny magazay ny kaontera rehefa mandefa ny laharana marina. Fa hataontsika izany any aoriana any.

Andeha hojerentsika hoe inona ny rafitra angon-drakitra sy ny angon-drakitra tokony hotehirizina ao amin'ny fifanarahana marani-tsaina.

Holazaiko izay rehetra tehirizinay.

`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` пСрСмСнная Ρ‚ΠΈΠΏΠ° ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ, Ρ…Ρ€Π°Π½ΠΈΡ‚ послСдниС Π΄Π²Π°Π΄Ρ†Π°Ρ‚ΡŒ ставок. 

Manaraka dia mila manoratra asa roa ianao. Andeha isika hiantso ny voalohany pack_state(), izay hanangona ny angon-drakitra ho an'ny tahiry manaraka ao amin'ny fitahirizana fifanarahana marani-tsaina. Andeha hiantso ny faharoa unpack_state() hamaky sy hamerina angona avy amin'ny fitahirizana.

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

Ampio ireo fiasa roa ireo amin'ny fiandohan'ny fifanarahana marani-tsaina. Hahomby izany toa izao vokatra manelanelana.

Raha te hitahiry ny angona ianao dia mila miantso ny fiasa naorina set_data() ary hanoratra angona avy amin'ny pack_state() ao amin'ny fitahirizana fifanarahana smart.

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

Amin'izao fotoana izao isika dia manana fiasa mety amin'ny fanoratana sy famakiana angon-drakitra, afaka mandroso isika.

Mila manamarina isika fa ny hafatra miditra avy any ivelany dia nosoniavin'ny tompon'ny fifanarahana (na mpampiasa hafa izay afaka miditra amin'ny fanalahidy manokana).

Rehefa mamoaka fifanarahana marani-tsaina izahay dia afaka manomboka izany amin'ny angon-drakitra ilaintsika amin'ny fitahirizana, izay hotehirizina ho an'ny fampiasana ho avy. Horaketinay ao ny fanalahidin'ny daholobe mba hahafahanay manamarina fa ny hafatra miditra dia nosoniavina tamin'ny fanalahidy manokana mifandraika amin'izany.

Alohan'ny hanohizana, andao hamorona fanalahidy manokana ary hanoratana azy test/keys/owner.pk. Mba hanaovana izany, andao hanomboka Fift amin'ny fomba interactive ary manatanteraka baiko efatra.

`newkeypair` гСнСрация ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° ΠΈ запись ΠΈΡ… Π² стСк. 

`drop` удалСния ΠΈΠ· стСка Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ элСмСнта (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡)  

`.s` просто ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ Π»Π΅ΠΆΠΈΡ‚ Π² стСкС Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ 

`"owner.pk" B>file` запись ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° Π² Ρ„Π°ΠΉΠ» с ΠΈΠΌΠ΅Π½Π΅ΠΌ `owner.pk`. 

`bye` Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Fift. 

Andao hamorona lahatahiry keys ao anaty lahatahiry test ary soraty eo ny lakile manokana.

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

Mahita rakitra ao amin'ny lahatahiry ankehitriny isika owner.pk.

Esorinay ao amin'ny stack ny fanalahidin'ny daholobe ary rehefa ilaina dia azonay alaina amin'ny an'olon-tokana.

Ankehitriny dia mila manoratra fanamarinana sonia isika. Andeha isika hanomboka amin'ny fitsapana. Voalohany dia mamaky ny fanalahidy manokana avy amin'ny rakitra mampiasa ny fiasa file>B ary soraty amin'ny variable owner_private_key, avy eo mampiasa ny asa priv>pub avadiho ho fanalahidin'ny daholobe ny fanalahidy manokana ary soraty ao ny valiny 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 !

Mila ny fanalahidy roa isika.

Izahay dia manomboka ny fitahirizana fifanarahana marani-tsaina miaraka amin'ny angona tsy misy dikany amin'ny filaharana mitovy amin'ny ao amin'ny fiasa pack_state()ary soraty ao anaty faribolana 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 !

Manaraka izany dia hamorona hafatra voasonia isika, tsy misy afa-tsy ny sonia sy ny sandan'ny counter.

Voalohany, mamorona ny angon-drakitra tiantsika halefa isika, avy eo manao sonia izany amin'ny fanalahidy manokana ary farany dia mamorona hafatra voasonia.

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 !  

Vokatr'izany, ny hafatra izay halefantsika amin'ny fifanarahana marani-tsaina dia voarakitra anaty faribolana message_to_send, momba ny asa hashu, ed25519_sign_uint afaka mamaky ianao ao amin'ny antontan-taratasy Fift.

Ary hanatanteraka ny fitsapana dia miantso indray.

message_to_send @ 
recv_external 
code 
storage @
c7
runvmctx

Here so Ny rakitra misy fitsapana dia tokony ho toy izao amin'ity dingana ity.

Andeha hataontsika ny fitsapana dia tsy hahomby izany, ka hanova ny fifanarahana marani-tsaina mba hahazoany hafatra amin'ity endrika ity sy hanamarina ny sonia.

Voalohany, manisa 512 bits amin'ny sonia avy amin'ny hafatra isika ary manoratra izany amin'ny fari-pahalalana, avy eo manisa 32 bits amin'ny variable counter.

Koa satria manana fiasa amin'ny famakiana angon-drakitra avy amin'ny fitahirizana fifanarahana marani-tsaina izahay, dia hampiasa izany izahay.

Manaraka izany dia manamarina ny kaontera nafindra miaraka amin'ny fitahirizana ary manamarina ny sonia. Raha misy zavatra tsy mifanaraka, dia manipy exception miaraka amin'ny kaody mety.

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

Fanoloran-tena mifandraika right here.

Andao hatao ny fitsapana ary hojerentsika fa tsy mahomby ny fitsapana faharoa. Noho ny antony roa, tsy ampy ny bits ao amin'ny hafatra ary tsy ampy ny bits ao amin'ny fitehirizana, noho izany dia mianjera ny kaody rehefa mandika. Mila manampy sonia amin'ny hafatra alefantsika isika ary mandika ny fitahirizana avy amin'ny fitsapana farany.

Amin'ny fitsapana faharoa dia hanampy sonia hafatra isika ary hanova ny fitahirizana fifanarahana marani-tsaina. Here so ny rakitra misy fitsapana dia toa amin'izao fotoana izao.

Andeha hanoratra fitsapana fahefatra, izay handefasana hafatra voasonia miaraka amin'ny fanalahidin'ny olon-kafa. Andao hamorona fanalahidy manokana hafa ary tehirizo ao anaty rakitra not-owner.pk. Hanasonia ny hafatra amin'ity fanalahidy manokana ity izahay. Andao hanao andrana ary ho azo antoka fa lany avokoa ny fitsapana rehetra. Ankino amin'izao fotoana izao.

Ankehitriny isika dia afaka mandroso amin'ny fampiharana ny lojika fifanarahana marani-tsaina.
Π’ recv_external() hanaiky karazana hafatra roa izahay.

Koa satria ny fifanarahana ataontsika dia hanangona ny fatiantoka ny mpilalao, io vola io dia tsy maintsy afindra amin'ny mpamorona ny loteria. Ny adiresin'ny kitapom-bolan'ny mpamorona loteria dia voarakitra ao amin'ny fitahirizana rehefa noforonina ny fifanarahana.

Raha sanatria, mila fahaizana manova ny adiresy halefantsika grama ny resy. Tokony ho afaka mandefa grama avy amin'ny loteria amin'ny adiresin'ny tompony ihany koa isika.

Andeha isika hanomboka amin'ny voalohany. Andeha aloha hanoratra fitsapana izay hanamarina fa aorian'ny fandefasana ny hafatra, ny fifanarahana marani-tsaina dia namonjy ny adiresy vaovao tao amin'ny fitahirizana. Mariho fa ao amin'ny hafatra, ankoatra ny kaontera sy ny adiresy vaovao, dia mandefa ihany koa izahay action Ny isa 7-bit tsy miiba, miankina amin'izany, dia hifidy ny fomba fanodinana ny hafatra ao amin'ny fifanarahana marani-tsaina.

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

Ao amin'ny fitsapana dia afaka mahita ny fomba fitahirizana smartcontract deserialized storage ao amin'ny Fift. Deserialization ny variables dia voalaza ao amin'ny antontan-taratasy Fift.

Manorata rohy miaraka amin'ny koba fanampiny.

Andao hanao ny fitsapana ary ho azo antoka fa tsy mahomby. Andeha isika hanampy lojika hanova ny adiresin'ny tompon'ny loteria.

Ao amin'ny fifanarahana marani-tsaina dia manohy manadihady izahay message, mamaky ao action. Ampahatsiahivo anao fa hanana roa isika action: manova adiresy ary mandefa grama.

Avy eo dia mamaky ny adiresin'ny tompon'ny fifanarahana izahay ary tehirizo ao anaty tahiry.
Manao ny fitsapana izahay ary mahita fa tsy nahomby ny fitsapana fahatelo. Mianjera izany noho ny fisian'ny fifanarahana izao dia manaparitaka 7 bit avy amin'ny hafatra, izay tsy hita ao amin'ny fitsapana. Ampio izay tsy misy amin'ny hafatra action. Andeha hojerentsika fa mandalo ny zava-drehetra. eto manolo-tena amin'ny fanovana. Mahafinaritra.

Andeha isika hanoratra ny lojika amin'ny fandefasana ny isan'ny grama voatondro amin'ny adiresy voatahiry teo aloha.

Andeha aloha hanoratra fitsapana. Hanoratra fitsapana roa isika, ny iray rehefa tsy ampy ny fifandanjana, ny faharoa rehefa tokony handalo tsara ny zava-drehetra. Azo jerena ny fitsapana amin'ity fifanarahana ity.

Andeha isika hanampy ny kaody. Voalohany, andao hanoratra fomba roa mpanampy. Ny fomba hahazoana voalohany dia ny fitadiavana ny fifandanjana amin'izao fotoana izao amin'ny fifanarahana marani-tsaina.

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

Ary ny faharoa dia ny fandefasana grama amin'ny fifanarahana marani-tsaina hafa. Nadikako tanteraka ity fomba ity tamin'ny fifanarahana marani-tsaina hafa.

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

Andao ampiana ireo fomba roa ireo amin'ny fifanarahana marani-tsaina ary soraty ny lojika. Voalohany, manara-maso ny isan'ny grama avy amin'ny hafatra isika. Manaraka izany dia manamarina ny fifandanjana, raha tsy ampy izany dia manipy fanavahana. Raha tsara ny zava-drehetra, dia alefanay any amin'ny adiresy voatahiry ny grama ary manavao ny kaontera.

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

Here so toa ny fifanarahana smart amin'izao fotoana izao. Andao hanao ny fitsapana ary ho azo antoka fa lany izy ireo.

Raha ny marina, ny komisiona dia esorina amin'ny fifanarahana marani-tsaina isaky ny misy hafatra voarindra. Mba hahafahan'ny hafatra fifanarahana marani-tsaina manatanteraka ny fangatahana, aorian'ny fisavana fototra dia mila miantso ianao accept_message().

Andeha isika hiroso amin'ny hafatra anatiny. Raha ny marina dia grama ihany no hanaiky ary haverina avo roa heny ny vola ho an'ny mpilalao raha mandresy izy ary ny ampahatelony ho an'ny tompony raha resy.

Andeha aloha hanoratra fitsapana tsotra. Mba hanaovana izany dia mila adiresin'ny andrana ny fifanarahana marani-tsaina izay heverinay fa handefasana grama amin'ny fifanarahana marani-tsaina.

Ny adiresin'ny fifanarahana marani-tsaina dia misy isa roa, integer 32-bit tompon'andraikitra amin'ny rojom-piasana ary laharan-kaonty tokana tsy misy integer 256-bit ao amin'ity rojom-piasana ity. Ohatra, -1 sy 12345, ity no adiresy hotehirizinay amin'ny rakitra iray.

Nakaniko ny asa fitehirizana ny adiresy avy amin'ny 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

Andeha hojerentsika ny fomba fiasan'ny asa, izany dia hanome fahatakarana ny fomba fiasan'ny Fift. Alefaso ny Fift amin'ny fomba interactive.

~/TON/build/crypto/fift -i 

Voalohany dia manosika ny -1, 12345 ary ny anaran'ny rakitra ho avy "sender.addr" eo amin'ny stack:

-1 12345 "sender.addr" 

Ny dingana manaraka dia ny fanatanterahana ny asa -rot, izay manova ny stack amin'ny fomba izay eo an-tampon'ny stack dia misy laharana fifanarahana marani-tsaina tokana:

"sender.addr" -1 12345

256 u>B mamadika integer 256-bit tsy ratsy ho bytes.

"sender.addr" -1 BYTES:0000000000000000000000000000000000000000000000000000000000003039

swap manova ny singa roa ambony amin'ny stack.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 -1

32 i>B mamadika integer 32-bit ho bytes.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 BYTES:FFFFFFFF

B+ mampifandray andian-bytes roa.

 "sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF

indray swap.

BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF "sender.addr" 

Ary farany dia soratana amin'ny rakitra ny bytes B>file. Aorian'io dia banga ny antontantsika. Mijanona izahay Fift. Nisy rakitra noforonina tao amin'ny lahatahiry ankehitriny sender.addr. Andao hamindra ny rakitra amin'ny lahatahiry noforonina test/addresses/.

Andao hanoratra fitsapana tsotra izay handefa grama amin'ny fifanarahana marani-tsaina. Ity ny fanoloran-tena.

Andeha hojerentsika ny lojikan'ny loteria.

Ny zavatra voalohany ataontsika dia ny manamarina ny hafatra bounced na tsia raha bounced, dia tsy raharahantsika izany. bounced midika fa ny fifanarahana dia hamerina grama raha misy fahadisoana mitranga. Tsy hamerina grama izahay raha misy fahadisoana tampoka.

Manamarina isika, raha latsaky ny antsasaky ny grama ny fifandanjana, dia manaiky fotsiny ny hafatra ary tsy miraharaha izany.

Manaraka izany dia vakianay ny adiresin'ny fifanarahana marani-tsaina niavian'ny hafatra.

Mamaky ny angon-drakitra avy amin'ny fitahirizana izahay ary mamafa ny filokana taloha amin'ny tantara raha toa ka mihoatra ny roapolo izy ireo. Ho fanamorana dia nanoratra asa fanampiny telo aho pack_order(), unpack_order(), remove_old_orders().

Manaraka izany dia mijery isika raha tsy ampy ny fifandanjana amin'ny fandoavam-bola, dia heverinay fa tsy filokana izany, fa famenoana ary tehirizo ny famenoana amin'ny orders.

Avy eo farany ny fototry ny fifanarahana smart.

Voalohany, raha resy ny mpilalao dia tehirizinay ao amin'ny tantaran'ny filokana izany ary raha mihoatra ny 3 grama ny vola dia alefanay ny 1/3 amin'ny tompon'ny fifanarahana marani-tsaina.

Raha mandresy ny mpilalao, dia alefanay avo roa heny ny vola amin'ny adiresin'ny mpilalao ary avy eo mitahiry ny fampahalalana momba ny filokana amin'ny tantara.

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

Izay ihany. Fanoloran-tena mifanaraka amin'izany.

Ankehitriny dia tsotra ny sisa tavela, andao hamorona fomba fiasa ahafahantsika mahazo fampahalalana momba ny toetry ny fifanarahana avy any ivelany (raha ny marina, vakio ny angon-drakitra avy amin'ny fitahirizana fifanarahana marani-tsaina).

Andeha isika hanampy get fomba. Hanoratra eto ambany izahay momba ny fomba handraisana vaovao momba ny fifanarahana marani-tsaina.

Adinoko ihany koa ny manampy ny kaody izay handamina ny fangatahana voalohany indrindra rehefa mamoaka fifanarahana marani-tsaina. Fanoloran-tena mifanaraka amin'izany. Ary ankoatra izany nahitsy bug amin'ny fandefasana ny 1/3 amin'ny vola amin'ny kaontin'ny tompony.

Ny dingana manaraka dia ny famoahana ny fifanarahana marani-tsaina. Andao hamorona lahatahiry requests.

Noraisiko ho fototra ny code publication simple-wallet-code.fc izay afaka mahita ao amin'ny tahiry ofisialy.

Zavatra mendrika hojerena. Mamorona fitahirizana fifanarahana marani-tsaina sy hafatra fampidirana izahay. Aorian'izany dia mipoitra ny adiresin'ny fifanarahana marani-tsaina, izany hoe ny adiresy dia fantatra alohan'ny famoahana azy ao amin'ny TON. Manaraka, mila mandefa grama maromaro amin'ity adiresy ity ianao, ary aorian'izay dia mila mandefa rakitra miaraka amin'ny fifanarahana marani-tsaina ianao, satria ny tambajotra dia mandray komisiona amin'ny fitehirizana ny fifanarahana marani-tsaina sy ny asa ao anatiny (validators izay mitahiry sy manatanteraka smart fifanarahana). Ny kaody dia azo jerena eto.

Manaraka izany dia manatanteraka ny kaody famoahana ary mahazo lottery-query.boc rakitra sy adiresy smart contract.

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

Aza adino ny mitahiry ireo rakitra novokarina: lottery-query.boc, lottery.addr, lottery.pk.

Ankoatra ny zavatra hafa, ho hitantsika ny adiresin'ny fifanarahana marani-tsaina ao amin'ny logs famonoana.

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

Mba fialamboly fotsiny dia aleo manao fangatahana amin'i TON

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

Ary ho hitantsika fa foana ny kaonty misy io adiresy io.

account state is empty

Alefantsika any amin'ny adiresy 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd 2 Gram ary aorian'ny segondra vitsy dia manatanteraka baiko mitovy izahay. Mba handefasana grama no ampiasaiko poketra ofisialy, ary afaka manontany olona iray avy amin'ny chat ianao momba ny grama fitsapana, izay horesahiko amin'ny faran'ny lahatsoratra.

> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Toa tsy fantatra (state:account_uninit) fifanarahana marani-tsaina miaraka amin'ny adiresy mitovy ary mizana 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

Andeha isika hamoaka ny fifanarahana smart. Andao hanomboka lite-client ary tanterahana.

> 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 

Andeha hojerentsika fa efa navoaka ny fifanarahana.

> last
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Anisan'ny zavatra hafa azontsika.

  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

Hitantsika izany account_active.

Fanoloran-tena mifanaraka amin'ny fanovana right here.

Andeha isika hamorona fangatahana hifanerasera amin'ny fifanarahana marani-tsaina.

Raha ny marimarina kokoa, dia hamela ny voalohany isika amin'ny fanovana ny adiresy ho asa mahaleo tena, ary hanao ny faharoa amin'ny fandefasana grama amin'ny adiresin'ny tompony. Raha ny marina dia mila manao zavatra mitovy amin'ny an'ny fitsapana fandefasana grama isika.

Ity ny hafatra halefantsika amin'ny fifanarahana marani-tsaina, izay msg_seqno 165, action 2 sy 9.5 grama ho an'ny fandefasana.

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

Aza adino ny manao sonia ny hafatra amin'ny alalan'ny fanalahidy manokana lottery.pk, izay novokarina teo aloha rehefa namorona ny fifanarahana smart. Ity ny commit mifanaraka amin'izany.

Mandray vaovao avy amin'ny fifanarahana marani-tsaina mampiasa fomba get

Andeha hojerentsika izao ny fomba fitantanana smart contract get method.

fandefasana lite-client ary tanteraho ny fomba mahazo izay nosoratanay.

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

Π’ result misy ny sanda averin'ilay asa balance() avy amin'ny fifanarahana marani-tsainay.
Hanao toy izany koa isika amin'ny fomba maro hafa.

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

Andao anontanio ny tantaran'ny filokana anao.

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

Hampiasa lite-client izahay ary hahazo fomba hanehoana vaovao momba ny fifanarahana marani-tsaina ao amin'ny tranokala.

Mampiseho angon-drakitra fifanarahana marani-tsaina amin'ny tranokala

Nanoratra tranonkala tsotra amin'ny Python aho mba hampisehoana ny angona avy amin'ny fifanarahana marani-tsaina amin'ny fomba mety. Eto aho dia tsy hiresaka amin'ny antsipiriany ary hamoaka ny tranokala amin'ny fihetsiketsehana iray.

Ny fangatahana TON dia natao avy amin'ny Python miaraka amin'ny fanampian'ny lite-client. Ho fanamorana, ny tranokala dia napetraka ao amin'ny Docker ary navoaka tao amin'ny Google Cloud. Rohy.

manandrana

Andeha isika izao hanandrana handefa grama any ho famenoana avy kitapom-batsy. Handefa 40 grama izahay. Ary andao hanao filokana roa mba hazava. Hitanay fa ny tranokala dia mampiseho ny tantaran'ny filokana, ny isan-jaton'ny fandresena amin'izao fotoana izao ary ny fampahalalana mahasoa hafa.

Hitantsikahoe nahazo ny voalohany, resy ny faharoa.

afterword

Nivadika ho lava lavitra noho ny nantenaiko ilay lahatsoratra, mety ho fohy kokoa, na mety ho an'ny olona tsy mahalala na inona na inona momba ny TON ary te hanoratra sy hamoaka fifanarahana hendry tsy dia tsotra miaraka amin'ny fahafahana mifandray amin'ny izany. Mety ho nohazavaina tsotra kokoa angamba ny zavatra sasany.

Angamba ny lafiny sasany amin'ny fampiharana dia azo natao tamin'ny fomba mahomby sy tsara kokoa, saingy avy eo dia nila fotoana bebe kokoa ny fanomanana ilay lahatsoratra. Mety ho diso ihany koa aho tany ho any na tsy azoko, ka raha manao zavatra matotra ianao dia mila miantehitra amin'ny antontan-taratasy ofisialy na ny tahiry ofisialy misy ny code TON.

Marihina fa satria ny TON mihitsy dia mbola ao anatin'ny dingana mavitrika amin'ny fampandrosoana, dia mety hisy fiovana izay hanapaka ny dingana rehetra ato amin'ity lahatsoratra ity (izay nitranga tamin'ny fotoana nanoratako dia efa voahitsy), fa ny fomba fiasa ankapobeny dia tsy azo inoana fa hiova.

Tsy hiresaka momba ny hoavin'ny TON aho. Angamba ho lasa zava-dehibe ny sehatra ary tokony handany fotoana hianarana azy io isika ary hameno ny akany amin'ny vokatray izao.

Misy ihany koa ny Libra avy amin'ny Facebook, izay mety ho mpihaino mpampiasa lehibe kokoa noho ny TON. Saika tsy mahalala na inona na inona momba ny Libra aho, raha jerena amin'ny forum dia misy hetsika betsaka kokoa noho ny ao amin'ny vondrom-piarahamonina TON. Na dia mitovy amin'ny ambanin'ny tany aza ny mpamorona sy ny vondrom-piarahamonina TON, izay mahafinaritra ihany koa.

soratra masina

  1. Taratasy ofisialy TON: https://test.ton.org
  2. Fitehirizam-boky ofisialy TON: https://github.com/ton-blockchain/ton
  3. Kitapo ofisialy ho an'ny sehatra samihafa: https://wallet.ton.org
  4. Smart contract repository avy amin'ity lahatsoratra ity: https://github.com/raiym/astonished
  5. Rohy mankany amin'ny tranokalan'ny fifanarahana smart: https://ton-lottery.appspot.com
  6. Repository ho an'ny fanitarana ny Visual Studio Code for FunC: https://github.com/raiym/func-visual-studio-plugin
  7. Resaho momba ny TON ao amin'ny Telegram, izay tena nanampy tamin'ny fahafantarana izany tamin'ny dingana voalohany. Heveriko fa tsy ho diso raha milaza aho fa ao daholo izay nanoratra zavatra ho an'ny TON. Azonao atao koa ny mangataka grama fitsapana any. https://t.me/tondev_ru
  8. Resaka hafa momba ny TON izay nahitako fampahalalana mahasoa: https://t.me/TONgramDev
  9. Dingana voalohany amin'ny fifaninanana: https://contest.com/blockchain
  10. Dingana faharoa amin'ny fifaninanana: https://contest.com/blockchain-2

Source: www.habr.com

Add a comment