Game da yadda ake rubutawa da buga kwangilar wayo a cikin Telegram Open Network (TON)

Game da yadda ake rubutawa da buga kwangilar wayo a cikin TON

Menene wannan labarin game da?

A cikin labarin zan yi magana game da yadda na shiga cikin farkon (na biyu) Telegram blockchain gasar, ban karɓi kyauta ba, kuma na yanke shawarar yin rikodin gogewa ta a cikin labarin don kada ya nutse cikin mantawa kuma, wataƙila, taimako. wani.

Tun da ba na so in rubuta lambar ƙididdiga ba, amma don yin wani abu mai aiki, don labarin na rubuta kwangila mai kyau don caca nan take da gidan yanar gizon da ke nuna bayanan kwangilar kai tsaye daga TON ba tare da amfani da matsakaicin ajiya ba.

Labarin zai zama da amfani ga waɗanda suke son yin kwangilar wayo ta farko a TON, amma ba su san inda za su fara ba.

Yin amfani da irin caca a matsayin misali, zan tafi daga shigar da yanayi zuwa buga kwangila mai wayo, yin hulɗa da shi, da rubuta gidan yanar gizo don karɓa da buga bayanai.

Game da shiga gasar

Oktoban da ya gabata, Telegram ya sanar da gasar blockchain tare da sabbin harsuna Fift и FunC. Ya zama dole a zaɓi daga rubuta kowane ɗayan kwangiloli biyar da aka gabatar. Na ga zai yi kyau in yi wani abu dabam, in koyi yare kuma in yi wani abu, ko da ba sai na rubuta wani abu ba a nan gaba. Ƙari ga haka, batun koyaushe yana kan lebe.

Yana da kyau a faɗi cewa ba ni da gogewa wajen haɓaka kwangiloli masu wayo.

Na yi shirin shiga har zuwa ƙarshe har sai na iya sannan in rubuta labarin bita, amma na kasa nan da nan a farkon. I ya rubuta wallet tare da sa hannu da yawa a kunne FunC kuma gabaɗaya yayi aiki. Na dauki shi a matsayin tushe kwangila mai wayo akan Solidity.

A lokacin, na yi tunanin cewa lalle wannan ya isa ya ɗauki aƙalla wani wuri na kyaututtuka. Sakamakon haka, kusan kashi 40 cikin 60 na mahalarta taron sun zama masu cin kyaututtuka kuma ba ni cikin su. Gabaɗaya, babu laifi a cikin wannan, amma abu ɗaya ya dame ni. A lokacin da aka sanar da sakamakon, ba a yi nazarin jarrabawar kwangila ta ba, na tambayi mahalarta a cikin hira ko akwai wani wanda ba shi da shi, babu.

A bayyane yake kula da sakonni na, bayan kwana biyu alkalan sun buga sharhi kuma har yanzu ban gane ko sun yi kuskuren kuskuren kwangila na ba a lokacin shari'a ko kuma kawai sun yi tunanin cewa yana da kyau don haka ba ya buƙatar sharhi. Na yi tambaya a shafin, amma ban sami amsa ba. Ko da yake ba asiri ba ne wanda ya yi hukunci, na yi la'akari da cewa ba lallai ba ne don rubuta saƙonnin sirri.

An kashe lokaci mai yawa don fahimta, don haka an yanke shawarar rubuta labarin. Tun da babu bayanai da yawa tukuna, wannan labarin zai taimaka wajen adana lokaci ga duk masu sha'awar.

Manufar kwangilar wayo a cikin TON

Kafin ka rubuta wani abu, kana buƙatar gano ko wane bangare za ka kusanci wannan abu daga. Saboda haka, yanzu zan gaya muku abin da sassan tsarin ya ƙunshi. Daidai daidai, waɗanne sassa kuke buƙatar sani don rubuta aƙalla wani nau'in kwangilar aiki.

Za mu mai da hankali kan rubuta kwangila mai wayo da aiki tare TON Virtual Machine (TVM), Fift и FunC, don haka labarin ya fi kama da bayanin ci gaban shirin na yau da kullum. Ba za mu tsaya kan yadda dandalin da kansa yake aiki a nan ba.

Gabaɗaya game da yadda yake aiki TVM da harshe Fift akwai kyawawan takaddun hukuma. Yayin da nake shiga gasar kuma yanzu yayin rubuta kwangilar yanzu, nakan juya zuwa gare ta.

Babban harshen da ake rubuta kwangiloli masu wayo shine FunC. Babu takardun shaida akan shi a halin yanzu, don haka don rubuta wani abu kuna buƙatar nazarin misalan kwangila masu wayo daga ma'ajin aikin hukuma da aiwatar da harshen da kanta a can, kuma zaku iya duba misalan kwangilar wayo daga baya biyu. gasa. Hanyoyin haɗi a ƙarshen labarin.

Bari mu ce mun riga mun rubuta kwangila mai wayo don FunC, Bayan haka muna tattara lambar zuwa Fift assembler.

Ƙwararrun kwangilar wayo da aka haɗa ya rage don buga shi. Don yin wannan kuna buƙatar rubuta aiki a ciki Fift, wanda zai ɗauki lambar kwangila mai wayo da wasu sigogi a matsayin shigarwa, kuma fitarwa zai zama fayil tare da tsawo .boc (wanda ke nufin "jakar kwayoyin halitta"), kuma, dangane da yadda muke rubuta shi, maɓalli na sirri da adireshin, wanda aka ƙirƙira bisa la'akari da lambar kwangila mai wayo. Kuna iya aika gram zuwa adireshin kwangilar wayo wanda ba a buga ba tukuna.

