TONã§ã®ã¹ããŒãã³ã³ãã©ã¯ãã®æžãæ¹ãšå ¬éæ¹æ³ã«ã€ããŠ
ãã®èšäºã«ã€ããŠã¯äœã§ããïŒ
ãã®èšäºã§ã¯ãç§ãã©ã®ããã«ããŠæåã®ïŒXNUMX åã®ãã¡ïŒTelegram ãããã¯ãã§ãŒã³ ã³ã³ãã¹ãã«åå ããè³ãç²åŸã§ããªãã£ãã®ãããããŠããããå¿ãå»ãããªãããããããŠããããå©ãã«ãªãããã«ãèªåã®çµéšãèšäºã«èšé²ããããšã«æ±ºããã®ãã«ã€ããŠè©±ããŸãã誰ãã
ç§ã¯æœè±¡çãªã³ãŒããæžãããã£ãã®ã§ã¯ãªããäœãåããã®ãäœãããã£ãã®ã§ããã®èšäºã§ã¯ã€ã³ã¹ã¿ã³ãå®ããçšã®ã¹ããŒã ã³ã³ãã©ã¯ããšãäžéã¹ãã¬ãŒãžã䜿çšããã« TON ããçŽæ¥ã¹ããŒã ã³ã³ãã©ã¯ã ããŒã¿ã衚瀺ãã Web ãµã€ããæžããŸããã
ãã®èšäºã¯ãTON ã§åããŠã¹ããŒã ã³ã³ãã©ã¯ããäœæãããããã©ãããå§ããã°ãããããããªã人ã«åœ¹ç«ã¡ãŸãã
å®ãããäŸãšããŠãç°å¢ã®ã€ã³ã¹ããŒã«ãããã¹ããŒã ã³ã³ãã©ã¯ãã®å ¬éãã¹ããŒã ã³ã³ãã©ã¯ããšã®å¯Ÿè©±ãããŒã¿ã®åä¿¡ãšå ¬éã®ããã® Web ãµã€ãã®äœæãŸã§ãé²ããŠãããŸãã
ã³ã³ãã¹ããžã®åå ã«ã€ããŠ
æšå¹ŽXNUMXæããã¬ã°ã©ã ã¯æ°ããèšèªã«ãããããã¯ãã§ãŒã³ã³ã³ãã¹ããçºè¡šãã Fift
О FunC
ã ææ¡ãããŠãã XNUMX ã€ã®ã¹ããŒã ã³ã³ãã©ã¯ãã®ãããããäœæããå¿
èŠããããŸããã ããšãå°æ¥äœããæžãå¿
èŠããªããŠããäœãéãããšãããŠãèšèªãåŠã³ãäœããäœãã®ã¯ããããšã ãšæããŸããã ããã«ããã®è©±é¡ã¯åžžã«å£äžã«ãããŸãã
èšã£ãŠãããŸãããç§ã«ã¯ã¹ããŒãã³ã³ãã©ã¯ãã®éçºçµéšããããŸããã§ããã
åå ã§ãããŸã§æåŸãŸã§åå ããŠã¬ãã¥ãŒèšäºãæžãããšæã£ãŠããã®ã§ãããXNUMXåç®ã§ããã«æ«æããŠããŸããŸããã ç§ FunC
ãããŠããã¯äžè¬çã«ããŸããããŸããã ãããåºç€ãšããŠèããŠã¿ã
ãã®æã¯ãããã§å°ãªããšãäœããã®è³ãç²åŸã§ããã®ã¯ééããªããšæããŸããã ãã®çµæãåå è 40åäžçŽ60åãå ¥è³è ãšãªããç§ã¯ãã®äžã«ã¯å ¥ã£ãŠããŸããã§ããã äžè¬çã«ã¯äœãåé¡ã¯ãããŸããããXNUMX ã€æ°ã«ãªãç¹ããããŸããã çµæçºè¡šã®æç¹ã§ã¯ãç§ã®å¥çŽãããã¹ãã®å¯©æ»ã¯ãŸã è¡ãããŠããªãã£ãã®ã§ããã£ããã§åå è ã«ä»ã«æã£ãŠããªã人ã¯ããããšå°ãããšããã誰ãæã£ãŠããŸããã§ããã
ã©ãããç§ã®ã¡ãã»ãŒãžã«æ³šæãæã£ãããã§ãXNUMXæ¥åŸã«å¯©æ»å¡ãã³ã¡ã³ããå ¬éããŸãããã圌ãã審æ»äžã«å¶ç¶ç§ã®ã¹ããŒãã³ã³ãã©ã¯ããèŠéããã®ãããããšãã³ã¡ã³ããå¿ èŠãªãã»ã©ã²ã©ããã®ã ãšåçŽã«èããã®ãã¯ãŸã ããããŸããã ããŒãžäžã§è³ªåããŸããããåçããããŸããã§ããã 誰ãå€æãããã¯ç§å¯ã§ãããå人çãªã¡ãã»ãŒãžãæžãå¿ èŠã¯ãªããšå€æããŸããã
ç解ããã®ã«å€ãã®æéãè²»ããããããèšäºãæžãããšã«ããŸããã ãŸã æ å ±ãå°ãªãããããã®èšäºã¯èå³ã®ããæ¹ã®æéãç¯çŽããã®ã«åœ¹ç«ã¡ãŸãã
TONã«ãããã¹ããŒãã³ã³ãã©ã¯ãã®æŠå¿µ
äœããæžãåã«ãã©ã¡ãã®åŽãããã®åé¡ã«ã¢ãããŒãããããç解ããå¿ èŠããããŸãã ãããã£ãŠãã·ã¹ãã ãã©ã®ãããªéšåã§æ§æãããŠãããã説æããŸãã ããæ£ç¢ºã«èšãã°ãå°ãªããšãããçš®ã®åŽåå¥çŽãæžãããã«ã©ã®éšåãç¥ãå¿ èŠãããããšããããšã§ãã
ç§ãã¡ã¯ã¹ããŒãã³ã³ãã©ã¯ãã®äœæãšé£æºã«çŠç¹ãåœãŠãŸãã TON Virtual Machine (TVM)
, Fift
О FunC
, ãããã£ãŠããã®èšäºã¯éåžžã®ããã°ã©ã ã®éçºã®èª¬æã«äŒŒãŠããŸãã ããã§ã¯ãã©ãããã©ãŒã èªäœãã©ã®ããã«æ©èœãããã«ã€ããŠã¯è§ŠããŸããã
äžè¬çãªä»çµã¿ã«ã€ã㊠TVM
ãšèšèª Fift
åªããå
¬åŒããã¥ã¡ã³ãããããŸãã ã³ã³ãã¹ãã«åå ããŠããéããããŠä»å¥çŽæžãæžããŠããéãç§ã¯ãã圌女ã«é ŒããŸããã
ã¹ããŒãã³ã³ãã©ã¯ããèšè¿°ãããäž»ãªèšèªã¯æ¬¡ã®ãšããã§ãã FunC
ã çŸæç¹ã§ã¯ããã«é¢ããããã¥ã¡ã³ãããªããããäœããæžãã«ã¯ãå
¬åŒãªããžããªããã¹ããŒã ã³ã³ãã©ã¯ãã®äŸãšããã«ããèšèªèªäœã®å®è£
ãåŠã¶å¿
èŠããããŸããããã«ãéå» XNUMX ã€ã®ã¹ããŒã ã³ã³ãã©ã¯ãã®äŸãèŠãããšãã§ããŸãã競æäŒã èšäºã®æåŸã«ãããªã³ã¯ã
ãã§ã«ã¹ããŒãã³ã³ãã©ã¯ããæžããŠãããšããŸãã FunC
, ãã®åŸãã³ãŒããFiftã¢ã»ã³ãã©ã«ã³ã³ãã€ã«ããŸãã
ã³ã³ãã€ã«ãããã¹ããŒã ã³ã³ãã©ã¯ãã¯ãŸã å
¬éãããŠããŸããã ãããè¡ãã«ã¯ãé¢æ°ãèšè¿°ããå¿
èŠããããŸã Fift
ãã¹ããŒã ã³ã³ãã©ã¯ã ã³ãŒããšãã®ä»ã®ãã©ã¡ãŒã¿ãŒãå
¥åãšããŠåãåããåºåã¯æ¡åŒµåãä»ããŠãããã¡ã€ã«ã«ãªããŸãã .boc
(ããã¯ã现èã®è¢ããæå³ããŸã)ããããŠãæžãæ¹ã«ãã£ãŠã¯ãã¹ããŒã ã³ã³ãã©ã¯ã ã³ãŒãã«åºã¥ããŠçæãããç§å¯ããŒãšã¢ãã¬ã¹ã§ãã ãŸã å
¬éãããŠããªãã¹ããŒã ã³ã³ãã©ã¯ãã®ã¢ãã¬ã¹ã«ã°ã©ã ãéä¿¡ããããšãã§ããŸãã
åãåã£ãTONã§ã¹ããŒãã³ã³ãã©ã¯ããå
¬éããã«ã¯ .boc
ãã¡ã€ã«ã¯ãã©ã€ã ã¯ã©ã€ã¢ã³ãã䜿çšããŠãããã¯ãã§ãŒã³ã«éä¿¡ããå¿
èŠããããŸã (詳现ã¯ä»¥äžã§èª¬æããŸã)ã ãã ããå
¬éããåã«ãçæãããã¢ãã¬ã¹ã«ã°ã©ã ã転éããå¿
èŠããããŸããããããªããšãã¹ããŒã ã³ã³ãã©ã¯ãã¯å
¬éãããŸããã å
¬éåŸãå€éšãã (ããšãã°ãã©ã€ã ã¯ã©ã€ã¢ã³ãã䜿çšããŠ) ãŸãã¯å
éšãã (ããšãã°ãããã¹ããŒã ã³ã³ãã©ã¯ãã TON å
ã§å¥ã®ã¹ããŒã ã³ã³ãã©ã¯ãã«ã¡ãã»ãŒãžãéä¿¡ãã) ã¡ãã»ãŒãžãéä¿¡ããããšã§ãã¹ããŒã ã³ã³ãã©ã¯ããšå¯Ÿè©±ã§ããŸãã
ã³ãŒããã©ã®ããã«å
¬éãããããç解ããã°ãããã¯ããç°¡åã«ãªããŸãã äœãæžãããã®ããããã°ã©ã ãã©ã®ããã«åäœããã®ãã¯ããããããã£ãŠããŸãã ãããŠãäœæäžã«ããããæ¢åã®ã¹ããŒã ã³ã³ãã©ã¯ãã«ã©ã®ããã«å®è£
ãããŠãããã調ã¹ãããå®è£
ã³ãŒãã調ã¹ããããŸãã Fift
О FunC
å
¬åŒãªããžããªã§ç¢ºèªããããå
¬åŒããã¥ã¡ã³ããåç
§ããŠãã ããã
ç§ã¯ãã³ã³ãã¹ãåå è å šå¡ãš Telegram åŸæ¥å¡ãéãŸã Telegram ãã£ããã§ããŒã¯ãŒããæ€çŽ¢ããããšããããããŸããããããŠãããŸããŸã³ã³ãã¹ãäžã«å šå¡ãããã«éãŸããFift ãš FunC ã«ã€ããŠè©±ãå§ããŸããã èšäºã®æåŸã«ãªã³ã¯ããããŸãã
çè«ããå®è·µãžç§»è¡ãããšããæ¥ãŸããã
TONã䜿çšããããã®ç°å¢ãæºåãã
ãã®èšäºã§èª¬æããããšã¯ãã¹ãŠ MacOS äžã§å®è¡ããDocker äžã®ã¯ãªãŒã³ãª Ubuntu 18.04 LTS ã§å確èªããŸããã
æåã«è¡ãå¿
èŠãããã®ã¯ãããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããããšã§ã lite-client
ããã䜿çšã㊠TON ã«ãªã¯ãšã¹ããéä¿¡ã§ããŸãã
å
¬åŒãŠã§ããµã€ãã®èª¬ææžã«ã¯ãã€ã³ã¹ããŒã«ããã»ã¹ãéåžžã«è©³çŽ°ãã€æ確ã«èª¬æãããŠãããäžéšã®è©³çŽ°ã¯çç¥ãããŠããŸãã ããã§ã¯ãæ瀺ã«åŸããéäžã§äžè¶³ããŠããäŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŸãã åãããžã§ã¯ããèªåã§ã³ã³ãã€ã«ãããå
¬åŒã® Ubuntu ãªããžããªããã€ã³ã¹ããŒã«ããŸãã (MacOS ã§ã¯äœ¿çšããŸãã) 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
ãã¹ãŠã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ãããããã€ã³ã¹ããŒã«ã§ããŸã lite-client
, Fift
, FunC
.
ãŸããTON ãªããžããªãšãã®äŸåé¢ä¿ã®ã¯ããŒã³ãäœæããŸãã 䟿å®äžããã¹ãŠããã©ã«ããŒå
ã§å®è¡ããŸã ~/TON
.
cd ~/TON
git clone https://github.com/ton-blockchain/ton.git
cd ./ton
git submodule update --init --recursive
ãªããžããªã«ã¯å®è£
ãä¿åãããŸã Fift
О FunC
.
ããã§ããããžã§ã¯ããçµã¿ç«ãŠãæºåãæŽããŸããã ãªããžã㪠ã³ãŒãããã©ã«ããŒã«è€è£œãããŸã ~/TON/ton
ã 㧠~/TON
ãã©ã«ããŒãäœæãã build
ãã®äžã«ãããžã§ã¯ããåéããŸãã
mkdir ~/TON/build
cd ~/TON/build
cmake ../ton
ã¹ããŒã ã³ã³ãã©ã¯ããäœæããã®ã§ãå¿
èŠãªã®ã¯æ¬¡ã®ãšããã§ãã lite-client
ããã Fift
Ñ FunC
, ããã§ã¯ããã¹ãŠãã³ã³ãã€ã«ããŸãããã ããã«ã§ããæç¶ãã§ã¯ãããŸããã®ã§ããåŸ
ã¡ããŠãããŸãã
cmake --build . --target lite-client
cmake --build . --target fift
cmake --build . --target func
次ã«ãããŒãã«é¢ããããŒã¿ãå«ãæ§æãã¡ã€ã«ãããŠã³ããŒãããŸãã lite-client
ã€ãªãããŸãã
wget https://test.ton.org/ton-lite-client-test1.config.json
TON ãžã®æåã®ãªã¯ãšã¹ãã®å®è¡
ãããèµ·åããŸããã lite-client
.
cd ~/TON/build
./lite-client/lite-client -C ton-lite-client-test1.config.json
ãã«ããæåããå Žåã¯ãèµ·ååŸã«ã©ã€ã ã¯ã©ã€ã¢ã³ãã®ããŒããžã®æ¥ç¶ã®ãã°ã衚瀺ãããŸãã
[ 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)
...
ã³ãã³ããå®è¡ã§ããŸã help
䜿çšå¯èœãªã³ãã³ãã確èªããŠãã ããã
help
ãã®èšäºã§äœ¿çšããã³ãã³ãããªã¹ãããŠã¿ãŸãããã
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-ЌеÑÐŸÐŽÑ ÑЌаÑÑкПМÑÑакÑа.
ããã§ãå¥çŽæžèªäœãäœæããæºåãæŽããŸããã
å ·çŸå
ã¢ã€ãã¢
äžã§ãæžããŸããããç§ãã¡ãæžããŠããã¹ããŒãã³ã³ãã©ã¯ãã¯å®ããã§ãã
ããããããã¯ãã±ããã賌å
¥ããŠXNUMXæéãXNUMXæ¥ãXNUMXã¶æåŸ
ã€å¿
èŠãããå®ããã§ã¯ãªãããŠãŒã¶ãŒãå¥çŽã¢ãã¬ã¹ã«è»¢éããã ãã®å³æå®ããã§ãã N
ã°ã©ã åäœã§ããã«åãæ»ããŸã 2 * N
ã°ã©ã ãè² ããŸãã åœéžç¢ºçã¯çŽ40ïŒ
ãšãããŠããã ããŸãã ãæ¯æãã«å¿
èŠãªã°ã©ã æ°ãäžè¶³ããŠããå Žåã¯ããã£ãŒãžãšããŠååŒãæ€èšãããŠããã ããŸãã
ããã«ããŠãŒã¶ãŒãåã£ããè² ããããããã«ç解ã§ããããã«ãè³ãããªã¢ã«ã¿ã€ã ãã€äŸ¿å©ãªåœ¢åŒã§ç¢ºèªã§ããããšãéèŠã§ãã ãããã£ãŠãTON ããçŽæ¥ããããšçµæã衚瀺ãã Web ãµã€ããäœæããå¿ èŠããããŸãã
ã¹ããŒãã³ã³ãã©ã¯ããæžã
䟿å®äžãFunC ã®ã³ãŒãã匷調衚瀺ããŸããããã©ã°ã€ã³ã¯ Visual Studio Code æ€çŽ¢ã§èŠã€ããŠã€ã³ã¹ããŒã«ã§ããŸããçªç¶äœããè¿œå ãããå Žåã¯ããã©ã°ã€ã³ãå ¬éããŠãããŸãã ãŸãã誰ãã以åã« Fift ãæäœããããã®ãã©ã°ã€ã³ãäœæããŸããããããã€ã³ã¹ããŒã«ã㊠VSC ã§èŠã€ããããšãã§ããŸãã
äžéçµæãã³ããããããªããžããªãããã«äœæããŸãããã
äœæ¥ã楜ã«ããããã«ãã¹ããŒã ã³ã³ãã©ã¯ããäœæããæºåãæŽããŸã§ããŒã«ã«ã§ãã¹ãããŸãã ãããçµãã£ãŠåããŠTONã«æ²èŒãããŸãã
ã¹ããŒã ã³ã³ãã©ã¯ãã«ã¯ãã¢ã¯ã»ã¹ã§ãã XNUMX ã€ã®å€éšã¡ãœããããããŸãã åãã recv_external()
ãã®é¢æ°ã¯ãã³ã³ãã©ã¯ããžã®ãªã¯ãšã¹ããå€éšãããã€ãŸã TON ããã§ã¯ãªããããšãã°ãç§ãã¡èªèº«ãã¡ãã»ãŒãžãçæããŠã©ã€ãã¯ã©ã€ã¢ã³ãçµç±ã§éä¿¡ãããšãã«å®è¡ãããŸãã XNUMXçªã recv_internal()
ããã¯ãTON èªäœã®äžã§ãããããå¥çŽãåœç€Ÿã®å¥çŽãæãå Žåã§ãã ã©ã¡ãã®å Žåããé¢æ°ã«ãã©ã¡ãŒã¿ãæž¡ãããšãã§ããŸãã
å ¬éãããå Žåã«æ©èœããç°¡åãªäŸããå§ããŸãããããã ããæ©èœçãªè² è·ã¯ãããŸããã
() recv_internal(slice in_msg) impure {
;; TODO: implementation
}
() recv_external(slice in_msg) impure {
;; TODO: implementation
}
ããã§ãããäœã§ãããã説æããå¿
èŠããããŸã slice
ã TON ãããã¯ãã§ãŒã³ã«ä¿åãããŠãããã¹ãŠã®ããŒã¿ã¯ã³ã¬ã¯ã·ã§ã³ã§ã TVM cell
ãŸãã¯åã« cell
, ãã®ãããªã»ã«ã«ã¯ãæ倧 1023 ãããã®ããŒã¿ãšãä»ã®ã»ã«ãžã®æ倧 4 ã€ã®ãªã³ã¯ãä¿åã§ããŸãã
TVM cell slice
ãŸã㯠slice
ããã¯æ¢åã®ãã®ã®äžéšã§ã cell
ã¯è§£æã«äœ¿çšãããŸãããããã¯åŸã§æããã«ãªããŸãã ç§ãã¡ã«ãšã£ãŠéèŠãªããšã¯ã転éã§ããããšã§ã slice
ã¡ãã»ãŒãžã®çš®é¡ã«å¿ããŠãããŒã¿ãåŠçããŸãã recv_external()
ãŸã㯠recv_internal()
.
impure
â é¢æ°ãã¹ããŒã ã³ã³ãã©ã¯ã ããŒã¿ãå€æŽããããšã瀺ãããŒã¯ãŒãã
å¥çŽã³ãŒããä¿åããŸããã lottery-code.fc
ãããŠã³ã³ãã€ã«ããŸãã
~/TON/build/crypto/func -APSR -o lottery-compiled.fif ~/TON/ton/crypto/smartcont/stdlib.fc ./lottery-code.fc
ãã©ã°ã®æå³ã¯ãã³ãã³ãã䜿çšããŠè¡šç€ºã§ããŸãã
~/TON/build/crypto/func -help
Fift ã¢ã»ã³ãã© ã³ãŒããã³ã³ãã€ã«ããŸããã 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
ããŒã«ã«ã§èµ·åããããšãã§ããŸãã®ã§ããã®ããã®ç°å¢ãæºåããŸãã
æåã®è¡ãæ¥ç¶ããŠããããšã«æ³šæããŠãã ãã Asm.fif
ããã㯠Fift ã¢ã»ã³ãã©çšã« Fift ã§æžãããã³ãŒãã§ãã
ã¹ããŒãã³ã³ãã©ã¯ããããŒã«ã«ã§å®è¡ããŠãã¹ããããã®ã§ããã¡ã€ã«ãäœæããŸã lottery-test-suite.fif
ããã«ã³ã³ãã€ã«ãããã³ãŒããã³ããŒããã¹ããŒã ã³ã³ãã©ã¯ã ã³ãŒããå®æ°ã«æžã蟌ãæåŸã®è¡ã眮ãæããŸãã code
次ã«ããããä»®æ³ãã·ã³ã«è»¢éããŸãã
"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
ãããŸã§ã¯æãããªã®ã§ã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
ã³ã³ããã¹ããã€ãŸã TVM (ãŸãã¯ãããã¯ãŒã¯ç¶æ
) ãèµ·åãããããŒã¿ãèšé²ããŸãã ã³ã³ãã¹ãäžã«ããéçºè
ã® XNUMX 人ãäœææ¹æ³ã瀺ããŸããã c7
ãããŠç§ã¯ã³ããŒããŸããã ãã®èšäºã§ã¯å€æŽãå¿
èŠã«ãªãå ŽåããããŸã rand_seed
ä¹±æ°ã®çæã¯ä¹±æ°ã«äŸåããŠãããå€æŽããªããšæ¯ååãæ°å€ãè¿ãããããã§ãã
recv_internal
О recv_external
å€ 0 ãš -1 ãæã€å®æ°ã¯ãã¹ããŒã ã³ã³ãã©ã¯ãå
ã®å¯Ÿå¿ããé¢æ°ãåŒã³åºã圹å²ãæãããŸãã
ããã§ã空ã®ã¹ããŒã ã³ã³ãã©ã¯ãã®æåã®ãã¹ããäœæããæºåãæŽããŸããã ããããããããããã«ãä»ã®ãšããããã¹ãŠã®ãã¹ããåããã¡ã€ã«ã«è¿œå ããŸãã lottery-test-suite.fif
.
å€æ°ãäœæããŸããã storage
ããã«ç©ºã®ãã®ãæžã蟌ã¿ãŸã cell
, ãããã¹ããŒãã³ã³ãã©ã¯ãã¹ãã¬ãŒãžã«ãªããŸãã
message
å€éšããã¹ããŒãã³ã³ã¿ã¯ãã«éä¿¡ããã¡ãã»ãŒãžã§ãã ãã¡ãããšãããã空ã«ããŠãããŸãã
variable storage
<b b> storage !
variable message
<b b> message !
å®æ°ãšå€æ°ãæºåãããã次ã®ã³ãã³ãã䜿çšã㊠TVM ãèµ·åããŸãã runvmctx
ãããŠäœæãããã©ã¡ãŒã¿ãå
¥åã«æž¡ããŸãã
message @
recv_external
code
storage @
c7
runvmctx
æçµçã«ã¯æåããã ãã Fift
.
ããã§ãçµæã®ã³ãŒããå®è¡ã§ããããã«ãªããŸãã
export FIFTPATH=~/TON/ton/crypto/fift/lib // вÑпПлМÑеЌ ПЎОМ Ñаз ÐŽÐ»Ñ ÑЎПбÑÑва
~/TON/build/crypto/fift -s lottery-test-suite.fif
ããã°ã©ã ã¯ãšã©ãŒãªãã§å®è¡ãããåºåã«ã¯å®è¡ãã°ã衚瀺ãããŸãã
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
çŽ æŽããããã¹ããŒã ã³ã³ãã©ã¯ãã®æåã®å®çšããŒãžã§ã³ãäœæã§ããŸããã
次ã«ãæ©èœãè¿œå ããå¿
èŠããããŸãã ãŸããå€ã®äžçããå±ãã¡ãã»ãŒãžã«å¯ŸåŠããŸãããã recv_external()
éçºè èªèº«ããã³ã³ãã©ã¯ããåãå ¥ããããšãã§ããã¡ãã»ãŒãžåœ¢åŒãéžæããŸãã
ã§ããæ®æ®µã¯
- ãŸããã³ã³ãã©ã¯ããå€éšããä¿è·ããã³ã³ãã©ã¯ãã®ææè ã ããã³ã³ãã©ã¯ãã«å€éšã¡ãã»ãŒãžãéä¿¡ã§ããããã«ããããšèããŠããŸãã
- 次ã«ãæå¹ãªã¡ãã»ãŒãžã TON ã«éä¿¡ãããšãã«ãããã XNUMX åã ãè¡ãããããã«ããåãã¡ãã»ãŒãžãå床éä¿¡ãããšãã¹ããŒã ã³ã³ãã©ã¯ãããããæåŠããããã«ããŸãã
ãããã£ãŠãã»ãšãã©ãã¹ãŠã®ã³ã³ãã©ã¯ãã¯ããã XNUMX ã€ã®åé¡ã解決ããŸããç§ãã¡ã®ã³ã³ãã©ã¯ãã¯å€éšã¡ãã»ãŒãžãåãå ¥ãããããããã«ã察åŠããå¿ èŠããããŸãã
éã®é åºã§ãã£ãŠãããŸãã ãŸããç¹°ãè¿ãã®åé¡ã解決ããŸããããã³ã³ãã©ã¯ãããã§ã«ãã®ãããªã¡ãã»ãŒãžãåä¿¡ããŠââåŠçããŠããå Žåããããå床å®è¡ããããšã¯ãããŸããã ãããŠãç¹å®ã®ãµãŒã¯ã«ã®ã¿ãã¹ããŒã ã³ã³ãã©ã¯ãã«ã¡ãã»ãŒãžãéä¿¡ã§ããããã«åé¡ã解決ããŸãã
éè€ã¡ãã»ãŒãžã®åé¡ã解決ããã«ã¯ãããŸããŸãªæ¹æ³ããããŸãã ãã®æ¹æ³ã¯æ¬¡ã®ãšããã§ãã ã¹ããŒã ã³ã³ãã©ã¯ãã§ã¯ãåä¿¡ã¡ãã»ãŒãžã®ã«ãŠã³ã¿ãŒãåæå€ 0 ã§åæåããŸããã¹ããŒã ã³ã³ãã©ã¯ããžã®åã¡ãã»ãŒãžã«ãçŸåšã®ã«ãŠã³ã¿ãŒå€ãè¿œå ããŸãã ã¡ãã»ãŒãžå ã®ã«ãŠã³ã¿ãŒå€ãã¹ããŒã ã³ã³ãã©ã¯ãå ã®å€ãšäžèŽããªãå Žåã¯åŠçããŸããããäžèŽããå Žåã¯åŠçããŠã¹ããŒã ã³ã³ãã©ã¯ãå ã®ã«ãŠã³ã¿ãŒã 1 å¢ãããŸãã
ã«æ»ããŸããã lottery-test-suite.fif
ãã㊠166 çªç®ã®ãã¹ããè¿œå ããŸãã ééã£ãæ°å€ãéä¿¡ããå Žåãã³ãŒãã¯äŸå€ãã¹ããŒããå¿
èŠããããŸãã ããšãã°ãå¥çŽããŒã¿ã« 165 ãä¿åãããŠãããšãããšãXNUMX ãéä¿¡ããŸãã
<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"
èµ·åããŸãããã
~/TON/build/crypto/fift -s lottery-test-suite.fif
ãããŠããã¹ããå®è¡ãããŠãšã©ãŒãçºçããããšãããããŸãã
[ 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
ãã®æ®µé㧠lottery-test-suite.fif
ã®ããã«èŠããã¯ãã§ã
次ã«ãã«ãŠã³ã¿ãŒ ããžãã¯ãã¹ããŒã ã³ã³ãã©ã¯ãã«è¿œå ããŸãããã 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
ç§ãã¡ãéãã¡ãã»ãŒãžã¯åã§ãã
æåã«ã¡ãã»ãŒãžã«ããŒã¿ãå«ãŸããŠãããã©ããã確èªããå«ãŸããŠããªãå Žåã¯åã«çµäºããŸãã
次ã«ã¡ãã»ãŒãžã解æããŸãã in_msg~load_uint(32)
æ°å€ 165ã32 ããããããŒãããŸã unsigned int
éä¿¡ãããã¡ãã»ãŒãžããã
次ã«ãã¹ããŒã ã³ã³ãã©ã¯ã ã¹ãã¬ãŒãžãã 32 ããããããŒãããŸãã ããŒããããæ°å€ãæž¡ãããæ°å€ãšäžèŽãããã©ããã確èªããäžèŽããªãå Žåã¯äŸå€ãã¹ããŒããŸãã ãã®å ŽåãäžäžèŽãæž¡ããŠãããããäŸå€ãã¹ããŒãããã¯ãã§ãã
ããã§ã¯ã³ã³ãã€ã«ããŸãããã
~/TON/build/crypto/func -APSR -o lottery-compiled.fif ~/TON/ton/crypto/smartcont/stdlib.fc ./lottery-code.fc
çµæã®ã³ãŒãã次ã®å Žæã«ã³ããŒããŸã lottery-test-suite.fif
æåŸã®è¡ã眮ãæããããšãå¿ããªãã§ãã ããã
ãã¹ããæåããããšã確èªããŸãã
~/TON/build/crypto/fift -s lottery-test-suite.fif
ã¹ããŒã ã³ã³ãã©ã¯ãã®ã³ã³ãã€ã«ãããã³ãŒãããã¹ããå«ããã¡ã€ã«ã«åžžã«ã³ããŒããã®ã¯äžäŸ¿ã§ããããšã«æ³šæããŠãã ããããã®ãããã³ãŒããå®æ°ã«æžã蟌ãã¹ã¯ãªãããäœæããã³ã³ãã€ã«ãããã³ãŒããåã«æ¬¡ã䜿çšããŠãã¹ãã«æ¥ç¶ããŸãã "include"
.
ãããžã§ã¯ããã©ã«ããŒã«ãã¡ã€ã«ãäœæããŸã build.sh
以äžã®å
容ã§ã
#!/bin/bash
~/TON/build/crypto/func -SPA -R -o lottery-compiled.fif ~/TON/ton/crypto/smartcont/stdlib.fc ./lottery-code.fc
å®è¡å¯èœã«ããŠã¿ãŸãããã
chmod +x ./build.sh
ããã§ãã¹ã¯ãªãããå®è¡ããŠã³ã³ãã©ã¯ããã³ã³ãã€ã«ããã ãã§ãã ããããããã«å ããŠããããå®æ°ã«æžã蟌ãå¿
èŠããããŸã code
ã ããã§ãæ°ãããã¡ã€ã«ãäœæããŸã lotter-compiled-for-test.fif
ããã¡ã€ã«ã«å«ããŸã lottery-test-suite.fif
.
sh ã« Skirpt ã³ãŒããè¿œå ããŸããããããã¯åã«ã³ã³ãã€ã«ããããã¡ã€ã«ãè€è£œããã ãã§ãã lotter-compiled-for-test.fif
ãããŠãã®æåŸã®è¡ãå€æŽããŸãã
# 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
ããã§ã確èªã®ããã«ãçµæã®ã¹ã¯ãªãããå®è¡ããŠã¿ãŸãããããã¡ã€ã«ãçæãããŸãã lottery-compiled-for-test.fif
ããããå«ããŸã lottery-test-suite.fif
Ð lottery-test-suite.fif
å¥çŽã³ãŒããåé€ããŠè¡ãè¿œå ããŸã "lottery-compiled-for-test.fif" include
.
ãã¹ããå®è¡ããŠãããããåæ Œããããšã確èªããŸãã
~/TON/build/crypto/fift -s lottery-test-suite.fif
ããããŸããããã¹ãã®èµ·åãèªååããããã«ããã¡ã€ã«ãäœæããŸããã test.sh
ãæåã«å®è¡ãããŸã build.sh
ãã¯ãªãã¯ãããã¹ããå®è¡ããŸãã
touch test.sh
chmod +x test.sh
äžã«æžããŸã
./build.sh
echo "nCompilation completedn"
export FIFTPATH=~/TON/ton/crypto/fift/lib
~/TON/build/crypto/fift -s lottery-test-suite.fif
ããããããŸããã test.sh
ãããå®è¡ããŠãã¹ããæ©èœããããšã確èªããŸãã
chmod +x ./test.sh
./test.sh
ã³ã³ãã©ã¯ããã³ã³ãã€ã«ããããã¹ããå®è¡ãããããšã確èªããŸãã
ãã°ããããèµ·åäžã§ã test.sh
ãã¹ãã¯ã³ã³ãã€ã«ãããããã«å®è¡ãããŸãã ããã«ãªã³ã¯ããããŸã
ããŠãç¶è¡ããåã«ã䟿å®äžããã XNUMX ã€ãã£ãŠã¿ãŸãããã
ãã©ã«ããŒãäœæããŸããã build
ã³ããŒããã³ã³ãã©ã¯ããšå®æ°ã«æžã蟌ãŸãããã®ã¯ããŒã³ãããã«ä¿åããŸã lottery-compiled.fif
, lottery-compiled-for-test.fif
ã ãã©ã«ããäœã£ãŠã¿ãŸããã test
ãã¹ããã¡ã€ã«ã¯ã©ãã«ä¿åãããŸãã? lottery-test-suite.fif
ä»ã®ãµããŒã ãã¡ã€ã«ãå«ãŸããå¯èœæ§ããããŸãã
ã¹ããŒãã³ã³ãã©ã¯ãã®éçºãç¶ããŸãããã
次ã«ãã¡ãã»ãŒãžãåä¿¡ãããæ£ããçªå·ãéä¿¡ãããšãã«ã¹ãã¢å ã®ã«ãŠã³ã¿ãŒãæŽæ°ãããããšã確èªãããã¹ããå¿ èŠã§ãã ããããããã¯åŸã§è¡ããŸãã
次ã«ãã©ã®ãããªããŒã¿æ§é ãšã¹ããŒã ã³ã³ãã©ã¯ãã«ä¿åããå¿ èŠãããããŒã¿ã«ã€ããŠèããŠã¿ãŸãããã
ç§ãã¡ãä¿ç®¡ããŠãããã®ãã¹ãŠã«ã€ããŠèª¬æããŸãã
`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` пеÑÐµÐŒÐµÐœÐœÐ°Ñ ÑОпа ÑлПваÑÑ, Ñ
ÑÐ°ÐœÐžÑ Ð¿ÐŸÑлеЎМОе ЎваЎÑаÑÑ ÑÑавПк.
次ã«ãXNUMX ã€ã®é¢æ°ãäœæããå¿
èŠããããŸãã æåã«é»è©±ããŸããã pack_state()
ããã®åŸã¹ããŒã ã³ã³ãã©ã¯ã ã¹ãã¬ãŒãžã«ä¿åããããã«ããŒã¿ãããã¯ãããŸãã XNUMXçªç®ã«é»è©±ããŸããã unpack_state()
ã¹ãã¬ãŒãžããããŒã¿ãèªã¿åã£ãŠè¿ããŸãã
_ 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;
}
ããã XNUMX ã€ã®é¢æ°ãã¹ããŒã ã³ã³ãã©ã¯ãã®å
é ã«è¿œå ããŸãã ããã¯ããŸããããŸã
ããŒã¿ãä¿åããã«ã¯ãçµã¿èŸŒã¿é¢æ°ãåŒã³åºãå¿
èŠããããŸãã set_data()
ãããŠããã¯ããããŒã¿ãæžã蟌ã¿ãŸã pack_state()
ã¹ããŒãã³ã³ãã©ã¯ãã¹ãã¬ãŒãžå
ã
cell packed_state = pack_state(arg_1, .., arg_n);
set_data(packed_state);
ããŒã¿ã®æžã蟌ã¿ãšèªã¿åãã«äŸ¿å©ãªé¢æ°ãå®æããã®ã§ã次ã«é²ã¿ãŸãã
å€éšããåä¿¡ããã¡ãã»ãŒãžãå¥çŽã®ææè (ãŸãã¯ç§å¯ããŒã«ã¢ã¯ã»ã¹ã§ããå¥ã®ãŠãŒã¶ãŒ) ã«ãã£ãŠçœ²åãããŠããããšã確èªããå¿ èŠããããŸãã
ã¹ããŒã ã³ã³ãã©ã¯ããå ¬éãããšããã¹ãã¬ãŒãžã«å¿ èŠãªããŒã¿ã䜿çšããŠã¹ããŒã ã³ã³ãã©ã¯ããåæåããå°æ¥ã®äœ¿çšã«åããŠä¿åããŸãã åä¿¡ã¡ãã»ãŒãžã察å¿ããç§å¯éµã§çœ²åãããŠããããšã確èªã§ããããã«ãããã«å ¬ééµãèšé²ããŸãã
ç¶è¡ããåã«ãç§å¯ããŒãäœæããŠæžã蟌ã¿ãŸãããã test/keys/owner.pk
ã ãããè¡ãã«ã¯ãFift ã察話ã¢ãŒãã§èµ·åããXNUMX ã€ã®ã³ãã³ããå®è¡ããŸãããã
`newkeypair` геМеÑаÑÐžÑ Ð¿ÑблОÑМПгП О пÑОваÑМПгП клÑÑа О запОÑÑ ÐžÑ
в ÑÑек.
`drop` ÑÐŽÐ°Ð»ÐµÐœÐžÑ ÐžÐ· ÑÑека веÑÑ
МегП ÑлеЌеМÑа (в ЎаММПЌ ÑлÑÑае пÑблОÑÐœÑй клÑÑ)
`.s` пÑПÑÑП пПÑЌПÑÑеÑÑ ÑÑП Ð»ÐµÐ¶ÐžÑ Ð² ÑÑеке в ЎаММÑй ЌПЌеМÑ
`"owner.pk" B>file` запОÑÑ Ð¿ÑОваÑМПгП клÑÑа в Ñайл Ñ ÐžÐŒÐµÐœÐµÐŒ `owner.pk`.
`bye` завеÑÑÐ°ÐµÑ ÑабПÑÑ Ñ Fift.
ãã©ã«ããŒãäœæããŸããã keys
ãã©ã«ãã®äžã® test
ããã«ç§å¯ããŒãæžã蟌ã¿ãŸãã
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
çŸåšã®ãã©ã«ããŒã«ãã¡ã€ã«ã衚瀺ãããŸã owner.pk
.
ã¹ã¿ãã¯ããå ¬éããŒãåé€ããå¿ èŠã«å¿ããŠç§å¯ããŒããååŸã§ããŸãã
次ã«ã眲åæ€èšŒãèšè¿°ããå¿
èŠããããŸãã ãã¹ãããå§ããŸãããã ãŸããé¢æ°ã䜿çšããŠãã¡ã€ã«ããç§å¯ããŒãèªã¿åããŸãã file>B
ãããŠãããå€æ°ã«æžã蟌ã¿ãŸã owner_private_key
ã次ã«é¢æ°ã䜿çšããŸã priv>pub
ç§å¯éµãå
¬ééµã«å€æããçµæã次ã®ããã«æžã蟌ã¿ãŸãã 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 !
äž¡æ¹ã®ããŒãå¿ èŠã«ãªããŸãã
é¢æ°ãšåãã·ãŒã±ã³ã¹ã§ä»»æã®ããŒã¿ã䜿çšããŠã¹ããŒã ã³ã³ãã©ã¯ã ã¹ãã¬ãŒãžãåæåããŸãã pack_state()
ãããŠãããå€æ°ã«æžã蟌ã¿ãŸã 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 !
次ã«ã眲åä»ãã¡ãã»ãŒãžãäœæããŸããããã«ã¯ã眲åãšã«ãŠã³ã¿ãŒå€ã®ã¿ãå«ãŸããŸãã
ãŸããéä¿¡ããããŒã¿ãäœæãã次ã«ç§å¯éµã§çœ²åããæåŸã«çœ²åä»ãã¡ãã»ãŒãžãçæããŸãã
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 !
ãã®çµæãã¹ããŒãã³ã³ãã©ã¯ãã«éä¿¡ããã¡ãã»ãŒãžãå€æ°ã«èšé²ãããŸãã message_to_send
ãæ©èœã«ã€ã㊠hashu
, ed25519_sign_uint
ããªãã¯èªãããšãã§ããŸã
ãããŠãã¹ããå®è¡ããããã«ãããäžåºŠåŒã³åºããŸãã
message_to_send @
recv_external
code
storage @
c7
runvmctx
ãã¹ããå®è¡ãããšå€±æããã®ã§ããã®åœ¢åŒã®ã¡ãã»ãŒãžãåä¿¡ããŠââ眲åãæ€èšŒã§ããããã«ã¹ããŒã ã³ã³ãã©ã¯ããå€æŽããŸãã
ãŸããã¡ãã»ãŒãžãã眲åã® 512 ããããã«ãŠã³ãããŠå€æ°ã«æžã蟌ã¿ã次ã«ã«ãŠã³ã¿ãŒå€æ°ã® 32 ããããã«ãŠã³ãããŸãã
ã¹ããŒãã³ã³ãã©ã¯ãã®ã¹ãã¬ãŒãžããããŒã¿ãèªã¿èŸŒãæ©èœãããã®ã§ããããå©çšããŸãã
次ã¯ã¹ãã¬ãŒãžãšäžç·ã«è»¢éãããã«ãŠã³ã¿ã®ç¢ºèªãšçœ²åã®ç¢ºèªã§ãã äœããäžèŽããªãå Žåã¯ãé©åãªã³ãŒãã§äŸå€ãã¹ããŒããŸãã
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));
é¢é£ããã³ããã
ãã¹ããå®è¡ããŠãXNUMX çªç®ã®ãã¹ãã倱æããããšã確èªããŠã¿ãŸãããã XNUMX ã€ã®çç±ã«ãããã¡ãã»ãŒãžã«ååãªãããããªããã¹ãã¬ãŒãžã«ãååãªãããããªãããã解æäžã«ã³ãŒããã¯ã©ãã·ã¥ããŸãã éä¿¡ããã¡ãã»ãŒãžã«çœ²åãè¿œå ããæåŸã®ãã¹ãããã¹ãã¬ãŒãžãã³ããŒããå¿ èŠããããŸãã
XNUMX çªç®ã®ãã¹ãã§ã¯ãã¡ãã»ãŒãžçœ²åãè¿œå ããã¹ããŒã ã³ã³ãã©ã¯ã ã¹ãã¬ãŒãžãå€æŽããŸãã
XNUMX çªç®ã®ãã¹ããäœæããŠã¿ãŸãããããã®ãã¹ãã§ã¯ãä»ã®äººã®ç§å¯éµã§çœ²åãããã¡ãã»ãŒãžãéä¿¡ããŸãã å¥ã®ç§å¯ããŒãäœæããŠãã¡ã€ã«ã«ä¿åããŸããã not-owner.pk
ã ãã®ç§å¯éµã䜿çšããŠã¡ãã»ãŒãžã«çœ²åããŸãã ãã¹ããå®è¡ããŠããã¹ãŠã®ãã¹ããæåããããšã確èªããŠã¿ãŸãããã
ããã§ãããããã¹ããŒã ã³ã³ãã©ã¯ã ããžãã¯ã®å®è£
ã«é²ãããšãã§ããŸãã
Ð recv_external()
XNUMXçš®é¡ã®ã¡ãã»ãŒãžãåãä»ããŠãããŸãã
ç§ãã¡ã®å¥çŽã§ã¯ãã¬ã€ã€ãŒã®æ倱ã环ç©ãããããããã®ãéã¯å®ããã®äœæè ã«ééãããªããã°ãªããŸããã å®ããäœæè ã®ãŠã©ã¬ããã¢ãã¬ã¹ã¯ãå¥çŽã®äœææã«ã¹ãã¬ãŒãžã«èšé²ãããŸãã
念ã®ãããæè ã®ã°ã©ã ã®éä¿¡å ã¢ãã¬ã¹ãå€æŽããæ©èœãå¿ èŠã§ãã ãŸããå®ããããåŸãã°ã©ã ãææè ã®äœæã«éä¿¡ã§ããããã«ããå¿ èŠããããŸãã
æåã®ãã®ããå§ããŸãããã ãŸããã¡ãã»ãŒãžã®éä¿¡åŸãã¹ããŒã ã³ã³ãã©ã¯ããæ°ããã¢ãã¬ã¹ãã¹ãã¬ãŒãžã«ä¿åãããã©ããã確èªãããã¹ããäœæããŸãããã ã¡ãã»ãŒãžã§ã¯ãã«ãŠã³ã¿ãŒãšæ°ããã¢ãã¬ã¹ã«å ããŠã action
7 ãããã®éè² ã®æŽæ°ãããã«å¿ããŠãã¹ããŒã ã³ã³ãã©ã¯ãã§ã®ã¡ãã»ãŒãžã®åŠçæ¹æ³ãéžæããŸãã
<b 0 32 u, 1 @ 7 u, new_owner_wc @ 32 i, new_owner_account_id @ 256 u, b> message_to_sign !
ãã¹ãã§ã¯ãã¹ããŒãã³ã³ãã©ã¯ã ã¹ãã¬ãŒãžãã©ã®ããã«éã·ãªã¢ã«åããããã確èªã§ããŸãã storage
ãã£ããã§ã å€æ°ã®éã·ãªã¢ã«åã«ã€ããŠã¯ãFift ã®ããã¥ã¡ã³ãã§èª¬æãããŠããŸãã
ãã¹ããå®è¡ããŠã倱æããããšã確èªããŠã¿ãŸãããã 次ã«ãå®ããææè ã®äœæãå€æŽããããžãã¯ãè¿œå ããŸãããã
ã¹ããŒãã³ã³ãã©ã¯ãã§ã¯è§£æãç¶ããŸã message
ãèªã¿èŸŒãã§ãã ãã action
ã XNUMX ã€ããããšãæãåºãããŠãã ãã action
ïŒã¢ãã¬ã¹ãå€æŽããŠã°ã©ã ãéä¿¡ããŸãã
次ã«ãå¥çŽææè
ã®æ°ããäœæãèªã¿åããã¹ãã¬ãŒãžã«ä¿åããŸãã
ãã¹ããå®è¡ãããšã7 çªç®ã®ãã¹ãã倱æããããšãããããŸãã ã³ã³ãã©ã¯ããã¡ãã»ãŒãžããããã« XNUMX ãããã解æããããã«ãªãããã¹ãã§ã¯æ¬ èœããŠãããããã¯ã©ãã·ã¥ããŸãã ååšããªããã®ãã¡ãã»ãŒãžã«è¿œå ãã action
ã ãã¹ããå®è¡ããŠããã¹ãŠãæåããããšã確èªããŠã¿ãŸãããã
次ã«ãæå®ããã°ã©ã æ°ã以åã«ä¿åããã¢ãã¬ã¹ã«éä¿¡ããããžãã¯ãäœæããŸãããã
ãŸãããã¹ããæžããŠã¿ãŸãããã XNUMX ã€ã®ãã¹ããäœæããŸããXNUMX ã€ã¯ãã©ã³ã¹ãäžååãªå Žåããã XNUMX ã€ã¯ãã¹ãŠãæ£åžžã«ãã¹ããå¿
èŠãããå Žåã§ãã ãã¹ããé²èŠ§ã§ãã
ã³ãŒããè¿œå ããŸãããã ãŸããXNUMX ã€ã®ãã«ã㌠ã¡ãœãããäœæããŸãããã æåã® get ã¡ãœããã¯ãã¹ããŒã ã³ã³ãã©ã¯ãã®çŸåšã®æ®é«ã確èªããããšã§ãã
int balance() inline_ref method_id {
return get_balance().pair_first();
}
XNUMX ã€ç®ã¯ãã°ã©ã ãå¥ã®ã¹ããŒã ã³ã³ãã©ã¯ãã«éä¿¡ããããã®ãã®ã§ãã ãã®ã¡ãœãããå¥ã®ã¹ããŒã ã³ã³ãã©ã¯ãããå®å šã«ã³ããŒããŸããã
() 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
}
ããã XNUMX ã€ã®ã¡ãœãããã¹ããŒã ã³ã³ãã©ã¯ãã«è¿œå ããããžãã¯ãèšè¿°ããŠã¿ãŸãããã ãŸããã¡ãã»ãŒãžããã°ã©ã æ°ã解æããŸãã 次ã«ãã©ã³ã¹ããã§ãã¯ããäžè¶³ããŠããå Žåã¯äŸå€ãã¹ããŒããŸãã ãã¹ãŠãæ£åžžã§ããã°ãä¿åãããã¢ãã¬ã¹ã«ã°ã©ã ãéä¿¡ããã«ãŠã³ã¿ãŒãæŽæ°ããŸãã
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));
ã¡ãªã¿ã«ãã¡ãã»ãŒãžãåŠçããããã³ã«ã¹ããŒãã³ã³ãã©ã¯ãããææ°æãå·®ãåŒãããŸãã ã¹ããŒã ã³ã³ãã©ã¯ã ã¡ãã»ãŒãžããªã¯ãšã¹ããå®è¡ããã«ã¯ãåºæ¬çãªãã§ãã¯ã®åŸã以äžãåŒã³åºãå¿
èŠããããŸãã accept_message()
.
次ã«ãå éšã¡ãã»ãŒãžã«ç§»ããŸãããã å®éãç§ãã¡ã¯ã°ã©ã ã®ã¿ãåãåãããã¬ãŒã€ãŒãåã£ãå Žå㯠XNUMX åã®éé¡ããè² ããå Žå㯠XNUMX åã® XNUMX ããªãŒããŒã«éãè¿ããŸãã
ãŸããç°¡åãªãã¹ããæžããŠã¿ãŸãããã ãããè¡ãã«ã¯ãã¹ããŒã ã³ã³ãã©ã¯ãã«ã°ã©ã ãéä¿¡ããããšã«ãªãã¹ããŒã ã³ã³ãã©ã¯ãã®ãã¹ã ã¢ãã¬ã¹ãå¿ èŠã§ãã
ã¹ããŒã ã³ã³ãã©ã¯ã ã¢ãã¬ã¹ã¯ãã¯ãŒã¯ãã§ãŒã³ãæ åœãã 32 ãããæŽæ°ãšããã®ã¯ãŒã¯ãã§ãŒã³å ã® 256 ãããã®éè² ã®æŽæ°ã®äžæã®ã¢ã«ãŠã³ãçªå·ã® 1 ã€ã®æ°å€ã§æ§æãããŸãã ããšãã°ã-12345 ãš XNUMX ã¯ããã¡ã€ã«ã«ä¿åããã¢ãã¬ã¹ã§ãã
ããã¢ãã¬ã¹ãä¿åããé¢æ°ãã³ããŒããŸãã 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
ãã®é¢æ°ãã©ã®ããã«åäœããããèŠãŠã¿ãŸããããããã«ãããFift ãã©ã®ããã«åäœããããç解ã§ããŸãã ã€ã³ã¿ã©ã¯ãã£ãã¢ãŒãã§Fiftãèµ·åããŸãã
~/TON/build/crypto/fift -i
ãŸãã-1ã12345ãããã³å°æ¥ã®ãã¡ã€ã«åãsender.addrããã¹ã¿ãã¯ã«ããã·ã¥ããŸãã
-1 12345 "sender.addr"
次ã®ã¹ãããã¯é¢æ°ãå®è¡ããããšã§ã -rot
ãã¹ã¿ãã¯ã®æäžéšã«äžæã®ã¹ããŒã ã³ã³ãã©ã¯ãçªå·ãååšããããã«ã¹ã¿ãã¯ãã·ããããŸãã
"sender.addr" -1 12345
256 u>B
256 ãããã®è² ã§ãªãæŽæ°ããã€ãã«å€æããŸãã
"sender.addr" -1 BYTES:0000000000000000000000000000000000000000000000000000000000003039
swap
ã¹ã¿ãã¯ã®äžäœ XNUMX ã€ã®èŠçŽ ã亀æããŸãã
"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 -1
32 i>B
32 ãããæŽæ°ããã€ãã«å€æããŸãã
"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 BYTES:FFFFFFFF
B+
XNUMX ã€ã®ãã€ã ã·ãŒã±ã³ã¹ãæ¥ç¶ããŸãã
"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF
ããäžåºŠ swap
.
BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF "sender.addr"
ãããŠæåŸã«ãã€ãããã¡ã€ã«ã«æžã蟌ãŸããŸã B>file
ã ãã®åŸãã¹ã¿ãã¯ã¯ç©ºã«ãªããŸãã ãããŸã Fift
ã çŸåšã®ãã©ã«ããŒã«ãã¡ã€ã«ãäœæãããŸãã sender.addr
ã äœæãããã©ã«ããŒã«ãã¡ã€ã«ã移åããŸããã test/addresses/
.
ã°ã©ã ãã¹ããŒã ã³ã³ãã©ã¯ãã«éä¿¡ããç°¡åãªãã¹ããäœæããŠã¿ãŸãããã
ã§ã¯ãå®ããã®ããžãã¯ãèŠãŠã¿ãŸãããã
æåã«ã¡ãã»ãŒãžã確èªããŸã bounced
ããã§ãªãå Žå bounced
ããã®åŸã¯ç¡èŠããŸãã bounced
ããã¯ãäœããã®ãšã©ãŒãçºçããå Žåã«ã³ã³ãã©ã¯ããã°ã©ã ãè¿ãããšãæå³ããŸãã çªç¶ãšã©ãŒãçºçããå Žåã§ãã°ã©ã ã®è¿åŽã¯èŽããŸããã
æ®é«ã XNUMX ã°ã©ã æªæºã§ããããšã確èªããã¡ãã»ãŒãžããã®ãŸãŸåãå ¥ããç¡èŠããŸãã
次ã«ãã¡ãã»ãŒãžã®éä¿¡å ã®ã¹ããŒã ã³ã³ãã©ã¯ãã®ã¢ãã¬ã¹ã解æããŸãã
ã¹ãã¬ãŒãžããããŒã¿ãèªã¿åããå€ããããã XNUMX åãè¶
ããå Žåã¯å±¥æŽããåé€ããŸãã 䟿å®äžãXNUMX ã€ã®è¿œå é¢æ°ãäœæããŸãã pack_order()
, unpack_order()
, remove_old_orders()
.
次ã«ãæ®é«ãæ¯æãã«ååã§ã¯ãªããã©ããã確èªããããã¯è³ãã§ã¯ãªãè£å
ã§ãããšã¿ãªããè£å
ãä¿åããŸãã orders
.
ãããŠæåŸã«ã¹ããŒãã³ã³ãã©ã¯ãã®æ¬è³ªã§ãã
ãŸãããã¬ã€ã€ãŒãè² ããå Žåã¯è³ãå±¥æŽã«ä¿åããéé¡ã 3 ã°ã©ã ãè¶ ããå Žå㯠1/3 ãã¹ããŒã ã³ã³ãã©ã¯ãã®ææè ã«éä¿¡ããŸãã
ãã¬ãŒã€ãŒãåã£ãå ŽåãXNUMX åã®éé¡ããã¬ãŒã€ãŒã®ã¢ãã¬ã¹ã«éä¿¡ããè³ãã«é¢ããæ å ±ãå±¥æŽã«ä¿åããŸãã
() 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));
}
ããã¯ããã ã
ããšã¯ç°¡åã§ããå€éšããã³ã³ãã©ã¯ãã®ç¶æ ã«é¢ããæ å ±ãååŸã§ããããã« (å®éã«ã¯ãã¹ããŒã ã³ã³ãã©ã¯ãã®ã¹ãã¬ãŒãžããããŒã¿ãèªã¿åããŸã)ãget ã¡ãœãããäœæããŸãããã
ãŸããã¹ããŒã ã³ã³ãã©ã¯ããå
¬éãããšãã«çºçããæåã®ãªã¯ãšã¹ããåŠçããã³ãŒããè¿œå ããã®ãå¿ããŠããŸããã
次ã®ã¹ãããã¯ãã¹ããŒã ã³ã³ãã©ã¯ããå
¬éããããšã§ãã ãã©ã«ããŒãäœæããŸããã requests
.
åºçã³ãŒããããŒã¹ã«ããŸãã simple-wallet-code.fc
泚ç®ã«å€ãããã®ããããŸãã ã¹ããŒã ã³ã³ãã©ã¯ã ã¹ãã¬ãŒãžãšå
¥åã¡ãã»ãŒãžãçæããŸãã ãã®åŸãã¹ããŒã ã³ã³ãã©ã¯ãã®ã¢ãã¬ã¹ãçæãããŸããã€ãŸããã¢ãã¬ã¹ã¯ TON ã§å
¬éãããåããããã£ãŠããŸãã 次ã«ããã®ã¢ãã¬ã¹ã«æ°ã°ã©ã ãéä¿¡ããå¿
èŠããããŸãããã®åŸãã¹ããŒã ã³ã³ãã©ã¯ãèªäœãå«ããã¡ã€ã«ãéä¿¡ããå¿
èŠããããŸããããã¯ããããã¯ãŒã¯ãã¹ããŒã ã³ã³ãã©ã¯ããšãã®æäœãä¿åããããã«ææ°æãåãããã§ã (ã¹ããŒã ã³ã³ãã©ã¯ããä¿åããŠå®è¡ããããªããŒã¿)å¥çŽïŒã
次ã«ãå
¬éã³ãŒããå®è¡ããŠååŸããŸãã lottery-query.boc
ã¹ããŒã ã³ã³ãã©ã¯ã ãã¡ã€ã«ãšã¢ãã¬ã¹ã
~/TON/build/crypto/fift -s requests/new-lottery.fif 0
çæããããã¡ã€ã«ãå¿ããã«ä¿åããŠãã ããã lottery-query.boc
, lottery.addr
, lottery.pk
.
ãšããããå®è¡ãã°ã«ã¯ã¹ããŒã ã³ã³ãã©ã¯ãã®ã¢ãã¬ã¹ã衚瀺ãããŸãã
new wallet address = 0:044910149dbeaf8eadbb2b28722e7d6a2dc6e264ec2f1d9bebd6fb209079bc2a
(Saving address to file lottery.addr)
Non-bounceable address (for init): 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd
Bounceable address (for later access): kQAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8KpFY
楜ãã¿ã®ããã« TON ã«ãªã¯ãšã¹ãããŠã¿ãŸããã
$ ./lite-client/lite-client -C ton-lite-client-test1.config.json
getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd
ãããŠããã®ã¢ãã¬ã¹ã®ã¢ã«ãŠã³ãã空ã§ããããšãããããŸãã
account state is empty
ã¢ãã¬ã¹ã«ãéãããŸã 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd
2ã°ã©ã ãå®è¡ããæ°ç§åŸã«åãã³ãã³ããå®è¡ããŸãã ã°ã©ã ãéä¿¡ããããã«äœ¿çšããŸã
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd
åæåãããŠããªãããã§ã (state:account_uninit
) åãã¢ãã¬ã¹ãš 1 ããã°ã©ã ã®æ®é«ãæã€ã¹ããŒã ã³ã³ãã©ã¯ãã
account state is (account
addr:(addr_std
anycast:nothing workchain_id:0 address:x044910149DBEAF8EADBB2B28722E7D6A2DC6E264EC2F1D9BEBD6FB209079BC2A)
storage_stat:(storage_info
used:(storage_used
cells:(var_uint len:1 value:1)
bits:(var_uint len:1 value:103)
public_cells:(var_uint len:0 value:0)) last_paid:1583257959
due_payment:nothing)
storage:(account_storage last_trans_lt:3825478000002
balance:(currencies
grams:(nanograms
amount:(var_uint len:4 value:2000000000))
other:(extra_currencies
dict:hme_empty))
state:account_uninit))
x{C00044910149DBEAF8EADBB2B28722E7D6A2DC6E264EC2F1D9BEBD6FB209079BC2A20259C2F2F4CB3800000DEAC10776091DCD650004_}
last transaction lt = 3825478000001 hash = B043616AE016682699477FFF01E6E903878CDFD6846042BA1BFC64775E7AC6C4
account balance is 2000000000ng
次ã«ãã¹ããŒã ã³ã³ãã©ã¯ããå ¬éããŸãããã lite-clientãèµ·åããŠå®è¡ããŠã¿ãŸãããã
> 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
å¥çŽæžãçºè¡ãããããšã確èªããŠã¿ãŸãããã
> last
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd
ãšããããç§ãã¡ã¯åŸããã®ããããŸãã
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
ãããããããŸã account_active
.
å€æŽãå«ã察å¿ããã³ããã
次ã«ãã¹ããŒã ã³ã³ãã©ã¯ããšå¯Ÿè©±ããããã®ãªã¯ãšã¹ããäœæããŸãããã
ããæ£ç¢ºã«ã¯ãæåã®ã¢ãã¬ã¹å€æŽã¯ç¬ç«ããäœæ¥ãšããŠæ®ããXNUMX çªç®ã¯ææè ã®ã¢ãã¬ã¹ã«ã°ã©ã ãéä¿¡ããããã«å®è¡ããŸãã å®éã«ã¯ãã°ã©ã ãéä¿¡ãããã¹ããšåãããšãè¡ãå¿ èŠããããŸãã
ããã¯ã¹ããŒã ã³ã³ãã©ã¯ãã«éä¿¡ããã¡ãã»ãŒãžã§ãã msg_seqno
165ã action
éä¿¡çšã¯2ã°ã©ã ãš9.5ã°ã©ã ã
<b 165 32 u, 2 7 u, 9500000000 Gram, b>
ç§å¯éµã䜿çšããŠã¡ãã»ãŒãžã«çœ²åããããšãå¿ããªãã§ãã ãã lottery.pk
ãããã¯ã¹ããŒã ã³ã³ãã©ã¯ãã®äœææã«çæãããŸããã
get ã¡ãœããã䜿çšããŠã¹ããŒã ã³ã³ãã©ã¯ãããæ å ±ãåä¿¡ãã
次ã«ãã¹ããŒã ã³ã³ãã©ã¯ãã® get ã¡ãœãããå®è¡ããæ¹æ³ãèŠãŠã¿ãŸãããã
æã¡äžã lite-client
ãããŠãäœæãã get ã¡ãœãããå®è¡ããŸãã
$ ./lite-client/lite-client -C ton-lite-client-test1.config.json
> runmethod 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd balance
arguments: [ 104128 ]
result: [ 64633878952 ]
...
Ð result
é¢æ°ãè¿ãå€ãå«ãŸããŸã balance()
ç§ãã¡ã®ã¹ããŒãã³ã³ãã©ã¯ãããã
ããã«ããã€ãã®ã¡ãœããã«ã€ããŠãåãããšãè¡ããŸãã
> runmethod 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd get_seqno
...
arguments: [ 77871 ]
result: [ 1 ]
ããªãã®ãããå±¥æŽãèããŠã¿ãŸãããã
> 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]) ]
Lite-client ã䜿çšããŠããµã€ãäžã®ã¹ããŒã ã³ã³ãã©ã¯ãã«é¢ããæ å ±ã衚瀺ããã¡ãœãããååŸããŸãã
ã¹ããŒãã³ã³ãã©ã¯ãããŒã¿ãWebãµã€ãã«è¡šç€ºãã
ã¹ããŒã ã³ã³ãã©ã¯ãããã®ããŒã¿ã䟿å©ãªæ¹æ³ã§è¡šç€ºããããã®ç°¡å㪠Web ãµã€ãã Python ã§äœæããŸããã ããã§ã¯è©³ããã¯è¿°ã¹ãããµã€ããå
¬éããŸã
TONãžã®ãªã¯ãšã¹ãã¯ä»¥äžããè¡ãããŸãã Python
çµç± lite-client
ã 䟿å®äžããµã€ã㯠Docker ã§ããã±ãŒãžåãããGoogle Cloud ã§å
¬éãããŠããŸãã
ãã£ãŠã¿ãã
ããã§ãè£å
ã®ããã«ããã«ã°ã©ã ãéã£ãŠã¿ãŸããã
åŸæžã
ãã®èšäºã¯ç§ãäºæ³ããŠããããããã£ãšé·ããªã£ãŠããŸããŸããããããããããã£ãšçããŠãããã£ããããããŸããããããã¯åã« TON ã«ã€ããŠäœãç¥ãããTON ãšå¯Ÿè©±ããæ©èœãåããããã»ã©åçŽã§ã¯ãªãã¹ããŒã ã³ã³ãã©ã¯ããäœæããŠå ¬éããããšèããŠãã人åããããããŸãããããã ãããããããã€ãã®ããšã¯ãã£ãšç°¡åã«èª¬æã§ãããããããŸããã
ãããããå®è£ ã®ããã€ãã®åŽé¢ã¯ãã£ãšå¹ççãã€ãšã¬ã¬ã³ãã«å®è¡ã§ããã¯ãã§ããããã®å Žåã¯èšäºã®æºåã«ããã«æéãããã£ãã§ãããã ã©ããã§ééããç¯ããããäœããç解ããŠããªãã£ãå¯èœæ§ããããããæ·±å»ãªäœæ¥ãè¡ãå Žåã¯ãå ¬åŒããã¥ã¡ã³ããŸã㯠TON ã³ãŒããèšèŒãããå ¬åŒãªããžããªã«äŸåããå¿ èŠããããŸãã
TON èªäœã¯ãŸã éçºã®æŽ»çºãªæ®µéã«ããããããã®èšäºã®ã¹ãããã®ãããããäžæããå€æŽãçºçããå¯èœæ§ãããããšã«æ³šæããŠãã ãã (ããã¯ç§ãå·çäžã«çºçããŸãããããã§ã«ä¿®æ£ãããŠããŸã) ããäžè¬çãªã¢ãããŒãã¯æ¬¡ã®ãšããã§ããå€ããå¯èœæ§ã¯äœãã§ãã
TONã®å°æ¥ã«ã€ããŠã¯è©±ããŸããã ããããããã®ãã©ãããã©ãŒã ã¯å€§ããªãã®ã«ãªãã§ããããç§ãã¡ã¯æéããããŠç 究ããä»ãããããåžå Žãåœç€Ÿã®è£œåã§åããå¿ èŠããããŸãã
Facebook ã® Libra ããããTON ãããå€ãã®ãŠãŒã¶ãŒãæœåšçã«æ±ããŠããŸãã ç§ã¯Libraã«ã€ããŠã»ãšãã©äœãç¥ããŸãããããã©ãŒã©ã ããå€æãããšãTONã³ãã¥ããã£ãããã¯ããã«å€ãã®æŽ»åãè¡ãããŠããŸãã TON ã®éçºè ãšã³ãã¥ããã£ã¯ã¢ã³ããŒã°ã©ãŠã³ãã«è¿ãã§ããããããã¯ãŒã«ã§ãã
ãªãã¡ã¬ã³ã¹
- TON ã®å
¬åŒããã¥ã¡ã³ã:
https://test.ton.org - å
¬åŒ TON ãªããžããª:
https://github.com/ton-blockchain/ton - ããŸããŸãªãã©ãããã©ãŒã çšã®å
¬åŒãŠã©ã¬ãã:
https://wallet.ton.org - ãã®èšäºã®ã¹ããŒã ã³ã³ãã©ã¯ã ãªããžããª:
https://github.com/raiym/astonished - ã¹ããŒã ã³ã³ãã©ã¯ã Web ãµã€ããžã®ãªã³ã¯:
https://ton-lottery.appspot.com - Visual Studio Code for FunC ã®æ¡åŒµæ©èœã®ãªããžããª:
https://github.com/raiym/func-visual-studio-plugin - Telegram 㧠TON ã«ã€ããŠãã£ããããŠãã ãããããã¯ãåæ段éã§ãããç解ããã®ã«éåžžã«åœ¹ç«ã¡ãŸããã TONã§äœããæžãã人ã¯ã¿ããªãããšèšã£ãŠãééãã§ã¯ãªããšæããŸãã ããã§ãã¹ãã°ã©ã ãæ±ããããšãã§ããŸãã
https://t.me/tondev_ru - TON ã«é¢ããå¥ã®ãã£ããã§æçãªæ
å ±ãèŠã€ããŸããã
https://t.me/TONgramDev - ã³ã³ãã¹ãã®æåã®ã¹ããŒãž:
https://contest.com/blockchain - ã³ã³ãã¹ãã®ç¬¬ XNUMX ã¹ããŒãž:
https://contest.com/blockchain-2
åºæïŒ habr.com