α’αααΈααααααααα αα·αααααα»ααααα·α αα αααααΆααααΆααααα αααα»α TON
ααΎα’αααααααααα·ααΆαα’αααΈα’αααΈ?
αα αααα»αα’ααααααααα»αααΉααα·ααΆαα’αααΈααααααααααα»αααΆαα αΌααα½ααααα»αααΆαααααα½ααααααα Telegram blockchain ααααΌα (ααΈα) αα·αααΆααααααααΆααααα αΎαααΆααααααα α α·ααααααααααΆαααα·ααααααααααααα»ααα αααα»αα’ααααααα½αααΎααααΈαα»αα±ααααΆααααΆααα αΌααα αααα»αααΆαααααα ααααΆααα αΎααααα ααααΆαα½αα α’αααααΆααααΆααα
αααααΆααααα»ααα·αα αααααααααΌαα’ααΌααΈ ααα»ααααααΎααααΈααααΎα’αααΈαα½ααααααααΎαααΆααααααΆααα’ααααααααα»αααΆαααααααα·α αα αααααΆααααΆααααααααΆαααααααααααΆαα αα·αααα αααααααααααα αΆααα·αααααααα·α αα αααααΆααααΆααααααααααΆααααΈ TON ααααα·αααααΎααΆααααα»αααααα·ααααααα
α’αααααααΉαααΆααααααααααααααΆααα’ααααααα ααααααΎαα·α αα αααααΆααααΆαααααααΌααααααα½ααααα αααα»α TON ααα»αααααα·αααΉαααΆααααΌαα αΆααααααΎαααΈααΆα
αααααααΎαααααααΆα§ααΆα ααα αααα»αααΉααα ααΈααΆαααα‘αΎαααα·ααααΆααα ααΆαααααα»ααααα·α αα αααααΆααααΆααα ααααΎα’ααααααααααΆαα½αααΆ αα·ααααααααα ααααααααααΆααααα½α αα·αααααα»ααααα·ααααααα
α’αααΈααΆαα αΌααα½ααααα»αααΆαααααα½ααααααα
ααΆαααΈαααα»ααΆααααΆααα»α Telegram ααΆααααααΆαααΆαααααα½ααααααα blockchain ααΆαα½αααΉαααΆααΆααααΈα Fift
ΠΈ FunC
. ααΆα
αΆαααΆα
ααααα»αααΆαααααΎαααΎαααΈααΆαααααααα·α
αα
αααααΆααααΆαααααΆαα½ααααααΆαααααΎα‘αΎαααΆααααααΆαα αααα»αβαα·αβααΆβααΆβααΆβααΆαβααα’βαααα»αβααΆαβααααΎβα’αααΈβαααβαααααβααΈβαα αααβααΆααΆ αα·αβααααΎβα’αααΈβαα½α αααβααΈβααΆβαααα»αβαα·αβααααΌαβαααααβα’αααΈβαααααβαααβαα
βαααβα’ααΆααα ααΎαααΈααααααααΆαααααΊααΆααααΆαα·α
αα
αα
ααΎαααΌαααΆααα
ααΆααααΉααα·ααΆαααΆαααα»ααα·αααΆααααα·ααααααααα»αααΆαα’αα·αααααααα·α αα αααααΆααααΆαααααα
αααα»αααΆααααααααΉαα
αΌααα½ααα αΌααααααΈαααα
αααα αΌαααααααα»αα’αΆα
ααααΎααΆα α αΎααααααΆαααααααααα’ααααααα·αα·αααα‘αΎααα·α ααα»αααααααα»αααΆααααΆαααααααΆαααα
ααααααΈαα½αα αααα»α FunC
α αΎαααΆααΌαα
ααΆααααΎαααΆαα αααα»αααΆαααααΆααΆααΌαααααΆα
αα βαααβααα αααα»αβαα·αβααΆβαααβααΊβαα·αβααΆβαααααβααααΆααβααΎααααΈβααβαααΆαβα αα βααΆααβααααααβααα½αβαααααΆααα ααΆαααααα α’αααα αΌααα½ααααα αα 40 ααΆαααααα»αα αααα 60 ααΆααααΆαααααΆαααΆα’ααααααααααααΆαα α αΎααααα»ααααα·ααααααΆαααα»αα αααααα½ααααααα ααΆααΌαα αα·αααΆαα’αααΈαα»αααΆαα½αααΏαααααα ααα»ααααααΆαααΏααα½αααααΆααααα»αα αα ααααααααΆααααααα ααΆααα·αα·αααα‘αΎααα·αααααΆαααααΎααααααααααΆαααα·α αα αααααΆαααααααα»ααα·αααΆααααΆαααααΎαα αααα»αααΆααα½αα’αααα αΌααα½ααααα»αααΆαααααααΆααΎααΆαα’αααααααααααααααα·αααΆαααΆαα ααΊαα·αααΆαααα
ααΆαααΎααα αααααα α·ααααα»αααΆααα ααααααΆααααααααα»α ααΈααααααααααααα α ααααααΆααααα ααααα·αα½α α αΎααααα»ααα αααα·ααααααΆααΎαα½αααααααΆααα·α αα αααααΆααααΆααααααααααα»ααααα ααααααααα»αα’αα‘α»αααααα·αα·α αααα α¬ααααΆαααααα·αααΆααΆα’αΆαααααααααΆαααααααΆαα·αααααΌαααΆαααα·αααααα αααα»αβααΆαβαα½αβαααα½αβαα½αβαα βααΎβααααα ααα»ααααβαα·αβααΆαβααα½αβα ααααΎαα αααααΈααΆααΆαα·ααααααΆααΏααααααΆαααααααΆα’ααααα·αα·α ααααααααα αααα»αααΆαα αΆαααα»αααΆααΆαα·αα αΆαααΆα ααααα»αααΆααααααααΆαααααΆαααααα½αααα
αααααααΆααΆα αααΎαααααΌαααΆαα αααΆαααΎααΆααααααΉα ααΌα ααααααΆααααΌαααΆααααααααα α α·ααααααααα’ααααααα½αα αααααΆααα·αααΆααααΆαααααααΆαα αααΎα α’ααααααααααΉααα½ααααααααα ααααααααΆαααααΆααα’αααα αΆααα’αΆαααααααααααααααΆα
αααα·ααααα·α αα αααααΆααααΆααααα αααα»α TON
αα»ααααα’ααααααααα’αααΈ α’αααααααΌαααααααααααΆααΎαααααααΆαααααααΌαα αΌααα αα·αααΏααααα ααΌα ααααα₯α‘αΌαααα αααα»αααΉαααααΆααα’αααααΈαααααααΆαααααααααααααΆαα ααΆααααα αααΆααααΆαααααα ααα ααΎαααααααΆαααααααα’αααααααΌαααΉα ααΎααααΈααααααα·α αα αααααΆααΆαααΆααααΆαα αα ααΆααααααα
ααΎαααΉααααααααΎααΆαααααααα·α
αα
αααααΆααααΆααα αα·αααααΎααΆαααΆαα½α TON Virtual Machine (TVM)
, Fift
ΠΈ FunC
ααΌα
ααααα’αααααααΊααΌα
ααΆααΆααα·αααααΆα’αααΈααΆαα’αα·αααααααααααα·ααΈααααααΆα ααΎαααΉααα·αααΉαααα’ααααΎααααααααααα·ααΆαααα½αααΆααααΎαααΆααα
ααΈαααααα
ααΆααΌαα
α’αααΈαααααααααΆααααΎαααΆα TVM
αα·αααΆααΆ Fift
ααΆαα―αααΆαααααΌαααΆαααα’α αααβα
αΌαβαα½αβαααα»αβααΆαβααααα½αβαααααα α αΎαβα₯α‘αΌαβαααβαααα»αβαααααβαα·α
αα
βαααααΆβαα
αα
α»αααααα αααα»αβαααβααΆαβαα
βααβααΆαα
ααΆααΆααααΆααααααα·α
αα
αααααΆααααΆαααααααΌαααΆαααααα FunC
. αα·αααΆαα―αααΆααα
ααΎααΆαα
αααααααα ααΌα
ααααααΎααααΈαααααα’αααΈαα½α α’αααααααΌααα·ααααΆα§ααΆα ααααααα·α
αα
αααααΆααααΆαααααΈααααΆααααααΌαααΆα αα·αααΆαα’αα»ααααααΆααΆαααα½αα―ααα
ααΈααα ααΌαα’αααα’αΆα
ααΎαα§ααΆα ααααααα·α
αα
αααααΆααααΆαααααΈα’ααΈαααΆαααΈαα ααΆαααααα½αααααααα αααααααΆαααα
α
α»ααααα
ααααα’αααααα
α
αΌααα·ααΆαααΆααΎαααΆαααααααα·α
αα
αααααΆααααΆααααα½α
α αΎααααααΆαα FunC
αααααΆααααΈαααααΎαα
αααααααΌααα
ααΆ Fift assemblerα
αα·α
αα
αααααΆααααΆααααααααΆαα
ααααααα
ααααααΌαααααα»αααα ααΎααααΈααααΎααΌα
ααααα’αααααααΌαααααααα»αααΆααα
αααα»α Fift
αααααΉααααααααΌααα·α
αα
αααααΆααααΆααα αα·ααααΆαααΆαααααααααααααααα½αα
ααα½αααΆααΆααααα
αΌα α αΎαααααααααΉαααΆα―αααΆααααααΆαααααααααααα .boc
(αααααΆααααααΆ "ααααααα‘αΆ") α αΎαα’αΆαααααααΎαααααααααΎααααααααΆ ααα―ααα αα·αα’αΆααααααΆα αααααααΌαααΆααααααΎααααααα’ααααΎαααααΌααα·α
αα
αααααΆααααΆαααα α’αααα’αΆα
ααααΎααααΆααα
α’αΆααααααΆααααα·α
αα
αααααΆααααΆαααααααα·αααΆααααααΌαααΆαααααα»αααααααΆααα½α
α αΎαα
ααΎααααΈααααα»ααααα·α
αα
αααααΆααααΆααααα
αααα»α TON ααΆαααα½α .boc
α―αααΆαααΉαααααΌααααααΌααα
blockchain αααααααΎαααΆαααΈαααααααααααΊ (ααααααααΎααΆααΆαααααα) α ααα»αααααα»ααααααααα»ααα α’αααααααΌααααααααααΆααα
α’αΆααααααΆααααααΆααααααΎα ααΎαα·αααΌα
αααααααα·α
αα
αααααΆααααΆαααααΉααα·αααααΌαααΆαααααα»αααααα αααααΆααααΈααΆαααααα»αααααααΆα α’αααα’αΆα
ααααΎα’ααααααααααΆαα½ααα·α
αα
αααααΆααααΆααααααααααΎααΆαααΈααΆααααα
(α§ααΆα ααα ααΆαααααΎααααΆαααααΆαααΈαααααααααααΊ) α¬ααΈααΆααααα»α (α§ααΆα ααα αα·α
αα
αααααΆααααΆααααα½αααααΎααΆααααααααααα
αααα»α TON) α
αα
ααααααααΎααααααΈαααααααααΌαααααΌαααΆαααααα»ααα ααΆααΆααααααΆααααα½αα ααΎαβαααα ααβααΆβααΉαβααΈβα’αααΈβαααβααΎαβα
ααβααααα αα·αβααααβαααβαααααα·ααΈβααααβααΎαβααΉαβααααΎαααΆαα α αΎααααααααααα»αααααα ααΎαααααΎαααΈαααααααααΆααααΌαααΆαα’αα»αααααα
αααα»ααα·α
αα
αααααΆααααΆααααααααΆαααααΆαα α¬ααΎααα·αα·αααααΎαααΌαααΆαα’αα»αααα Fift
ΠΈ FunC
αα
αααα»αααααΆααααααΌαααΆα α¬ααααΎααα
αααα»αα―αααΆαααααΌαααΆαα
ααΆααΉαααΆαααααα»αααΆααααααααααΆααααααααΉααα αααα»αααΆαααααααΆα Telegram αααα’αααα αΌααα½αααααα½ααααααα αα·ααα»ααααα·α Telegram ααΆααα’ααααΆααααααΌααααα»αααααΆ α αΎαααΆααΆαααΎαα‘αΎαααΌα ααααααΆαααα»αα’αα‘α»ααααααααΆαααααα½αααααααα’ααααααααααααΆααΆααααααΌααααα»αααααΆαα ααΈααα α αΎαα αΆααααααΎααα·ααΆααααΆα’αααΈ Fift αα·α FunC α ααααΆαααα α α»ααααα ααααα’αααααα
ααΆαααααααααααααΌαααααΆααααααΌαααΈααααΉααααΈαα ααΆαα’αα»ααααα
ααΆααααα αααα·ααααΆααααααΆααααααΎααΆαααΆαα½α TON
αααα»αααΆαααααΎα’αααΈααααααααΆααααααΉαααααΌαααΆααα·αααααΆαα αααα»αα’ααααααα ααΎ MacOS α αΎαααΆααα·αα·αααααΆααΈααααααα»α Ubuntu 18.04 LTS ααα’αΆααα ααΎ Docker α
ααΏαααααΌααααα’αααααααΌαααααΎααΊααΆααααα·αααα‘αΎα 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-ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΠΌΠ°ΡΡΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ°.
α₯α‘αΌααααααΎαααααααααα½ααα½α ααΆααα αΎαααΎααααΈααααααα·α αα αααααΆααααααα½αα―αα
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ
αααα·α
ααΌα ααααααα»αααΆααααααααΆαααΎαα·α αα αααααΆααααΆααααααΎααααα»ααααααααΊααΆαααααα
ααΆαααααα
ααα ααααα·ααααααΆααααααααα’αααααααΌαααΆααα·ααααα»ααα α αΎααααα
αΆααα½ααααα αααα α¬ααααααα ααα»ααααααΆααααΆαααααα’αααααααΎααααΆααααααααα
α’αΆααααααΆααα·α
αα
αααααΆα N
ααααΆα α αΎαααααΆαααα·αααααΆαα 2 * N
ααααΆαα¬α
αΆααα ααΎαααΉαααααΎα±ααααααΌααΆαααΈααΈααααααΆααααααααα αα 40% α ααααα·αααΎαα·αααΆαααααΆααααααααααΆαααααααΆααααΆαααΌααΆαααα αααααΎαααΉααα·α
αΆαααΆααααα·ααααα·ααΆαααΆααΆααααα
αΌαααΉαααααΆααα
ααΎαααΈααααα ααα ααΆααΆαααΆααααααΆαααααααΆαααααΆααα’αΆα ααααΌαααΆαααααΎαααΎααααα»ααααααααΆααΆααααααα αα·ααααα»αααααααααΆααααα½α ααΌα ααααα’αααααααΎααααΆααα’αΆα αααααΆαααααΆααααΆααΎααΆαααααα α¬α αΆααα ααΌα ααααα αΎα α’αααααααΌααααααΎαααα ααααααααααΉααααα αΆαααΆαααααΆαα αα·ααααααααααααααΆααααΈ TONα
ααΆαααααααα·α αα αααααΆααααΆααα
ααΎααααΈααΆαααΆααααα½α αααα»αααΆαααααα ααΌααααααΆαα FunC α αΎααααααα·ααΈαααα½αα’αΆα ααααΌαααΆαααααΎα αα·αααα‘αΎααα αααα»αααΆαααααααα Visual Studio Code ααααα·αααΎα’αααααααΆααα ααααααααα’αααΈαα½α αααα»αααΆαααααΎα±αααααααα·ααΈαααα½ααααα’αΆα ααααΎααΆαααΆααΆααΆαααα ααΌα ααααΆαααααααα ααααΆααααΆααααΈαα»αααΆααααααΎααααααα·ααΈαααα½ααααααΆααααααΎααΆαααΆαα½α Fift α’αααααα’αΆα ααα‘αΎαααΆ αα·ααααααααααΆαα αααα»α VSC αααααα
ααααααααΎαααααΆαααα½αααααΆαα αααααΎαααΉααααααα ααααααααααα·ααααααα
ααΎααααΈααααΎα±ααααΈαα·αααααααΎαααΆααααααΆααααα½α ααΎαααΉαααααααα·α αα αααααΆααααΆααα α αΎαααΆαααααααΆαα αααα»αααΌαααααΆααα αΌααααααΆαα½α ααΆααα ααΆααααααααΆααααΈαααααΎαααΉαααααα»αααααΆαα αααα»α TON α
αα·α
αα
αααααΆααααΆαααααΆααα·ααΈααΆαααααααΆααααα
ααΈααααα’αΆα
α
αΌαααΆαα ααΈαα½α recv_external()
αα»αααΆααααααααΌαααΆαααααα·ααααα·αα
ααααααααααΎαα
αα·α
αα
αααααΆααααΈαα·ααααΆααααα
αααααΊαα·ααααααααΈ TON α§ααΆα ααα αα
ααααααααΎααααααΎαααΆααα½α α αΎαααααΎααΆααΆααααα’αα·αα·αααα·α
αα½α
α ααΈααΈα recv_internal()
αααααΊααΆαααααααα
αααα»α TON αααα½αααΆ αα·α
αα
αααααΆααΆαα½ααααα
αα
ααΎααααααΎαα αααα»αααααΈααΆααααΈαα’αααα’αΆα
αααααααΆαααΆαααααααα
αα»αααΆαα
α αΌαα αΆααααααΎαααΆαα½αααΉαα§ααΆα αααααααΆαααααα½ααααααΉαααααΎαααΆαααααα·αααΎααΆαααααα»ααα ααα»αααααα·αααΆαααΆααααα»ααα»αααΆααα αααα»αααΆααα
() 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 code αα
αααα»α 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
αα αΌαααααααααααα ααΆα αΆααααΌα ααΆα αααΆααα αΎα α₯α‘αΌαααα ααΌααααααααα α―αααΆαααΌα ααααΆααΌαααΌααααααΎαααΉαααααΎααΎααααΈααΎαααααΎαααΆα 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 (α¬ααααΆαααΆααααααΆα) ααΉαααααΌαααΆαααΆααα±ααααααΎαααΆαα ααΌααααΈαααααα»αα’αα‘α»ααααααααα½αααααααα’αααα’αα·ααααααααααΆααααΆααααα αΆαααΈαααααααααΎα 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 ααΎαα ααα±ααααΆααΎαα‘αΎααααααα α αΎααα ααααααααΎαααααΎααΆαααααααααααα αα·α αα αααααΆααααΆαααααΉαααα·αααααΆα
ααΌα ααααααααΎαααααααααα·α αα αααααΆαααααααΆααααα αΆααΆααααΈαααα αααααΆααα·α αα αααααΆααααααΎαααα½αααΆαααΈααΆααααα ααΎαααααααΌαααα α·ααααα»αααΆαααααααα
ααΎαααΉαααααΎααΆααΆαααααΆαααααα αααΆαα ααΈαα½α ααΎααααααααΆααααα αΆαααααΆαααααααα ααααα·αααΎαα·α αα αααααΆααΆαααα½αααΆααααααα α αΎαααααΎαααΆαααΆαα½α α αΎα ααΆααΉααα·αααααΎαααΆαααΆααΆααΎαααΈααΈαααα α αΎααααααΆααααααΎαααΉααααααααΆααααα αΆααΎααααΈα±ααααΆαααααααααααα»αααααΆααααΆααααα»ααααααααα’αΆα ααααΎααΆααα ααΆαααα·α αα αααααΆααααΆαααααΆαα
ααΆααα·ααΈαααααααααΆααΎααααΈαααααααΆααααα αΆααΆαα½αααΆααααα½αα αααααΆαααααααααΎαααΉαααααΎααΆα αα αααα»ααα·α αα αααααΆααααΆααα ααΎαα αΆααααααΎαααΆααααΆααααααα½αααΆαααααααααααααΌα 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
.
ααααααααα skirt code αα
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 !
αα
αααα»αααΆαααααΎααααα α’αααα’αΆα
ααΎαααΎαααΈαααααααααΆααααα»ααα·α
αα
αααααΆααααΆαααααααΌαααΆα deserialized storage
αα
αααα»α Fift α Deserialization ααα’αααααααΌαααΆααα·αααααΆαα
αααα»αα―αααΆα 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
α’αααΈαα½αααααα½αααα
α·ααααα»αααΆααα ααΎααααααΎααααααααααα»ααα·α
αα
αααααΆααααΆααα αα·αααΆααααα
αΌαα αααααΆααααΈααα α’αΆαααααααΆααααα·α
αα
αααααΆααααΆαααααααΌαααΆααααααΎα αααααΊα’αΆααααααΆαααααΌαααΆαααααααΆααααΌααααΈαααα»ααααααααα»ααααα
αααα»α 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 nanograms α
account state is (account
addr:(addr_std
anycast:nothing workchain_id:0 address:x044910149DBEAF8EADBB2B28722E7D6A2DC6E264EC2F1D9BEBD6FB209079BC2A)
storage_stat:(storage_info
used:(storage_used
cells:(var_uint len:1 value:1)
bits:(var_uint len:1 value:103)
public_cells:(var_uint len:0 value:0)) last_paid:1583257959
due_payment:nothing)
storage:(account_storage last_trans_lt:3825478000002
balance:(currencies
grams:(nanograms
amount:(var_uint len:4 value:2000000000))
other:(extra_currencies
dict:hme_empty))
state:account_uninit))
x{C00044910149DBEAF8EADBB2B28722E7D6A2DC6E264EC2F1D9BEBD6FB209079BC2A20259C2F2F4CB3800000DEAC10776091DCD650004_}
last transaction lt = 3825478000001 hash = B043616AE016682699477FFF01E6E903878CDFD6846042BA1BFC64775E7AC6C4
account balance is 2000000000ng
α₯α‘αΌαααα α αΌαααΎαααααααααααΆααα·α αα αααααΆααααΆαααα αααααΎαααααΎαααΆαα’αα·αα·αα Lite αα·αααααα·ααααα·α
> 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]) ]
ααΎαααΉαααααΎααααΆαα Lite-Client αα·αααα½αααΆααα·ααΈααΆαααααααΎααααΈαααα αΆαααααααΆαα’αααΈαα·α αα αααααΆααααΆααααα ααΎααα αααααα
αααα αΆααα·αααααααα·α αα αααααΆααααΆααααα ααΎααα ααααα
αααα»αααΆααααααααα αααααααΆαααααα½ααα
αααα»α Python ααΎααααΈαααα αΆααα·ααααααααΈαα·α
αα
αααααΆααααΆαααααΆαααααααΆααααα½αα αα
ααΈααααααα»αααΉααα·αααααα
ααΎααΆαα
αααα»ααααα’α·αααα αΎαααΉαααααααααααΆαααα ααααα
ααααΎαα
TON ααααΌαααΆαααααΎα‘αΎαααΈ Python
αααααΆααααα½α lite-client
. ααΎααααΈααΆαααΆααααα½α ααα ααααααααααααΌαααΆαααα
αααα
αααα»α Docker α αΎααααααααΆααα
ααΎ Google Cloudα
αααα»αααααΆααΆα
α₯α‘αΌααααααΌαααααΆααΆαααααΎααααΆααα
ααΈααααααααΆααααΆααααααααααααααΈ
Afterword
α’ααααααααααΆααααααα ααΆαααααΆαα’αααΈααααααα»αααααΉααα»α αααα ααααΆααΆααααΈααΆα α¬αααα ααααΆαααααΆααααααα»αααααααΆααααααα·αααΉαα’αααΈα’αααΈ TON α αΎαα ααααααα αα·αααααα»ααααα·α αα αααααΆααααΆαααααααα·αααΆαααα ααΆαα½αααΉααααααααΆααααα»αααΆαααααΎα’ααααααααααΆαα½α ααΆα αααα ααααΆααΏαααααα’αΆα ααααΌαααΆαααααααααΆααααααΆααααα
αααα ααααΆαα·αααααΆααα½αα ααα½αααααΆαα’αα»ααααα’αΆα ααααΌαααΆαα’αα»ααααααΆααααααΆαααααα·αααααΆα αα·αααΎαααΆα ααα»αααααααααΆααααααΆααΉαααααΌαααΆααααα αααΎαααΆααα»αααΎααααΈαααα αα’αααααα ααΆααα’αΆα αα αα½α αααααΆαααα»αααΆαααααΎαα»ααα ααααααααΆαα½α α¬αα·ααααα’αααΈαα½α ααΌα ααααααααα·αααΎα’ααααααα»αααααΎα’αααΈααααααααα α’αααααααΌαααΉαααα’ααααΎα―αααΆαααααΌαααΆα α¬ααααΆααααααΌαααΆααααααΆααααααΌα TON α
ααΆαα½αααααααΌαααΆαααααααααΆααααΆα αΆααααΆααααΈ TON αααα½αααΆαα αααααα·ααααα»αααααΆααααΆααααααααααΆαα’αα·ααααααααΆαααααΆααααααΌαα’αΆα ααΎαα‘αΎααααααΉααααααααα αΆαααΆαα½ααα αααα»αα’αααααααα (αααααΆαααΎαα‘αΎαααααααααααααα»ααααα»ααααααααΆααααΌαααΆααααααααΌααα½α α αΎα) ααα»αααααα·ααΈααΆαααααααΌαα ααΊ ααααααΆαα·αααααΆααααααΌαα
αααα»αααΉααα·ααα·ααΆαα’αααΈα’ααΆαααααα TON ααα αααα ααααΆαααα·ααΆαααααΉαααααΆαααΆα’αααΈααααα α αΎαααΎααα½αααα αααΆαααααα·ααααΆααΆ α αΎααααααααΈααααΆααα·αααααΆαα½αααα·αααααααααΎαα₯α‘αΌααααα
ααΆααααΆα Libra ααααΈ Facebook αααααΆααααααα·ααααααααΆαα»ααααα’αααααααΎααααΆααααααΆα 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 - ααααΆαααα
ααα ααααααα·α
αα
αααααΆααααΆαααα
https://ton-lottery.appspot.com - ααααΆαααααααΆααααααααααααααααααΆαα Visual Studio Code αααααΆαα FunCα
https://github.com/raiym/func-visual-studio-plugin - ααααα’αααΈ TON αα
αααα»α Telegram ααααα·αααΆααΆααα½ααααααααΆαααΆαα
ααααΆααααΆαααααΌαα αααα»αβαα·αβααΆβααΆβααΉαβαα·αβααΆαβααα α»αβααβααααα·αβααΎβαααα»αβαα·ααΆαβααΆβα’αααβααΆααβααααΆβαααβααΆαβαααααβα’αααΈβαα½αβαααααΆαα TON ααΊβαα
βααΈαααα α’αααααα’αΆα
αα½αααααααΆαααααααα
ααΈαααα
https://t.me/tondev_ru - ααΆααααααα½ααααα’αααΈ TON ααααααα»αααΆαααααΎαααααααΆαααΆαααααααααα
https://t.me/TONgramDev - ααααΆααααΆαααααΌαααααΆαααααα½αααααααα
https://contest.com/blockchain - ααααΆααααΆαααΈααΈαααααΆαααααα½αα
https://contest.com/blockchain-2
ααααα: www.habr.com