Konsènan ki jan yo ekri ak pibliye yon kontra entelijan nan Telegram Open Network (TON)

Konsènan ki jan yo ekri ak pibliye yon kontra entelijan nan TON

Ki sa ki atik sa a sou?

Nan atik la mwen pral pale sou ki jan mwen te patisipe nan premye (nan de) konpetisyon Telegram blockchain, pa t 'pran yon pri, epi mwen deside anrejistre eksperyans mwen nan yon atik pou li pa koule nan oubli epi, petèt, ede. yon moun.

Depi mwen pa t 'vle ekri kòd abstrè, men fè yon bagay k ap travay, pou atik la mwen te ekri yon kontra entelijan pou yon lotri enstantane ak yon sit entènèt ki montre done kontra entelijan ki sòti dirèkteman nan TON san yo pa itilize depo entèmedyè.

Atik la pral itil pou moun ki vle fè premye kontra entelijan yo nan TON, men ki pa konnen ki kote yo kòmanse.

Sèvi ak lotri a kòm yon egzanp, mwen pral soti nan enstale anviwònman an pibliye yon kontra entelijan, kominike avèk li, epi ekri yon sit entènèt pou resevwa ak pibliye done.

Sou patisipasyon nan konpetisyon an

Oktòb pase a, Telegram te anonse yon konpetisyon blockchain ak nouvo lang Fift и FunC. Li te nesesè yo chwazi nan ekri nenpòt nan senk kontra entelijan yo pwopoze yo. Mwen te panse ke li ta bon pou fè yon bagay diferan, aprann yon lang ak fè yon bagay, menm si mwen pa bezwen ekri anyen ankò nan lavni. Anplis de sa, sijè a toujou ap sou bouch yo.

Li vo di ke mwen pa te gen okenn eksperyans devlope kontra entelijan.

Mwen te planifye pou patisipe jouk nan fen anpil jiskaske mwen te kapab ak Lè sa a, ekri yon atik revizyon, men mwen echwe touswit nan youn nan premye. mwen ekri yon bous ak milti-siyati sou FunC epi li jeneralman te travay. Mwen te pran li kòm yon baz kontra entelijan sou Solidity.

Lè sa a, mwen te panse ke sa a te definitivman ase yo pran omwen kèk plas pri. Kòm yon rezilta, anviwon 40 sou 60 patisipan yo te vin jwenn pri e mwen pa t nan mitan yo. An jeneral, pa gen anyen mal ak sa a, men yon sèl bagay anmède m '. Nan moman anons rezilta yo, revizyon egzamen an pou kontra mwen an pa te fèt, mwen te mande patisipan yo nan chat la si gen nenpòt lòt moun ki pa t 'gen li, pa te gen okenn.

Aparamman peye atansyon sou mesaj mwen yo, de jou apre jij yo pibliye yon kòmantè epi mwen toujou pa konprann si yo aksidantèlman rate kontra entelijan mwen an pandan jijman an oswa tou senpleman panse ke li te tèlman mal ke li pa t 'bezwen yon kòmantè. Mwen te poze yon kesyon sou paj la, men mwen pa t resevwa yon repons. Malgre ke se pa sekrè ki moun ki jije, mwen konsidere li pa nesesè yo ekri mesaj pèsonèl.

Anpil tan te pase sou konpreyansyon, kidonk li te deside ekri yon atik. Depi pa gen anpil enfòmasyon ankò, atik la pral ede ekonomize tan pou tout moun ki enterese.

Konsèp nan kontra entelijan nan TON

Anvan ou ekri anyen, ou bezwen konnen ki bò pou apwoche bagay sa a. Se poutèt sa, kounye a mwen pral di ou ki pati sistèm nan konsiste de. Plis jisteman, ki pati ou bezwen konnen yo nan lòd yo ekri omwen kèk kalite kontra travay.

Nou pral konsantre sou ekri yon kontra entelijan ak travay avèk yo TON Virtual Machine (TVM), Fift и FunC, Se konsa, atik la se plis tankou yon deskripsyon nan devlopman nan yon pwogram regilye. Nou pa pral rete sou fason platfòm nan tèt li travay isit la.

An jeneral sou kijan li fonksyone TVM ak lang Fift gen bon dokiman ofisyèl. Pandan m t ap patisipe nan konpetisyon an e kounye a, pandan m t ap ekri kontra aktyèl la, mwen te souvan tounen vin jwenn li.

Lang prensipal nan ki kontra entelijan yo ekri se FunC. Pa gen okenn dokiman sou li nan moman sa a, se konsa yo nan lòd yo ekri yon bagay ou bezwen etidye egzanp nan kontra entelijan soti nan depo ofisyèl la ak aplikasyon an nan lang nan tèt li la, plis ou ka gade nan egzanp nan kontra entelijan soti nan de ki sot pase yo. konpetisyon. Lyen nan fen atik la.

Ann di nou te deja ekri yon kontra entelijan pou FunC, apre sa nou konpile kòd la nan Fift assembler.

