Hais txog yuav ua li cas sau thiab tshaj tawm daim ntawv cog lus ntse hauv Telegram Qhib Network (TON)

Hais txog yuav ua li cas sau thiab luam tawm daim ntawv cog lus ntse hauv TON

Zaj lus no hais txog dab tsi?

Hauv tsab xov xwm kuv yuav tham txog yuav ua li cas kuv tau koom nrog thawj (ntawm ob) Telegram blockchain kev sib tw, tsis tau txais khoom plig, thiab txiav txim siab sau kuv cov kev paub dhau los hauv ib tsab xov xwm kom tsis txhob poob rau hauv oblivion thiab, tej zaum, pab. ib tug.

Txij li thaum kuv tsis xav sau cov lej paub daws teeb meem, tab sis ua ib yam dab tsi ua haujlwm, rau tsab xov xwm kuv tau sau daim ntawv cog lus ntse rau kev rho npe tam sim thiab lub vev xaib uas qhia cov ntaub ntawv cog lus ntse ncaj qha los ntawm TON yam tsis siv qhov nruab nrab cia.

Kab lus yuav muaj txiaj ntsig zoo rau cov neeg uas xav ua lawv thawj daim ntawv cog lus ntse hauv TON, tab sis tsis paub yuav pib qhov twg.

Siv cov rho npe ua piv txwv, kuv yuav mus los ntawm kev txhim kho ib puag ncig los tshaj tawm daim ntawv cog lus ntse, cuam tshuam nrog nws, thiab sau lub vev xaib kom tau txais thiab tshaj tawm cov ntaub ntawv.

Hais txog kev koom tes hauv kev sib tw

Lub Kaum Hli Ntuj dhau los, Telegram tshaj tawm kev sib tw blockchain nrog cov lus tshiab Fift ΠΈ FunC. Nws yog tsim nyog los xaiv los ntawm kev sau ib qho ntawm tsib daim ntawv cog lus ntse. Kuv xav tias nws yuav zoo rau ua ib yam dab tsi txawv, kawm ib hom lus thiab ua ib yam dab tsi, txawm tias kuv tsis tas yuav sau lwm yam yav tom ntej. Ntxiv rau, lub ntsiab lus yog tas li ntawm daim di ncauj.

Nws tsim nyog hais tias kuv tsis muaj kev paub dhau los tsim cov ntawv cog lus ntse.

Kuv npaj mus koom kom txog thaum kawg kom txog rau thaum kuv tuaj yeem sau ib tsab xov xwm tshuaj xyuas, tab sis kuv ua tsis tiav tam sim ntawd ntawm thawj qhov. Kuv sau ib lub hnab nyiaj nrog ntau kos npe rau FunC thiab nws feem ntau ua haujlwm. Kuv coj nws ua lub hauv paus ntse daim ntawv cog lus ntawm Solidity.

Lub sijhawm ntawd, kuv xav tias qhov no yeej txaus los coj yam tsawg kawg ib qho khoom plig. Raws li qhov tshwm sim, kwv yees li 40 ntawm 60 tus neeg koom tau los ua tus yeej thiab kuv tsis nyob hauv lawv. Feem ntau, tsis muaj dab tsi tsis ncaj ncees lawm nrog qhov no, tab sis ib qho ua rau kuv nyuaj siab. Thaum lub sijhawm tshaj tawm cov txiaj ntsig, kev tshuaj xyuas qhov kev xeem rau kuv daim ntawv cog lus tsis tau ua tiav, Kuv nug cov neeg koom nrog hauv kev sib tham yog tias muaj lwm tus tsis muaj, tsis muaj.

Pom tau tias ua tib zoo mloog kuv cov lus, ob hnub tom qab cov kws txiav txim plaub tau tshaj tawm cov lus pom thiab kuv tseem tsis nkag siab tias lawv puas tau plam kuv daim ntawv cog lus ntse thaum txiav txim lossis tsuas xav tias nws phem heev uas tsis xav tau cov lus pom. Kuv nug ib lo lus nug ntawm nplooj ntawv, tab sis tsis tau txais lus teb. Txawm hais tias nws tsis pub leej twg txiav txim, kuv xav tias nws tsis tsim nyog los sau cov lus ntawm tus kheej.

Ntau lub sij hawm tau siv rau kev nkag siab, yog li nws tau txiav txim siab los sau ib tsab xov xwm. Txij li thaum tseem tsis tau muaj ntau cov ntaub ntawv, kab lus no yuav pab txuag lub sijhawm rau txhua tus neeg nyiam.

Lub tswv yim ntawm kev cog lus ntse hauv TON

Ua ntej koj sau ib yam dab tsi, koj yuav tsum paub seb sab twg los mus txog qhov no los ntawm. Yog li ntawd, tam sim no kuv yuav qhia rau koj seb qhov system muaj li cas. Ntau qhov tseeb, qhov twg koj yuav tsum paub txhawm rau sau tsawg kawg qee yam kev cog lus ua haujlwm.

Peb yuav tsom mus rau kev sau daim ntawv cog lus ntse thiab ua haujlwm nrog TON Virtual Machine (TVM), Fift ΠΈ FunC, yog li tsab xov xwm zoo ib yam li cov lus piav qhia ntawm kev txhim kho cov kev pab cuam ib txwm muaj. Peb yuav tsis nyob ntawm yuav ua li cas lub platform nws tus kheej ua haujlwm ntawm no.

Feem ntau hais txog nws ua haujlwm li cas TVM thiab lus Fift muaj cov ntaub ntawv zoo. Thaum koom nrog kev sib tw thiab tam sim no thaum sau daim ntawv cog lus tam sim no, kuv feem ntau tig mus rau nws.

Cov lus tseem ceeb uas cov ntawv cog lus ntse sau yog FunC. Tsis muaj ntaub ntawv rau nws tam sim no, yog li txhawm rau sau ib yam dab tsi koj yuav tsum kawm cov piv txwv ntawm cov ntawv cog lus ntse los ntawm lub chaw khaws ntaub ntawv thiab kev siv cov lus nws tus kheej nyob ntawd, ntxiv rau koj tuaj yeem saib cov piv txwv ntawm cov ntawv cog lus ntse los ntawm ob yav dhau los. kev sib tw. Txuas rau qhov kawg ntawm tsab xov xwm.

Wb hais tias peb twb tau sau ib daim ntawv cog lus ntse rau FunC, tom qab ntawd peb sau cov cai rau hauv Fift assembler.