Don buga kwangila mai wayo a cikin TON da aka karɓa .boc za a buƙaci a aika fayil ɗin zuwa blockchain ta amfani da abokin ciniki mai haske (ƙari akan abin da ke ƙasa). Amma kafin bugawa, kuna buƙatar canja wurin gram zuwa adireshin da aka samar, in ba haka ba ba za a buga kwangilar wayo ba. Bayan bugawa, zaku iya hulɗa tare da kwangilar wayo ta hanyar aika saƙon daga waje (misali, ta amfani da abokin ciniki mai haske) ko daga ciki (misali, kwangilar wayo yana aika wani sako cikin TON).

Da zarar mun fahimci yadda ake buga lambar, zai zama sauƙi. Mun san kusan abin da muke so mu rubuta da kuma yadda shirinmu zai yi aiki. Kuma yayin rubutawa, muna neman yadda aka riga aka aiwatar da wannan a cikin kwangiloli masu kaifin basira, ko kuma mu duba cikin lambar aiwatarwa Fift и FunC a cikin ma'ajiyar hukuma, ko duba cikin takaddun hukuma.

Sau da yawa na kan nemi keywords a cikin Telegram chat inda dukkan mahalarta gasar da ma'aikatan Telegram suka taru, kuma hakan ya faru ne a yayin gasar kowa ya taru a wurin ya fara tattaunawa kan Fift and FunC. Link a karshen labarin.

Lokaci yayi don matsawa daga ka'idar zuwa aiki.

Shirya yanayi don aiki tare da TON

Na yi duk abin da za a bayyana a cikin labarin akan MacOS kuma na duba shi sau biyu a cikin Ubuntu 18.04 LTS mai tsabta akan Docker.

Abu na farko da kake buƙatar yi shine saukewa kuma shigar lite-client wanda zaku iya aika buƙatun zuwa TON.

