Dwar kif tikteb u tippubblika kuntratt intelliġenti fin-Netwerk Miftuħ tat-Telegram (TON)

Dwar kif tikteb u tippubblika kuntratt intelliġenti f'TON

X'inhu dan l-artikolu dwar?

Fl-artiklu se nitkellem dwar kif ħadt sehem fl-ewwel (minn tnejn) kompetizzjoni tal-blockchain tat-Telegram, ma ħadtx premju, u ddeċidejt li nirreġistra l-esperjenza tiegħi f’artiklu biex ma jegħreqx fl-oblivion u, forsi, ngħin xi ħadd.

Peress li ma ridtx nikteb kodiċi astratt, iżda nagħmel xi ħaġa li taħdem, għall-artiklu ktibt kuntratt intelliġenti għal lotterija instantanja u websajt li turi data ta 'kuntratt intelliġenti direttament minn TON mingħajr ma nuża ħażna intermedja.

L-artiklu se jkun utli għal dawk li jixtiequ jagħmlu l-ewwel kuntratt intelliġenti tagħhom f'TON, iżda ma jafux minn fejn jibdew.

Bl-użu tal-lotterija bħala eżempju, se mmur mill-installazzjoni tal-ambjent għall-pubblikazzjoni ta 'kuntratt intelliġenti, interazzjoni miegħu, u nikteb websajt biex tirċievi u nippubblika data.

Dwar il-parteċipazzjoni fil-kompetizzjoni

F'Ottubru li għadda, Telegram ħabbar kompetizzjoni blockchain b'lingwi ġodda Fift и FunC. Kien meħtieġ li tagħżel milli tikteb xi wieħed mill-ħames kuntratti intelliġenti proposti. Ħsibt li jkun sabiħ li nagħmel xi ħaġa differenti, nitgħallem lingwa u nagħmel xi ħaġa, anke jekk ma jkollix għalfejn nikteb xi ħaġa oħra fil-futur. Barra minn hekk, is-suġġett huwa kontinwament fuq ix-xufftejn.

Ta’ min jgħid li ma kelli l-ebda esperjenza fl-iżvilupp ta’ kuntratti intelliġenti.

Ippjanajt li nipparteċipa sal-aħħar sakemm stajt u mbagħad nikteb artiklu ta 'reviżjoni, iżda fallejt mill-ewwel fl-ewwel wieħed. I kiteb kartiera b'multi-firem mixgħula FunC u ġeneralment ħadem. Ħadtha bħala bażi kuntratt intelliġenti dwar is-Solidità.

Dak iż-żmien, ħsibt li dan żgur kien biżżejjed biex jieħu tal-inqas xi post ta’ premju. Bħala riżultat, madwar 40 minn 60 parteċipant saru rebbieħa tal-premjijiet u jien ma kontx fosthom. B'mod ġenerali, m'hemm xejn ħażin f'dan, iżda ħaġa waħda ddejjaqni. Fiż-żmien tat-tħabbir tar-riżultati, ir-reviżjoni tat-test għall-kuntratt tiegħi ma kinitx saret, staqsejt lill-parteċipanti fiċ-chat jekk kienx hemm xi ħadd ieħor li ma kellux, ma kienx hemm.

Apparentement agħti kas tal-messaġġi tiegħi, jumejn wara l-imħallfin ippubblikaw kumment u għadni ma nifhimx jekk aċċidentalment tilfux il-kuntratt intelliġenti tiegħi waqt il-ġudizzju jew sempliċiment ħasbu li tant kien ħażin li ma kellhiex bżonn kumment. Staqsejt mistoqsija fuq il-paġna, iżda ma rċevejtx tweġiba. Għalkemm mhux sigriet min iġġudika, qiest li mhux meħtieġ li nikteb messaġġi personali.

Intefaq ħafna ħin fuq il-fehim, għalhekk ġie deċiż li tikteb artiklu. Peress li għad m'hemmx ħafna informazzjoni, dan l-artikolu se jgħin biex jiffranka l-ħin għal kull min hu interessat.

Il-kunċett ta 'kuntratti intelliġenti f'TON

Qabel ma tikteb xi ħaġa, trid issib minn liema naħa tavviċina din il-ħaġa. Għalhekk, issa se ngħidlek f'liema partijiet tikkonsisti s-sistema. B'mod aktar preċiż, liema partijiet trid tkun taf sabiex tikteb mill-inqas xi tip ta 'kuntratt tax-xogħol.

Aħna se niffukaw fuq il-kitba ta 'kuntratt intelliġenti u naħdmu miegħu TON Virtual Machine (TVM), Fift и FunC, għalhekk l-artiklu huwa aktar bħal deskrizzjoni tal-iżvilupp ta 'programm regolari. Aħna mhux se noqogħdu fuq kif taħdem il-pjattaforma nnifisha hawn.

B'mod ġenerali dwar kif taħdem TVM u l-lingwa Fift hemm dokumentazzjoni uffiċjali tajba. Waqt li kont qed nipparteċipa fil-kompetizzjoni u issa waqt li nikteb il-kuntratt attwali, ħafna drabi dawwart lejha.

Il-lingwa ewlenija li biha jinkitbu l-kuntratti intelliġenti hija FunC. M'hemm l-ebda dokumentazzjoni dwarha bħalissa, għalhekk biex tikteb xi ħaġa trid tistudja eżempji ta 'kuntratti intelliġenti mir-repożitorju uffiċjali u l-implimentazzjoni tal-lingwa nnifisha hemmhekk, flimkien ma' tista 'tħares lejn eżempji ta' kuntratti intelliġenti mill-aħħar tnejn. kompetizzjonijiet. Links fl-aħħar tal-artiklu.

Ejja ngħidu li diġà ktibna kuntratt intelliġenti għal FunC, wara li niġbru l-kodiċi f'Fift assembler.

