TON์์ ์ค๋งํธ ๊ณ์ฝ์ ์์ฑํ๊ณ ๊ฒ์ํ๋ ๋ฐฉ๋ฒ์ ๋ํด
์ด ๊ธฐ์ฌ๋ ๋ฌด์์ ๋๊น?
์ด ๊ธฐ์ฌ์์๋ Telegram ๋ธ๋ก์ฒด์ธ ๋ํ ์ค ์ฒซ ๋ฒ์งธ ๋ํ์ ์ฐธ๊ฐํ์ฌ ์์ ๋ฐ์ง ๋ชปํ ๋ฐฉ๋ฒ๊ณผ ๋ง๊ฐ์ ๋น ์ง์ง ์๊ณ ๋์์ด ๋ ์ ์๋๋ก ๋ด ๊ฒฝํ์ ๊ธฐ์ฌ์ ๊ธฐ๋กํ๊ธฐ๋ก ๊ฒฐ์ ํ ๋ฐฉ๋ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค. ๋๊ตฌ.
์ถ์์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ ๋ญ๊ฐ ์๋ํ๋ ์์ ์ ํ๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ ์ด ๊ธฐ์ฌ์์๋ ์ฆ์ ๋ณต๊ถ์ ์ํ ์ค๋งํธ ๊ณ์ฝ๊ณผ ์ค๊ฐ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ TON์์ ์ง์ ์ค๋งํธ ๊ณ์ฝ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ์น ์ฌ์ดํธ๋ฅผ ์์ฑํ์ต๋๋ค.
์ด ๊ธฐ์ฌ๋ TON์์ ์ฒ์์ผ๋ก ์ค๋งํธ ๊ณ์ฝ์ ๋ง๋ค๊ณ ์ถ์ง๋ง ์ด๋์๋ถํฐ ์์ํด์ผ ํ ์ง ๋ชจ๋ฅด๋ ์ฌ๋๋ค์๊ฒ ์ ์ฉํ ๊ฒ์ ๋๋ค.
๋ณต๊ถ์ ์๋ก ๋ค์ด ํ๊ฒฝ ์ค์น๋ถํฐ ์ค๋งํธ ๊ณ์ฝ ๊ฒ์, ์ํธ ์์ฉ, ๋ฐ์ดํฐ ์์ ๋ฐ ๊ฒ์๋ฅผ ์ํ ์น ์ฌ์ดํธ ์์ฑ๊น์ง ์งํํ๊ฒ ์ต๋๋ค.
๊ณต๋ชจ์ ์ฐธ๊ฐ์ ๋ํด
์ง๋ XNUMX์ ํ
๋ ๊ทธ๋จ์ ์๋ก์ด ์ธ์ด๋ก ๋ธ๋ก์ฒด์ธ ๋ํ๋ฅผ ๋ฐํํ์ต๋๋ค. Fift
ะธ FunC
. ์ ์๋ XNUMX๊ฐ์ ์ค๋งํธ ๊ณ์ฝ ์ค ํ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ํ์ํ์ต๋๋ค. ์์ผ๋ก ๋ค๋ฅธ ๊ธ์ ์ฐ์ง ์์๋ ๋ญ๊ฐ ๋ค๋ฅธ ์ผ์ ํ๊ณ , ์ธ์ด๋ฅผ ๋ฐฐ์ฐ๊ณ , ๋ญ๊ฐ๋ฅผ ๋ง๋ค์ด ๋ณด๋ฉด ์ข๊ฒ ๋ค๊ณ ์๊ฐํ์ด์. ๋ํ ์ฃผ์ ๋ ๋์์์ด ์
์ ์ ์์ต๋๋ค.
๋๋ ์ค๋งํธ ๊ณ์ฝ ๊ฐ๋ฐ ๊ฒฝํ์ด ์์๋ค๊ณ ๋งํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
ํ ์ ์์ ๋๊น์ง ๋๊น์ง ์ฐธ์ฌํ๊ณ ๋ฆฌ๋ทฐ๊ธ์ ์ฐ๋ ค๊ณ ํ๋๋ฐ ์ฒซ ๋ฒ์งธ์ ๋ฐ๋ก ์คํจํ์ด์. ๋ FunC
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์๋ํ์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๊ธฐ์ด๋ก ์ผ์๋ค.
๋น์์๋ ์ด ์ ๋๋ฉด ์ ์ด๋ ์์ ๋ฐ๊ธฐ์ ์ถฉ๋ถํ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ์ฐธ๊ฐ์ 40๋ช ์ค 60๋ช ์ ๋๊ฐ ์์์๊ฐ ๋์๋๋ฐ ๋๋ ๊ทธ์ค์ ํฌํจ๋์ง ์์๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด๊ฒ์๋ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์์ง๋ง ํ ๊ฐ์ง๊ฐ ๋๋ฅผ ๊ดด๋กญํ์ต๋๋ค. ๊ฒฐ๊ณผ๋ฐํ ๋น์ ๋ณธ์ธ์ ๊ณ์ฝ์ ๋ํ ํ ์คํธ ๊ฒํ ๊ฐ ์ด๋ฃจ์ด์ง์ง ์์๋๋ฐ, ์ฑํ ์ฐธ๊ฐ์๋ค์๊ฒ ํน์ ์๋ ์ฌ๋์ด ์๋์ง ๋ฌผ์ด๋ณด๋ ํ ๋ช ๋ ์์์ต๋๋ค.
๋ถ๋ช ํ ๋ด ๋ฉ์์ง์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ธ ๊ฒ ๊ฐ์๋ฐ, ์ดํ ํ ์ฌ์ฌ์์๋ค์ด ๋๊ธ์ ๊ฒ์ํ๋๋ฐ, ๊ทธ๋ค์ด ์ฌ์ฌ ๊ณผ์ ์์ ์ค์๋ก ๋ด ์ค๋งํธ ๊ณ์ฝ์ ๋์ณค๋์ง ์๋๋ฉด ๋จ์ํ ๋๋ฌด ๋๋น ์ ๋๊ธ์ด ํ์ํ์ง ์๋ค๊ณ ์๊ฐํ๋์ง๋ ์์ง๋ ์ดํด๊ฐ ๋์ง ์์ต๋๋ค. ํ์ด์ง์ ์ง๋ฌธ์ ํ๋๋ฐ ๋ต๋ณ์ ๋ฐ์ง ๋ชปํ์ต๋๋ค. ๋๊ฐ ์ฌ์ฌํ๋์ง๋ ์ ๋น๋ฐ์ด์ง๋ง ๊ฐ์ธ์ ์ธ ๋ฉ์์ง๋ฅผ ์ฐ๋ ๊ฒ์ ๋ถํ์ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
์ดํดํ๋ ๋ฐ ๋ง์ ์๊ฐ์ ์๋นํ๊ธฐ ๋๋ฌธ์ ๊ธฐ์ฌ๋ฅผ ์์ฑํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์์ง ์ ๋ณด๊ฐ ๋ง์ง ์๊ธฐ ๋๋ฌธ์ ์ด ๊ธฐ์ฌ๋ ๊ด์ฌ ์๋ ๋ชจ๋ ์ฌ๋์ ์๊ฐ์ ์ ์ฝํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
TON์ ์ค๋งํธ ๊ณ์ฝ ๊ฐ๋
๊ธ์ ์ฐ๊ธฐ ์ ์ ์ด๋ ์ชฝ์์ ์ ๊ทผํด์ผ ํ ์ง ํ์ ํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ด์ ์์คํ ์ด ์ด๋ค ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋์ง ์๋ ค ๋๋ฆฌ๊ฒ ์ต๋๋ค. ๋ณด๋ค ์ ํํ๊ฒ๋ ์ต์ํ ์ผ์ข ์ ๊ทผ๋ก ๊ณ์ฝ์๋ฅผ ์์ฑํ๊ธฐ ์ํด ์์์ผ ํ ๋ถ๋ถ์ด ๋ฌด์์ธ์ง์ ๋๋ค.
์ฐ๋ฆฌ๋ ์ค๋งํธ ๊ณ์ฝ์ ์์ฑํ๊ณ ํ๋ ฅํ๋ ๋ฐ ์ค์ ์ ๋ ๊ฒ์
๋๋ค. TON Virtual Machine (TVM)
, Fift
ะธ FunC
, ๋ฐ๋ผ์ ๊ธฐ์ฌ๋ ์ผ๋ฐ ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ์ ๋ํ ์ค๋ช
๊ณผ ๋น์ทํฉ๋๋ค. ์ฌ๊ธฐ์๋ ํ๋ซํผ ์์ฒด๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๋ํด์๋ ๋ค๋ฃจ์ง ์๊ฒ ์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์๋ ๋ฐฉ์์ ๋ํด TVM
๊ทธ๋ฆฌ๊ณ ์ธ์ด Fift
์ข์ ๊ณต์ ๋ฌธ์๊ฐ ์์ต๋๋ค. ๋ํ์ ์ฐธ๊ฐํ๋ฉด์, ๊ทธ๋ฆฌ๊ณ ์ง๊ธ ๊ณ์ฝ์๋ฅผ ์์ฑํ๋ฉด์ ๋๋ ์์ฃผ ๊ทธ๋
์๊ฒ ๋์ ๋๋ ธ๋ค.
์ค๋งํธ ๊ณ์ฝ์ด ์์ฑ๋๋ ์ฃผ์ ์ธ์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. FunC
. ํ์ฌ ์ด์ ๋ํ ๋ฌธ์๊ฐ ์์ผ๋ฏ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ์์ฑํ๋ ค๋ฉด ๊ณต์ ์ ์ฅ์์์ ์ค๋งํธ ๊ณ์ฝ์ ์์ ๊ฑฐ๊ธฐ์ ์๋ ์ธ์ด ์์ฒด์ ๊ตฌํ์ ์ฐ๊ตฌํด์ผ ํ๋ฉฐ, ์ง๋ ๋ ๊ฐ์ง ์ค๋งํธ ๊ณ์ฝ์ ์๋ ๋ณผ ์ ์์ต๋๋ค. ๋ํ. ๊ธฐ์ฌ ๋ ๋ถ๋ถ์ ๋งํฌ.
์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ์ค๋งํธ ๊ณ์ฝ์ ์์ฑํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. FunC
, ๊ทธ ํ ์ฝ๋๋ฅผ Fift ์ด์
๋ธ๋ฌ๋ก ์ปดํ์ผํฉ๋๋ค.
์ปดํ์ผ๋ ์ค๋งํธ ๊ณ์ฝ์ ๊ณ์ ๊ฒ์๋ ์์ ์
๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ํจ์๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. Fift
, ์ค๋งํธ ๊ณ์ฝ ์ฝ๋ ๋ฐ ๊ธฐํ ๋งค๊ฐ๋ณ์๋ฅผ ์
๋ ฅ์ผ๋ก ์ฌ์ฉํ๊ณ ์ถ๋ ฅ์ ํ์ฅ์๊ฐ ์๋ ํ์ผ์ด ๋ฉ๋๋ค. .boc
(โ์ธํฌ ์ฃผ๋จธ๋โ๋ฅผ ์๋ฏธํจ) ๊ทธ๋ฆฌ๊ณ ์์ฑ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ์ค๋งํธ ๊ณ์ฝ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋ ๊ฐ์ธ ํค์ ์ฃผ์๊ฐ ์์ต๋๋ค. ์์ง ๊ณต๊ฐ๋์ง ์์ ์ค๋งํธ ๊ณ์ฝ์ ์ฃผ์๋ก ์ด๋ฏธ ๊ทธ๋จ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
์์ ๋ TON์ ์ค๋งํธ ๊ณ์ฝ์ ๊ฒ์ํ๋ ค๋ฉด .boc
ํ์ผ์ ๋ผ์ดํธ ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ก์ฒด์ธ์ผ๋ก ์ ์ก๋์ด์ผ ํฉ๋๋ค(์์ธํ ๋ด์ฉ์ ์๋ ์ฐธ์กฐ). ํ์ง๋ง ๊ฒ์ํ๊ธฐ ์ ์ ์์ฑ๋ ์ฃผ์๋ก ๊ทธ๋จ์ ์ ์กํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ค๋งํธ ๊ณ์ฝ์ด ๊ฒ์๋์ง ์์ต๋๋ค. ๊ฒ์ ํ ์ธ๋ถ(์: ๋ผ์ดํธ ํด๋ผ์ด์ธํธ ์ฌ์ฉ) ๋๋ ๋ด๋ถ(์: ํ๋์ ์ค๋งํธ ๊ณ์ฝ์ด TON ๋ด๋ถ์์ ๋ค๋ฅธ ์ค๋งํธ ๊ณ์ฝ์ ๋ฉ์์ง๋ฅผ ๋ณด๋)์์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด ์ค๋งํธ ๊ณ์ฝ๊ณผ ์ํธ ์์ฉํ ์ ์์ต๋๋ค.
์ฝ๋๊ฐ ์ด๋ป๊ฒ ๊ฒ์๋๋์ง ์ดํดํ๋ฉด ๋ ์ฌ์์ง๋๋ค. ์ฐ๋ฆฌ๋ ์์ฑํ๋ ค๋ ๋ด์ฉ๊ณผ ํ๋ก๊ทธ๋จ์ด ์ด๋ป๊ฒ ์๋ํ ์ง ๋๋ต์ ์ผ๋ก ์๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ธ์ ์ฐ๋ฉด์ ๊ธฐ์กด ์ค๋งํธ ๊ณ์ฝ์์ ์ด๊ฒ์ด ์ด๋ฏธ ์ด๋ป๊ฒ ๊ตฌํ๋์ด ์๋์ง ์ฐพ์๋ณด๊ฑฐ๋ ๊ตฌํ ์ฝ๋๋ฅผ ์ดํด๋ด
๋๋ค. Fift
ะธ FunC
๊ณต์ ์ ์ฅ์์์ ๋๋ ๊ณต์ ๋ฌธ์๋ฅผ ์ดํด๋ณด์ธ์.
๋ํ ์ฐธ๊ฐ์๋ค๊ณผ ํ ๋ ๊ทธ๋จ ์ง์๋ค์ด ๋ชจ๋ ๋ชจ์ด๋ ํ ๋ ๊ทธ๋จ ์ฑํ ์์ ์์ฃผ ํค์๋๋ฅผ ๊ฒ์ํ๋๋ฐ, ๋ํ๊ฐ ์งํ๋๋ ๋์ ๋ชจ๋๊ฐ ๊ทธ๊ณณ์ ๋ชจ์ฌ 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-ะผะตัะพะดั ัะผะฐััะบะพะฝััะฐะบัะฐ.
์ด์ ๊ณ์ฝ ์์ฒด๋ฅผ ์์ฑํ ์ค๋น๊ฐ ๋์์ต๋๋ค.
ะ ะตะฐะปะธะทะฐัะธั
์๊ฐ
์์์๋ ์ผ๋ฏ์ด ์ฐ๋ฆฌ๊ฐ ์์ฑํ๊ณ ์๋ ์ค๋งํธ ์ปจํธ๋ํธ๋ ๋ณต๊ถ์ด๋ค.
๊ฒ๋ค๊ฐ ํฐ์ผ์ ๊ตฌ๋งคํ๊ณ ํ ์๊ฐ, ํ๋ฃจ, ํ ๋ฌ์ ๊ธฐ๋ค๋ ค์ผ ํ๋ ๋ณต๊ถ์ด ์๋๋ผ ์ฌ์ฉ์๊ฐ ๊ณ์ฝ ์ฃผ์๋ก ์ ์กํ๋ ์ฆ์ ๋ณต๊ถ์
๋๋ค. 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 ๋ธ๋ก์ฒด์ธ์ ์ ์ฅ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ ๋ชจ์์
๋๋ค. 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(๋๋ ๋คํธ์ํฌ ์ํ)์ด ์์๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ๋ํ ์ค์๋ ๊ฐ๋ฐ์ ์ค ํ ๋ช
์ด ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ์์ต๋๋ค. 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
.
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๋ฅผ ๋ํํ ๋ชจ๋๋ก ์คํํ๊ณ 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));
๊ด๋ จ ์ปค๋ฐ
ํ ์คํธ๋ฅผ ์คํํ๊ณ ๋ ๋ฒ์งธ ํ ์คํธ๊ฐ ์คํจํ๋์ง ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค. ๋ ๊ฐ์ง ์ด์ ๋๋ฌธ์ ๋ฉ์์ง์ ๋นํธ๊ฐ ์ถฉ๋ถํ์ง ์๊ณ ์ ์ฅ์์ ๋นํธ๊ฐ ์ถฉ๋ถํ์ง ์์ ๊ตฌ๋ฌธ ๋ถ์ ์ ์ฝ๋๊ฐ ์ถฉ๋ํฉ๋๋ค. ๋ณด๋ด๋ ๋ฉ์์ง์ ์๋ช ์ ์ถ๊ฐํ๊ณ ๋ง์ง๋ง ํ ์คํธ์ ์ ์ฅ์๋ฅผ ๋ณต์ฌํด์ผ ํฉ๋๋ค.
๋ ๋ฒ์งธ ํ
์คํธ์์๋ ๋ฉ์์ง ์๋ช
์ ์ถ๊ฐํ๊ณ ์ค๋งํธ ๊ณ์ฝ ์ ์ฅ์๋ฅผ ๋ณ๊ฒฝํด ๋ณด๊ฒ ์ต๋๋ค.
๋ค๋ฅธ ์ฌ๋์ ๊ฐ์ธ ํค๋ก ์๋ช
๋ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ๋ค ๋ฒ์งธ ํ
์คํธ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. ๋ ๋ค๋ฅธ ๊ฐ์ธ ํค๋ฅผ ๋ง๋ค์ด ํ์ผ์ ์ ์ฅํด ๋ณด๊ฒ ์ต๋๋ค. 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
XNUMXํ์์. ๋ณ์์ ์ญ์ง๋ ฌํ๋ Fift ๋ฌธ์์ ์ค๋ช
๋์ด ์์ต๋๋ค.
ํ ์คํธ๋ฅผ ์คํํ์ฌ ์คํจํ๋์ง ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค. ์ด์ ๋ณต๊ถ ์์ ์์ ์ฃผ์๋ฅผ ๋ณ๊ฒฝํ๋ ๋ ผ๋ฆฌ๋ฅผ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
์ค๋งํธ ๊ณ์ฝ์์ ์ฐ๋ฆฌ๋ ๊ณ์ํด์ ๋ถ์ํฉ๋๋ค. message
, ์ฝ์ด๋ณด์ธ์ action
. ์ฐ๋ฆฌ๋ ๋ ๊ฐ์ง๋ฅผ ๊ฐ๊ฒ ๋ ๊ฒ์์ ์๊ธฐ์์ผ ๋๋ฆฌ๊ฒ ์ต๋๋ค. action
: ์ฃผ์๋ฅผ ๋ณ๊ฒฝํ๊ณ ๊ทธ๋จ์ ๋ณด๋
๋๋ค.
๊ทธ๋ฐ ๋ค์ ๊ณ์ฝ ์์ ์์ ์ ์ฃผ์๋ฅผ ์ฝ๊ณ ์ด๋ฅผ ์ ์ฅ์์ ์ ์ฅํฉ๋๋ค.
ํ
์คํธ๋ฅผ ์คํํ๊ณ ์ธ ๋ฒ์งธ ํ
์คํธ๊ฐ ์คํจํ๋์ง ํ์ธํฉ๋๋ค. ์ด์ ๊ณ์ฝ์ด ํ
์คํธ์์ ๋๋ฝ๋ ๋ฉ์์ง์ 7๋นํธ๋ฅผ ์ถ๊ฐ๋ก ๊ตฌ๋ฌธ ๋ถ์ํ๋ค๋ ์ฌ์ค๋ก ์ธํด ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค. ์กด์ฌํ์ง ์๋ ๋ฉ์์ง๋ฅผ ๋ฉ์์ง์ ์ถ๊ฐํ์ธ์. action
. ํ
์คํธ๋ฅผ ์คํํ๊ณ ๋ชจ๋ ๊ฒ์ด ํต๊ณผ๋๋์ง ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
์ด์ ์ด์ ์ ์ ์ฅ๋ ์ฃผ์๋ก ์ง์ ๋ ๊ทธ๋จ ์๋ฅผ ๋ณด๋ด๋ ๋ ผ๋ฆฌ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ ํ
์คํธ๋ฅผ ์์ฑํด๋ณด์. ์ฐ๋ฆฌ๋ ๋ ๊ฐ์ง ํ
์คํธ๋ฅผ ์์ฑํ ๊ฒ์
๋๋ค. ํ๋๋ ์๊ณ ๊ฐ ์ถฉ๋ถํ์ง ์์ ๋์ด๊ณ , ๋ ๋ฒ์งธ๋ ๋ชจ๋ ๊ฒ์ด ์ฑ๊ณต์ ์ผ๋ก ํต๊ณผ๋์ด์ผ ํ ๋์
๋๋ค. ํ
์คํธ๋ฅผ ๋ณผ ์ ์์ต๋๋ค
์ด์ ์ฝ๋๋ฅผ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. ๋จผ์ ๋ ๊ฐ์ง ๋์ฐ๋ฏธ ๋ฉ์๋๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. ์ฒซ ๋ฒ์งธ get ๋ฐฉ๋ฒ์ ์ค๋งํธ ๊ณ์ฝ์ ํ์ฌ ์์ก์ ํ์ธํ๋ ๊ฒ์ ๋๋ค.
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
์ด๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๊ณ์ฝ์ด ๊ทธ๋จ์ ๋ฐํํ๋ค๋ ์๋ฏธ์
๋๋ค. ๊ฐ์๊ธฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๊ทธ๋จ์ ๋ฐํํ์ง ์์ต๋๋ค.
์์ก์ด XNUMX๊ทธ๋จ ๋ฏธ๋ง์ธ์ง ํ์ธํ๊ณ ๋ฉ์์ง๋ฅผ ์๋ฝํ๊ณ ๋ฌด์ํฉ๋๋ค.
๋ค์์ผ๋ก ๋ฉ์์ง๊ฐ ๋์จ ์ค๋งํธ ๊ณ์ฝ์ ์ฃผ์๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํฉ๋๋ค.
์ฐ๋ฆฌ๋ ์ ์ฅ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ค์ XNUMX๊ฐ ์ด์์ด๋ฉด ๊ธฐ๋ก์์ ์ค๋๋ ๋ฒ ํ
์ ์ญ์ ํฉ๋๋ค. ํธ์์ ์ธ ๊ฐ์ง ์ถ๊ฐ ๊ธฐ๋ฅ์ ์์ฑํ์ต๋๋ค. 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));
}
๊ทธ๊ฒ ์ ๋ถ ์ผ.
์ด์ ๋จ์ ๊ฒ์ ๊ฐ๋จํฉ๋๋ค. ์ธ๋ถ ์ธ๊ณ์์ ๊ณ์ฝ ์ํ์ ๋ํ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋๋ก get-method๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค(์ค์ ๋ก ์ค๋งํธ ๊ณ์ฝ ์ ์ฅ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค).
๋ํ ์ค๋งํธ ๊ณ์ฝ์ ๊ฒ์ํ ๋ ๋ฐ์ํ๋ ์ฒซ ๋ฒ์งธ ์์ฒญ์ ์ฒ๋ฆฌํ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์์์ต๋๋ค.
๋ค์ ๋จ๊ณ๋ ์ค๋งํธ ๊ณ์ฝ์ ๊ฒ์ํ๋ ๊ฒ์
๋๋ค. ํด๋๋ฅผ ๋ง๋ค์ด๋ณด์ 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 Gram์ ์ฌ์ฉํ๊ณ ๋ช ์ด ํ์ ๋์ผํ ๋ช
๋ น์ ์คํํฉ๋๋ค. ๋ด๊ฐ ์ฌ์ฉํ๋ ๊ทธ๋จ์ ๋ณด๋ด๋ ค๋ฉด
> 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
.
๋ณ๊ฒฝ์ฌํญ์ด ์๋ ํด๋น ์ปค๋ฐ
์ด์ ์ค๋งํธ ๊ณ์ฝ๊ณผ ์ํธ ์์ฉํ๊ธฐ ์ํ ์์ฒญ์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
๋ณด๋ค ์ ํํ๊ฒ๋ ์ฃผ์ ๋ณ๊ฒฝ์ ์ํ ์ฒซ ๋ฒ์งธ ์์ ์ ๋ ๋ฆฝ์ ์ธ ์์ ์ผ๋ก ๋จ๊ฒจ๋๊ณ , ์์ ์์ ์ฃผ์๋ก ๊ทธ๋จ์ ๋ณด๋ด๋ ๋ ๋ฒ์งธ ์์ ์ ์ํํ๊ฒ ์ต๋๋ค. ์ค์ ๋ก ๊ทธ๋จ ์ ์ก ํ ์คํธ์ ๋์ผํ ์์ ์ ์ํํด์ผ ํฉ๋๋ค.
์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ค๋งํธ ๊ณ์ฝ์ผ๋ก ๋ณด๋ผ ๋ฉ์์ง์
๋๋ค. 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๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ดํธ์ ์ค๋งํธ ๊ณ์ฝ์ ๋ํ ์ ๋ณด๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์ ์ป์ ๊ฒ์ ๋๋ค.
์น์ฌ์ดํธ์ ์ค๋งํธ ๊ณ์ฝ ๋ฐ์ดํฐ ํ์
์ ๋ ์ค๋งํธ ๊ณ์ฝ์ ๋ฐ์ดํฐ๋ฅผ ํธ๋ฆฌํ ๋ฐฉ์์ผ๋ก ํ์ํ๊ธฐ ์ํด Python์ผ๋ก ๊ฐ๋จํ ์น์ฌ์ดํธ๋ฅผ ์์ฑํ์ต๋๋ค. ์ฌ๊ธฐ์๋ ์์ธํ ์ค๋ช
ํ์ง ์๊ณ ์ฌ์ดํธ๋ฅผ ๊ฒ์ํ๊ฒ ์ต๋๋ค.
TON์ ๋ํ ์์ฒญ์ ๋ค์์์ ์ด๋ฃจ์ด์ง๋๋ค. Python
๋ฅผ ํตํด lite-client
. ํธ์๋ฅผ ์ํด ์ฌ์ดํธ๋ Docker๋ก ํจํค์ง๋์ด Google Cloud์ ๊ฒ์๋ฉ๋๋ค.
ํด๋ณด์
์ด์ ๋ณด์ถฉ์ ์ํด ๊ทธ๋จ์ ๊ทธ๊ณณ์ผ๋ก ๋ณด๋ด ๋ณด๊ฒ ์ต๋๋ค.
์ฌํ
๊ธฐ์ฌ๋ ์ ๊ฐ ์์ํ ๊ฒ๋ณด๋ค ํจ์ฌ ๊ธธ์๊ณ , ๋ ์งง์์ ์๋ ์๊ณ , ์๋๋ฉด ๋จ์ง TON์ ๋ํด ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๊ณ ์ํธ ์์ฉํ ์ ์๋ ๊ทธ๋ฆฌ ๊ฐ๋จํ์ง ์์ ์ค๋งํธ ๊ณ์ฝ์ ์์ฑํ๊ณ ๊ฒ์ํ๋ ค๋ ์ฌ๋์ ์ํ ๊ฒ์ผ ์๋ ์์ต๋๋ค. ๊ทธ๊ฒ. ์๋ง๋ ์ด๋ค ๊ฒ๋ค์ ๋ ๊ฐ๋จํ๊ฒ ์ค๋ช ๋ ์ ์์์ ๊ฒ์ ๋๋ค.
์๋ง๋ ๊ตฌํ์ ์ผ๋ถ ์ธก๋ฉด์ ๋ ํจ์จ์ ์ด๊ณ ์ฐ์ํ๊ฒ ์ํํ ์ ์์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ ๊ฒ ๋์๋ค๋ฉด ๊ธฐ์ฌ๋ฅผ ์ค๋นํ๋ ๋ฐ ํจ์ฌ ๋ ๋ง์ ์๊ฐ์ด ๊ฑธ๋ ธ์ ๊ฒ์ ๋๋ค. ์ด๋๊ฐ์์ ์ค์๋ฅผ ํ๊ฑฐ๋ ๋ญ๊ฐ๋ฅผ ์ดํดํ์ง ๋ชปํ์ ์๋ ์์ผ๋ฏ๋ก ์ฌ๊ฐํ ์์ ์ ์ํํ๋ ๊ฒฝ์ฐ TON ์ฝ๋๊ฐ ์๋ ๊ณต์ ๋ฌธ์๋ ๊ณต์ ์ ์ฅ์์ ์์กดํด์ผ ํฉ๋๋ค.
TON ์์ฒด๋ ์ฌ์ ํ ํ๋ฐํ ๊ฐ๋ฐ ๋จ๊ณ์ ์๊ธฐ ๋๋ฌธ์ ์ด ๊ธฐ์ฌ์ ๋ชจ๋ ๋จ๊ณ๋ฅผ ์ค๋จ์ํค๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ ์ ์์ง๋ง(์ด ๊ธ์ ์ฐ๋ ๋์ ๋ฐ์ํ์ผ๋ฉฐ ์ด๋ฏธ ์์ ๋์์ต๋๋ค) ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ฐ๋ ๊ฒ ๊ฐ์ง ์์ต๋๋ค.
TON์ ๋ฏธ๋์ ๋ํด์๋ ์ด์ผ๊ธฐํ์ง ์๊ฒ ์ต๋๋ค. ์๋ง๋ ํ๋ซํผ์ด ํฌ๊ฒ ์ฑ์ฅํ ๊ฒ์ด๋ฏ๋ก ์ฐ๋ฆฌ๋ ์๊ฐ์ ๋ค์ฌ ํ๋ซํผ์ ์ฐ๊ตฌํ๊ณ ์ง๊ธ ์ฐ๋ฆฌ ์ ํ์ผ๋ก ํ์ ์์ฅ์ ์ฑ์์ผ ํ ๊ฒ์ ๋๋ค.
TON๋ณด๋ค ๋ ๋ง์ ์ ์ฌ ๊ณ ๊ฐ์ ๋ณด์ ํ Facebook์ Libra๋ ์์ต๋๋ค. ์ ๋ Libra์ ๋ํด ๊ฑฐ์ ์๋ ๋ฐ๊ฐ ์์ต๋๋ค. ํฌ๋ผ์ ๋ฐ๋ฅด๋ฉด TON ์ปค๋ฎค๋ํฐ๋ณด๋ค Libra์์ ํจ์ฌ ๋ ๋ง์ ํ๋์ด ์๋ค๊ณ ํ๋จ๋ฉ๋๋ค. 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 - FunC์ฉ Visual Studio Code ํ์ฅ์ ์ํ ๋ฆฌํฌ์งํ ๋ฆฌ:
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 - ๋ํ์ ๋ ๋ฒ์งธ ๋จ๊ณ:
https://contest.com/blockchain-2
์ถ์ฒ : habr.com