Umarnin akan gidan yanar gizon hukuma yana bayyana tsarin shigarwa a cikin daki-daki kuma a sarari kuma ya tsallake wasu cikakkun bayanai. Anan muna bin umarnin, shigar da abubuwan dogaro da suka ɓace a hanya. Ban tattara kowane aikin da kaina ba kuma na shigar da shi daga wurin ajiyar Ubuntu na hukuma (akan MacOS da na yi amfani da shi 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 

Da zarar an shigar da duk abin dogara za ku iya shigarwa lite-client, Fift, FunC.

Na farko, muna rufe ma'ajiyar TON tare da abubuwan dogaronta. Don saukakawa, za mu yi komai a cikin babban fayil ~/TON.

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

Ma'ajiyar ajiyar kuma tana adana abubuwan aiwatarwa Fift и FunC.

Yanzu mun shirya don haɗa aikin. An kulle lambar ma'adana cikin babban fayil ~/TON/ton. A ~/TON ƙirƙirar babban fayil build da tattara aikin a cikinsa.

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

Tun da za mu rubuta kwangila mai wayo, ba muna buƙatar kawai ba lite-clientamma Fift с FunC, don haka bari mu tattara komai. Ba tsari bane mai sauri, don haka muna jira.

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

Na gaba, zazzage fayil ɗin sanyi wanda ya ƙunshi bayanai game da kumburin zuwa wanda lite-client za su haɗa.

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

Yin buƙatun farko zuwa TON

Yanzu bari mu kaddamar lite-client.

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

Idan ginin ya yi nasara, to bayan ƙaddamarwa za ku ga log na haɗin haɗin abokin ciniki zuwa kumburi.

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

Kuna iya gudanar da umarni help kuma duba waɗanne umarni suke samuwa.

help

Bari mu lissafa dokokin da za mu yi amfani da su a wannan labarin.

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

Yanzu mun shirya don rubuta kwangilar kanta.

Aiwatarwa

Idea

Kamar yadda na rubuta a sama, kwangilar wayo da muke rubutawa caca ce.

Haka kuma, wannan ba irin caca bane wanda kuke buƙatar siyan tikitin ku jira awa ɗaya, rana ko wata, amma nan take wanda mai amfani ya canza zuwa adireshin kwangila. N grams, kuma nan take ya dawo da shi 2 * N grams ko asara. Za mu yi yuwuwar samun nasara kusan kashi 40%. Idan babu isasshen gram don biyan kuɗi, to za mu yi la'akari da ma'amala azaman ƙari.

Bugu da ƙari, yana da mahimmanci cewa za a iya ganin fare a cikin ainihin lokaci kuma a cikin tsari mai dacewa, don haka mai amfani zai iya gane nan da nan ko ya ci nasara ko ya rasa. Don haka, kuna buƙatar yin gidan yanar gizon da zai nuna fare da sakamako kai tsaye daga TON.

Rubutun kwangila mai wayo

Don dacewa, na haskaka lambar don FunC; ana iya samun plugin ɗin kuma shigar da shi a cikin Binciken Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin, idan kuna son ƙara wani abu ba zato ba tsammani, na sanya plugin ɗin a bainar jama'a. Har ila yau, wani a baya ya yi plugin don aiki tare da Fift, za ku iya shigar da shi kuma ku same shi a cikin VSC.

Nan da nan mu ƙirƙiri wurin ajiya inda za mu aikata matsakaicin sakamakon.

Don sauƙaƙe rayuwar mu, za mu rubuta kwangila mai wayo kuma mu gwada shi a gida har sai ya shirya. Sai bayan haka za mu buga shi a TON.

Kwangilar mai wayo tana da hanyoyin waje guda biyu waɗanda za a iya samun dama ga su. Na farko, recv_external() Ana aiwatar da wannan aikin ne lokacin da buƙatar kwangilar ta fito daga waje, wato, ba daga TON ba, misali, lokacin da mu kanmu ke samar da saƙo kuma mu aika ta hanyar abokin ciniki. Na biyu, recv_internal() wannan shine lokacin, a cikin TON kanta, kowane kwangila yana nufin namu. A lokuta biyu, zaku iya wuce sigogi zuwa aikin.

Bari mu fara da misali mai sauƙi wanda zai yi aiki idan an buga shi, amma babu wani nauyin aiki a ciki.

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

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

Anan muna buƙatar bayyana menene slice. Duk bayanan da aka adana a cikin TON Blockchain tarin ne TVM cell ko kuma kawai cell, a cikin irin wannan tantanin halitta zaka iya adana bayanai har zuwa bits 1023 da kuma hanyoyin haɗin kai zuwa wasu sel guda 4.

TVM cell slice ko slice wannan bangare ne na wanda ake da shi cell ana amfani da shi don tantance shi, zai bayyana a baya. Babban abu a gare mu shi ne cewa za mu iya canja wurin slice kuma ya danganta da nau'in sakon, sarrafa bayanan a ciki recv_external() ko recv_internal().

impure - kalma mai mahimmanci wanda ke nuna cewa aikin yana canza bayanan kwangilar wayo.

Mu ajiye lambar kwangila a ciki lottery-code.fc da tattarawa.

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

Ana iya ganin ma'anar tutoci ta amfani da umarnin

~/TON/build/crypto/func -help

Mun harhada fift assembler code a ciki 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

Ana iya kaddamar da shi a gida, don wannan za mu shirya yanayin.

Lura cewa layin farko yana haɗi Asm.fif, wannan lambar ce da aka rubuta a cikin Fift don masu tarawa Biyar.

Tun da muna son gudu da gwada kwangilar wayo a gida, za mu ƙirƙiri fayil lottery-test-suite.fif kuma kwafi lambar da aka haɗa a can, maye gurbin layi na ƙarshe a cikinsa, wanda ke rubuta lambar kwangilar mai kaifin baki zuwa dindindin codedon canja wurin shi zuwa injin kama-da-wane:

"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

Ya zuwa yanzu ya bayyana a sarari, yanzu bari mu ƙara zuwa wannan fayil ɗin lambar da za mu yi amfani da ita don ƙaddamar da 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 muna yin rikodin mahallin, wato, bayanan da za a ƙaddamar da TVM (ko hanyar sadarwa). Ko a lokacin gasar, daya daga cikin masu haɓaka ya nuna yadda ake ƙirƙira c7 kuma na kwafi. A cikin wannan labarin muna iya buƙatar canzawa rand_seed tunda ƙirƙira lambar bazuwar ya dogara da ita kuma idan ba a canza ba, adadin ɗaya zai dawo kowane lokaci.

recv_internal и recv_external madaidaitan tare da ƙimar 0 da -1 za su kasance da alhakin kiran ayyukan da suka dace a cikin kwangilar wayo.

Yanzu muna shirye don ƙirƙirar gwajin farko don kwangilar wayo mara kyau. Don bayyanawa, a yanzu za mu ƙara duk gwaje-gwaje zuwa fayil iri ɗaya lottery-test-suite.fif.

Bari mu haifar da m storage kuma ku rubuta komai a ciki cell, wannan zai zama mai wayo kwangila ajiya.

message Wannan shine saƙon da za mu isar da shi zuwa ga mai kaifin basira daga waje. Za mu kuma sanya shi fanko a yanzu.

variable storage 
<b b> storage ! 

variable message 
<b b> message ! 

Bayan mun shirya masu daidaitawa da masu canji, muna ƙaddamar da TVM ta amfani da umarnin runvmctx kuma wuce sigogin da aka ƙirƙira zuwa shigarwar.

message @ 
recv_external 
code 
storage @ 
c7 
runvmctx 

A karshe za mu yi nasara kamar wancan matsakaici code don Fift.

Yanzu za mu iya gudanar da sakamakon code.

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

Ya kamata shirin ya gudana ba tare da kurakurai ba kuma a cikin fitarwa za mu ga log ɗin aiwatarwa:

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

Mai girma, mun rubuta sigar aikin farko na kwangilar wayo.

Yanzu muna buƙatar ƙara ayyuka. Da farko bari mu magance saƙonnin da suka zo daga waje duniya zuwa recv_external()

Mai haɓakawa da kansa ya zaɓi tsarin saƙon da kwangilar za ta iya karɓa.

Amma yawanci

  • na farko, muna son mu kare kwangilar mu daga waje kuma mu sanya ta yadda mai kwangila kawai zai iya aika saƙon waje zuwa gare ta.
  • Na biyu, idan muka aika da ingantaccen saƙo zuwa TON, muna son hakan ya faru sau ɗaya kuma idan muka sake aika saƙon guda ɗaya, kwangilar smart ta ƙi shi.

Don haka kusan kowace kwangila tana magance waɗannan matsalolin guda biyu, tunda kwangilarmu ta karɓi saƙon waje, muna buƙatar kula da hakan ma.

Za mu yi shi a bi da bi. Na farko, bari mu magance matsalar ta hanyar maimaitawa, idan kwangilar ta riga ta karɓi irin wannan saƙon kuma ta sarrafa shi, ba za ta sake aiwatar da shi a karo na biyu ba. Sannan za mu warware matsalar ta yadda wasu da’irar mutane kawai za su iya aika saƙon zuwa kwangilar wayo.

Akwai hanyoyi daban-daban don magance matsalar tare da kwafin saƙonni. Ga yadda za mu yi. A cikin kwangilar wayo, muna fara lissafin saƙonnin da aka karɓa tare da ƙimar farko 0. A cikin kowane saƙo zuwa kwangilar wayo, za mu ƙara ƙimar ƙima na yanzu. Idan ƙima a cikin saƙon bai dace da ƙima a cikin kwangilar wayo ba, to ba za mu sarrafa shi ba; idan ya yi, to, mu sarrafa shi kuma mu ƙara counter a cikin kwangilar wayo ta 1.

Mu koma lottery-test-suite.fif kuma ƙara gwaji na biyu gare shi. Idan muka aika lambar da ba daidai ba, lambar ya kamata ta jefa banda. Misali, bari bayanan kwangilar su adana 166, kuma za mu aika 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"

Mu kaddamar.

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

Kuma za mu ga cewa an yi gwajin tare da kuskure.

[ 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

A wannan mataki lottery-test-suite.fif kamata yayi kama mahada.

Yanzu bari mu ƙara da counter dabaru zuwa smart kwangila a 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 karya ne sakon da muke aikawa.

Abu na farko da za mu yi shi ne bincika idan sakon ya ƙunshi bayanai, idan ba haka ba, to kawai mu fita.

Na gaba za mu rarraba sakon. in_msg~load_uint(32) Yana ɗaukar lambar 165, 32-bit unsigned int daga sakon da aka watsa.

Na gaba za mu loda 32 ragowa daga ma'ajin kwangila mai wayo. Mun duba cewa lambar da aka ɗora ta yi daidai da wadda aka wuce, idan ba haka ba, mun jefa keɓantacce. A wajenmu, tun da ba wasa muke yi ba, to sai a jefar da wani banda.

Yanzu bari mu tattara.

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

Kwafi sakamakon lambar zuwa lottery-test-suite.fif, ba tare da mantawa don maye gurbin layi na ƙarshe ba.

Mun duba cewa gwajin ya wuce:

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

A nan Kuna iya ganin alƙawarin da ya dace tare da sakamakon yanzu.

Yi la'akari da cewa yana da wahala a koyaushe kwafin lambar da aka haɗa ta kwangilar wayo a cikin fayil tare da gwaje-gwaje, don haka za mu rubuta rubutun da zai rubuta mana lambar a cikin dindindin, kuma za mu haɗa lambar da aka haɗa zuwa gwaje-gwajenmu ta amfani da "include".

Ƙirƙiri fayil a cikin babban fayil ɗin aikin build.sh tare da abun ciki mai zuwa.

#!/bin/bash

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

Bari mu sanya shi aiwatarwa.

chmod +x ./build.sh

Yanzu, kawai gudanar da rubutun mu don haɗa kwangilar. Amma banda wannan, muna buƙatar rubuta shi a cikin kullun code. Don haka za mu ƙirƙiri sabon fayil lotter-compiled-for-test.fif, wanda za mu haɗa a cikin fayil ɗin lottery-test-suite.fif.

Bari mu ƙara skirpt code zuwa sh, wanda kawai zai kwafi fayil ɗin da aka haɗa a ciki lotter-compiled-for-test.fif kuma canza layi na ƙarshe a ciki.

# 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

Yanzu, don bincika, bari mu gudanar da rubutun sakamakon kuma za a samar da fayil lottery-compiled-for-test.fif, wanda za mu hada a cikin namu lottery-test-suite.fif

В lottery-test-suite.fif share lambar kwangila kuma ƙara layin "lottery-compiled-for-test.fif" include.

Muna gudanar da gwaje-gwaje don tabbatar da cewa sun ci.

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

Mai girma, yanzu don sarrafa ƙaddamar da gwaje-gwaje, bari mu ƙirƙiri fayil test.sh, wanda zai fara aiwatarwa build.sh, sa'an nan kuma gudanar da gwaje-gwaje.

touch test.sh
chmod +x test.sh

Muna rubutu a ciki

./build.sh 

echo "nCompilation completedn"

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

Mu yi test.sh kuma gudanar da shi don tabbatar da cewa gwaje-gwajen sun yi aiki.

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

Muna duba cewa kwangilar ta tattara kuma an aiwatar da gwaje-gwajen.

Mai girma, yanzu akan farawa test.sh Za a hada gwaje-gwajen kuma za a gudanar da su nan da nan. Ga hanyar haɗi zuwa aikata.

To, kafin mu ci gaba, bari mu ƙara yin abu ɗaya don dacewa.

Bari mu ƙirƙiri babban fayil build inda za mu adana kwafin kwangila da clone da aka rubuta zuwa akai-akai lottery-compiled.fif, lottery-compiled-for-test.fif. Bari kuma mu ƙirƙiri babban fayil test a ina za a adana fayil ɗin gwaji? lottery-test-suite.fif da yuwuwar wasu fayilolin masu goyan baya. Hanyar haɗi zuwa canje-canje masu dacewa.

Bari mu ci gaba da haɓaka kwangilar wayo.

Bayan haka ya kamata a yi gwajin da zai duba cewa an karɓi saƙon kuma ana sabunta na'urar a cikin kantin sayar da idan muka aika madaidaicin lamba. Amma za mu yi hakan daga baya.

Yanzu bari muyi tunani game da tsarin bayanan da abin da bayanai ke buƙatar adanawa a cikin kwangilar wayo.

Zan kwatanta duk abin da muka adana.

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

Na gaba kuna buƙatar rubuta ayyuka biyu. Mu kira na farko pack_state(), wanda zai tattara bayanan don adanawa na gaba a cikin ajiyar kwangilar wayo. Mu kira na biyu unpack_state() zai karanta kuma ya dawo da bayanai daga ajiya.

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

Mun ƙara waɗannan ayyuka biyu zuwa farkon kwangilar wayo. Zai yi aiki kamar wancan matsakaicin sakamako.

Don ajiye bayanai kuna buƙatar kiran ginanniyar aikin set_data() kuma zai rubuta bayanai daga pack_state() a cikin smart kwangila ajiya.

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

Yanzu da muna da ayyuka masu dacewa don rubutawa da karanta bayanai, za mu iya ci gaba.

Muna buƙatar bincika cewa saƙon da ke shigowa daga waje mai mallakar kwangila ne ya sa hannu (ko wani mai amfani da ke da damar yin amfani da maɓalli na sirri).

Lokacin da muka buga kwangilar wayo, za mu iya fara shi tare da bayanan da muke buƙata a cikin ma'adana, waɗanda za a adana don amfani a gaba. Za mu yi rikodin maɓalli na jama'a a can don mu iya tabbatar da cewa an sa hannu kan saƙon mai shigowa tare da maɓalli na sirri daidai.

Kafin mu ci gaba, bari mu ƙirƙiri maɓalli na sirri mu rubuta zuwa gare shi test/keys/owner.pk. Don yin wannan, bari mu ƙaddamar da Fift a cikin yanayin hulɗa kuma mu aiwatar da umarni huɗu.

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

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

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

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

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

Bari mu ƙirƙiri babban fayil keys cikin babban fayil test kuma rubuta keɓaɓɓen maɓalli a wurin.

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

Muna ganin fayil a cikin babban fayil na yanzu owner.pk.

Muna cire maɓallin jama'a daga tari kuma lokacin da ake buƙata za mu iya samun shi daga na sirri.

Yanzu muna buƙatar rubuta tabbacin sa hannu. Bari mu fara da gwajin. Da farko mun karanta maɓalli na sirri daga fayil ta amfani da aikin file>B kuma rubuta shi zuwa ma'auni owner_private_key, sannan amfani da aikin priv>pub canza maɓalli na sirri zuwa maɓalli na jama'a kuma rubuta sakamakon a ciki 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 !

Za mu buƙaci maɓallan biyu.

Muna ƙaddamar da ma'ajin kwangila mai wayo tare da bayanan sabani a cikin jeri ɗaya kamar a cikin aikin pack_state()kuma rubuta shi a cikin wani m storage.

variable owner_private_key
variable owner_public_key 
variable orders
variable owner_wc
variable owner_account_id

"./keys/owner.pk" file>B owner_private_key !
owner_private_key @ priv>pub owner_public_key !
dictnew orders !
0 owner_wc !
0 owner_account_id !

<b 0 32 u, owner_public_key @ B, 0 32 u, 0 32 u, 0 Gram, 0 Gram, owner_wc @ 32 i, owner_account_id @ 256 u,  orders @ dict, b> storage !

Na gaba, za mu rubuta sa hannun sa hannu, zai ƙunshi sa hannu kawai da ƙimar ƙima.

Da farko, muna ƙirƙirar bayanan da muke son watsawa, sannan mu sanya hannu tare da maɓalli na sirri kuma a ƙarshe mun samar da sa hannun sa hannu.

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 !  

A sakamakon haka, ana yin rikodin saƙon da za mu aika zuwa kwangilar wayo a cikin wani canji message_to_send, game da ayyuka hashu, ed25519_sign_uint za ku iya karantawa a cikin Fift takardun.

Kuma don gudanar da gwajin mu sake kira.

message_to_send @ 
recv_external 
code 
storage @
c7
runvmctx

Kamar wannan Fayil ɗin tare da gwaje-gwaje yakamata yayi kama da wannan a wannan matakin.

Bari mu yi gwajin kuma za ta fadi, don haka za mu canza kwangilar smart ta yadda za ta iya karɓar saƙonnin wannan tsari kuma a tabbatar da sa hannu.

Da farko, za mu ƙidaya rago 512 na sa hannu daga saƙon kuma mu rubuta shi zuwa maɗaukaki, sannan mu ƙidaya 32 ragowa na ma'aunin ma'aunin.

Tun da muna da aiki don karanta bayanai daga ajiyar kwangilar wayo, za mu yi amfani da shi.

Na gaba shine duba na'urar da aka canjawa wuri tare da ma'ajiyar da duba sa hannun. Idan wani abu bai dace ba, to muna jefa banda tare da lambar da ta dace.

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

Alkawari mai dacewa dama a nan.

Bari mu gudanar da gwaje-gwajen mu ga cewa gwajin na biyu ya fadi. Don dalilai guda biyu, babu isassun ragowa a cikin saƙon kuma babu isassun raƙuman ruwa a cikin ma'ajiyar, don haka lambar ta fashe lokacin yin nazari. Muna buƙatar ƙara sa hannu a cikin saƙon da muke aikawa da kwafin ajiya daga gwaji na ƙarshe.

A cikin gwaji na biyu, za mu ƙara sa hannun saƙon saƙo kuma mu canza ma'ajiyar kwangila mai wayo. Kamar wannan fayil ɗin tare da gwaje-gwaje yayi kama a wannan lokacin.

Bari mu rubuta gwaji na huɗu, inda za mu aika da saƙon da aka sa hannu tare da maɓallin sirri na wani. Bari mu ƙirƙiri wani maɓalli na sirri kuma mu ajiye shi zuwa fayil not-owner.pk. Za mu sanya hannu kan saƙon da wannan maɓalli na sirri. Bari mu gudanar da gwaje-gwaje kuma mu tabbatar cewa duk gwaje-gwajen sun wuce. Aikata a wannan lokacin.

Yanzu za mu iya ƙarshe matsawa zuwa aiwatar da dabarar kwangilar wayo.
В recv_external() za mu karbi sakonni iri biyu.

Tunda kwantiragin mu zai tara asarar ’yan wasa, dole ne a tura wannan kudi zuwa ga wanda ya yi caca. Ana yin rikodin adireshin walat na mahaliccin caca a cikin ma'ajiyar lokacin da aka ƙirƙiri kwangilar.

Kawai idan, muna buƙatar ikon canza adireshin da muke aika gram na masu hasara zuwa gare shi. Hakanan ya kamata mu iya aika gram daga caca zuwa adireshin mai shi.

Bari mu fara da na farko. Bari mu fara rubuta gwajin da zai bincika cewa bayan aika saƙon, kwangilar wayo ta adana sabon adireshin a cikin ma'ajiyar. Lura cewa a cikin sakon, ban da counter da sabon adireshin, muna kuma aikawa action Lambar lamba 7-bit mara kyau, dangane da shi, za mu zaɓi yadda ake aiwatar da saƙo a cikin kwangilar wayo.

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

A cikin gwajin zaku iya ganin yadda aka lalata ma'ajin kwangilar smart storage a cikin biyar. An kwatanta ɓarna masu canji a cikin takaddun Fift.

Ƙaddamar da hanyar haɗin gwiwa tare da kara kullu.

Bari mu yi gwajin kuma mu tabbatar da cewa ta fadi. Yanzu bari mu ƙara dabaru don canza adireshin mai irin caca.

A cikin wayo kwangila muna ci gaba da parse message, karatu a ciki action. Bari mu tunatar da ku cewa za mu sami biyu action: canza adireshi kuma aika gram.

Sa'an nan kuma mu karanta sabon adireshin mai kwangila kuma mu ajiye shi a cikin ajiya.
Muna gudanar da gwaje-gwajen kuma mun ga cewa gwajin na uku ya fadi. Ya fadi saboda gaskiyar cewa kwangilar a yanzu ta kuma rarraba 7 rago daga saƙon, waɗanda suka ɓace a cikin gwajin. Ƙara wanda babu shi zuwa saƙon action. Bari mu gudanar da gwaje-gwajen mu ga cewa komai ya wuce. Haka sadaukar da canje-canje. Mai girma.

Yanzu bari mu rubuta dabaru don aika takamaiman adadin gram zuwa adireshin da aka ajiye a baya.

Da farko, bari mu rubuta gwaji. Za mu rubuta gwaje-gwaje biyu, ɗaya lokacin da babu isasshen ma'auni, na biyu lokacin da komai ya kamata ya wuce cikin nasara. Ana iya duba gwaje-gwaje cikin wannan alkawari.

Yanzu bari mu ƙara code. Da farko, bari mu rubuta hanyoyin taimako guda biyu. Hanyar samun farko ita ce gano ma'auni na yanzu na kwangila mai wayo.

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

Kuma na biyu shine don aika gram zuwa wani kwangila mai wayo. Na kwafi wannan hanyar gaba ɗaya daga wata kwangila mai wayo.

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

Bari mu ƙara waɗannan hanyoyi guda biyu zuwa kwangilar wayo kuma mu rubuta dabaru. Da farko, muna rarraba adadin gram daga saƙon. Na gaba muna duba ma'auni, idan bai isa ba mu jefa banda. Idan komai yana da kyau, to muna aika gram zuwa adireshin da aka ajiye kuma mu sabunta ma'aunin.

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

Kamar wannan yayi kama da kwangilar wayo a wannan lokacin. Mu gudanar da gwaje-gwajen mu tabbatar sun ci.

Af, ana cire kwamiti daga kwangilar wayo a kowane lokaci don saƙon da aka sarrafa. Domin saƙon kwangila masu wayo don aiwatar da buƙatun, bayan bincike na asali kuna buƙatar kira accept_message().

Yanzu bari mu matsa zuwa saƙonnin ciki. Haƙiƙa, gram ɗin kawai za mu karɓi gram ne kawai mu mayar wa mai kunnawa ninki biyu idan ya ci nasara kuma na uku ga mai shi idan ya yi rashin nasara.

Da farko, bari mu rubuta gwaji mai sauƙi. Don yin wannan, muna buƙatar adireshin gwaji na kwangilar wayo daga abin da muke tsammanin aika gram zuwa kwangilar wayo.

Adireshin kwangila mai wayo ya ƙunshi lambobi biyu, lamba 32-bit da ke da alhakin sarkar aiki da lambar asusu na musamman mara 256-bit a cikin wannan sarkar aiki. Misali, -1 da 12345, wannan shine adireshin da zamu ajiye a cikin fayil.

Na kwafi aikin don ajiye adireshin daga 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

Bari mu dubi yadda aikin yake aiki, wannan zai ba da fahimtar yadda Fift ke aiki. Kaddamar da Fift a cikin yanayin hulɗa.

~/TON/build/crypto/fift -i 

Da farko muna tura -1, 12345 da sunan fayil ɗin nan gaba "sender.addr" akan tari:

-1 12345 "sender.addr" 

Mataki na gaba shine aiwatar da aikin -rot, wanda ke canza tari ta yadda a saman tarin akwai lambar kwangilar wayo ta musamman:

"sender.addr" -1 12345

256 u>B yana canza lamba 256-bit mara kyau zuwa bytes.

"sender.addr" -1 BYTES:0000000000000000000000000000000000000000000000000000000000003039

swap musanya manyan abubuwa biyu na tari.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 -1

32 i>B yana canza lamba 32-bit zuwa bytes.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 BYTES:FFFFFFFF

B+ yana haɗa jeri biyu na bytes.

 "sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF

Har yanzu swap.

BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF "sender.addr" 

Kuma a ƙarshe an rubuta bytes zuwa fayil ɗin B>file. Bayan wannan tarin mu babu kowa. Mu tsaya Fift. An ƙirƙiri fayil a cikin babban fayil na yanzu sender.addr. Bari mu matsar da fayil ɗin zuwa babban fayil ɗin da aka ƙirƙira test/addresses/.

Bari mu rubuta gwaji mai sauƙi wanda zai aika gram zuwa kwangila mai wayo. Ga alƙawarin.

Yanzu bari mu dubi dabaru na irin caca.

Abu na farko da muke yi shine duba sakon bounced ko ba idan bounced, to mu yi watsi da shi. bounced yana nufin cewa kwangilar za ta dawo da gram idan wasu kuskure sun faru. Ba za mu dawo da gram ba idan kuskure ya faru ba zato ba tsammani.

Mun bincika, idan ma'auni bai wuce rabin gram ba, to kawai mu karɓi saƙon kuma muyi watsi da shi.

Na gaba, za mu raba adireshin kwangilar wayo daga abin da saƙon ya fito.

Muna karanta bayanan daga ma'adana sannan mu share tsoffin fare daga tarihi idan akwai sama da ashirin daga cikinsu. Don saukakawa, na rubuta ƙarin ayyuka uku pack_order(), unpack_order(), remove_old_orders().

Na gaba, muna duba idan ma'auni bai isa ba don biyan kuɗi, to, mun yi la'akari da cewa wannan ba fare ba ne, amma sake cikawa da ajiyewa a ciki. orders.

Sa'an nan a karshe jigon kwangila mai wayo.

Na farko, idan mai kunnawa ya yi hasara, muna ajiye shi a cikin tarihin yin fare kuma idan adadin ya wuce gram 3, muna aika 1/3 ga mai kwangila mai wayo.

Idan mai kunnawa ya yi nasara, to muna aika adadin ninki biyu zuwa adireshin mai kunnawa sannan mu adana bayanan game da fare a tarihi.

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

Wannan duka. Alkawari mai dacewa.

Yanzu duk abin da ya rage yana da sauƙi, bari mu ƙirƙiri hanyoyin samun-hanyoyi don mu sami bayanai game da yanayin kwangilar daga duniyar waje (a zahiri, karanta bayanan daga ajiyar kwangilar su mai wayo).

Bari mu ƙara samun hanyoyin. Za mu rubuta a ƙasa game da yadda ake karɓar bayani game da kwangila mai wayo.

Na kuma manta da ƙara lambar da za ta aiwatar da buƙatun farko da ke faruwa lokacin buga kwangilar wayo. Alkawari mai dacewa. Kuma gaba gyara bug tare da aika 1/3 na adadin zuwa asusun mai shi.

Mataki na gaba shine buga kwangilar wayo. Bari mu ƙirƙiri babban fayil requests.

Na ɗauki lambar bugawa a matsayin tushe simple-wallet-code.fc wanda za a iya samu a cikin ma'ajiyar hukuma.

Wani abu da ya dace a kula da shi. Muna samar da ma'ajin kwangila mai wayo da saƙon shigarwa. Bayan haka, an samar da adireshin kwangilar wayo, wato, adireshin an san shi tun kafin a buga shi a cikin TON. Bayan haka, kuna buƙatar aika gram da yawa zuwa wannan adireshin, kuma bayan haka kuna buƙatar aika fayil tare da kwangilar wayo da kanta, tunda cibiyar sadarwar ta ɗauki kwamiti don adana kwangilar wayo da aiki a ciki (masu tabbatarwa waɗanda ke adanawa da aiwatar da wayo. kwangila). Ana iya duba lambar a nan.

Na gaba muna aiwatar da lambar bugawa kuma mu samu lottery-query.boc smart kwangila fayil da adireshin.

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

Kar a manta da adana fayilolin da aka samar: lottery-query.boc, lottery.addr, lottery.pk.

Daga cikin wasu abubuwa, za mu ga adireshin kwangilar wayo a cikin rajistan ayyukan.

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

Don jin daɗi kawai, bari mu yi buƙatar TON

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

Kuma za mu ga cewa asusun da wannan adireshin babu kowa.

account state is empty

Mun aika zuwa adireshin 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd 2 Gram kuma bayan ƴan daƙiƙa muna aiwatar da umarni iri ɗaya. Don aika gram ina amfani hukuma walat, kuma zaka iya tambayar wani daga hira don gwajin gwajin, wanda zan yi magana game da shi a ƙarshen labarin.

> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Yana kama da wanda ba a fara ba (state:account_uninit) kwangila mai wayo tare da adireshin iri ɗaya da ma'auni na nanogram 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

Yanzu bari mu buga kwangilar wayo. Bari mu kaddamar da lite-abokin ciniki da aiwatar.

> 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 

Bari mu duba cewa an buga kwangilar.

> last
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Daga cikin abubuwan da muke samu.

  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

Muna ganin haka account_active.

Canje-canjen da aka yi daidai dama a nan.

Yanzu bari mu ƙirƙiri buƙatun don yin hulɗa tare da kwangila mai wayo.

Mafi daidai, za mu bar na farko don canza adireshin a matsayin aiki mai zaman kansa, kuma za mu yi na biyu don aikawa da gram zuwa adireshin mai shi. A gaskiya ma, za mu buƙaci yin abu ɗaya kamar yadda a cikin gwajin aikawa da gram.

Wannan shi ne sakon da za mu aika zuwa ga smart contract, inda msg_seqno 165, action 2 da 9.5 grams don aikawa.

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

Kar a manta ku sanya hannu kan saƙon tare da maɓallin keɓaɓɓen ku lottery.pk, wanda aka samar a baya lokacin ƙirƙirar kwangila mai kaifin baki. Ga alƙawarin da ya dace.

Karɓar bayanai daga kwangilar wayo ta amfani da hanyoyin samun

Yanzu bari mu dubi yadda za a gudanar da smart kwangila samun hanyoyin.

Kaddamarwa lite-client da kuma gudanar da samun hanyoyin da muka rubuta.

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

В result ya ƙunshi ƙimar da aikin ke dawowa balance() daga kwangilarmu mai wayo.
Za mu yi haka don ƙarin hanyoyin da yawa.

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

Mu nemi tarihin fare ku.

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

Za mu yi amfani da lite-abokin ciniki da samun hanyoyin da za a nuna bayanai game da smart kwangila a kan site.

Nuna bayanan kwangilar wayo akan gidan yanar gizon

Na rubuta gidan yanar gizo mai sauƙi a cikin Python don nuna bayanan daga kwangilar wayo ta hanyar da ta dace. A nan ba zan tsaya a kansa daki-daki ba kuma zan buga shafin cikin alkawari daya.

Ana yin buƙatun zuwa TON daga Python tare da taimakon lite-client. Don saukakawa, an tattara rukunin yanar gizon a cikin Docker kuma an buga shi akan Google Cloud. mahada.

Gwada

Yanzu bari mu yi kokarin aika gram a can domin replenishment daga walat. Za mu aika 40 grams. Kuma bari mu yi fare biyu don tsabta. Mun ga cewa rukunin yanar gizon yana nuna tarihin fare, adadin nasara na yanzu da sauran bayanai masu amfani.

Muna ganicewa mun ci na farko, muka yi rashin nasara na biyu.

Bayanword

Labarin ya juya ya fi tsayi fiye da yadda nake tsammani, watakila yana iya zama ya fi guntu, ko watakila kawai ga mutumin da bai san kome ba game da TON kuma yana son rubutawa da buga kwangilar wayo mai sauƙi mai sauƙi tare da ikon yin hulɗa da shi. shi. Wataƙila an yi bayanin wasu abubuwa cikin sauƙi.

Wataƙila wasu abubuwan aiwatarwa za a iya yin su cikin inganci da kyau, amma sai ya ɗauki ƙarin lokaci don shirya labarin. Hakanan yana yiwuwa na yi kuskure a wani wuri ko ban fahimci wani abu ba, don haka idan kuna yin wani abu mai mahimmanci, kuna buƙatar dogaro da takaddun hukuma ko wurin ajiyar hukuma tare da lambar TON.

Ya kamata a lura cewa tun da TON kanta har yanzu yana cikin ci gaba mai aiki, canje-canje na iya faruwa wanda zai karya kowane matakai a cikin wannan labarin (wanda ya faru yayin da nake rubutawa, an riga an gyara shi), amma tsarin gaba ɗaya shine. mai yuwuwa ya canza.

Ba zan yi magana game da makomar TON ba. Wataƙila dandalin zai zama wani abu mai girma kuma ya kamata mu ciyar da lokaci don nazarin shi kuma mu cika wani wuri tare da samfuranmu a yanzu.

Hakanan akwai Libra daga Facebook, wanda ke da yuwuwar masu sauraron masu amfani da suka fi TON girma. Ban san kusan komai game da Libra ba, idan aka yi la'akari da taron akwai ayyuka da yawa a can fiye da al'ummar TON. Kodayake masu haɓakawa da al'ummar TON sun fi kama da ƙasa, wanda kuma yana da kyau.

nassoshi

  1. Takardun TON na hukuma: https://test.ton.org
  2. Ma'ajiyar TON ta hukuma: https://github.com/ton-blockchain/ton
  3. Wallet na hukuma don dandamali daban-daban: https://wallet.ton.org
  4. Ma'ajiyar kwangilar Smart daga wannan labarin: https://github.com/raiym/astonished
  5. Hanyar haɗi zuwa gidan yanar gizon kwangila mai wayo: https://ton-lottery.appspot.com
  6. Wurin ajiya don tsawaita na Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Kayayyakin Hulda) don FunC https://github.com/raiym/func-visual-studio-plugin
  7. Yi taɗi game da TON a cikin Telegram, wanda da gaske ya taimaka wajen gano shi a matakin farko. Ina tsammanin ba zai zama kuskure ba idan na ce duk wanda ya rubuta wani abu don TON yana nan. Hakanan zaka iya neman gram gwaji a can. https://t.me/tondev_ru
  8. Wani hira game da TON wanda na sami bayanai masu amfani a ciki: https://t.me/TONgramDev
  9. Matakin farko na gasar: https://contest.com/blockchain
  10. Mataki na biyu na gasar: https://contest.com/blockchain-2

source: www.habr.com

Add a comment