Il-kuntratt intelliġenti kkumpilat għad irid jiġi ppubblikat. Biex tagħmel dan għandek bżonn tikteb funzjoni fi Fift, li se tieħu l-kodiċi tal-kuntratt intelliġenti u xi parametri oħra bħala input, u l-output se jkun fajl bl-estensjoni .boc (li tfisser "borża ta 'ċelluli"), u, skond kif niktbuha, ċavetta privata u indirizz, li hija ġġenerata abbażi tal-kodiċi tal-kuntratt intelliġenti. Diġà tista 'tibgħat grammi fl-indirizz ta' kuntratt intelliġenti li għadu ma ġiex ippubblikat.

Biex tippubblika kuntratt intelliġenti f'TON riċevuti .boc il-fajl jeħtieġ li jintbagħat lill-blockchain bl-użu ta 'klijent ħafif (aktar dwar dak hawn taħt). Iżda qabel ma tippubblika, għandek bżonn tittrasferixxi grammi għall-indirizz iġġenerat, inkella l-kuntratt intelliġenti mhux se jiġi ppubblikat. Wara l-pubblikazzjoni, tista 'tinteraġixxi mal-kuntratt intelliġenti billi tibgħatlu messaġġi minn barra (pereżempju, billi tuża klijent ħafif) jew minn ġewwa (per eżempju, kuntratt intelliġenti wieħed jibgħat messaġġ ieħor ġewwa TON).

Ladarba nifhmu kif il-kodiċi jiġi ppubblikat, isir aktar faċli. Nafu bejn wieħed u ieħor dak li rridu niktbu u kif se jaħdem il-programm tagħna. U waqt il-kitba, infittxu kif dan huwa diġà implimentat f'kuntratti intelliġenti eżistenti, jew inħarsu lejn il-kodiċi ta 'implimentazzjoni Fift и FunC fir-repożitorju uffiċjali, jew ħares fid-dokumentazzjoni uffiċjali.

Ħafna drabi kont fittixt kliem ewlieni fiċ-chat tat-Telegram fejn inġabru l-parteċipanti kollha tal-kompetizzjoni u l-impjegati tat-Telegram, u ġara li waqt il-kompetizzjoni kulħadd inġabar hemm u beda jiddiskuti Fift u FunC. Link fl-aħħar tal-artiklu.

Wasal iż-żmien li nimxu mit-teorija għall-prattika.

Tħejjija tal-ambjent biex taħdem ma 'TON

Għamilt dak kollu li se jiġi deskritt fl-artiklu dwar MacOS u ċċekkjah doppju f'Ubuntu 18.04 LTS nadif fuq Docker.

L-ewwel ħaġa li għandek bżonn tagħmel hu li tniżżel u tinstalla lite-client li biha tista’ tibgħat talbiet lil TON.

