á áśá ááľáĽ áĽáἠáá áĽáá´áľ áĽáá°ááá áĽá áĽáá°ááłá°á
áá á˝áá áľá áááľá áá?
á á˝áá ááľáĽ á ááááŞáŤá (á¨áááľ) á¨á´áááŤá á¨áĽáááźáá ááľáľá ááľáĽ áĽáá´áľ áĽáá°á°áłá°áአáĽá á˝áááľ áĽááłááá°áľáŠ áĽá áá° áĽááłáľ ááľáĽ áĽááłááᣠáĽá ááááŁáľá áĽáá°áá¨áłá á á ááľ á˝áá ááľáĽ ááá´á áááááἠáá°áአᢠá ááľ á°á.
á áĽáľáľáŤááľ áŽáľ ááťá áľáááááá ááá áá á¨áá°áŤ ááá áááľáŤáľáŁ áá˝áá áááŁá áá°áŞ áĽáἠáá áťááŠá áĽá ááŤá¨áá áá¨ááť áłáá áá á¨áľáááľ áŽááľáŤáľ áá¨áá á ááĽáł ᨠáśá á¨ááŤáłá áľá áŁá˘áŤ áťááŠá˘
á˝áá á áśá ááľáĽ á¨ááááŞáŤáá áááá áá áááĽáŤáľ ááááá á°áá˝ á áá áááá, ááá áá á¨áľ áááá áĽááłááŁá¸á á áŤááá.
áá°áŞáá áĽáá° ááłá á áá áá á áŤáŁá˘á á¨ááŤá áá° áľáááľ áŽááľáŤáľ áá°áᣠá¨áą áá ááľá°ááĽá áĽá áá¨á áááá á áĽá ááá°á áľá¨-áá˝ á ááťá áĽááłááá˘
áľá ááľáľá á°áłáľá
áŁááá áĽá
ááľáŁ á´áááŤá á¨á áłá˛áľ ááááá˝ áá á¨áĽáááźáá ááľáľáá á áľáłááá Fift
и FunC
. á¨á ááľáą á¨áłááą áááá áŽááľáŤáśá˝ ááľáĽ áááááá á¨ááťá ááá¨áĽ á áľááá áá á. áá°ááľ ááá ááťá áŁááááĽáá á¨á°áᨠááá áĽá áŤáŁ ááá áĽááá á ááľ ááá áĽá ፠áĽáŠ ááľáá áá áᢠá á°á¨ááŞá, áááą áŤáááá¨áĽ á á¨áááŽá˝ áá áá.
áĽáἠáŽááľáŤáśá˝á á¨áááááľ áááľ á ááá á¨áá áááľ á°áᢠááá˘
áĽáľá¨ áá¨á¨áťá áľá¨áľ áááłá°á áĽá
áľ áá á¨á áĽá á¨á፠á¨áááá á˝áá áááťá á áľá¤ áá á, ááá áá á ááááŞáŤá áá áá˛áŤáá á áá°áłáŤááá. á á FunC
áĽá á á á ááá á ááˇá. áá°á¨áľ á áľáá áá°áľáŠáľ
á ááŤá ááᣠáá á áĽááá áááľ á˘áŤááľ á¨á°áá°á á¨á˝áááľ áŚáł áááá°áľ á á áá áĽáŹ á áľá¤ áá áᢠá áá ááááŤáľ á¨40 á°áłáłááá˝ ááľáĽ 60 áŤá á á°á¸áá áááá áĽáá á¨áĽááą ááŤá¨á á ááá ááŠáᢠá á á ááá, á áá ááľáĽ ááá áľá á°áľ á¨áá áľá, áá á ááľ ááá á áľá¨ááá. áá¤áą á áááá˝á áľ áá ááŽááľáŤá´ á¨áá°á áááá á áá°áŤáá°á áá á, á áťáľ ááľáĽ áŤá á°áłáłááá˝ áá á°á á¨áá áá á°á áŤá á á¨á áłá¸á, ááá á ááá áŠá.
ááááĽááśáź áľáŠá¨áľ á ááľá áľ áááľáá á¨áááľ áááľ á áá áłááš á áľá°áŤá¨áľ á áᥠáĽá á ááá á áłáááľ áá á¨áĽáá áĽáἠáá á á ááŁá á ááá á áĽáá°áá ááá á ááá á áľá°áŤá¨áľ á áŤáľááááá áĽáá á áá°áĽ á ááá á áááŁááᢠá ááš áá á ááľ áĽáŤá áĽá áá á áááľ á áááááᢠááá áĽááłá áá áĽáá°áá¨á° ááľáĽá áŁáááá, á¨áá áááááśá˝á ááťá áĽáá°ááŤáľááá áá ááŠ.
á áá¨áłáľ áá áĽá áá á áłááá, áľááá á ááľ á˝áá áááťá á°áá°á. áá áĽá áá¨á áľááá, áá á˝áá ááááľ ááá áá ááá áááá ἠáá¨áłá.
á áśá ááľáĽ á¨áľáááľ áŽááľáŤáśá˝ á˝áá°-ááłáĽ
áááááá ááá á¨ááťáá á ááľ, áá áá ááá á¨á¨áľáá ááá áĽáá°áááᥠááá áŤáľáááááłá. áľááá , á áá áľáááą áá áááá˝ áĽááłá áĽáááááłáá. á¨á áá á áľááá ᣠá˘áŤááľ á ááľ ááááľ á¨áĽáŤ áá áááá áá áááá˝ ááá áŤáľáááááłáá˘
áááá áŽááľáŤáľ á ááťá áĽá á ááĽáŤáľ áá áĽáá°áŠáŤáá TON Virtual Machine (TVM)
, Fift
и FunC
, áľááá
á˝áá áĽáá° áá°á á ááŽááŤá áĽáľááľ ááá፠áá. ááľá¨áŠ áŤáą áĽáá´áľ áĽáá°áá°áŤ áĽáá
áá á áá°áŠááá˘
á á á ááá áĽáá´áľ áĽáá°áá°áŤ TVM
áĽá ááá Fift
áĽáŠ áŚáá´áá á°ááśá˝ á á. á ááľáľáŠ áá áľáłá°á áĽá á áá áŤááá áá áĽá¨ááአáĽá áá áá° áĽáˇ áááŠá˘
áĽáἠáŽááľáŤáśá˝ á¨ááťáá áľ áá ááá ááᢠFunC
. á á áá áá ááá á°ááľ á¨áá, áľááá
á ááľ ááá áááťá á¨áŚáá´ááá á¨áá¨á áá áŤáá፠áĽá á¨áááá á á°ááŁá á ááłááá˝á ááĽááľ áŤáľáááááłá, á á°á¨ááŞá áŤáááľ áááľ á¨áľáááľ áŽááľáŤáśá˝ ááłááá˝á áááá¨áľ áá˝áá. ááľáľáŽá˝. á á áááš áá¨á¨áť áá á áááá˝.
á áľááľáá áĽáἠáá á˝ááá áĽáá á FunC
, á¨á፠á áá áŽáąá áá° Fift assembler áĽáá°á áľáŁáá.
á¨á°á ááá¨á áľáááľ áá áááłá°á áááŤáᢠáá
áá áááľá¨á á ááľ á°ááŁá ááá áŤáľáááááłá Fift
, áá
á áááá á¨áŽááľáŤáľ áŽáľ áĽá á ááłááľ ááá˝ áááŞáŤáá˝á áĽáá° ááĽá áľ á¨áááľáľ á˛áá áá¤áąá á
áĽáŤá áŤáá ááá áááá .boc
(áááľá "á¨á´áá˝ áŚááł" áááľ áá), áĽá, áĽáá´áľ áĽáá°ááá˝áá, á¨áá ááá áĽá á áľáŤáť, áá
á á áľáááľ áŽááľáŤáľ áŽáľ áá á¨á°áá°á¨á° áá. áĽáľáŤáá áŤááłá°á á¨áľáááľ áŽááľáŤáľ á áľáŤáť ááŤá ááá áá˝ááá˘
á TON á¨á°áá áá áááá áá ááá°á .boc
ááá á¨áĽááá á°áá áá á áá áá áá° blockchain ááá á áá áľ (á¨áá
á áłá˝ áŁáá á°á¨ááŞ)ᢠááá áá á¨áá°áá á ááľ ááŤá áá°á°áá á¨á á áľáŤáť ááľá°ááá áŤáľáááááłá, á áá áá፠ááááá áŽááľáŤáľ á ááłá°áá. á¨á
áľááą á áá á¨áľáááľ áŽááľáŤáą áá á¨áá áááááśá˝á á ááá (áááłá á¨áĽááá á°áá áá á áá áá) ááá á¨ááľáĽ (áááłá á ááľ áĽáἠáŽááľáŤáľ á áśá ááľáĽ áá áááĽááľ áááŤá) áá ááľá°ááĽá ááá á áá˝ááá˘
áŽáą áĽáá´áľ áĽáá°ááłá°á á¨á°á¨áłá á áá ááá ááááᢠáá ááťá áĽáá°ááááá áĽá ááŽááŤáá˝á áĽáá´áľ áĽáá°áá°áŤ á áľááá áĽáááááᢠáĽá á áá˝áá áľ áá, áá
á áá áŁáá áááá áŽááľáŤáśá˝ ááľáĽ áĽáá´áľ áĽáá°áá°áá á áĽáááááá, ááá á¨á á°ááŁá áŠá áŽáľ áĽáááá¨áłáá Fift
и FunC
á áŚáá´ááá áá¨ááť ááľáĽ, ááá áŚáá´áá á°ááśá˝á áááá¨áą.
áĽá áá ááá á¨ááľáľá á°áłáłááá˝ áĽá á¨á´áááŤá á°áŤá°áá˝ á á°á°á á°áĄá áľ á¨á´áááŤá áťáľ áá ááá áááľá áĽááá áá á áĽáá á ááľáľáŠ áá áľ ááá á°á áĽááŤá á°á°áĽáľá á áľá Fift áĽá FunC áááŤá¨áľ áááŠá˘ á á áááš áá¨á¨áť áá á ááá.
á¨á˛á᪠áá° ááááľ á¨ááá¸áááá áľ áá ááá˘
ᨠTON áá áááľáŤáľ á áŤáŁá˘á áááááľ
á MacOS áá áŁáá ááŁáĽá ááľáĽ á¨ááĽáŤáŤáá áááá ááá á á°á¨áá áĽá á áášá áĄáĄááą 18.04 LTS á Docker áá ááá´ á á¨áááŤááá˘
ááľá¨á áŤááĽááľ á¨ááááŞáŤá ááá ááá¨áľ áĽá ááŤá áá lite-client
áá° áśá áĽáŤááá˝á ááá á¨áá˝áá áľ.
á áŚáá´ááá áľááŁá˘áŤ áá áŤááľ áááŞáŤáá˝ á¨ááŤá áá°áąá á áááá áĽá á ááá
ááááá áĽá á ááłááľ ááááŽá˝á áá°áá ᢠáĽáá
áááŞáŤáášá áĽáá¨á°ááá, á¨áá°ááľá áĽááá˝ á ááááľ áá ááŤá. áĽáŤááłááąá ááŽáááľ áŤá´ á áá ááááŠá áĽá á¨áŚáá´ááá á¨áĄáĄááą áá¨ááť áŤá (á áááŚá¤áľ á¨á°á áááŠáľ) 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
.
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-ПоŃĐžĐ´Ń ŃПаŃŃкОнŃŃĐ°ĐşŃĐ°.
á áá áŽááľáŤáąá áŤáą áááťá ááá áá.
áľáá áŤ
ááłáĽ
á¨áá áĽáá°áťááŠáľ á¨ááá˝áá áĽáἠáá áá°áŞ ááá˘
á¨áá
á á áá áá
á˛áŹáľ ááá°á
á ááľ á°ááľáŁ áá ááá áá áá á á
áŤááĽá
áá°áŞ áłááá á°á ááá áá° áá á áľáŤáť á¨áá¸áááá áľ á
á˝á áłá ááᢠN
ááŤá, áĽá áá˛áŤáá áááś áŤááá 2 * N
ááŤá ááá ááŁáľ. 40% á áŤáŁá˘ á¨áá¸áá áĽáľáá˝áá áĽáá°ááááᢠááá፠á á ááŤáá˝ á¨áá, ááĽááąá áĽáá° ááááľ áĽáááĽáŤáá.
á¨áá á á áá ááááľ á áĽááá°á áá áĽá ááš á áá ááአááłá¨áľ á áľááá áá, áá á á°á ááá áŤá¸áá ááá á¨á°á¸áá áĽáá°áá áá˛áŤáá áĽáá˛á¨áłá. áľááá , ááááśá˝á áĽá áá¤áśá˝á á ááĽáł ᨠáśá á¨ááŤáłá áľá ᨠáá˝ ááľáŤáľ áŤáľáááááłá.
áĽáἠáŽááľáŤáľ ááťá
ááážáľ á˛áŁá á¨FunCá áŽáľ á áááťááᤠá°á°áŞá á Visual Studio Code ááá ááľáĽ ááá áĽá ááá áá˝ááᤠá áľáááľ á¨áá ááá áá¨á á¨ááá ááááá á áá áĽáá˛áá á áľáááááᢠáĽáá˛ááᣠá ááľ á°á á¨áá áá°á á¨Fift áá á áĽáŽ áááľáŤáľ á°á°áŞ á ááˇáᣠáĽáąá ááŤá áĽá á áŞá¤áľá˛ ááľáĽ ááááľ áá˝ááá˘
áá˛áŤáá ááŤá¨áá áá¤áśá˝á á¨áááá˝áá áľ áá¨ááť áĽááá á.
á áááłá˝áá ááá ááᣠáľáááľ áŽááľáŤáľ áĽáá ááá áĽá áĽáľáŞááá áľá¨áľ á á áá ááľáĽ áĽáááľáťááᢠá¨á፠á áá áĽáť á áśá ááľáĽ áĽáá°áááá˘
áĽáἠáŽááľáŤáą áá°á¨áľáŁá¸á á¨áá˝á áááľ ááŤá áá´áá˝ á ááľ. á áá°á, recv_external()
áá
á°ááŁá á¨ááá¸áá á¨áŽááľáŤáą áĽáŤá á¨ááá ááá á˛áᣠáááľá á¨áśá áłááá áĽá áŤáłá˝á áááĽááľ á ááĽá°á á áá°-á°áá á á áŠá áľááá ááᢠááá°á, recv_internal()
áá
á áśá á áŤáą ááľáĽ ááááá áá á¨áĽáá áááá¨áłáᢠá áááąá áááłáá˝ áááŞáŤáá˝á áá° á°ááŁáŠ ááá áá˝áá.
á¨áłá°á á áá°áŤ ááá ááłá áĽáááá, ááá áá á ááľáĄ ááá á°ááŁáŤá áááľ á¨áá.
() recv_internal(slice in_msg) impure {
;; TODO: implementation
}
() recv_external(slice in_msg) impure {
;; TODO: implementation
}
áĽáá
áá áĽáá°áá ááĽáŤáŤáľ áŤáľááááá slice
. á TON Blockchain ááľáĽ á¨á°á¨ááš ááá áá¨ááá˝ áľáĽáľáĽ áá¸áᢠ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 assembler áŽáľ á ááá
á°áá 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 for the Fift assembler á¨á°áťá áŽáľ ááá˘
áľáááľ áŽááľáŤáąá á á áá ááľáĽ ááŽáĽ áĽá ááá¨á áľáááááá ááá áĽáááĽáŤáá 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
áĽáľáŤáá ááá áááľááᣠá áá á˛áŞá¤áá áááááľ á¨ááá ááá áľá áŽáľ áá° á°ááłáłá ááá áĽáá¨ááá˘
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
áĽá á ááľ áĽáááááŁáá, áááľá, á¨á˛áŞá¤á (ááá á¨á ááłá¨ áá¨áĽ áááł) á¨ááááá áľá áááĽ. á ááľáľáŠ áá
áľ áĽááłá á¨ááá˘ááš á ááą áĽáá´áľ ááá á áĽáá°ááťá á áłááˇáᢠ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()
ááá˘á áŤáą áá ááá áá á¨áá˝ááá á¨áááááľ á áá¸áľ ááááŁá.
áá á áĽáááá áá
- á ááááŞáŤ ááá˝áá á¨ááŞá á áá ááá á á áĽá á¨áá áŁáá¤áľ áĽáť á¨áá áááĽááľ áĽáá˛ááááľ áááľá¨á áĽááááááá˘
- á ááá°á á°á¨á áľáááá áááĽááľ áá° áśá áľááá áá á áľááá á ááľ áá áĽáá˛áá áĽáááááá áĽá á°ááłáłá áááĽááľ áľááá áľáááľ áŽááľáŤáą ááľá áŤá°ááááá˘
áľááá áĽáŤááłááą áá áááľ ááťáá áĽááá á áááľ á˝ááŽá˝ áááłáᣠááá˝á á¨áá áááááśá˝á áľáááá á áĽáá ááá ááá á áľ áááŁáá˘
á á°ááŤáá á á°á á°á¨á°á áĽáá°ááááá. á ááááŞáŤ á˝ááŠá á ááľáá áĽáááłáᤠáá á áľááľá áĽáá°áá á áááľ áááĽááľ á°ááśáľ á¨áá áááá°á áá á áŤáľáá˝áááᢠáĽá á¨á፠á¨á°áá°á á¨á°áá˝ áá ἠáĽáť áá° áĽáἠáŽááľáŤáą áááĽááľ áĽáá˛áá á˝ááŠá áĽáááłáááá˘
á á°áŁá áááááśá˝ á˝ááŠá ááááłáľ á¨á°ááŤáŠ ááááśá˝ á áᢠáĽáá´áľ áĽáá°ááá°ááá áĽááᢠá ááááá áŽááľáŤáľ ááľáĽ á¨á°áá ááľá áááĽááśá˝ ááŁáŞ á¨ááááŞáŤá áĽá´áľ 0 áá áĽááľáááŤáá ᢠá áĽáŤááłááą áááĽááľ áá° áĽáἠáŽááľáŤáľ ᣠá¨á ááá ááŁáŞ áĽá´áľ áĽáá¨ááŤáá ᢠá áááĽááą ááľáĽ áŤáá á¨ááŁáŞ áĽá´áľ á áľáááľ áŽááľáŤáľ ááľáĽ áŤáá áá áá á¨ááááłá°á á¨áá áĽá á ááľáŹá°áá ᣠá¨á°áŤ áĽá áĽáá°áŤá áĽá á áľáááľ áŽááľáŤáľ ááľáĽ áŤááá ááŁáŞ á 1 áĽáá¨ááŤáá á˘
áá°áá
áĽááááľ lottery-test-suite.fif
áĽá á áĽáą áá ááá°á áá°á á¨áá. á¨á°áłáłá° ááĽá á¨ááá, áŽáą á¨á°áᨠááá ááŁá á áá áľ. áááłá á¨áŽááľáŤáą áłáł 166 áŤáľááἠáĽá 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"
áĽááááá˘
~/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 áĽáá¨ááᣠáá
á á ááá á¨á°á ááá¨áá ááá áá° ááľáĽ áŤáŁáááᢠ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
áá°áááš áá áááá áĽá áá˛áŤáá áá°áŤáᢠááአáĽáá
á áá˘
áĽáşáŁ á¨ááá áá˝á á ááľáŁ áááá¸áľ á ááľ á°á¨á᪠ááá áĽááľááá˘
áá
á°á áĽááá á 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` поŃĐľĐźĐľĐ˝Đ˝Đ°Ń Ńипа ŃНОваŃŃ, Ń
ŃĐ°Đ˝Đ¸Ń ĐżĐžŃНоднио двадŃĐ°ŃŃ ŃŃавОк.
á ááá á áááľ á°ááŁáŤáľá ááťá áŤáľáááááłá. á¨ááááŞáŤáá áĽááĽáŤ pack_state()
, áá
á áááŁá áá ᣠá áááá á¨áŽááľáŤáľ áá¨ááť ááľáĽ áááĄá áŤá áááá. ááá°ááá áĽááĽáŤ 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;
}
áĽááá
á áááľ á°ááŁáŤáľ áá° áĽáἠáŽááľáŤáą ááááŞáŤ áĽáá¨ááŤáá. ááłáŤááłá
áááĽá áááľááἠá áĽáŽ á¨á°á°áŤáá á°ááŁá áá°áá áŤáľáááááłá set_data()
áĽá ᨠááἠáá˝áá pack_state()
á áľáááľ áŽááľáŤáľ áá¨ááť ááľáĽá˘
cell packed_state = pack_state(arg_1, .., arg_n);
set_data(packed_state);
á áá áá¨áá áááťá áĽá áááá ἠááš á°ááŁáŤáľ áľááá, ááá á áĽáá˝ááá.
á¨áá á¨áááŁá áááĽááľ á áá áŁáá¤áľ (ááá á¨áá áááá á¨áá áá áá á°á áá) á¨á°áá¨á áááá áá¨ááἠá ááĽáá˘
áááá áŽááľáŤáľ áľáá°á á áá¨ááť ááľáĽ á áááááá ááἠááľááá áĽáá˝áááᣠáá á ááá°ááľ áĽá á áá ááááᢠááŞá áááĽááľ á á°ááá á¨áá ááá á¨á°áá¨á áááá ááá¨ááἠá¨á á°áŁáŁá áááá áĽá፠áĽáááłááá˘
á¨ááá áá á ááľ á¨áá ááá áĽááá á áĽá áĽááá test/keys/owner.pk
. áá
áá áááľá¨á Fiftá á ááá°ááá áááł áĽááľááá áĽá á áŤáľ áľáááá˝á áĽááľáá˝á.
`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));
á ááŁáĽááľ áŤáá ááá áááľ
áá°ááášá áĽááŤááľ áĽá ááá°áá áá°á áĽááłáá°áłáŤ áĽááᢠá áááľ ááááŤáśá˝ á áááááą ááľáĽ á á á˘áľ á¨áá áĽá á áá¨ááťá ááľáĽ á á á˘áľ á¨áá, áľááá á˛á°áá°á áŽáą áá ááťá. á áááá áááĽááľ áá ááá áá¨á áĽá áá¨ááťáá á¨áá¨á¨áťá áá¨áŤ áá áłáľ á ááĽáá˘
á ááá°áá áá°á á¨áááĽááľ ááá áĽáá¨ááŤáá áĽá áááá á¨áŽááľáŤáľ áá¨ááťáá áĽááááŁááá˘
á áá á°á á¨áá ááá á¨á°áá¨á áááĽááľ á¨ááááá áľá á áŤá°á áá°á áĽáááᢠáá á¨áá ááá áĽááá á áĽá áá° ááá áĽááľááá á not-owner.pk
. á áá
á¨áá ááá áááĽááąá áĽááááááᢠáá°ááášá áĽááŤááľ áĽá ááá áá°ááá˝ áááá¸áá áĽáá¨áááĽá˘
á áá á áá¨á¨áť áá° áľáááľ áŽááľáŤáľ á áááᎠáá°áá á áááľ áĽáá˝áááá˘
Đ recv_external()
áááľ á áááľ áááááśá˝á áĽááá áááá˘
áŽááľáŤáłá˝á á¨á°áŤáážášá áŞáłáŤ áľáááŤá¨áá˝ áá áááἠááá°áŞá ááŁáŞ áá°ááá á áá áľá˘ áŽááľáŤáą á˛áá á á¨áá°áŞ ááŁáŞá á¨áŞáľ áŚááł á áľáŤáť á áá¨ááť ááľáĽ áááááŁá.
áĽáá°á፠á¨ááᣠá¨á°á¸áááá˝á ááŤá á¨ááááá áľá á áľáŤáť á¨ááá¨á á˝ááł áŤáľáááááᢠá¨áá°áŞá áá° áŁáá¤áą á áľáŤáť ááŤá ááá ááťá á ááĽáá˘
á¨ááááŞáŤá áĽááááᢠá ááááŞáŤ áááĽááąá á¨áአá áá áľáááľ áŽááľáŤáą á á˛áąá á áľáŤáť á áá¨ááťá ááľáĽ áĽááłáľááá á á¨ááŤá¨ááἠáá°á áĽáááᢠáĽáŁááá á áááĽááą ááľáĽ á¨ááŁáŞá áĽá á¨á á˛áą á áľáŤáť á á°á¨á᪠áĽá áĽáá°áááľá°ááá áἠáá á 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
. áááľ áĽáá°ááá¨á áĽááľáłááľá
action
á áľáŤáť ááá áĽá ááŤá ááá˘
á¨ááŤá á¨áŽááľáŤáąá áŁáá¤áľ á á˛áąá á áľáŤáť áĽáááŁáá áĽá á áá¨ááť ááľáĽ áĽááľááá ááá.
áá°ááášá áĽááŤááłáá áĽá áśáľá°áá áá°á á áááłáŤáąá áĽááŤáá. áŽááľáŤáą á áá á áá¨áŤá ááľáĽ á¨áá°ááľá á¨áááĽááą 7 á˘áľ á ááá¨áą áááľááᢠáá° áááĽááą á¨áááá áŤáá action
. áá°ááášá áĽááŤááľ áĽá ááá ááá áĽááłáá áĽááá˘
á áá á¨á°ááá¸áá á¨ááŤáá˝ ááĽá áá°á á˛á áá°á°ááá á á áľáŤáť áááá á ááááŽáá áĽááá.
ááááŞáŤ áá°á áĽáááᢠáááľ áá¨áŤáá˝á áĽáá˝ááá, á ááľ á á ááá á ááááá áľ áá, ááá°áá ááá ááá á á°áłáŤ áááł ááá á˛ááá áľ. áá°ááá˝ ááłáŠ áá˝áá
á áá áŽáąá áĽáá¨ááᢠá ááááŞáŤ, áááľ á¨áłáľ áá´áá˝á áĽááťá. á¨ááááŞáŤá á¨ááá áá´ á¨áľáááľ áŽááľáŤáľ á¨á ááá ááá ááá ááá˘
int balance() inline_ref method_id {
return get_balance().pair_first();
}
áĽá ááá°áá ááŤá áá° áá áááá áá áááá áá. áá áá áá´ á¨áá áááá áŽááľáŤáľ áá á áá áááĽáŤáá.
() 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
}
áĽááá á áááľ áá´áá˝ áá° áĽáἠáŽááľáŤáľ áĽáá¨áá áĽá á ááááŽáá áĽáááᢠá ááááŞáŤ á¨áááĽááą ááľáĽ á¨ááŤáá˝á áĽááľ áĽáááŁáá. á ááá á áááá áĽáááľáťáá, á á áŤááá á¨á°áᨠááá áĽááĽááá. ááá ááá á°á á á¨áá, á¨ááŤá ááŤáášá áá°á°ááá á á áľáŤáť áĽáááŤáá áĽá ááŁáŞáá áĽááááááá.
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()
.
á áá áá° ááľáŁá áááááśá˝ áĽáááľá˘ áĽáá°áá ááŤáá˝á áĽáť á°ááĽáá á°áŤááš á˘áŤá¸áá áĽá á¨á°á¸áá áśáľá°ááá ááŁáá¤áą áĽáááŤááá˘
á ááááŞáŤ á ááľ ááá áá°á áĽáááᢠáá áá áááľá¨á ááŤá áá° áľáááľ áŽááľáŤáľ á¨ááááá áľ á¨áľáááľ áŽááľáŤáľ á¨áá¨áŤ á áľáŤáť áĽááááááá˘
á¨áľáááľ áŽááľáŤáą á áľáŤáť áááľ ááĽáŽá˝á á¨áŤá áŁá 32-á˘áľ á˘áá˛áá ááľáŤ á°áá°ááľ áááááľ áŤáá áĽá 256-á˘áľ á ááłá áŤááá á¨á˘áá˛áá áአáá፠ááĽá á áá á¨áľáŤ á°áá°ááľ ááľáĽá˘ áááłá, -1 áĽá 12345, áá á ááá ááľáĽ á¨áááľááá á á áľáŤáť áá.
á áľáŤáťáá á¨ááľááἠá°ááŁáŠá áááĽáŤááᢠ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
á¨ááá áááąá áá á áŤááľ áááááŁáá˘
"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 -1
32 i>B
áŁá 32-á˘áľ á˘áá˛áá áá° áŁááľ ááááŤáá˘
"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 BYTES:FFFFFFFF
B+
áááľ á°á¨áłáłá áŁááľ áŤááááá˘
"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF
áĽáá°áá swap
.
BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF "sender.addr"
áĽá á áá¨á¨áťá áŁááľ á ááá áá á°á˝áá B>file
. á¨áá
á áá á¨áĽá ááá áŁáś ááᢠáĽááááá Fift
. á áá áŁáá á áá ááľáĽ ááá á°ááĽáŻáᢠsender.addr
. áááá áá° á°áá ᨠáá
á°á áĽááááłá
á°á test/addresses/
.
ááŤá áá° áĽáἠáá á¨ááá ááá áá°á áĽáááá˘
á áá á¨áá°áŞáá á áááᎠáĽáááá¨áľá˘
áĽá á¨ááá°ááá á¨ááááŞáŤá ááá áááĽááąá áá¨ááἠáá bounced
ááá á¨áá á áá°áá bounced
, á¨ááŤá á˝á áĽáááá. bounced
á ááłááľ áľá
á°áľ á¨á°áá ᨠáŽááľáŤáą ááŤá ááááłá áááľ áá. áľá
á°áľ á áľáááľ á˘á¨á°áľ ááŤá á ááááľáá˘
áĽáááľáťáá, ááá á¨ááá˝ ááŤá áŤáá° á¨áá, á ááá áááĽááąá áĽááá ááá áĽá á˝á áĽáááá.
á ááá á áááĽááą á¨ááŁá áľá á¨áľáááľ áŽááľáŤáľ á áľáŤáť áĽáá°áá°ááááá˘
áá¨ááá á¨áá áŤáááŤá ááľáĽ áĽáááŁáá áĽá á¨á፠á¨á፠á áá áŤá á¨áአáááŤáśá˝á á¨áłáŞá áĽáá°ááááᢠááááťá¸áľ, áśáľáľ á°á¨á᪠á°ááŁáŤáľá áťáአpack_order()
, unpack_order()
, remove_old_orders()
.
á ááá á ᣠááá ááááŤá á á áŤááá áĽááŤáá ᣠá¨á፠áá
ááááľ áĽááłááá áĽááľáŁáá ᣠáá ááááľ áĽá ááááľá á ááľáĽ áĽááľááá áááᢠorders
.
á¨á፠á áá¨á¨áť á¨áľáááľ áŽááľáŤáą áááľá˘
á ááááŞáŤ á°áŤááš á¨á°á¸áá á ááááľ áłáŞá ááľáĽ áĽááľááá ááá áĽá áá á ᨠ3 ááŤá á áá á¨áá 1/3 ááĽáἠáŽááľáŤáą áŁáá¤áľ áĽáááŤááá˘
á°áŤááš áŤá¸áá, á¨ááŤá á áĽáĽá áá á áá° á°áŤááš á áľáŤáť áĽáááŤáá áĽá á¨ááŤá á áłáŞá ááľáĽ áľá ááááľ áá¨á áĽááľááá ááá.
() 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));
}
፠áĽáť ááá˘
á áá á¨áá¨á áá ááá áá, áľá áŽááľáŤáą áááł á¨ááá ááá áá¨á áááááľ áĽááľáá˝á á¨ááááľ áá´áá˝á áĽááá á (á áĽáááą, áá¨ááá á¨áááá á¨áŽááľáŤáľ áá¨ááťá¸á áŤááĽáĄ).
áĽáá˛áá áĽáἠáá á˛áŤáľá á¨áá¨á°á°áá á¨ááááŞáŤáá áĽáŤá á¨ááŤáľáŹáľ áŽáľ áá¨á á¨áłáá˘
ááŁáŠ á°á¨á áááá áŽááľáŤáąá áá°á áá. áá
á°á áĽááá á requests
.
á¨ááľááľ áŽáąá áĽáá° áá á¨áľ á áľáá áá°áľáŠáľ simple-wallet-code.fc
áľáŠá¨áľ áá°á á á¨ááᣠááá. áááá á¨áŽááľáŤáľ áá¨ááť áĽá á¨áá¤áľ áááĽááľ áĽááááŤááᢠá¨áá
á áá á¨áľáááľ áŽááľáŤáą á áľáŤáť ááá áŤá, áááľá á áľáŤáťá á áśá ááľáĽ á¨ááłá°á á ááľ áĽááłá ááłááá. á ááá á ᣠáĽá ááŤá áá°áá
á áľáŤáť ááá áŤáľáááááłá ᣠáĽá á¨á፠á áá áĽáť á¨áľáááľ áŽááľáŤáą áá ááá ááá áŤáľáááááłá ᣠááááŤáąá á ááłá¨ áá¨áĄ áĽáἠáŽááľáŤáąá áĽá á ááľáĄ áŤááľá áľáŤáá˝ ááá¨áá¸áľ áŽáá˝á áľááááľáľ (áľáááľ á¨ááŤá¨ááš áĽá á¨ááá˝á á á¨áááŽá˝) ááá˝)á˘
á ááá á á¨á
áľááľ áŽáąá áĽááľáá˝ááá áĽá áĽááááá 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
ááááááľ áŤá áᣠááśá áĽáŤá áĽáá ááĽ
$ ./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
á áá áĽáἠáŽááľáŤáąá áĽáá°áᢠááľ-á°áá áá áĽáááá áĽá áĽááá˝áá˘
> 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
.
á¨áááŚá˝ áá á°ááłá áá áŞáłá
á áá á¨áľáááľ áŽááľáŤáą áá ááááááľ áĽáŤááá˝á áĽááá áá˘
áá áἠá áľááá ᣠá áľáŤáťáá áááá¨á á¨ááááŞáŤáá áĽáá°áááá áĽáá° áááá°á áĽáŤ ᣠáĽá ááá°ááá ááŤá áá° á¨áŁáá¤áą á áľáŤáť áááá áĽáá°áŤááᢠáĽáá° áĽáááą á¨áá, ááŤá áááá á áá°á ááľáĽ áĽáá°áá á¨á á°ááłáłá ááá ááľá¨á á ááĽá.
áá
áĽá áá° áĽáἠáŽááľáŤáľ á¨áááá áááĽááľ áá, á¨áľ msg_seqno
165, action
áááá 2 áĽá 9.5 ááŤá.
<b 165 32 u, 2 7 u, 9500000000 Gram, b>
áááĽááąá á áá áááá ááá¨ááá á áááą lottery.pk
áĽáἠáŽááľáŤáąá á˛ááĽáŠ áá°á áĽá á¨á°áá á¨.
á¨ááá áá´áá˝á á áá áá á¨áááá áŽááľáŤáľ áá¨á ááá á
á áá áĽáá´áľ áľáááľ áŽááľáŤáľ ááááľ áĽáá°ááťá áĽááá˘
á áľááá lite-client
áĽá áĽá á¨áťááá¸á áá´áá˝á áŤááąá˘
$ ./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]) ]
ááá á°áá áá áĽáá áááá áĽá á áŁá˘áŤá áá áľááá áááá áŽááľáŤáľ áá¨áá áááłá¨áľ áá´áá˝á áĽáááááá˘
á áľá áŁá˘áŤá áá á¨áľáááľ áŽááľáŤáľ áááĽá á ááłá¨áľ áá
áá¨ááá á¨áľáááľ áŽááľáŤáą ááš á áá ááááľ áááłá¨áľ á áááá ááľáĽ ááá áľá áŁá˘áŤ áťáአᢠáĽáá
áá á áááá á áááá áĽá áŁá˘áŤáá á áłáľáááá
ᨠTON áĽáŤááá˝ á¨ááááĄáľ ᨠPython
á áĽáá lite-client
. ááážáľ á˛áŁá áŁá˘áŤá á áśá¨á áłá˝á á Google ááááľ áá áłáľááá˘
áĽáááá
á áá áááááľ áĽá፠ááŤá áááá áĽáááá
á¨áá á áá
á˝áá á¨á á á áŠáľ á áá á¨áá áŤá áá á°áááˇáᣠááááŁáľ á á á áŤá ááá áá˝áá ááá ááááŁáľ áľá áśá ááá áááŤáá áĽá ááá áŤááá áľáááľ áŽááľáŤáľ ááťá áĽá áá°á ááááá á°á á¨áááŁáŁáľ á˝ááł ááá¨á áá˝ááᢠááᢠááááŁáľ á ááłááľ áááŽá˝ á ááá ááĽáŤáŠ áá˝á ááááá˘
ááááŁáľ á ááłááľ á¨á á°ááŁá አáá˝áłáá˝ áá áἠá á°ááá á áĽá á ááŤáá áááł áá¨ááá áá˝á áá á, ááá áá á˝ááá ááááááľ á¨á áá áá áááľáľ áá á. áĽáá˛áá á¨áá áŚáł áľá á°áľ á°ááź ááá á¨áá ááá áĽááłáááŁá ááá áá˝áá, áľááá á ááľ á¨áŁáľ ááá áĽáŤá°á¨á á¨áá, á TON áŽáľ áŚáá´áá á°ááľ ááá áŚáá´áá áá¨ááť áá áá°ááá á ááĽááľ.
áśá áŤáą áá á áááľ á¨ááľááľ á°á¨á áá áľááá á áá á˝áá ááľáĽ áŤááľá ááá¸ááá áĽááááá˝ á¨ááĽáą áááŚá˝ áá¨á°áą áĽáá°áá˝á áἠááŁá áááŁá (á áá˝áá áľ áá á¨á°á¨á°á°á ᣠááľááá á°áľá°áŤááá) ᣠáá á á ááá á ááŤá¨áĽ áááἠá¨ááá˝á.
áľá áśá á¨áá°ááľ áááł á ááááá. ááááŁáľ ááľá¨áŠ áľáá ááá áááá áĽá áĽáąá áááĽááľ áá áĽáá ááá áĽá á áá á áááśáťá˝á ááľáĽ á ááľ áŚáł áĽáááááá˘
ᨠâšTONâş á¨á áá á¨á°á áááá˝ á°áááŤá˝ áŤáá ááĽáŤ á¨ááľáĄáá á áᢠáľá ááĽáŤ ááá á¨áááá ááá á¨ááᣠá áá¨á áľááááá á¨áśá áá á á¨á°áĽ á¨á áá áĽá áĽáá áľáá´ á áᢠááá áĽááłá á¨áśá ááá˘áá˝ áĽá áá á á¨á°áŚá˝ áĽáá° á¨ááŹáľ á áłá˝ áŤá á˘ááá áĽáŠ ááá˘
ááŁááťáá˝
- á áśá áá áŚáá´áá á°ááśá˝áĄ-
https://test.ton.org - áŚáá´áá á¨áśá áá¨ááťáĄ-
https://github.com/ton-blockchain/ton - áá°ááŤáŠ ááľá¨áŽá˝ ááá á¨áŞáľ áŚááłáĄ-
https://wallet.ton.org - á¨áľáááľ áŽááľáŤáľ áá¨ááť á¨áá
á ááá˝áĄ-
https://github.com/raiym/astonished - áá° áááá á¨áŽááľáŤáľ áľá áŁá˘áŤ á ááááĄ
https://ton-lottery.appspot.com - á¨Visual Studio Code áFunC á¨ááŤáá፠áá¨ááťáĄ
https://github.com/raiym/func-visual-studio-plugin - á á´áááŤá áľá áśá áááŤáŠáŁ áá
á á áááť á°á¨á áááá
á¨á¨áłáᢠááśá á¨áá ááá á¨áá áá áĽá፠á á áĽáŁá áľá
á°áľ á áááá áĽáŹ á áľáŁááᢠáĽááŤá ááá¨áŤ ááŤá áá á¨á
áá˝áá.
https://t.me/tondev_ru - á áá áá¨á áŤáááá áľ áľá áśá áá ááááľáĄ-
https://t.me/TONgramDev - á¨ááľáľáŠ á¨ááááŞáŤ á°á¨ááĄ-
https://contest.com/blockchain - á¨ááľáľáŠ ááá°á á°á¨ááĄ-
https://contest.com/blockchain-2
ááá: hab.com