Konpile kontra entelijan rete yo dwe pibliye. Pou fè sa ou bezwen ekri yon fonksyon nan Fift, ki pral pran kòd la kontra entelijan ak kèk lòt paramèt kòm opinyon, ak pwodiksyon an pral yon dosye ak ekstansyon an. .boc (ki vle di "sak selil"), epi, depann sou fason nou ekri li, yon kle prive ak adrès, ki pwodwi ki baze sou kòd kontra entelijan an. Ou ka deja voye gram nan adrès yon kontra entelijan ki poko pibliye.

Pou pibliye yon kontra entelijan nan TON resevwa .boc dosye a ap bezwen voye nan blockchain a lè l sèvi avèk yon kliyan limyè (plis sou sa ki anba a). Men, anvan pibliye, ou bezwen transfere gram nan adrès pwodwi a, otreman kontra a entelijan pa pral pibliye. Apre piblikasyon, ou ka kominike avèk kontra entelijan an lè w voye mesaj li soti deyò (pa egzanp lè l sèvi avèk yon kliyan limyè) oswa andedan (pa egzanp, yon kontra entelijan voye yon lòt mesaj andedan TON).

Yon fwa nou konprann ki jan yo pibliye kòd la, li vin pi fasil. Nou konnen apeprè sa nou vle ekri ak ki jan pwogram nou an pral travay. Ak pandan w ap ekri, nou gade pou kijan sa a deja aplike nan kontra entelijan ki deja egziste, oswa nou gade nan kòd aplikasyon an Fift и FunC nan depo ofisyèl la, oswa gade nan dokiman ofisyèl la.

Trè souvan mwen te chèche mo kle nan chat Telegram kote tout patisipan yo nan konpetisyon an ak anplwaye Telegram yo te rasanble, epi li te rive ke pandan konpetisyon an tout moun te rasanble la epi yo te kòmanse diskite sou Fift ak FunC. Link nan fen atik la.

Li lè pou nou pase soti nan teyori al nan pratik.

Prepare anviwònman an pou travay ak TON

Mwen te fè tout sa ki pral dekri nan atik la sou MacOS epi mwen te verifye li de fwa nan yon pwòp Ubuntu 18.04 LTS sou Docker.

Premye bagay ou bezwen fè se telechaje ak enstale lite-client ak ki ou ka voye demann bay TON.