L-istruzzjonijiet fuq il-websajt uffiċjali jiddeskrivu l-proċess ta 'installazzjoni f'ħafna dettall u b'mod ċar u jħalli barra xi dettalji. Hawnhekk nsegwu l-istruzzjonijiet, ninstallaw id-dipendenzi neqsin tul it-triq. Jien ma kkumpilajtx kull proġett jien u installajt mir-repożitorju uffiċjali ta' Ubuntu (fuq MacOS użajt 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 

Ladarba d-dipendenzi kollha jkunu installati tista 'tinstalla lite-client, Fift, FunC.

L-ewwel, aħna nikklonu r-repożitorju TON flimkien mad-dipendenzi tiegħu. Għall-konvenjenza, aħna se nagħmlu kollox f'folder ~/TON.

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

Ir-repożitorju jaħżen ukoll l-implimentazzjonijiet Fift и FunC.

Issa aħna lesti biex niġbru l-proġett. Il-kodiċi tar-repożitorju huwa kklonat f'folder ~/TON/ton. Fil ~/TON toħloq folder build u iġbor il-proġett fih.

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

Peress li se niktbu kuntratt intelliġenti, għandna bżonn mhux biss lite-clientImma Fift с FunC, mela ejja niġbru kollox. Mhuwiex proċess mgħaġġel, għalhekk qed nistennew.

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

Sussegwentement, niżżel il-fajl tal-konfigurazzjoni li fih data dwar in-nodu li għalih lite-client se jgħaqqdu.

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

Nagħmlu l-ewwel talbiet lil TON

Issa ejja tniedi lite-client.

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

Jekk il-bini kien ta 'suċċess, imbagħad wara t-tnedija se tara log tal-konnessjoni tal-klijent tad-dawl man-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)
...

Tista 'tmexxi l-kmand help u ara x'kmandi huma disponibbli.

help

Ejja elenka l-kmandi li se nużaw f'dan l-artikolu.

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

Issa lesti niktbu l-kuntratt innifsu.

Реализация

Idea

Kif ktibt hawn fuq, il-kuntratt intelliġenti li qed niktbu huwa lotterija.

Barra minn hekk, din mhix lotterija li fiha trid tixtri biljett u tistenna siegħa, jum jew xahar, iżda waħda immedjata li fiha l-utent jittrasferixxi fl-indirizz tal-kuntratt. N grammi, u istantanjament iġibha lura 2 * N grammi jew jitlef. Aħna ser nagħmlu l-probabbiltà li nirbħu madwar 40%. Jekk ma jkunx hemm biżżejjed grammi għall-ħlas, allura nikkunsidraw it-tranżazzjoni bħala top-up.

Barra minn hekk, huwa importanti li l-imħatri jkunu jistgħu jidhru f'ħin reali u f'forma konvenjenti, sabiex l-utent ikun jista' jifhem immedjatament jekk rebaħx jew tilifx. Għalhekk, trid tagħmel websajt li turi l-imħatri u r-riżultati direttament minn TON.

Kitba ta 'kuntratt intelliġenti

Għall-konvenjenza, enfasizzajt il-kodiċi għal FunC; il-plugin jista 'jinstab u jiġi installat fit-tfittxija tal-Kodiċi tal-Visual Studio; jekk f'daqqa waħda trid iżżid xi ħaġa, għamilt il-plugin disponibbli pubblikament. Ukoll, xi ħadd qabel għamel plugin biex jaħdem ma 'Fift, tista' wkoll tinstallah u ssibha f'VSC.

Ejja immedjatament noħolqu repożitorju fejn se nimpenjaw ir-riżultati intermedji.

Biex nagħmlu ħajjitna aktar faċli, aħna se niktbu kuntratt intelliġenti u nittestjawh lokalment sakemm ikun lest. Wara biss se nippubblikawha f'TON.

Il-kuntratt intelliġenti għandu żewġ metodi esterni li jistgħu jiġu aċċessati. L-ewwel, recv_external() din il-funzjoni tiġi eżegwita meta talba lill-kuntratt tiġi mid-dinja ta 'barra, jiġifieri, mhux minn TON, pereżempju, meta aħna stess niġġeneraw messaġġ u nibagħtuh permezz tal-lite-client. It-tieni, recv_internal() dan meta, fi ħdan TON innifsu, kwalunkwe kuntratt jirreferi għal tagħna. Fiż-żewġ każijiet, tista 'tgħaddi parametri lill-funzjoni.

Ejja nibdew b'eżempju sempliċi li jaħdem jekk jiġi ppubblikat, iżda m'hemm l-ebda tagħbija funzjonali fiha.

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

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

Hawnhekk irridu nispjegaw x'inhu slice. Id-dejta kollha maħżuna f'TON Blockchain hija ġabra TVM cell jew sempliċiment cell, f'tali ċellula tista 'taħżen sa 1023 bit ta' dejta u sa 4 links għal ċelloli oħra.

TVM cell slice jew slice dan huwa parti minn dak eżistenti cell jintuża biex jiġi analizzat, isir ċar aktar tard. Il-ħaġa prinċipali għalina hija li nistgħu nittrasferixxu slice u skond it-tip ta' messaġġ, ipproċessa d-data fil recv_external() jew recv_internal().

impure — keyword li tindika li l-funzjoni timmodifika d-dejta tal-kuntratt intelliġenti.

Ejja nsalvaw il-kodiċi tal-kuntratt lottery-code.fc u jikkompila.

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

It-tifsira tal-bnadar tista 'tara bl-użu tal-kmand

~/TON/build/crypto/func -help

Aħna kkumpilajna kodiċi tal-assembler Fift fi 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

Jista’ jiġi mniedi lokalment, għal dan inħejju l-ambjent.

Innota li l-ewwel linja tgħaqqad Asm.fif, dan huwa kodiċi miktub f'Fift għall-assemblatur Fift.

Peress li rridu nħaddmu u nittestjaw il-kuntratt intelliġenti lokalment, se noħolqu fajl lottery-test-suite.fif u kkopja l-kodiċi kkumpilat hemmhekk, li tissostitwixxi l-aħħar linja fiha, li tikteb il-kodiċi tal-kuntratt intelliġenti għal kostanti codebiex imbagħad tittrasferih għall-magna virtwali:

"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

S'issa jidher ċar, issa ejja nżidu mal-istess fajl il-kodiċi li se nużaw biex inniedu 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 nirreġistraw il-kuntest, jiġifieri, id-dejta li biha se jitnieda t-TVM (jew l-istat tan-netwerk). Anke waqt il-kompetizzjoni, wieħed mill-iżviluppaturi wera kif toħloq c7 u kkupjajt. F'dan l-artikolu jista 'jkun hemm bżonn li nbiddlu rand_seed peress li l-ġenerazzjoni ta 'numru każwali tiddependi minnu u jekk ma jinbidel, l-istess numru jiġi rritornat kull darba.

recv_internal и recv_external kostanti b'valuri 0 u -1 se jkunu responsabbli biex isejħu l-funzjonijiet korrispondenti fil-kuntratt intelliġenti.

Issa aħna lesti li noħolqu l-ewwel test għall-kuntratt intelliġenti vojt tagħna. Għaċ-ċarezza, għalissa se nżidu t-testijiet kollha fl-istess fajl lottery-test-suite.fif.

Ejja noħolqu varjabbli storage u ikteb waħda vojta fiha cell, dan se jkun il-ħażna tal-kuntratt intelliġenti.

message Dan huwa l-messaġġ li se nittrasmettu lill-kuntatt intelliġenti minn barra. Se nagħmluha vojta wkoll għalissa.

variable storage 
<b b> storage ! 

variable message 
<b b> message ! 

Wara li ppreparajna l-kostanti u l-varjabbli, inniedu TVM bl-użu tal-kmand runvmctx u jgħaddi l-parametri maħluqa għall-input.

message @ 
recv_external 
code 
storage @ 
c7 
runvmctx 

Fl-aħħar se nirnexxu bħal dan kodiċi intermedju għal Fift.

Issa nistgħu nħaddmu l-kodiċi li jirriżulta.

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

Il-programm għandu jaħdem mingħajr żbalji u fl-output se naraw ir-reġistru tal-eżekuzzjoni:

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

Kbira, ktibna l-ewwel verżjoni tax-xogħol tal-kuntratt intelliġenti.

Issa rridu nżidu l-funzjonalità. L-ewwel ejja nittrattaw messaġġi li ġejjin mid-dinja ta 'barra għal recv_external()

L-iżviluppatur innifsu jagħżel il-format tal-messaġġ li l-kuntratt jista 'jaċċetta.

Imma normalment

  • l-ewwelnett, irridu nipproteġu l-kuntratt tagħna mid-dinja ta 'barra u nagħmluh sabiex is-sid tal-kuntratt biss ikun jista' jibgħatlu messaġġi esterni.
  • it-tieni, meta nibagħtu messaġġ validu lil TON, irridu li dan iseħħ eżattament darba u meta nerġgħu nibagħtu l-istess messaġġ, il-kuntratt intelliġenti jirrifjutah.

Allura kważi kull kuntratt isolvi dawn iż-żewġ problemi, peress li l-kuntratt tagħna jaċċetta messaġġi esterni, jeħtieġ li nieħdu ħsiebhom ukoll.

Aħna ser nagħmluha f'ordni inversa. L-ewwel, ejja nsolvu l-problema bir-ripetizzjoni; jekk il-kuntratt diġà rċieva messaġġ bħal dan u pproċessah, mhux se jesegwixxih għat-tieni darba. U mbagħad se nsolvu l-problema sabiex ċertu ċirku ta 'nies biss ikun jista' jibgħat messaġġi lill-kuntratt intelliġenti.

Hemm modi differenti biex issolvi l-problema b'messaġġi duplikati. Hawn kif se nagħmluh. Fil-kuntratt intelliġenti, aħna inizjalizzaw il-counter tal-messaġġi riċevuti bil-valur inizjali 0. F'kull messaġġ għall-kuntratt intelliġenti, aħna se nżidu l-valur tal-counter kurrenti. Jekk il-valur tal-counter fil-messaġġ ma jaqbilx mal-valur fil-kuntratt intelliġenti, allura aħna ma nipproċessawx; jekk hekk, allura nipproċessawha u nżidu l-counter fil-kuntratt intelliġenti b'1.

Nirritornaw għal lottery-test-suite.fif u żid it-tieni test miegħu. Jekk nibagħtu numru żbaljat, il-kodiċi għandu jarmi eċċezzjoni. Pereżempju, ħalli d-dejta tal-kuntratt taħżen 166, u aħna nibagħtu 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"

Ejja tniedi.

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

U se naraw li t-test jitwettaq bi żball.

[ 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

F'dan l-istadju lottery-test-suite.fif għandha tidher qisha по ссылке.

Issa ejja nżidu l-loġika tal-kontro mal-kuntratt intelliġenti fi 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 tinsab il-messaġġ li nibagħtu.

L-ewwel ħaġa li nagħmlu hija li niċċekkjaw jekk il-messaġġ fihx data, jekk le, allura sempliċement noħorġu.

Sussegwentement naqsbu l-messaġġ. in_msg~load_uint(32) jgħabbi n-numru 165, 32-bit unsigned int mill-messaġġ trażmess.

Sussegwentement aħna tagħbija 32 bit mill-ħażna tal-kuntratt intelliġenti. Aħna niċċekkjaw li n-numru mgħobbi jaqbel ma' dak li għadda; jekk le, nafgħu eċċezzjoni. Fil-każ tagħna, peress li qed ngħaddu mhux taqbila, għandha titfa' eċċezzjoni.

Issa ejja niġbru.

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

Ikkopja l-kodiċi li tirriżulta lil lottery-test-suite.fif, ma ninsewx li tissostitwixxi l-aħħar linja.

Aħna niċċekkjaw li t-test jgħaddi:

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

Hawnhekk Tista 'tara l-impenn korrispondenti mar-riżultati attwali.

Innota li huwa inkonvenjenti li kontinwament tikkopja l-kodiċi kkumpilat ta 'kuntratt intelliġenti f'fajl bit-testijiet, għalhekk aħna se niktbu skript li se tikteb il-kodiċi f'kostanti għalina, u aħna sempliċiment se nqabbdu l-kodiċi kkompilat mat-testijiet tagħna billi tuża "include".

Oħloq fajl fil-folder tal-proġett build.sh bil-kontenut li ġej.

#!/bin/bash

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

Ejja nagħmluha eżekutibbli.

chmod +x ./build.sh

Issa, mexxi l-iskrittura tagħna biex tikkumpila l-kuntratt. Iżda minbarra dan, għandna bżonn niktbuha f'kostanti code. Allura aħna se noħolqu fajl ġdid lotter-compiled-for-test.fif, li aħna se ninkludu fil-fajl lottery-test-suite.fif.

Ejja nżidu l-kodiċi skirpt ma sh, li sempliċiment se jidduplikaw il-fajl ikkumpilat fil lotter-compiled-for-test.fif u ibdel l-aħħar linja fiha.

# 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

Issa, biex tiċċekkja, ejja nħaddmu l-iskript li jirriżulta u jiġi ġġenerat fajl lottery-compiled-for-test.fif, li aħna se jinkludu fil tagħna lottery-test-suite.fif

В lottery-test-suite.fif ħassar il-kodiċi tal-kuntratt u żid il-linja "lottery-compiled-for-test.fif" include.

Aħna nwettqu testijiet biex niċċekkjaw li jgħaddu.

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

Kbir, issa biex awtomat it-tnedija tat-testijiet, ejja noħolqu fajl test.sh, li l-ewwel se tesegwixxi build.sh, u mbagħad agħmel it-testijiet.

touch test.sh
chmod +x test.sh

Aħna niktbu ġewwa

./build.sh 

echo "nCompilation completedn"

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

Ejja nagħmluha test.sh u mexxiha biex tiżgura li t-testijiet jaħdmu.

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

Aħna niċċekkjaw li l-kuntratt jikkompila u t-testijiet jiġu esegwiti.

Kbir, issa fuq l-istartjar test.sh It-testijiet se jiġu kkompilati u jsiru immedjatament. Hawn hu l-link għal jikkommettu.

Okay, qabel inkomplu, ejja nagħmlu ħaġa oħra għall-konvenjenza.

Ejja noħolqu folder build fejn se naħżnu l-kuntratt ikkupjat u l-klonu tiegħu miktub f'kostanti lottery-compiled.fif, lottery-compiled-for-test.fif. Ejja noħolqu wkoll folder test fejn se jinħażen il-fajl tat-test? lottery-test-suite.fif u potenzjalment fajls oħra ta' appoġġ. Link għal bidliet rilevanti.

Ejja nkomplu niżviluppaw il-kuntratt intelliġenti.

Imbagħad għandu jkun hemm test li jiċċekkja li l-messaġġ jiġi riċevut u l-counter jiġi aġġornat fil-maħżen meta nibagħtu n-numru korrett. Imma dan nagħmluh aktar tard.

Issa ejja naħsbu dwar liema struttura tad-data u liema data jeħtieġ li tinħażen fil-kuntratt intelliġenti.

Se niddeskrivi dak kollu li naħżnu.

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

Sussegwentement trid tikteb żewġ funzjonijiet. Ejja nsejħu l-ewwel pack_state(), li se jippakkja d-data biex aktar tard issalvaha fil-ħażna tal-kuntratt intelliġenti. Ejja nsejħu t-tieni unpack_state() se jaqra u jirritorna data mill-ħażna.

_ pack_state(int seqno, int pubkey, int order_seqno, int number_of_wins, int incoming_amount, int outgoing_amount, int owner_wc, int owner_account_id, cell orders) inline_ref {
    return begin_cell()
            .store_uint(seqno, 32)
            .store_uint(pubkey, 256)
            .store_uint(order_seqno, 32)
            .store_uint(number_of_wins, 32)
            .store_grams(incoming_amount)
            .store_grams(outgoing_amount)
            .store_int(owner_wc, 32)
            .store_uint(owner_account_id, 256)
            .store_dict(orders)
            .end_cell();
}

_ unpack_state() inline_ref {
    var ds = begin_parse(get_data());
    var unpacked = (ds~load_uint(32), ds~load_uint(256), ds~load_uint(32), ds~load_uint(32), ds~load_grams(), ds~load_grams(), ds~load_int(32), ds~load_uint(256), ds~load_dict());
    ds.end_parse();
    return unpacked;
}

Aħna nżidu dawn iż-żewġ funzjonijiet mal-bidu tal-kuntratt intelliġenti. Se taħdem bħal dan riżultat intermedju.

Biex tiffranka d-data ser ikollok bżonn issejjaħ il-funzjoni built-in set_data() u se tikteb data minn pack_state() fil-ħażna tal-kuntratt intelliġenti.

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

Issa li għandna funzjonijiet konvenjenti għall-kitba u l-qari tad-dejta, nistgħu ngħaddu.

Irridu niċċekkjaw li l-messaġġ li jidħol minn barra jkun iffirmat mis-sid tal-kuntratt (jew utent ieħor li għandu aċċess għaċ-ċavetta privata).

Meta nippubblikaw kuntratt intelliġenti, nistgħu inizjalizzawh bid-dejta li neħtieġu fil-ħażna, li tiġi ssejvjata għal użu futur. Aħna nirreġistraw iċ-ċavetta pubblika hemmhekk sabiex inkunu nistgħu nivverifikaw li l-messaġġ li jkun dieħel kien iffirmat biċ-ċavetta privata korrispondenti.

Qabel inkomplu, ejja noħolqu ċavetta privata u niktbuha test/keys/owner.pk. Biex tagħmel dan, ejja nniedu Fift fil-mod interattiv u tesegwixxi erba 'kmandi.

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

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

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

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

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

Ejja noħolqu folder keys ġewwa l-folder test u ikteb iċ-ċavetta privata hemmhekk.

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

Naraw fajl fil-folder attwali owner.pk.

Inneħħu ċ-ċavetta pubblika mill-munzell u meta jkun meħtieġ nistgħu niksbuha minn dik privata.

Issa għandna bżonn niktbu verifika tal-firma. Nibdew bit-test. L-ewwel naqraw iċ-ċavetta privata mill-fajl billi tuża l-funzjoni file>B u iktebha fuq varjabbli owner_private_key, imbagħad tuża l-funzjoni priv>pub jikkonverti ċ-ċavetta privata għal ċavetta pubblika u ikteb ir-riżultat fi 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 !

Ikollna bżonn iż-żewġ ċwievet.

Aħna inizjalizzaw il-ħażna tal-kuntratt intelliġenti b'dejta arbitrarja fl-istess sekwenza bħal fil-funzjoni pack_state()u iktebha f'varjabbli 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 !

Sussegwentement, aħna se nikkomponu messaġġ iffirmat, se jkun fih biss il-firma u l-valur tal-kontro.

L-ewwel, noħolqu d-dejta li rridu nittrasmettu, imbagħad niffirmawha b'ċavetta privata u fl-aħħar niġġeneraw messaġġ iffirmat.

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 !  

Bħala riżultat, il-messaġġ li se nibagħtu lill-kuntratt intelliġenti huwa rreġistrat f'varjabbli message_to_send, dwar funzjonijiet hashu, ed25519_sign_uint tista' taqra fid-dokumentazzjoni tal-Ħames.

U biex imexxu t-test nerġgħu nsejħu.

message_to_send @ 
recv_external 
code 
storage @
c7
runvmctx

Hawn hekk Il-fajl bit-testijiet għandu jidher bħal dan f'dan l-istadju.

Ejja nwettqu t-test u se jfalli, għalhekk aħna nibdlu l-kuntratt intelliġenti sabiex ikun jista 'jirċievi messaġġi ta' dan il-format u jivverifika l-firma.

L-ewwel, ngħoddu 512-il bit tal-firma mill-messaġġ u niktbuha fuq varjabbli, imbagħad ngħoddu 32 bit tal-varjabbli tal-kontro.

Peress li għandna funzjoni għall-qari tad-dejta mill-ħażna tal-kuntratt intelliġenti, se nużawha.

Li jmiss huwa l-iċċekkjar tal-counter trasferit mal-ħażna u l-kontroll tal-firma. Jekk xi ħaġa ma taqbilx, allura aħna tarmi eċċezzjoni bil-kodiċi xieraq.

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

Impenn rilevanti hawn.

Ejja nmexxu t-testijiet u naraw li t-tieni test ifalli. Għal żewġ raġunijiet, m'hemmx biżżejjed bits fil-messaġġ u m'hemmx biżżejjed bits fil-ħażna, għalhekk il-kodiċi jiġġarraf meta jiġi analizzat. Irridu nżidu firma mal-messaġġ li qed nibagħtu u nikkopja l-ħażna mill-aħħar test.

Fit-tieni test, aħna se nżidu firma ta 'messaġġ u nibdlu l-ħażna tal-kuntratt intelliġenti. Hawn hekk il-fajl bit-testijiet qisu bħalissa.

Ejja niktbu r-raba' test, li fih nibagħtu messaġġ iffirmat biċ-ċavetta privata ta' xi ħadd ieħor. Ejja noħolqu ċavetta privata oħra u ssejvjaha f'fajl not-owner.pk. Aħna se niffirmaw il-messaġġ b'din iċ-ċavetta privata. Ejja nmexxu t-testijiet u kun żgur li t-testijiet kollha jgħaddu. Impenja f'dan il-mument.

Issa fl-aħħar nistgħu ngħaddu għall-implimentazzjoni tal-loġika tal-kuntratt intelliġenti.
В recv_external() aħna se naċċettaw żewġ tipi ta 'messaġġi.

Peress li l-kuntratt tagħna se jakkumula t-telf tal-plejers, dawn il-flus għandhom jiġu trasferiti lill-kreatur tal-lotterija. L-indirizz tal-kartiera tal-kreatur tal-lotterija jiġi rreġistrat fil-ħażna meta jinħoloq il-kuntratt.

Fil-każ, neħtieġu l-abbiltà li nibdlu l-indirizz li fih nibagħtu grammi tat-telliefa. Għandna wkoll inkunu nistgħu nibagħtu grammi mil-lotterija fl-indirizz tas-sid.

Nibdew bl-ewwel waħda. Ejja l-ewwel niktbu test li se jiċċekkja li wara li bagħat il-messaġġ, il-kuntratt intelliġenti ssejvja l-indirizz il-ġdid fil-ħażna. Jekk jogħġbok innota li fil-messaġġ, minbarra l-counter u l-indirizz il-ġdid, nittrasmettu wkoll action Numru sħiħ ta '7-bit mhux negattiv, jiddependi minnu, aħna se nagħżlu kif nipproċessaw il-messaġġ fil-kuntratt intelliġenti.

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

Fit-test tista 'tara kif il-ħażna smartcontract hija deserialized storage fil-Ħames. Id-deserialization tal-varjabbli hija deskritta fid-dokumentazzjoni Fift.

Kommetti rabta bl-għaġina miżjuda.

Ejja nmexxu t-test u kun żgur li jfalli. Issa ejja nżidu l-loġika biex nibdlu l-indirizz tas-sid tal-lotterija.

Fil-kuntratt intelliġenti aħna nkomplu parse message, aqra fil action. Ejjew infakkarkom li se jkollna tnejn action: ibdel l-indirizz u ibgħat grammi.

Imbagħad naqraw l-indirizz il-ġdid tas-sid tal-kuntratt u nsalvawh fil-ħażna.
Aħna nmexxu t-testijiet u naraw li t-tielet test ifalli. Jiġġarraf minħabba l-fatt li l-kuntratt issa parses addizzjonalment 7 bits mill-messaġġ, li huma neqsin fit-test. Żid waħda li ma teżistix mal-messaġġ action. Ejja nagħmlu t-testijiet u naraw li kollox jgħaddi. Hawnhekk jimpenjaw ruħhom għal bidliet. Kbir.

Issa ejja niktbu l-loġika biex tibgħat in-numru speċifikat ta 'grammi fl-indirizz issejvjat qabel.

L-ewwel, ejja niktbu test. Se niktbu żewġ testijiet, wieħed meta ma jkunx hemm bilanċ biżżejjed, it-tieni meta kollox għandu jgħaddi b'suċċess. It-testijiet jistgħu jitqiesu f'dan l-impenn.

Issa ejja nżidu l-kodiċi. L-ewwel, ejja niktbu żewġ metodi helper. L-ewwel get metodu huwa li ssir taf il-bilanċ attwali ta 'kuntratt intelliġenti.

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

U t-tieni waħda hija biex jintbagħtu grammi għal kuntratt intelliġenti ieħor. I kkupjat kompletament dan il-metodu minn kuntratt intelliġenti ieħor.

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

Ejja nżidu dawn iż-żewġ metodi mal-kuntratt intelliġenti u ikteb il-loġika. L-ewwel, aħna parse n-numru ta 'grammi mill-messaġġ. Sussegwentement niċċekkjaw il-bilanċ, jekk mhux biżżejjed nafgħu eċċezzjoni. Jekk kollox huwa tajjeb, allura nibagħtu l-grammi fl-indirizz salvat u naġġornaw il-counter.

int amount_to_send = message~load_grams();
throw_if(36, amount_to_send + 500000000 > balance());
accept_message();
send_grams(owner_wc, owner_account_id, amount_to_send);
set_data(pack_state(stored_seqno + 1, pubkey, order_seqno, number_of_wins, incoming_amount, outgoing_amount, owner_wc, owner_account_id, orders));

Hawn hekk qisu l-kuntratt intelliġenti bħalissa. Ejja nmexxu t-testijiet u kun żgur li jgħaddu.

Mill-mod, kummissjoni titnaqqas mill-kuntratt intelliġenti kull darba għal messaġġ ipproċessat. Sabiex il-messaġġi tal-kuntratt intelliġenti jeżegwixxu t-talba, wara kontrolli bażiċi trid iċempel accept_message().

Issa ejja ngħaddu għal messaġġi interni. Fil-fatt se naċċettaw biss grammi u nibagħtu lura d-doppju tal-ammont lill-plejer jekk jirbaħ u terz lis-sid jekk jitlef.

L-ewwel, ejja niktbu test sempliċi. Biex nagħmlu dan, għandna bżonn indirizz tat-test tal-kuntratt intelliġenti li minnu suppost nibagħtu grammi lill-kuntratt intelliġenti.

L-indirizz tal-kuntratt intelliġenti jikkonsisti f'żewġ numri, numru sħiħ ta '32 bit responsabbli għall-workchain u numru sħiħ ta' kont uniku mhux negattiv ta '256 bit f'din il-workchain. Pereżempju, -1 u 12345, dan huwa l-indirizz li se nsalvaw f'fajl.

I kkupjati l-funzjoni biex issalva l-indirizz minn 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

Ejja nħarsu lejn kif taħdem il-funzjoni, dan se jagħti fehim ta 'kif jaħdem Fift. Tnedija Fift fil-mod interattiv.

~/TON/build/crypto/fift -i 

L-ewwel nimbottaw -1, 12345 u l-isem tal-fajl futur "sender.addr" fuq il-munzell:

-1 12345 "sender.addr" 

Il-pass li jmiss huwa li tesegwixxi l-funzjoni -rot, li tiċċaqlaq il-munzell b'tali mod li fil-quċċata tal-munzell ikun hemm numru uniku ta' kuntratt intelliġenti:

"sender.addr" -1 12345

256 u>B tikkonverti numru sħiħ mhux negattiv ta' 256 bit f'bytes.

"sender.addr" -1 BYTES:0000000000000000000000000000000000000000000000000000000000003039

swap tpartit iż-żewġ elementi ta 'fuq tal-munzell.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 -1

32 i>B tikkonverti numru sħiħ ta' 32 bit f'bytes.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 BYTES:FFFFFFFF

B+ jgħaqqad żewġ sekwenzi ta 'bytes.

 "sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF

Darb'oħra swap.

BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF "sender.addr" 

U finalment il-bytes jinkitbu fil-fajl B>file. Wara dan il-munzell tagħna huwa vojt. Nieqfu Fift. Inħoloq fajl fil-folder attwali sender.addr. Ejja nimxu l-fajl għall-folder maħluqa test/addresses/.

Ejja nikteb test sempliċi li se jibgħat grammi għal kuntratt intelliġenti. Hawn l-impenn.

Issa ejja nħarsu lejn il-loġika tal-lotterija.

L-ewwel ħaġa li nagħmlu hija li niċċekkjaw il-messaġġ bounced jew le jekk bounced, allura aħna ninjorawha. bounced ifisser li l-kuntratt jirritorna grammi jekk iseħħ xi żball. Mhux se nirritornaw grammi jekk iseħħ żball f'daqqa.

Aħna niċċekkjaw, jekk il-bilanċ huwiex inqas minn nofs gramma, allura sempliċement naċċettaw il-messaġġ u ninjowh.

Sussegwentement, aħna naqraw l-indirizz tal-kuntratt intelliġenti li minnu ġie l-messaġġ.

Naqraw id-dejta mill-ħażna u mbagħad inħassru imħatri qodma mill-istorja jekk ikun hemm aktar minn għoxrin minnhom. Għall-konvenjenza, ktibt tliet funzjonijiet addizzjonali pack_order(), unpack_order(), remove_old_orders().

Sussegwentement, inħarsu jekk il-bilanċ mhuwiex biżżejjed għall-ħlas, allura nikkunsidraw li din mhix bet, iżda riforniment u ssalva r-riforniment fi orders.

Imbagħad finalment l-essenza tal-kuntratt intelliġenti.

L-ewwel, jekk il-plejer jitlef, nissejvjah fl-istorja tal-imħatri u jekk l-ammont ikun aktar minn 3 grammi, nibagħtu 1/3 lis-sid tal-kuntratt intelliġenti.

Jekk il-plejer jirbaħ, allura nibagħtu d-doppju tal-ammont fl-indirizz tal-plejer u mbagħad insalvaw l-informazzjoni dwar l-imħatra fl-istorja.

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

Li minnu. Kommit korrispondenti.

Issa dak kollu li jibqa 'huwa sempliċi, ejja noħolqu metodi ta' get sabiex inkunu nistgħu niksbu informazzjoni dwar l-istat tal-kuntratt mid-dinja ta 'barra (fil-fatt, aqra d-dejta mill-ħażna tal-kuntratt intelliġenti tagħhom).

Ejja nżidu get metodi. Aħna se niktbu hawn taħt dwar kif nirċievu informazzjoni dwar kuntratt intelliġenti.

Insejt inżid ukoll il-kodiċi li se tipproċessa l-ewwel talba li sseħħ meta tippubblika kuntratt intelliġenti. Kommit korrispondenti. U aktar ikkoreġut bug li tibgħat 1/3 tal-ammont fil-kont tas-sid.

Il-pass li jmiss huwa li tippubblika l-kuntratt intelliġenti. Ejja noħolqu folder requests.

Ħadt il-kodiċi tal-pubblikazzjoni bħala bażi simple-wallet-code.fc li tista 'ssib fir-repożitorju uffiċjali.

Xi ħaġa ta’ min joqgħod attent għaliha. Aħna niġġeneraw ħażna ta 'kuntratt intelliġenti u messaġġ ta' input. Wara dan, jiġi ġġenerat l-indirizz tal-kuntratt intelliġenti, jiġifieri, l-indirizz huwa magħruf anki qabel il-pubblikazzjoni f'TON. Sussegwentement, għandek bżonn tibgħat diversi grammi f'dan l-indirizz, u wara biss trid tibgħat fajl bil-kuntratt intelliġenti innifsu, peress li n-netwerk jieħu kummissjoni għall-ħażna tal-kuntratt intelliġenti u l-operazzjonijiet fih (validaturi li jaħżnu u jeżegwixxu smart. kuntratti). Il-kodiċi jista 'jaraha hawn.

Sussegwentement aħna tesegwixxi l-kodiċi tal-pubblikazzjoni u nikseb lottery-query.boc fajl u indirizz tal-kuntratt intelliġenti.

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

Tinsiex issalva l-fajls iġġenerati: lottery-query.boc, lottery.addr, lottery.pk.

Fost affarijiet oħra, se naraw l-indirizz tal-kuntratt intelliġenti fir-zkuk tal-eżekuzzjoni.

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

Biss għall-gost, ejja nagħmlu talba lil TON

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

U naraw li l-kont b'dan l-indirizz huwa vojt.

account state is empty

Nibagħtu lill-indirizz 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd 2 Gram u wara ftit sekondi nwettqu l-istess kmand. Biex nibgħat grammi nuża kartiera uffiċjali, u tista 'titlob lil xi ħadd miċ-chat għal grammi tat-test, li se nitkellem dwarhom fl-aħħar tal-artiklu.

> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Jidher qisu mhux inizjalizzat (state:account_uninit) kuntratt intelliġenti bl-istess indirizz u bilanċ ta '1 nanogramma.

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

Issa ejja nippubblikaw il-kuntratt intelliġenti. Ejja tniedi lite-client u tesegwixxi.

> 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 

Ejja niċċekkjaw li l-kuntratt ġie ppubblikat.

> last
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Fost affarijiet oħra nġibu.

  storage:(account_storage last_trans_lt:3825499000002
    balance:(currencies
      grams:(nanograms
        amount:(var_uint len:4 value:1987150999))
      other:(extra_currencies
        dict:hme_empty))
    state:(account_active

Aħna naraw li account_active.

Impenn korrispondenti ma 'bidliet hawn.

Issa ejja noħolqu talbiet biex jinteraġixxu mal-kuntratt intelliġenti.

B'mod aktar preċiż, se nħallu l-ewwel waħda biex nibdlu l-indirizz bħala xogħol indipendenti, u se nagħmlu t-tieni waħda biex nibagħtu grammi fl-indirizz tas-sid. Fil-fatt, ikollna bżonn nagħmlu l-istess ħaġa bħal fit-test biex nibagħtu grammi.

Dan huwa l-messaġġ li se nibagħtu lill-kuntratt intelliġenti, fejn msg_seqno 165, action 2 u 9.5 grammi biex jintbagħtu.

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

Tinsiex tiffirma l-messaġġ biċ-ċavetta privata tiegħek lottery.pk, li ġie ġġenerat qabel meta ħoloq il-kuntratt intelliġenti. Hawn hu l-impenn korrispondenti.

Jirċievu informazzjoni minn kuntratt intelliġenti billi tuża metodi get

Issa ejja nħarsu lejn kif tmexxi kuntratt intelliġenti tikseb metodi.

Tnedija lite-client u mexxi l-metodi get li ktibna.

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

В result fih il-valur li l-funzjoni tirritorna balance() mill-kuntratt intelliġenti tagħna.
Se nagħmlu l-istess għal diversi metodi oħra.

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

Ejja nistaqsu għall-istorja tal-imħatri tiegħek.

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

Se nużaw lite-client u niksbu metodi biex nuru informazzjoni dwar il-kuntratt intelliġenti fuq is-sit.

Il-wiri tad-dejta tal-kuntratt intelliġenti fuq il-websajt

Ktibt websajt sempliċi f'Python biex turi d-dejta mill-kuntratt intelliġenti b'mod konvenjenti. Hawnhekk mhux se nitkellem dwarha fid-dettall u se nippubblika s-sit f'impenn wieħed.

It-talbiet lil TON isiru minn Python bl-għajnuna lite-client. Għall-konvenjenza, is-sit huwa ppakkjat f'Docker u ppubblikat fuq Google Cloud. Link.

Ejja nipruvaw

Issa ejja nippruvaw nibagħtu grammi hemm għal riforniment minn kartiera. Aħna nibagħtu 40 gramma. U ejja nagħmlu ftit imħatri għaċ-ċarezza. Naraw li s-sit juri l-istorja tal-imħatri, il-persentaġġ attwali tar-rebħ u informazzjoni utli oħra.

Narawli rbaħna l-ewwel, tlifna t-tieni.

Wara kelma

L-artiklu rriżulta li kien ħafna itwal milli stennejt, forsi seta’ jkun iqsar, jew forsi biss għal persuna li ma taf xejn dwar TON u trid tikteb u tippubblika kuntratt intelliġenti mhux daqshekk sempliċi bil-kapaċità li jinteraġixxi ma’ dan. Forsi xi affarijiet setgħu ġew spjegati b'mod aktar sempliċi.

Forsi xi aspetti tal-implimentazzjoni setgħu saru b'mod aktar effiċjenti u eleganti, iżda mbagħad kien jieħu aktar żmien biex jitħejja l-artiklu. Huwa possibbli wkoll li għamilt żball x'imkien jew ma fhimtx xi ħaġa, allura jekk qed tagħmel xi ħaġa serja, trid tistrieħ fuq id-dokumentazzjoni uffiċjali jew ir-repożitorju uffiċjali bil-kodiċi TON.

Ta’ min jinnota li peress li TON innifsu għadu fl-istadju attiv ta’ żvilupp, jistgħu jseħħu bidliet li jkissru kwalunkwe pass f’dan l-artikolu (li ġara waqt li kont qed nikteb, diġà ġie kkoreġut), iżda l-approċċ ġenerali huwa improbabbli li tinbidel.

Mhux se nitkellem dwar il-futur ta 'TON. Forsi l-pjattaforma ssir xi ħaġa kbira u għandna nqattgħu ħin nistudjawha u nimlew niċċa bil-prodotti tagħna issa.

Hemm ukoll Libra minn Facebook, li għandha udjenza potenzjali ta 'utenti akbar minn TON. Jien ma naf kważi xejn dwar Libra, meta wieħed jiġġudika mill-forum hemm ħafna aktar attività hemmhekk milli fil-komunità TON. Għalkemm l-iżviluppaturi u l-komunità ta 'TON huma aktar simili taħt l-art, li huwa wkoll jibred.

referenzi

  1. Dokumentazzjoni uffiċjali tat-TON: https://test.ton.org
  2. Repożitorju uffiċjali tat-TON: https://github.com/ton-blockchain/ton
  3. Kartiera uffiċjali għal pjattaformi differenti: https://wallet.ton.org
  4. Repożitorju tal-kuntratti intelliġenti minn dan l-artikolu: https://github.com/raiym/astonished
  5. Link għall-websajt tal-kuntratt intelliġenti: https://ton-lottery.appspot.com
  6. Repożitorju għall-estensjoni għal Visual Studio Code għal FunC: https://github.com/raiym/func-visual-studio-plugin
  7. Chat dwar TON f'Telegram, li verament għen biex insemmu fl-istadju inizjali. Naħseb li mhux se jkun żball jekk ngħid li kull min kiteb xi ħaġa għal TON qiegħed hemm. Tista 'wkoll titlob għal grammi tat-test hemmhekk. https://t.me/tondev_ru
  8. Chat oħra dwar TON li fiha sibt informazzjoni utli: https://t.me/TONgramDev
  9. L-ewwel stadju tal-kompetizzjoni: https://contest.com/blockchain
  10. It-tieni stadju tal-kompetizzjoni: https://contest.com/blockchain-2

Sors: www.habr.com

Żid kumment