Daim ntawv cog lus ntse tseem yuav tsum luam tawm. Txhawm rau ua qhov no koj yuav tsum sau ib txoj haujlwm hauv Fift, uas yuav siv cov ntawv cog lus ntse thiab qee qhov tsis sib xws raws li cov tswv yim, thiab cov zis yuav yog cov ntaub ntawv nrog qhov txuas ntxiv .boc (uas txhais tau tias "lub hnab ntawm cov hlwb"), thiab, nyob ntawm seb peb sau nws li cas, tus yuam sij ntiag tug thiab chaw nyob, uas yog tsim los ntawm cov ntawv cog lus ntse. Koj tuaj yeem xa grams mus rau qhov chaw nyob ntawm daim ntawv cog lus ntse uas tseem tsis tau luam tawm.

Tshaj tawm daim ntawv cog lus ntse hauv TON tau txais .boc cov ntaub ntawv yuav tsum tau xa mus rau lub blockchain siv lub teeb tus neeg siv khoom (ntxiv rau qhov hauv qab no). Tab sis ua ntej tshaj tawm, koj yuav tsum hloov cov grams mus rau qhov chaw nyob tsim, txwv tsis pub daim ntawv cog lus ntse yuav tsis raug luam tawm. Tom qab tshaj tawm, koj tuaj yeem cuam tshuam nrog daim ntawv cog lus ntse los ntawm kev xa nws cov lus los ntawm sab nraud (piv txwv li, siv lub teeb tus neeg siv) lossis los ntawm sab hauv (piv txwv li, ib daim ntawv cog lus ntse xa lwm cov lus hauv TON).

Thaum peb nkag siab tias cov cai luam tawm li cas, nws yooj yim dua. Peb paub zoo tias peb xav sau dab tsi thiab peb txoj haujlwm yuav ua haujlwm li cas. Thiab thaum sau ntawv, peb saib seb qhov no tau ua li cas hauv cov ntawv cog lus ntse uas twb muaj lawm, lossis peb saib mus rau hauv txoj cai siv Fift ΠΈ FunC nyob rau hauv lub official repository, los yog saib nyob rau hauv lub official ntaub ntawv.

Feem ntau kuv tau tshawb nrhiav cov ntsiab lus tseem ceeb hauv Telegram tham qhov twg txhua tus neeg koom nrog kev sib tw thiab Telegram cov neeg ua haujlwm tau sib sau ua ke, thiab nws tau tshwm sim thaum lub sijhawm kev sib tw txhua tus tau sib sau ua ke thiab pib sib tham txog Fift thiab FunC. Txuas rau qhov kawg ntawm tsab xov xwm.

Nws yog lub sijhawm txav los ntawm kev xav mus rau kev xyaum.

Npaj ib puag ncig rau kev ua haujlwm nrog TON

Kuv tau ua txhua yam uas yuav tau piav qhia hauv tsab xov xwm ntawm macOS thiab tau kuaj xyuas ob zaug hauv Ubuntu 18.04 LTS ntawm Docker.

Thawj qhov koj yuav tsum tau ua yog rub tawm thiab nruab lite-client uas koj tuaj yeem xa cov lus thov rau TON.