Enstriksyon yo sou sitwèb ofisyèl la dekri pwosesis enstalasyon an byen detaye e klèman, san yo pa mete kèk detay. La a, nou swiv enstriksyon yo, epi nou enstale nenpòt depandans ki manke pandan pwosesis la. Mwen pa t konpile chak pwojè mwen menm, mwen te enstale yo apati depo ofisyèl la. Ubuntu (sou MacOS mwen te itilize a 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 

Yon fwa tout depandans yo enstale ou ka enstale lite-client, Fift, FunC.

Premyèman, nou klonaj depo TON ansanm ak depandans li yo. Pou konvenyans, nou pral fè tout bagay nan yon katab ~/TON.

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

Repozitwa a tou estoke aplikasyon yo Fift и FunC.

Koulye a, nou pare yo rasanble pwojè a. Kòd depo a klone nan yon katab ~/TON/ton. Nan ~/TON kreye yon katab build epi kolekte pwojè a ladan l.

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

Depi nou pral ekri yon kontra entelijan, nou bezwen pa sèlman lite-clientMen, Fift с FunC, Se konsa, ann konpile tout bagay. Se pa yon pwosesis rapid, kidonk nou ap tann.

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

Apre sa, telechaje fichye a konfigirasyon ki gen done sou ne a ki lite-client pral konekte.

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

Fè premye demann yo bay TON

Koulye a, ann lanse lite-client.

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

Si bati a te gen siksè, Lè sa a, apre lansman ou pral wè yon boutèy demi lit nan koneksyon an nan kliyan an limyè nan ne la.

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

Ou ka kouri lòd la help epi wè ki kòmandman ki disponib.

help

Ann fè lis kòmandman yo ke nou pral itilize nan atik sa a.

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

Koulye a, nou pare yo ekri kontra a tèt li.

Aplikasyon

Lide

Kòm mwen te ekri pi wo a, kontra entelijan ke nou ekri a se yon lotri.

Anplis, sa a se pa yon lotri kote ou bezwen achte yon tikè epi tann yon èdtan, yon jou oswa yon mwa, men yon sèl enstantane kote itilizatè a transfere nan adrès kontra a. N gram, epi imedyatman jwenn li tounen 2 * N gram oswa pèdi. Nou pral fè pwobabilite pou genyen apeprè 40%. Si pa gen ase gram pou peman, Lè sa a, nou pral konsidere tranzaksyon an kòm yon tèt-up.

Anplis, li enpòtan ke parye ka wè an tan reyèl ak nan yon fòm pratik, pou itilizatè a ka imedyatman konprann si li te genyen oswa pèdi. Se poutèt sa, ou bezwen fè yon sit entènèt ki pral montre parye ak rezilta dirèkteman nan TON.

Ekri yon kontra entelijan

Pou konvenyans, mwen te mete aksan sou kòd la pou FunC ka jwenn ak enstale nan rechèch la Visual Studio si ou toudenkou vle ajoute yon bagay, mwen te fè Plugin la disponib. Epitou, yon moun te deja fè yon Plugin pou travay ak Fift, ou ka tou enstale li epi jwenn li nan VSC.

An nou imedyatman kreye yon depo kote nou pral komèt rezilta entèmedyè yo.

Pou rann lavi nou pi fasil, nou pral ekri yon kontra entelijan epi teste li lokalman jiskaske li pare. Se sèlman apre sa nou pral pibliye li nan TON.

Kontra entelijan an gen de metòd ekstèn ki ka jwenn aksè. Premyèman, recv_external() fonksyon sa a egzekite lè yon demann nan kontra a soti nan mond lan deyò, se sa ki, pa soti nan TON, pou egzanp, lè nou menm nou jenere yon mesaj epi voye li nan lite-kliyan an. Dezyèmman, recv_internal() sa a se lè, nan TON tèt li, nenpòt kontra refere a nou an. Nan de ka yo, ou ka pase paramèt nan fonksyon an.

Ann kòmanse ak yon egzanp senp ki pral travay si pibliye, men pa gen okenn chaj fonksyonèl nan li.

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

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

Isit la nou bezwen eksplike sa li ye slice. Tout done ki estoke nan TON Blockchain se yon koleksyon TVM cell oswa tou senpleman cell, nan yon selil konsa ou ka estoke jiska 1023 Bits nan done ak jiska 4 lyen ki mennen nan lòt selil yo.

TVM cell slice oswa slice sa a se yon pati nan youn nan ki deja egziste cell se itilize analize li, li pral vin klè pita. Bagay pwensipal lan pou nou se ke nou ka transfere slice epi depann sou kalite mesaj la, trete done yo nan recv_external() oswa recv_internal().

impure — yon mo kle ki endike ke fonksyon an modifye done kontra entelijan.

Ann sove kòd kontra a nan lottery-code.fc epi konpile.

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

Ou ka wè siyifikasyon drapo yo lè l sèvi avèk kòmandman an

~/TON/build/crypto/func -help

Nou te konpile Fift assembler kòd nan 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

Li ka lanse lokalman, pou sa nou pral prepare anviwònman an.

Remake byen ke premye liy lan konekte Asm.fif, sa a se kòd ki ekri nan Fift pou asanble Fift la.

Depi nou vle kouri ak teste kontra entelijan an lokalman, nou pral kreye yon dosye lottery-test-suite.fif epi kopye kòd konpile a la, ranplase dènye liy ki ladan l, ki ekri kòd kontra entelijan nan yon konstan codeLè sa a, transfere li nan machin vityèl la:

"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

Jiskaprezan li sanble klè, kounye a ann ajoute nan menm dosye a kòd ke nou pral itilize pou lanse 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 nou anrejistre kontèks la, se sa ki, done ak ki TVM (oswa eta rezo a) pral lanse. Menm pandan konpetisyon an, youn nan devlopè yo te montre kijan pou kreye c7 epi mwen kopye. Nan atik sa a nou ka bezwen chanje rand_seed piske jenerasyon yon nimewo o aza depann de li epi si li pa chanje, yo pral retounen menm nimewo a chak fwa.

recv_internal и recv_external konstan ak valè 0 ak -1 yo pral responsab pou rele fonksyon korespondan yo nan kontra entelijan an.

Koulye a, nou pare yo kreye premye tès la pou kontra entelijan vid nou an. Pou klè, pou kounye a nou pral ajoute tout tès yo nan menm dosye a lottery-test-suite.fif.

Ann kreye yon varyab storage epi ekri yon vid ladan l cell, sa a pral depo nan kontra entelijan.

message Sa a se mesaj la ke nou pral transmèt nan kontak la entelijan soti an deyò de la. Nou pral tou fè li vid pou kounye a.

variable storage 
<b b> storage ! 

variable message 
<b b> message ! 

Apre nou fin prepare konstan yo ak varyab yo, nou lanse TVM lè l sèvi avèk lòd la runvmctx epi pase paramèt yo kreye nan opinyon an.

message @ 
recv_external 
code 
storage @ 
c7 
runvmctx 

Nan fen a nou pral reyisi tankou sa a kòd entèmedyè pou Fift.

Koulye a, nou ka kouri kòd la ki kapab lakòz.

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

Pwogram nan ta dwe kouri san erè ak nan pwodiksyon an nou pral wè boutèy la ekzekisyon:

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

Gwo, nou te ekri premye vèsyon k ap travay nan kontra entelijan an.

Koulye a, nou bezwen ajoute fonctionnalités. Premye kite a fè fas ak mesaj ki soti nan mond lan deyò recv_external()

Pwomotè a li menm chwazi fòma mesaj ke kontra a ka aksepte.

Men, anjeneral

  • premyèman, nou vle pwoteje kontra nou an soti nan mond lan deyò epi fè li pou ke sèlman mèt kay la nan kontra a ka voye mesaj ekstèn ba li.
  • Dezyèmman, lè nou voye yon mesaj valab bay TON, nou vle sa a rive egzakteman yon fwa epi lè nou voye menm mesaj la ankò, kontra entelijan an rejte li.

Se konsa, prèske chak kontra rezoud de pwoblèm sa yo, depi kontra nou an aksepte mesaj ekstèn, nou bezwen pran swen nan sa tou.

Nou pral fè li nan lòd ranvèse. Premyèman, se pou nou rezoud pwoblèm nan ak repetisyon si kontra a te deja resevwa yon mesaj konsa ak trete li, li pa pral egzekite li yon dezyèm fwa. Lè sa a, nou pral rezoud pwoblèm nan pou ke sèlman yon sèk sèten nan moun ka voye mesaj nan kontra a entelijan.

Gen diferan fason yo rezoud pwoblèm nan ak mesaj kopi. Men ki jan nou pral fè li. Nan kontra entelijan an, nou inisyalize kontwa mesaj resevwa yo ak valè inisyal la 0. Nan chak mesaj nan kontra entelijan an, nou pral ajoute valè kontwa aktyèl la. Si valè kontwa a nan mesaj la pa matche ak valè nan kontra entelijan an, Lè sa a, nou pa trete li si li fè sa, Lè sa a, nou trete li epi ogmante kontwa a nan kontra a entelijan pa 1.

Nou retounen nan lottery-test-suite.fif epi ajoute yon dezyèm tès sou li. Si nou voye yon nimewo ki pa kòrèk, kòd la ta dwe voye yon eksepsyon. Pou egzanp, kite done kontra a magazen 166, epi nou pral voye 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"

Ann lanse.

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

Epi nou pral wè ke tès la egzekite ak yon erè.

[ 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

Nan etap sa a lottery-test-suite.fif ta dwe sanble по ссылке.

Koulye a, ann ajoute lojik kontwa a nan kontra entelijan an 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 manti mesaj nou voye a.

Premye bagay nou fè se tcheke si mesaj la gen done, si se pa sa, Lè sa a, nou tou senpleman sòti.

Apre sa, nou analize mesaj la. in_msg~load_uint(32) chaje nimewo a 165, 32-bit unsigned int soti nan mesaj transmèt la.

Apre sa, nou chaje 32 bits nan depo kontra entelijan an. Nou tcheke si nimewo ki chaje a matche ak yon sèl ki pase a; Nan ka nou an, depi nou ap pase yon non-match, yo ta dwe voye yon eksepsyon.

Koulye a, kite a konpile.

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

Kopi kòd ki kapab lakòz nan lottery-test-suite.fif, pa bliye ranplase dènye liy lan.

Nou tcheke si tès la pase:

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

Dwa isit la Ou ka wè komite ki koresponn lan ak rezilta aktyèl yo.

Remake byen ke li se enkonvenyan yo toujou ap kopye kòd la konpile nan yon kontra entelijan nan yon dosye ak tès, kidonk ann ekri yon script ki pral ekri kòd la nan yon konstan pou nou, epi nou pral tou senpleman konekte kòd la konpile ak tès nou yo lè l sèvi avèk "include".

Kreye yon dosye nan katab pwojè a build.sh ak kontni sa a.

#!/bin/bash

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

Ann fè li ègzekutabl.

chmod +x ./build.sh

Koulye a, jis kouri script nou pou konpile kontra a. Men, san konte sa a, nou bezwen ekri li nan yon konstan code. Se konsa, nou pral kreye yon nouvo dosye lotter-compiled-for-test.fif, ke nou pral mete nan dosye a lottery-test-suite.fif.

Ann ajoute kòd skirpt nan sh, ki pral tou senpleman kopi fichye a konpile nan lotter-compiled-for-test.fif epi chanje dènye liy lan nan li.

# 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

Koulye a, pou tcheke, ann kouri script ki kapab lakòz epi yo pral pwodwi yon dosye lottery-compiled-for-test.fif, ke nou pral mete nan nou an lottery-test-suite.fif

В lottery-test-suite.fif efase kòd kontra a epi ajoute liy lan "lottery-compiled-for-test.fif" include.

Nou fè tès pou verifye ke yo pase.

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

Bon, kounye a otomatize lansman tès yo, ann kreye yon dosye test.sh, ki pral premye egzekite build.sh, ak Lè sa a, kouri tès yo.

touch test.sh
chmod +x test.sh

Nou ekri anndan

./build.sh 

echo "nCompilation completedn"

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

Ann fèl test.sh epi kouri li pou asire w ke tès yo travay.

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

Nou tcheke ke kontra a konpile ak tès yo egzekite.

Gwo, kounye a sou demaraj test.sh Tès yo pral konpile epi kouri imedyatman. Men lyen pou komèt.

Oke, anvan nou kontinye, ann fè yon lòt bagay pou konvenyans.

Ann kreye yon katab build kote nou pral estoke kontra a kopye ak script li yo ekri nan yon konstan lottery-compiled.fif, lottery-compiled-for-test.fif. An nou tou kreye yon Katab test ki kote yo pral estoke dosye tès la? lottery-test-suite.fif ak potansyèlman lòt dosye sipò. Link ak chanjman ki enpòtan yo.

Ann kontinye devlope kontra entelijan an.

Apre sa, ta dwe gen yon tès ki tcheke si mesaj la resevwa ak kontwa a mete ajou nan magazen an lè nou voye nimewo ki kòrèk la. Men, nou pral fè sa pita.

Koulye a, ann reflechi sou ki estrikti done ak ki done yo bezwen estoke nan kontra entelijan an.

Mwen pral dekri tout sa nou sere.

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

Apre sa, ou bezwen ekri de fonksyon. Ann rele premye a pack_state(), ki pral pake done yo pou ekonomize ki vin apre nan depo kontra entelijan an. Ann rele dezyèm lan unpack_state() pral li epi retounen done ki soti nan depo.

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

Nou ajoute de fonksyon sa yo nan kòmansman kontra entelijan an. Li pral travay deyò tankou sa a rezilta entèmedyè.

Pou sove done w ap bezwen rele fonksyon entegre a set_data() epi li pral ekri done ki soti nan pack_state() nan depo kontra entelijan an.

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

Kounye a ke nou gen fonksyon pratik pou ekri ak li done, nou ka kontinye.

Nou bezwen tcheke si mesaj ki soti deyò a siyen pa pwopriyetè kontra a (oswa yon lòt itilizatè ki gen aksè a kle prive a).

Lè nou pibliye yon kontra entelijan, nou ka inisyalize li ak done nou bezwen nan depo, ki pral sove pou itilize nan lavni. Nou pral anrejistre kle piblik la pou nou ka verifye si mesaj k ap vini an te siyen ak kle prive ki koresponn lan.

Anvan w kontinye, ann kreye yon kle prive epi ekri l test/keys/owner.pk. Pou fè sa, ann lanse Fift nan mòd entèaktif epi egzekite kat kòmandman.

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

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

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

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

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

Ann kreye yon katab keys andedan katab la test epi ekri kle prive a la.

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

Nou wè yon dosye nan katab aktyèl la owner.pk.

Nou retire kle piblik la nan pil la epi lè sa nesesè nou ka jwenn li nan yon sèl prive a.

Koulye a, nou bezwen ekri yon verifikasyon siyati. Ann kòmanse ak tès la. Premye nou li kle prive a nan dosye a lè l sèvi avèk fonksyon an file>B epi ekri li nan yon varyab owner_private_key, Lè sa a, sèvi ak fonksyon an priv>pub konvèti kle prive a nan yon kle piblik epi ekri rezilta a nan 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 !

Nou pral bezwen tou de kle.

Nou inisyalize depo kontra entelijan ak done abitrè nan menm sekans ak fonksyon an pack_state()epi ekri li nan yon varyab 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 !

Apre sa, nou pral konpoze yon mesaj siyen, li pral sèlman genyen siyati a ak valè vann san preskripsyon an.

Premyèman, nou kreye done yo ke nou vle transmèt, Lè sa a, nou siyen li ak yon kle prive epi finalman nou jenere yon mesaj siyen.

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 !  

Kòm yon rezilta, mesaj la ke nou pral voye nan kontra a entelijan anrejistre nan yon varyab message_to_send, sou fonksyon hashu, ed25519_sign_uint ou ka li nan dokiman senkyèm lan.

Ak kouri tès la nou rele ankò.

message_to_send @ 
recv_external 
code 
storage @
c7
runvmctx

Isit la se konsa Fichye a ak tès yo ta dwe sanble sa a nan etap sa a.

Ann fè tès la epi li pral echwe, kidonk nou pral chanje kontra entelijan an pou li ka resevwa mesaj nan fòma sa a epi verifye siyati a.

Premyèman, nou konte 512 Bits nan siyati a soti nan mesaj la epi ekri li nan yon varyab, Lè sa a, nou konte 32 Bits nan varyab kontwa an.

Depi nou gen yon fonksyon pou li done ki soti nan depo kontra entelijan an, nou pral sèvi ak li.

Next se tcheke kontwa a transfere ak depo a ak tcheke siyati a. Si yon bagay pa matche, Lè sa a, nou voye yon eksepsyon ak kòd ki apwopriye a.

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

Komite ki enpòtan isit la.

Ann kouri tès yo epi wè dezyèm tès la echwe. Pou de rezon, pa gen ase Bits nan mesaj la epi pa gen ase Bits nan depo a, kidonk kòd la aksidan lè analize. Nou bezwen ajoute yon siyati nan mesaj n ap voye a epi kopye depo ki soti nan dènye tès la.

Nan dezyèm tès la, nou pral ajoute yon siyati mesaj epi chanje depo kontra entelijan an. Isit la se konsa dosye a ak tès yo sanble nan moman sa a.

Ann ekri yon katriyèm tès, kote n ap voye yon mesaj ki siyen ak kle prive yon lòt moun. Ann kreye yon lòt kle prive epi sove li nan yon dosye not-owner.pk. Nou pral siyen mesaj la ak kle prive sa a. Ann kouri tès yo epi asire w ke tout tès yo pase. komèt nan moman sa a.

Koulye a, nou ka finalman deplase sou aplike lojik kontra entelijan an.
В recv_external() nou pral aksepte de kalite mesaj.

Depi kontra nou an pral akimile pèt jwè yo, lajan sa a dwe transfere bay kreyatè lotri a. Adrès bous kreyatè lotri a anrejistre nan depo a lè kontra a kreye.

Jis nan ka, nou bezwen kapasite nan chanje adrès la nan ki nou voye gram nan pèdan yo. Nou ta dwe kapab tou voye gram soti nan lotri a nan adrès pwopriyetè a.

Ann kòmanse ak premye a. Se pou premye ekri yon tès ki pral tcheke ke apre voye mesaj la, kontra a entelijan sove nouvo adrès la nan depo a. Tanpri sonje ke nan mesaj la, anplis kontwa a ak nouvo adrès la, nou transmèt tou action Yon nonb antye ki pa negatif 7-bit, tou depann de li, nou pral chwazi ki jan yo trete mesaj la nan kontra a entelijan.

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

Nan tès la ou ka wè ki jan depo smartcontract deserialize storage nan senkant. Yo dekri deserializasyon varyab yo nan dokiman Fift la.

Komèt lyen ak adisyon nan farin.

Ann kouri tès la epi asire w ke li echwe. Koulye a, ann ajoute lojik pou chanje adrès mèt lotri a.

Nan kontra entelijan nou kontinye analize message, li nan action. Se pou nou raple w ke nou pral gen de action: chanje adrès epi voye gram.

Lè sa a, nou li nouvo adrès pwopriyetè kontra a epi sove li nan depo.
Nou kouri tès yo epi wè ke twazyèm tès la echwe. Li aksidan akòz lefèt ke kontra a kounye a Anplis de sa analize 7 Bits nan mesaj la, ki manke nan tès la. Ajoute yon ki pa egziste nan mesaj la action. Ann kouri tès yo epi wè ke tout bagay pase. Isit la angaje nan chanjman. Gwo.

Koulye a, ann ekri lojik pou voye kantite gram espesifye nan adrès ki te deja sove a.

Premyèman, ann ekri yon tès. Nou pral ekri de tès, youn lè pa gen ase balans, dezyèm lan lè tout bagay ta dwe pase avèk siksè. Yo ka wè tès yo nan angajman sa a.

Koulye a, ann ajoute kòd la. Premyèman, an n ekri de metòd asistan. Premye metòd jwenn se chèche konnen balans aktyèl la nan yon kontra entelijan.

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

Ak dezyèm lan se pou voye gram nan yon lòt kontra entelijan. Mwen konplètman kopye metòd sa a soti nan yon lòt kontra entelijan.

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

Ann ajoute de metòd sa yo nan kontra entelijan an epi ekri lojik la. Premyèman, nou analize kantite gram ki soti nan mesaj la. Apre sa, nou tcheke balans lan, si li pa ase nou voye yon eksepsyon. Si tout bagay anfòm, Lè sa a, nou voye gram yo nan adrès ki sove a epi mete ajou kontwa an.

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

Isit la se konsa sanble kontra entelijan nan moman sa a. Ann kouri tès yo epi asire w ke yo pase.

By wout la, se yon komisyon dedwi nan kontra a entelijan chak fwa pou yon mesaj trete. Nan lòd pou mesaj kontra entelijan yo egzekite demann lan, apre chèk debaz ou bezwen rele accept_message().

Koulye a, kite a deplase sou mesaj entèn yo. An reyalite, nou pral sèlman aksepte gram epi voye tounen doub kantite lajan an bay jwè a si li genyen ak yon tyè bay mèt kay la si li pèdi.

Premyèman, ann ekri yon tès senp. Pou fè sa, nou bezwen yon adrès tès nan kontra entelijan ki soti nan ki nou sipoze voye gram nan kontra a entelijan.

Adrès kontra entelijan an konsiste de de nimewo, yon nonb antye relatif 32-bit ki responsab pou chèn travay la ak yon nonb antye ki pa negatif 256-bit nimewo kont inik nan workchain sa a. Pou egzanp, -1 ak 12345, sa a se adrès la nou pral sove nan yon dosye.

Mwen kopye fonksyon an pou konsève pou adrès la soti nan 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

Ann gade nan ki jan fonksyon an ap travay, sa a pral bay yon konpreyansyon sou ki jan Fift travay. Lanse Fift nan mòd entèaktif.

~/TON/build/crypto/fift -i 

Premyèman, nou pouse -1, 12345 ak non fichye a nan lavni "sender.addr" sou pil la:

-1 12345 "sender.addr" 

Pwochen etap la se egzekite fonksyon an -rot, ki chanje pil la nan yon fason ke nan tèt pil la gen yon nimewo inik kontra entelijan:

"sender.addr" -1 12345

256 u>B konvèti yon nonb antye relatif 256-bit ki pa negatif nan byte.

"sender.addr" -1 BYTES:0000000000000000000000000000000000000000000000000000000000003039

swap echanje de eleman pi wo yo nan pil la.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 -1

32 i>B konvèti yon nonb antye relatif 32-bit an byte.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 BYTES:FFFFFFFF

B+ konekte de sekans byte.

 "sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF

Ankò swap.

BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF "sender.addr" 

Epi finalman bytes yo ekri nan dosye a B>file. Apre sa, pile nou an vid. Nou sispann Fift. Yo te kreye yon dosye nan katab aktyèl la sender.addr. Ann deplase dosye a nan katab la kreye test/addresses/.

Ann ekri yon tès senp ki pral voye gram nan yon kontra entelijan. Men angajman an.

Koulye a, ann gade nan lojik la nan lotri a.

Premye bagay nou fè se tcheke mesaj la bounced oswa ou pa si bounced, Lè sa a, nou inyore li. bounced vle di ke kontra a pral retounen gram si kèk erè rive. Nou pa pral retounen gram si yon erè toudenkou rive.

Nou tcheke, si balans lan se mwens pase mwatye yon gram, Lè sa a, nou tou senpleman aksepte mesaj la epi inyore li.

Apre sa, nou analize adrès kontra entelijan ki soti nan mesaj la soti.

Nou li done ki soti nan depo a ak Lè sa a, efase parye fin vye granmoun nan istwa a si gen plis pase ven nan yo. Pou konvenyans, mwen te ekri twa fonksyon adisyonèl pack_order(), unpack_order(), remove_old_orders().

Apre sa, nou gade si balans lan pa ase pou peman an, Lè sa a, nou konsidere ke sa a se pa yon parye, men yon renouvèlman, epi sove renouvèlman an nan. orders.

Lè sa a, finalman sans nan kontra a entelijan.

Premyèman, si jwè a pèdi, nou sove li nan istwa parayj la epi si kantite lajan an se plis pase 3 gram, nou voye 1/3 bay mèt kontra a entelijan.

Si jwè a genyen, Lè sa a, nou voye doub kantite lajan an nan adrès jwè a ak Lè sa a, sove enfòmasyon sou parye a nan listwa.

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

Sa a li. Korespondan komèt.

Koulye a, tout sa ki rete se senp, se pou nou kreye jwenn-metòd pou nou ka jwenn enfòmasyon sou eta a nan kontra a soti nan mond lan deyò (an reyalite, li done yo nan depo kontra entelijan yo).

Ann ajoute jwenn metòd. Nou pral ekri anba a sou fason pou resevwa enfòmasyon sou yon kontra entelijan.

Mwen menm mwen bliye ajoute kòd la ki pral trete premye demann ki fèt lè yo pibliye yon kontra entelijan. Korespondan komèt. Ak pi lwen korije ensèk ak voye 1/3 nan kantite lajan an nan kont pwopriyetè a.

Pwochen etap la se pibliye kontra entelijan an. Ann kreye yon katab requests.

Mwen te pran kòd piblikasyon an kòm yon baz simple-wallet-code.fc ki ka jwenn nan depo ofisyèl la.

Yon bagay ki vo peye atansyon a. Nou jenere yon depo kontra entelijan ak yon mesaj opinyon. Apre sa, adrès la nan kontra entelijan pwodwi, se sa ki, adrès la konnen menm anvan piblikasyon nan TON. Apre sa, ou bezwen voye plizyè gram nan adrès sa a, epi sèlman apre sa ou bezwen voye yon dosye ak kontra entelijan tèt li, depi rezo a pran yon komisyon pou estoke kontra a entelijan ak operasyon ladan l (validateur ki estoke ak egzekite entelijan. kontra). Ou ka wè kòd la isit la.

Apre sa, nou egzekite kòd la pibliye epi jwenn lottery-query.boc dosye kontra entelijan ak adrès.

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

Pa bliye sove dosye yo pwodwi: lottery-query.boc, lottery.addr, lottery.pk.

Pami lòt bagay, nou pral wè adrès la nan kontra a entelijan nan mòso bwa yo ekzekisyon.

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

Jis pou plezi, ann fè yon demann bay TON

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

Epi nou pral wè ke kont ki gen adrès sa a vid.

account state is empty

Nou voye nan adrès la 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd 2 Gram epi apre kèk segond nou egzekite menm kòmandman an. Pou voye gram mwen itilize bous ofisyèl, epi ou ka mande yon moun nan chat la pou gram tès, ki mwen pral pale sou nan fen atik la.

> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Sanble yon non (state:account_uninit) yon kontra entelijan ak menm adrès la ak yon balans 1 nanogram.

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

Koulye a, ann pibliye kontra entelijan an. Ann lanse lite-client ak egzekite.

> 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 

Ann tcheke si kontra a te pibliye.

> last
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Pami lòt bagay nou jwenn.

  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

Nou wè sa account_active.

Korespondan komèt ak chanjman isit la.

Koulye a, ann kreye demann pou kominike avèk kontra entelijan an.

Plis jisteman, nou pral kite premye a pou chanje adrès la kòm yon travay endepandan, epi nou pral fè dezyèm lan pou voye gram nan adrès pwopriyetè a. An reyalite, nou pral bezwen fè menm bagay ak nan tès la pou voye gram.

Sa a se mesaj la nou pral voye nan kontra a entelijan, ki kote msg_seqno 165, action 2 ak 9.5 gram pou voye.

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

Pa bliye siyen mesaj la ak kle prive ou lottery.pk, ki te pwodwi pi bonè lè yo te kreye kontra entelijan an. Isit la se komite ki koresponn lan.

Resevwa enfòmasyon ki soti nan yon kontra entelijan lè l sèvi avèk metòd jwenn

Koulye a, kite a gade nan ki jan yo kouri kontra entelijan jwenn metòd.

Lanse lite-client epi kouri metòd get ke nou te ekri yo.

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

В result gen valè fonksyon an retounen balance() soti nan kontra entelijan nou an.
Nou pral fè menm bagay la pou plizyè lòt metòd.

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

Ann mande istwa parye ou.

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

Nou pral sèvi ak lite-client epi jwenn metòd pou montre enfòmasyon sou kontra entelijan sou sit la.

Montre done kontra entelijan sou sit entènèt la

Mwen te ekri yon sit entènèt senp nan Python pou montre done ki soti nan kontra entelijan an nan yon fason pratik. Isit la mwen pa pral rete sou li an detay epi yo pral pibliye sit la nan yon sèl komèt.

Yo fè demann pou TON Python avèk èd la lite-client. Pou konvenyans, sit la pake nan Docker epi pibliye sou Google Cloud. Link.

Eseye

Koulye a, kite a eseye voye gram la pou renouvèlman soti nan bous. Nou pral voye 40 gram. Epi ann fè yon koup la parye pou klè. Nou wè ke sit la montre istwa a nan parye, pousantaj aktyèl la genyen ak lòt enfòmasyon itil.

Nou wèke nou te genyen premye a, pèdi dezyèm lan.

Apreword

Atik la te vin pi long pase mwen te espere, petèt li te kapab pi kout, oswa petèt jis pou yon moun ki pa konnen anyen sou TON epi ki vle ekri epi pibliye yon kontra entelijan ki pa tèlman senp ak kapasite pou kominike avèk yo. li. Petèt kèk bagay te kapab eksplike plis tou senpleman.

Petèt kèk aspè nan aplikasyon an te kapab fè pi efikas ak elegant, men Lè sa a, li ta pran plis tan pou prepare atik la. Li posib tou ke mwen te fè yon erè yon kote oswa mwen pa t 'konprann yon bagay, kidonk si w ap fè yon bagay serye, ou bezwen konte sou dokiman ofisyèl la oswa depo ofisyèl la ak kòd la TON.

Li ta dwe remake ke piske TON li menm se toujou nan etap aktif nan devlopman, chanjman ka rive ki pral kraze nenpòt nan etap sa yo nan atik sa a (ki te rive pandan mwen t ap ekri, li te deja korije), men apwòch jeneral la se fasil pou chanje.

Mwen pa pral pale sou lavni nan TON. Petèt platfòm la pral vin yon bagay gwo epi nou ta dwe pase tan etidye li epi ranpli yon nich ak pwodwi nou yo kounye a.

Genyen tou Libra soti nan Facebook, ki gen yon odyans potansyèl de itilizatè ki pi gwo pase TON. Mwen pa konnen prèske anyen sou Libra, jije pa fowòm nan gen anpil plis aktivite la pase nan kominote a TON. Malgre ke devlopè yo ak kominote TON yo plis tankou anba tè, ki se tou fre.

Referans

  1. Dokiman ofisyèl TON: https://test.ton.org
  2. Depo ofisyèl TON: https://github.com/ton-blockchain/ton
  3. Bous ofisyèl pou diferan platfòm: https://wallet.ton.org
  4. Repozitwa kontra entelijan soti nan atik sa a: https://github.com/raiym/astonished
  5. Link sou sit entènèt kontra entelijan an: https://ton-lottery.appspot.com
  6. Repozitwa pou ekstansyon an pou Kòd Visual Studio pou FunC: https://github.com/raiym/func-visual-studio-plugin
  7. Chat sou TON nan Telegram, ki vrèman te ede konnen li nan premye etap la. Mwen panse ke li pa pral yon erè si mwen di ke tout moun ki te ekri yon bagay pou TON la. Ou ka mande tou pou gram tès la. https://t.me/tondev_ru
  8. Yon lòt chat sou TON kote mwen jwenn enfòmasyon itil: https://t.me/TONgramDev
  9. Premye etap nan konpetisyon an: https://contest.com/blockchain
  10. Dezyèm etap nan konpetisyon an: https://contest.com/blockchain-2

Sous: www.habr.com

Achte hosting serye pou sit ki gen pwoteksyon DDoS, sèvè VPS VDS 🔥 Achte yon hébergement sit entènèt serye ak pwoteksyon DDoS, sèvè VPS VDS | ProHoster