Cov lus qhia ntawm lub vev xaib raug cai piav qhia txog cov txheej txheem kev teeb tsa hauv kev nthuav dav thiab meej thiab tshem tawm qee cov ntsiab lus. Ntawm no peb ua raws li cov lus qhia, txhim kho qhov tsis muaj kev vam khom ntawm txoj kev. Kuv tsis tau sau txhua qhov project kuv tus kheej thiab tau teeb tsa los ntawm lub chaw khaws ntaub ntawv Ubuntu (ntawm MacOS kuv siv 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 

Thaum tag nrho cov dependencies raug ntsia koj tuaj yeem nruab lite-client, Fift, FunC.

Ua ntej, peb clone lub TON repository nrog rau nws cov dependencies. Txhawm rau kom yooj yim, peb yuav ua txhua yam hauv daim nplaub tshev ~/TON.

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

Lub chaw khaws cia tseem khaws cov kev siv Fift ΠΈ FunC.

Tam sim no peb npaj txhij los sib sau ua ke qhov project. Lub repository code yog cloned rau hauv ib daim ntawv tais ceev tseg ~/TON/ton. Cov ~/TON tsim ib daim nplaub tshev build thiab sau qhov project hauv nws.

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

Txij li thaum peb tab tom yuav sau daim ntawv cog lus ntse, peb xav tau tsis yog xwb lite-clientTab sis Fift с FunC, yog li cia peb sau txhua yam. Nws tsis yog txheej txheem ceev, yog li peb tos.

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

Tom ntej no, rub tawm cov ntaub ntawv teeb tsa uas muaj cov ntaub ntawv hais txog ntawm qhov twg lite-client yuav txuas.

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

Ua thawj qhov kev thov rau TON

Tam sim no cia peb pib lite-client.

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

Yog tias kev tsim ua tiav, tom qab tso tawm koj yuav pom ib lub cav ntawm kev sib txuas ntawm cov neeg siv lub teeb rau ntawm qhov chaw.

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

Koj tuaj yeem khiav cov lus txib help thiab saib seb cov lus txib twg muaj.

help

Cia peb sau cov lus txib uas peb yuav siv hauv kab lus no.

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

Tam sim no peb tau npaj sau daim ntawv cog lus nws tus kheej.

Kev siv

Lub tswv yim

Raws li kuv tau sau saum toj no, daim ntawv cog lus ntse uas peb sau yog rho npe.

Ntxiv mus, qhov no tsis yog ib qho kev rho npe uas koj yuav tsum tau yuav daim pib thiab tos ib teev, hnub lossis hli, tab sis ib qho instant uas tus neeg siv hloov mus rau qhov chaw nyob hauv daim ntawv cog lus. N grams, thiab tam sim ntawd tau txais nws rov qab 2 * N grams los yog poob. Peb yuav ua qhov tshwm sim ntawm kev yeej ntawm 40%. Yog tias tsis muaj grams txaus rau kev them nyiaj, ces peb yuav txiav txim siab qhov kev hloov pauv raws li kev sau nyiaj.

Ntxiv mus, nws yog ib qho tseem ceeb uas bets yuav pom nyob rau hauv lub sij hawm ntawm lub sij hawm thiab nyob rau hauv ib tug yooj yim daim ntawv, yog li ntawd tus neeg siv yuav tam sim ntawd nkag siab txog seb nws yeej los yog poob. Yog li ntawd, koj yuav tsum tau ua ib lub website uas yuav qhia bets thiab cov txiaj ntsig ncaj qha los ntawm TON.

Sau daim ntawv cog lus ntse

Txhawm rau kom yooj yim, kuv tau hais txog cov cai rau FunC; lub plugin tuaj yeem pom thiab ntsia hauv Visual Studio Code nrhiav; yog tias koj xav tau ntxiv ib yam dab tsi, kuv tau ua lub plugin rau pej xeem. Tsis tas li ntawd, ib tus neeg yav dhau los tau ua lub plugin rau kev ua haujlwm nrog Fift, koj tuaj yeem nruab nws thiab pom nws hauv VSC.

Cia tam sim ntawd tsim ib lub chaw cia khoom uas peb yuav ua tiav cov txiaj ntsig nruab nrab.

Ua kom peb lub neej yooj yim dua, peb yuav sau daim ntawv cog lus ntse thiab sim nws hauv zos kom txog thaum nws npaj txhij. Tsuas yog tom qab ntawd peb yuav tshaj tawm hauv TON.

Daim ntawv cog lus ntse muaj ob txoj hauv kev sab nraud uas tuaj yeem nkag mus tau. Ua ntej, recv_external() Qhov kev ua haujlwm no tau ua tiav thaum qhov kev thov rau daim ntawv cog lus los ntawm lub ntiaj teb sab nraud, uas yog, tsis yog los ntawm TON, piv txwv li, thaum peb tus kheej tsim cov lus thiab xa nws los ntawm lite-neeg siv khoom. Thib ob, recv_internal() qhov no yog thaum, hauv TON nws tus kheej, ib daim ntawv cog lus hais txog peb li. Hauv ob qho xwm txheej, koj tuaj yeem dhau qhov ntsuas rau qhov ua haujlwm.

Cia peb pib nrog ib qho piv txwv yooj yim uas yuav ua haujlwm yog tias luam tawm, tab sis tsis muaj kev ua haujlwm hauv nws.

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

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

Ntawm no peb yuav tsum piav qhia tias nws yog dab tsi slice. Tag nrho cov ntaub ntawv khaws cia hauv TON Blockchain yog ib qho sau TVM cell los yog tsuas yog cell, nyob rau hauv xws li ib tug cell koj tuaj yeem khaws txog 1023 cov ntaub ntawv thiab mus txog 4 txuas mus rau lwm lub hlwb.

TVM cell slice los yog slice qhov no yog ib feem ntawm qhov uas twb muaj lawm cell yog siv los parse nws, nws yuav ua kom meej tom qab. Qhov tseem ceeb rau peb yog qhov peb tuaj yeem hloov mus slice thiab nyob ntawm hom lus, ua cov ntaub ntawv hauv recv_external() los yog recv_internal().

impure - lo lus tseem ceeb uas qhia tau hais tias lub luag haujlwm hloov cov ntaub ntawv cog lus ntse.

Cia peb khaws cov ntawv cog lus hauv lottery-code.fc thiab sau ua ke.

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

Lub ntsiab lus ntawm cov chij tuaj yeem saib tau siv cov lus txib

~/TON/build/crypto/func -help

Peb tau tso ua ke Fift assembler code hauv 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

Nws tuaj yeem tso tawm hauv zos, rau qhov no peb yuav npaj ib puag ncig.

Nco ntsoov tias thawj kab txuas Asm.fif, qhov no yog code sau nyob rau hauv Fift rau Fift assembler.

Txij li thaum peb xav khiav thiab sim daim ntawv cog lus ntse hauv zos, peb yuav tsim cov ntaub ntawv lottery-test-suite.fif thiab luam theej cov ntawv tso ua ke nyob rau ntawd, hloov kab kawg hauv nws, uas sau cov ntawv cog lus ntse rau qhov tsis tu ncua codeTxhawm rau hloov nws mus rau lub tshuab virtual:

"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

Txog tam sim no nws zoo li meej, tam sim no cia peb ntxiv rau tib cov ntaub ntawv tus lej uas peb yuav siv los tso 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 peb sau cov ntsiab lus, uas yog, cov ntaub ntawv uas TVM (los yog lub xeev network) yuav raug tso tawm. Txawm tias thaum lub sij hawm kev sib tw, ib tug ntawm cov developers tau qhia yuav ua li cas los tsim c7 thiab kuv tau theej. Hauv kab lus no peb yuav tau hloov rand_seed txij thaum tiam ntawm tus lej random nyob ntawm nws thiab yog tias tsis hloov, tib tus lej yuav raug xa rov qab txhua zaus.

recv_internal ΠΈ recv_external qhov tsis tu ncua nrog qhov tseem ceeb 0 thiab -1 yuav yog lub luag haujlwm rau kev hu xov tooj rau cov haujlwm sib xws hauv daim ntawv cog lus ntse.

Tam sim no peb tau npaj los tsim thawj qhov kev xeem rau peb daim ntawv cog lus ntse khoob. Kom meej meej, rau tam sim no peb yuav ntxiv tag nrho cov kev xeem rau tib cov ntaub ntawv lottery-test-suite.fif.

Cia peb tsim qhov sib txawv storage thiab sau ib qho khoob rau hauv nws cell, qhov no yuav yog qhov kev cog lus ntse cia.

message Qhov no yog cov lus uas peb yuav xa mus rau tus ntse hu los ntawm sab nraud. Peb tseem yuav ua kom nws khoob rau tam sim no.

variable storage 
<b b> storage ! 

variable message 
<b b> message ! 

Tom qab peb tau npaj qhov tsis tu ncua thiab hloov pauv, peb tso TVM siv cov lus txib runvmctx thiab dhau qhov tsim tsis tau rau cov tswv yim.

message @ 
recv_external 
code 
storage @ 
c7 
runvmctx 

Thaum kawg peb yuav ua tiav zoo li ntawv intermediate code rau Fift.

Tam sim no peb tuaj yeem khiav cov lej tshwm sim.

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

Qhov kev zov me nyuam yuav tsum khiav yam tsis muaj qhov yuam kev thiab hauv cov zis peb yuav pom cov ntawv ua tiav:

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

Zoo heev, peb tau sau thawj zaug ua haujlwm ntawm daim ntawv cog lus ntse.

Tam sim no peb yuav tsum tau ntxiv functionality. Ua ntej cia peb nrog cov lus uas los ntawm lub ntiaj teb sab nraud rau recv_external()

Tus tsim tawm nws tus kheej xaiv cov lus hom uas daim ntawv cog lus tuaj yeem txais.

Tab sis feem ntau

  • ua ntej, peb xav tiv thaiv peb daim ntawv cog lus los ntawm lub ntiaj teb sab nraud thiab ua kom tsuas yog tus tswv ntawm daim ntawv cog lus tuaj yeem xa cov lus sab nraud rau nws.
  • thib ob, thaum peb xa cov lus siv tau rau TON, peb xav kom qhov no tshwm sim raws nraim ib zaug thiab thaum peb xa cov lus qub dua, daim ntawv cog lus ntse tsis lees paub.

Yog li yuav luag txhua daim ntawv cog lus daws ob qhov teeb meem no, txij li peb daim ntawv cog lus lees txais cov lus sab nraud, peb yuav tsum tau saib xyuas qhov ntawd thiab.

Peb yuav ua nws rov qab. Ua ntej, cia peb daws qhov teeb meem nrog kev rov ua dua; yog tias daim ntawv cog lus twb tau txais cov lus no thiab ua tiav nws, nws yuav tsis ua nws thib ob. Thiab tom qab ntawd peb yuav daws qhov teeb meem kom tsuas yog ib lub voj voog ntawm tib neeg tuaj yeem xa lus mus rau daim ntawv cog lus ntse.

Muaj ntau txoj hauv kev los daws qhov teeb meem nrog cov lus sib npaug. Nov yog peb yuav ua li cas. Nyob rau hauv daim ntawv cog lus ntse, peb pib lub txee ntawm cov lus tau txais nrog tus nqi pib 0. Hauv txhua cov lus rau daim ntawv cog lus ntse, peb yuav ntxiv tus nqi counter tam sim no. Yog hais tias tus nqi counter hauv cov lus tsis sib xws tus nqi hauv daim ntawv cog lus ntse, ces peb tsis ua nws; yog tias nws ua, peb ua nws thiab nce lub txee hauv daim ntawv cog lus ntse los ntawm 1.

Cia peb rov qab los lottery-test-suite.fif thiab ntxiv qhov kev sim thib ob rau nws. Yog tias peb xa tus lej tsis raug, tus lej yuav tsum pov qhov kev zam. Piv txwv li, cia cov ntaub ntawv cog lus cia 166, thiab peb yuav xa 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"

Cia peb pib.

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

Thiab peb yuav pom tias qhov kev sim no raug tua nrog qhov yuam kev.

[ 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

Nyob rau theem no lottery-test-suite.fif yuav tsum zoo li txuas.

Tam sim no cia peb ntxiv lub txee logic rau daim ntawv cog lus ntse hauv 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 dag cov lus peb xa.

Thawj qhov peb ua yog xyuas seb cov lus muaj cov ntaub ntawv, yog tias tsis yog, ces peb tsuas yog tawm.

Tom ntej no peb txheeb cov lus. in_msg~load_uint(32) loads tus naj npawb 165, 32-ntsis unsigned int los ntawm kev xa xov.

Tom ntej no peb thauj 32 khoom los ntawm kev cog lus ntse cia. Peb kuaj xyuas tias tus lej thauj khoom sib tw dhau los; yog tias tsis yog, peb muab qhov kev zam. Hauv peb qhov xwm txheej, txij li peb dhau qhov tsis sib tw, qhov kev zam yuav tsum raug pov tseg.

Tam sim no cia peb sau.

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

Luam cov lej tshwm sim rau lottery-test-suite.fif, tsis txhob hnov ​​qab hloov kab kawg.

Peb xyuas tias qhov kev xeem dhau:

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

Txoj cai ntawm no Koj tuaj yeem pom qhov sib cog lus nrog cov txiaj ntsig tam sim no.

Nco ntsoov tias nws tsis yooj yim mus tas li luam cov lej sib sau ua ke ntawm daim ntawv cog lus ntse rau hauv cov ntaub ntawv nrog cov kev xeem, yog li cia peb sau ib tsab ntawv uas yuav sau cov lej rau hauv qhov tsis tu ncua rau peb, thiab peb yuav yooj yim txuas cov lej sau rau peb cov kev xeem siv. "include".

Tsim ib cov ntaub ntawv hauv qhov project folder build.sh nrog cov ntsiab lus hauv qab no.

#!/bin/bash

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

Cia peb ua nws executable.

chmod +x ./build.sh

Tam sim no, cia li khiav peb tsab ntawv los sau daim ntawv cog lus. Tab sis ntxiv rau qhov no, peb yuav tsum tau sau nws mus rau qhov tsis tu ncua code. Yog li peb yuav tsim cov ntaub ntawv tshiab lotter-compiled-for-test.fif, uas peb yuav suav nrog hauv cov ntaub ntawv lottery-test-suite.fif.

Cia peb ntxiv skirt code rau sh, uas yuav tsuas duplicate cov ntaub ntawv compiled nyob rau hauv lotter-compiled-for-test.fif thiab hloov kab kawg hauv nws.

# 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

Tam sim no, txhawm rau txheeb xyuas, cia peb khiav cov ntawv ua tiav thiab cov ntaub ntawv yuav raug tsim tawm lottery-compiled-for-test.fif, uas peb yuav suav nrog hauv peb lottery-test-suite.fif

Π’ lottery-test-suite.fif rho tawm daim ntawv cog lus code thiab ntxiv cov kab "lottery-compiled-for-test.fif" include.

Peb khiav kev xeem los xyuas tias lawv dhau.

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

Zoo heev, tam sim no kom automate qhov kev sim pib, cia peb tsim cov ntaub ntawv test.sh, uas yuav xub ua build.sh, thiab tom qab ntawd khiav cov kev xeem.

touch test.sh
chmod +x test.sh

Peb sau sab hauv

./build.sh 

echo "nCompilation completedn"

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

Cia peb ua test.sh thiab khiav nws kom paub tseeb tias cov kev xeem ua haujlwm.

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

Peb xyuas tias daim ntawv cog lus suav sau thiab cov kev xeem raug ua tiav.

Zoo heev, tam sim no ntawm kev pib test.sh Cov kev ntsuam xyuas yuav muab tso ua ke thiab khiav tam sim ntawd. Ntawm no yog qhov txuas rau cog lus.

Okay, ua ntej peb mus ntxiv, cia peb ua ib qho ntxiv kom yooj yim.

Wb tsim ib daim nplaub tshev build qhov twg peb yuav khaws cov ntawv cog lus theej thiab nws cov clone sau rau hauv qhov tsis tu ncua lottery-compiled.fif, lottery-compiled-for-test.fif. Wb kuj tsim ib daim nplaub tshev test yuav muab cov ntaub ntawv xeem nyob qhov twg? lottery-test-suite.fif thiab tej zaum lwm cov ntaub ntawv txhawb nqa. Txuas rau cov kev hloov pauv uas cuam tshuam.

Cia peb txuas ntxiv txhim kho daim ntawv cog lus ntse.

Tom ntej no yuav tsum muaj ib qho kev sim uas kuaj xyuas tias cov lus tau txais thiab lub txee hloov tshiab hauv lub khw thaum peb xa tus lej raug. Tab sis peb yuav ua qhov ntawd tom qab.

Tam sim no cia peb xav txog dab tsi cov ntaub ntawv qauv thiab cov ntaub ntawv dab tsi yuav tsum tau khaws cia hauv daim ntawv cog lus ntse.

Kuv yuav piav txhua yam uas peb khaws cia.

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

Tom ntej no koj yuav tsum sau ob txoj haujlwm. Wb hu thawj pack_state(), uas yuav ntim cov ntaub ntawv rau kev txuag tom ntej hauv cov ntawv cog lus ntse. Wb hu tus thib ob unpack_state() yuav nyeem thiab xa cov ntaub ntawv rov qab los ntawm kev khaws cia.

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

Peb ntxiv ob txoj haujlwm no rau qhov pib ntawm daim ntawv cog lus ntse. Nws yuav ua haujlwm tawm zoo li ntawv nruab nrab tshwm sim.

Yuav kom txuag tau cov ntaub ntawv koj yuav tau hu rau lub built-in muaj nuj nqi set_data() thiab nws yuav sau cov ntaub ntawv los ntawm pack_state() hauv kev cog lus ntse cia.

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

Tam sim no peb muaj cov haujlwm yooj yim rau kev sau thiab nyeem cov ntaub ntawv, peb tuaj yeem txav mus.

Peb yuav tsum xyuas kom meej tias cov lus tuaj ntawm sab nraud yog kos npe los ntawm tus tswv ntawm daim ntawv cog lus (lossis lwm tus neeg siv uas tau nkag mus rau tus yuam sij ntiag tug).

Thaum peb tshaj tawm daim ntawv cog lus ntse, peb tuaj yeem pib nws nrog cov ntaub ntawv peb xav tau hauv kev khaws cia, uas yuav tau txais kev cawmdim rau kev siv yav tom ntej. Peb yuav sau tus yuam sij pej xeem nyob rau ntawd kom peb tuaj yeem tshawb xyuas tias cov lus xa tuaj tau kos npe nrog tus yuam sij ntiag tug sib raug.

Ua ntej txuas ntxiv, cia peb tsim tus yuam sij ntiag tug thiab sau rau test/keys/owner.pk. Ua li no, cia peb tso Fift hauv kev sib tham sib thiab ua plaub yam lus txib.

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

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

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

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

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

Wb tsim ib daim nplaub tshev keys hauv daim nplaub tshev test thiab sau tus yuam sij ntiag tug nyob ntawd.

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

Peb pom ib cov ntaub ntawv hauv daim nplaub tshev tam sim no owner.pk.

Peb tshem tawm cov yuam sij pej xeem ntawm pawg thiab thaum xav tau peb tuaj yeem tau txais los ntawm tus kheej.

Tam sim no peb yuav tsum sau daim ntawv pov thawj kos npe. Cia peb pib nrog qhov kev xeem. Ua ntej peb nyeem tus yuam sij ntiag tug los ntawm cov ntaub ntawv siv cov haujlwm file>B thiab sau nws mus rau qhov sib txawv owner_private_key, tom qab ntawd siv cov haujlwm priv>pub hloov tus yuam sij ntiag tug mus rau tus yuam sij pej xeem thiab sau cov txiaj ntsig hauv 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 !

Peb yuav xav tau ob tus yuam sij.

Peb pib qhov kev cog lus ntse cia nrog cov ntaub ntawv arbitrary nyob rau tib lub sijhawm raws li hauv kev ua haujlwm pack_state()thiab sau rau hauv ib qho kev sib txawv 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 !

Tom ntej no, peb yuav sau cov lus kos npe, nws tsuas yog muaj qhov kos npe thiab tus nqi txee.

Ua ntej, peb tsim cov ntaub ntawv uas peb xav xa, tom qab ntawd peb kos npe nrog tus yuam sij ntiag tug thiab thaum kawg peb tsim cov lus kos npe.

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 !  

Raws li qhov tshwm sim, cov lus uas peb yuav xa mus rau daim ntawv cog lus ntse raug kaw rau hauv qhov sib txawv message_to_send, hais txog kev ua haujlwm hashu, ed25519_sign_uint koj nyeem tau hauv Fift cov ntaub ntawv.

Thiab khiav qhov kev xeem peb hu dua.

message_to_send @ 
recv_external 
code 
storage @
c7
runvmctx

Zoo li no Cov ntaub ntawv nrog cov kev xeem yuav tsum zoo li no nyob rau theem no.

Cia peb khiav qhov kev sim thiab nws yuav ua tsis tau, yog li peb yuav hloov daim ntawv cog lus ntse kom nws thiaj li tau txais cov lus ntawm hom ntawv no thiab txheeb xyuas qhov kos npe.

Ua ntej, peb suav 512 cov khoom kos npe los ntawm cov lus thiab sau nws mus rau qhov sib txawv, tom qab ntawd peb suav 32 cov khoom ntawm cov khoom sib txawv.

Txij li thaum peb muaj lub luag haujlwm rau kev nyeem cov ntaub ntawv los ntawm cov ntawv cog lus ntse, peb yuav siv nws.

Tom ntej no yog xyuas lub txee xa nrog lub chaw cia khoom thiab xyuas qhov kos npe. Yog hais tias ib yam dab tsi tsis sib xws, ces peb pov ib qho kev zam nrog cov cai tsim nyog.

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

Kev cog lus muaj feem nyob ntawm no.

Cia peb khiav qhov kev xeem thiab pom tias qhov kev xeem thib ob ua tsis tiav. Rau ob qho laj thawj, tsis muaj cov khoom txaus hauv cov lus thiab tsis muaj cov khoom txaus hauv qhov chaw cia, yog li cov cai sib tsoo thaum parsing. Peb yuav tsum tau ntxiv ib qho kos npe rau cov lus uas peb xa thiab luam qhov chaw cia los ntawm qhov kev xeem dhau los.

Hauv kev sim thib ob, peb yuav ntxiv cov lus kos npe thiab hloov pauv cov ntawv cog lus ntse. Zoo li no cov ntaub ntawv nrog cov kev xeem zoo li tam sim no.

Cia peb sau qhov kev xeem thib plaub, uas peb yuav xa cov lus kos npe nrog lwm tus tus yuam sij ntiag tug. Cia peb tsim lwm tus yuam sij ntiag tug thiab khaws cia rau hauv cov ntaub ntawv not-owner.pk. Peb yuav kos npe rau cov lus nrog tus yuam sij ntiag tug no. Cia peb khiav cov kev xeem thiab xyuas kom txhua qhov kev xeem dhau. cog lus lub sijhawm no.

Tam sim no peb tuaj yeem hloov mus rau qhov kev siv cov lus cog lus ntse.
Π’ recv_external() peb yuav txais ob hom lus.

Txij li thaum peb daim ntawv cog lus yuav sau cov players poob, cov nyiaj no yuav tsum raug xa mus rau tus tsim ntawm rho npe. Lub hnab nyiaj qhov chaw nyob ntawm tus tsim rho npe raug kaw rau hauv qhov chaw cia thaum tsim daim ntawv cog lus.

Tsuas yog nyob rau hauv rooj plaub, peb xav tau lub peev xwm los hloov qhov chaw nyob uas peb xa grams ntawm cov poob. Peb kuj tseem tuaj yeem xa cov grams ntawm rho npe mus rau tus tswv qhov chaw nyob.

Cia peb pib nrog thawj tus. Cia peb xub sau ib qho kev sim uas yuav kuaj xyuas tias tom qab xa cov lus, daim ntawv cog lus ntse tau khaws qhov chaw nyob tshiab hauv qhov chaw cia. Thov nco ntsoov tias hauv cov lus, ntxiv rau lub txee thiab qhov chaw nyob tshiab, peb kuj xa mus action Tus lej 7-ntsis tus lej tsis zoo, nyob ntawm nws, peb yuav xaiv yuav ua li cas ua cov lus hauv daim ntawv cog lus ntse.

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

Hauv kev sim koj tuaj yeem pom yuav ua li cas smartcontract cia yog deserialized storage hauv Fift. Deserialization ntawm kev hloov pauv tau piav qhia hauv Fift cov ntaub ntawv.

Txuas txuas nrog ntxiv mov paj.

Cia peb khiav qhov kev sim thiab xyuas kom nws ua tsis tiav. Tam sim no cia peb ntxiv logic hloov chaw nyob ntawm tus tswv rho npe.

Nyob rau hauv daim ntawv cog lus ntse peb txuas ntxiv parse message, nyeem hauv action. Cia peb nco ntsoov tias peb yuav muaj ob action: hloov chaw nyob thiab xa grams.

Tom qab ntawd peb nyeem qhov chaw nyob tshiab ntawm tus tswv daim ntawv cog lus thiab khaws cia rau hauv.
Peb khiav qhov kev xeem thiab pom tias qhov kev xeem thib peb ua tsis tiav. Nws poob vim qhov tseeb tias daim ntawv cog lus tam sim no ntxiv parses 7 khoom los ntawm cov lus, uas ploj lawm hauv qhov kev xeem. Ntxiv ib qho uas tsis muaj nyob rau hauv cov lus action. Cia peb khiav cov kev xeem thiab pom tias txhua yam dhau mus. no cog lus rau kev hloov. Zoo heev.

Tam sim no cia peb sau cov laj thawj rau xa cov naj npawb ntawm grams mus rau qhov chaw nyob yav dhau los.

Ua ntej, cia peb sau ib qho kev xeem. Peb yuav sau ob qhov kev xeem, ib qho thaum tsis muaj qhov sib npaug txaus, qhov thib ob thaum txhua yam yuav tsum ua tiav. Kev ntsuam xyuas tuaj yeem pom hauv qhov kev cog lus no.

Tam sim no cia peb ntxiv cov cai. Ua ntej, cia peb sau ob txoj kev pab. Thawj qhov tau txais txoj hauv kev yog kom paub qhov sib npaug tam sim no ntawm daim ntawv cog lus ntse.

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

Thiab qhov thib ob yog rau xa grams mus rau lwm daim ntawv cog lus ntse. Kuv tau luam cov qauv no los ntawm lwm daim ntawv cog lus ntse.

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

Cia peb ntxiv ob txoj hauv kev rau daim ntawv cog lus ntse thiab sau cov logic. Ua ntej, peb txheeb tus naj npawb ntawm grams ntawm cov lus. Tom ntej no peb xyuas qhov nyiaj tshuav, yog tias nws tsis txaus peb muab qhov kev zam. Yog tias txhua yam zoo, ces peb xa cov grams mus rau qhov chaw nyob ruaj khov thiab hloov kho lub txee.

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

Zoo li no zoo li daim ntawv cog lus ntse tam sim no. Cia peb khiav cov kev xeem thiab xyuas kom lawv dhau.

Los ntawm txoj kev, ib qho commission raug txiav tawm ntawm daim ntawv cog lus ntse txhua lub sijhawm rau cov lus ua tiav. Txhawm rau kom cov ntawv cog lus ntse kom ua tiav qhov kev thov, tom qab kev kuaj xyuas yooj yim koj yuav tsum hu accept_message().

Tam sim no cia peb txav mus rau cov lus sab hauv. Qhov tseeb, peb tsuas yog lees txais grams thiab xa rov qab ob npaug rau tus nqi rau tus neeg ua si yog tias nws yeej thiab ib feem peb rau tus tswv yog tias nws poob.

Ua ntej, cia peb sau ib qho kev sim yooj yim. Txhawm rau ua qhov no, peb xav tau qhov chaw nyob xeem ntawm daim ntawv cog lus ntse los ntawm qhov uas peb xav tias xa mus rau daim ntawv cog lus ntse.

Qhov chaw nyob daim ntawv cog lus ntse muaj ob tus lej, tus lej 32-ntsis lub luag haujlwm rau lub chaw ua haujlwm thiab 256-ntsis tus lej tsis zoo ntawm tus lej tshwj xeeb hauv cov haujlwm no. Piv txwv li, -1 thiab 12345, qhov no yog qhov chaw nyob peb yuav khaws cia rau hauv cov ntaub ntawv.

Kuv theej cov haujlwm rau txuag qhov chaw nyob ntawm 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

Cia saib seb qhov ua haujlwm ua haujlwm li cas, qhov no yuav ua rau kev nkag siab ntawm Fift ua haujlwm li cas. Tua tawm Fift hauv kev sib tham sib hom.

~/TON/build/crypto/fift -i 

Ua ntej peb thawb -1, 12345 thiab lub npe ntawm cov ntaub ntawv yav tom ntej "sender.addr" mus rau pawg:

-1 12345 "sender.addr" 

Cov kauj ruam tom ntej yog ua haujlwm -rot, uas hloov cov pawg nyob rau hauv ib txoj kev uas nyob rau sab saum toj ntawm pawg muaj ib tug tshwj xeeb ntse daim ntawv cog lus:

"sender.addr" -1 12345

256 u>B converts 256-ntsis tsis-negative integer rau bytes.

"sender.addr" -1 BYTES:0000000000000000000000000000000000000000000000000000000000003039

swap swaps lub sab saum toj ob lub ntsiab ntawm pawg.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 -1

32 i>B converts 32-ntsis integer rau bytes.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 BYTES:FFFFFFFF

B+ txuas ob ntu ntawm bytes.

 "sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF

Ib zaug ntxiv swap.

BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF "sender.addr" 

Thiab thaum kawg cov bytes tau sau rau hauv cov ntaub ntawv B>file. Tom qab no peb pawg yog khoob. Peb nres Fift. Ib cov ntaub ntawv tau tsim nyob rau hauv daim nplaub tshev tam sim no sender.addr. Cia peb txav cov ntaub ntawv mus rau qhov tsim folders test/addresses/.

Cia peb sau ib qho kev sim yooj yim uas yuav xa cov grams mus rau daim ntawv cog lus ntse. Nov yog qhov kev cog lus.

Tam sim no cia saib lub logic ntawm lub rho npe.

Thawj qhov peb ua yog xyuas cov lus bounced los tsis yog bounced, ces peb tsis quav ntsej nws. bounced txhais tau hais tias daim ntawv cog lus yuav rov qab grams yog tias muaj qee qhov yuam kev tshwm sim. Peb yuav tsis rov qab grams yog tias muaj qhov yuam kev tam sim ntawd tshwm sim.

Peb xyuas, yog tias qhov nyiaj tshuav tsawg dua li ib nrab ib gram, ces peb tsuas lees txais cov lus thiab tsis quav ntsej nws.

Tom ntej no, peb txheeb xyuas qhov chaw nyob ntawm daim ntawv cog lus ntse uas cov lus tuaj.

Peb nyeem cov ntaub ntawv los ntawm kev khaws cia thiab tom qab ntawd tshem tawm cov thawj koom ruam qub los ntawm keeb kwm yog tias muaj ntau tshaj nees nkaum ntawm lawv. Kom yooj yim, kuv tau sau peb txoj haujlwm ntxiv pack_order(), unpack_order(), remove_old_orders().

Tom ntej no, peb saib yog tias qhov nyiaj tshuav tsis txaus rau cov nyiaj them poob haujlwm, ces peb xav tias qhov no tsis yog thawj koom ruam, tab sis kev rov ua dua thiab txuag cov khoom ntxiv hauv orders.

Tom qab ntawd thaum kawg lub ntsiab lus ntawm daim ntawv cog lus ntse.

Ua ntej, yog tias tus neeg ua si poob, peb khaws nws hauv keeb kwm kev twv txiaj thiab yog tias tus nqi ntau dua 3 grams, peb xa 1/3 rau tus tswv ntawm daim ntawv cog lus ntse.

Yog tias tus neeg ua si yeej, ces peb xa ob tus nqi mus rau tus neeg ua si qhov chaw nyob thiab tom qab ntawd khaws cov ntaub ntawv hais txog thawj koom ruam hauv keeb kwm.

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

Qhov ntawd yog txhua yam. Sib cog lus.

Tam sim no txhua yam uas tseem tshuav yog qhov yooj yim, cia peb tsim cov txheej txheem kom peb tau txais cov ntaub ntawv hais txog lub xeev ntawm daim ntawv cog lus los ntawm lub ntiaj teb sab nraud (qhov tseeb, nyeem cov ntaub ntawv los ntawm lawv cov ntawv cog lus ntse).

Wb ntxiv tau txoj kev. Peb yuav sau hauv qab no hais txog yuav ua li cas kom tau txais cov ntaub ntawv hais txog daim ntawv cog lus ntse.

Kuv kuj tsis nco qab ntxiv cov lej uas yuav ua cov ntawv thov thawj zaug uas tshwm sim thaum tshaj tawm daim ntawv cog lus ntse. Sib cog lus. Thiab ntxiv kho kab mob nrog xa 1/3 ntawm tus nqi mus rau tus tswv tus account.

Cov kauj ruam tom ntej yog luam tawm daim ntawv cog lus ntse. Wb tsim ib daim nplaub tshev requests.

Kuv muab cov ntawv tshaj tawm raws li lub hauv paus simple-wallet-code.fc uas nrhiav tau nyob rau hauv lub official repository.

Tej yam tsim nyog them rau. Peb tsim cov ntawv cog lus ntse cia thiab cov lus tawm tswv yim. Tom qab no, qhov chaw nyob ntawm daim ntawv cog lus ntse yog tsim, uas yog, qhov chaw nyob yog paub txawm tias ua ntej tshaj tawm hauv TON. Tom ntej no, koj yuav tsum tau xa ob peb grams mus rau qhov chaw nyob no, thiab tsuas yog tom qab ntawd koj yuav tsum xa cov ntaub ntawv nrog daim ntawv cog lus ntse nws tus kheej, txij li lub network siv lub luag haujlwm rau khaws cov ntawv cog lus ntse thiab kev ua haujlwm hauv nws (cov neeg siv khoom uas khaws thiab ua haujlwm ntse. cog lus). Cov cai tuaj yeem pom ntawm no.

Tom ntej no peb ua tus tshaj tawm code thiab tau txais lottery-query.boc ntse daim ntawv cog lus thiab chaw nyob.

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

Tsis txhob hnov ​​qab khaws cov ntaub ntawv generated: lottery-query.boc, lottery.addr, lottery.pk.

Ntawm lwm yam, peb yuav pom qhov chaw nyob ntawm daim ntawv cog lus ntse hauv cov ntawv ua tiav.

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

Tsuas yog ua kev lom zem xwb thov ua tsaug rau TON

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

Thiab peb yuav pom tias tus account nrog qhov chaw nyob no yog khoob.

account state is empty

Peb xa mus rau qhov chaw nyob 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd 2 Gram thiab tom qab ob peb vib nas this peb ua tib cov lus txib. xa grams kuv siv hnab nyiaj official, thiab koj tuaj yeem nug ib tus neeg los ntawm kev sib tham rau cov ntawv xeem, uas kuv yuav tham txog thaum kawg ntawm tsab xov xwm.

> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Zoo li ib tug uninitialized (state:account_uninit) daim ntawv cog lus ntse nrog tib qhov chaw nyob thiab qhov sib npaug ntawm 1 nanograms.

account state is (account
  addr:(addr_std
    anycast:nothing workchain_id:0 address:x044910149DBEAF8EADBB2B28722E7D6A2DC6E264EC2F1D9BEBD6FB209079BC2A)
  storage_stat:(storage_info
    used:(storage_used
      cells:(var_uint len:1 value:1)
      bits:(var_uint len:1 value:103)
      public_cells:(var_uint len:0 value:0)) last_paid:1583257959
    due_payment:nothing)
  storage:(account_storage last_trans_lt:3825478000002
    balance:(currencies
      grams:(nanograms
        amount:(var_uint len:4 value:2000000000))
      other:(extra_currencies
        dict:hme_empty))
    state:account_uninit))
x{C00044910149DBEAF8EADBB2B28722E7D6A2DC6E264EC2F1D9BEBD6FB209079BC2A20259C2F2F4CB3800000DEAC10776091DCD650004_}
last transaction lt = 3825478000001 hash = B043616AE016682699477FFF01E6E903878CDFD6846042BA1BFC64775E7AC6C4
account balance is 2000000000ng

Tam sim no cia peb luam tawm daim ntawv cog lus ntse. Cia peb pib lite-neeg siv khoom thiab ua tiav.

> 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 

Cia peb xyuas tias daim ntawv cog lus tau luam tawm lawm.

> last
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Ntawm lwm yam peb tau txais.

  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

Peb pom qhov ntawd account_active.

Kev cog lus nrog kev hloov pauv nyob ntawm no.

Tam sim no cia peb tsim kev thov kom cuam tshuam nrog daim ntawv cog lus ntse.

Ntau qhov tseeb, peb yuav tawm thawj qhov hloov pauv qhov chaw nyob raws li kev ua haujlwm ywj pheej, thiab peb yuav ua qhov thib ob rau xa cov grams mus rau tus tswv qhov chaw nyob. Qhov tseeb, peb yuav tau ua tib yam li hauv qhov kev xeem xa grams.

Qhov no yog cov lus peb yuav xa mus rau daim ntawv cog lus ntse, qhov twg msg_seqno 165, action 2 thiab 9.5 grams rau xa.

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

Tsis txhob hnov ​​​​qab kos npe cov lus nrog koj tus yuam sij ntiag tug lottery.pk, uas tau tsim ua ntej thaum tsim daim ntawv cog lus ntse. Ntawm no yog qhov sib cog lus.

Tau txais cov ntaub ntawv los ntawm daim ntawv cog lus ntse siv tau cov txheej txheem

Tam sim no cia saib yuav ua li cas khiav daim ntawv cog lus ntse tau txoj hauv kev.

Tua tawm lite-client thiab khiav cov kev tau txais uas peb tau sau.

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

Π’ result muaj tus nqi uas cov haujlwm rov qab los balance() los ntawm peb daim ntawv cog lus ntse.
Peb yuav ua tib yam rau ntau txoj hauv kev.

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

Wb nug txog koj qhov keeb kwm thawj koom ruam.

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

Peb yuav siv lite-neeg siv thiab tau txais cov txheej txheem los tso saib cov ntaub ntawv hais txog kev cog lus ntse ntawm lub xaib.

Tso cov ntaub ntawv cog lus ntse ntawm lub vev xaib

Kuv tau sau ib lub vev xaib yooj yim hauv Python los tso saib cov ntaub ntawv los ntawm daim ntawv cog lus ntse hauv txoj kev yooj yim. Ntawm no kuv yuav tsis nyob ntawm nws hauv kev nthuav dav thiab yuav tshaj tawm lub xaib hauv ib qho kev cog lus.

Kev thov rau TON yog tsim los ntawm Python nrog kev pab lite-client. Txhawm rau kom yooj yim, lub xaib tau ntim rau hauv Docker thiab luam tawm hauv Google Cloud. Txuas.

Sim

Tam sim no cia peb sim xa cov grams muaj rau ntxiv los ntawm hnab nyiaj. Peb yuav xa 40 grams. Thiab cia peb ua ob peb qhov kev twv txiaj kom pom tseeb. Peb pom tias lub vev xaib qhia txog keeb kwm ntawm kev twv txiaj, qhov feem pua ​​​​tau yeej tam sim no thiab lwm yam ntaub ntawv tseem ceeb.

Peb pomtias peb yeej thawj, poob qhov thib ob.

Tom qab ntawd

Cov kab lus tau hloov mus ntev dua li qhov kuv xav tau, tej zaum nws yuav luv dua, lossis tej zaum tsuas yog rau tus neeg uas tsis paub dab tsi txog TON thiab xav sau thiab tshaj tawm cov ntawv cog lus ntse tsis yooj yim uas muaj peev xwm cuam tshuam nrog. nws. Tej zaum qee yam tuaj yeem piav qhia yooj yim dua.

Tej zaum qee qhov ntawm qhov kev siv yuav ua tau zoo dua thiab zoo nkauj, tab sis tom qab ntawd nws yuav siv sij hawm ntau dua los npaj cov lus. Nws kuj tseem ua tau tias kuv tau ua yuam kev nyob qhov twg los yog tsis to taub ib yam dab tsi, yog li yog tias koj ua ib yam dab tsi loj, koj yuav tsum tau cia siab rau cov ntaub ntawv raug cai lossis cov ntaub ntawv pov thawj nrog TON code.

Nws yuav tsum tau muab sau tseg tias txij li thaum TON nws tus kheej tseem nyob rau hauv lub active theem ntawm txoj kev loj hlob, kev hloov tej zaum yuav tshwm sim uas yuav ua txhaum ib yam ntawm cov kauj ruam nyob rau hauv no tsab xov xwm (uas tau tshwm sim thaum kuv sau ntawv, nws twb raug kho lawm), tab sis txoj kev dav dav yog. tsis zoo li hloov.

Kuv yuav tsis tham txog yav tom ntej ntawm TON. Tej zaum lub platform yuav dhau los ua ib yam dab tsi loj thiab peb yuav tsum siv sijhawm los kawm nws thiab sau ib qho niche nrog peb cov khoom tam sim no.

Tseem muaj Libra los ntawm Facebook, uas muaj peev xwm ntawm cov neeg siv loj dua TON. Kuv paub yuav luag tsis muaj dab tsi txog Libra, txiav txim los ntawm lub rooj sab laj muaj ntau yam kev ua ub no ntau dua li hauv zej zog TON. Txawm hais tias cov neeg tsim khoom thiab cov zej zog ntawm TON zoo li hauv av, uas kuj yog txias.

ua tim khawv

  1. Official TON cov ntaub ntawv: https://test.ton.org
  2. Official TON repository: https://github.com/ton-blockchain/ton
  3. Lub hnab nyiaj raug cai rau ntau lub platform: https://wallet.ton.org
  4. Smart daim ntawv cog lus repository los ntawm kab lus no: https://github.com/raiym/astonished
  5. Txuas mus rau lub vev xaib sib cog lus ntse: https://ton-lottery.appspot.com
  6. Repository rau qhov txuas ntxiv rau Visual Studio Code rau FunC: https://github.com/raiym/func-visual-studio-plugin
  7. Tham txog TON hauv Telegram, uas tau pab tiag tiag los txheeb xyuas nws ntawm thawj theem. Kuv xav tias nws yuav tsis yuam kev yog tias kuv hais tias txhua tus neeg uas sau ib yam dab tsi rau TON yog nyob ntawd. Koj tuaj yeem thov kom kuaj cov grams nyob ntawd. https://t.me/tondev_ru
  8. Lwm qhov kev sib tham txog TON uas kuv pom cov ntaub ntawv tseem ceeb: https://t.me/TONgramDev
  9. Thawj theem ntawm kev sib tw: https://contest.com/blockchain
  10. Qhov thib ob theem ntawm kev sib tw: https://contest.com/blockchain-2

Tau qhov twg los: www.hab.com

Ntxiv ib saib