Telegram Open Network(TON)์—์„œ ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ์ž‘์„ฑํ•˜๊ณ  ๊ฒŒ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด

TON์—์„œ ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ์ž‘์„ฑํ•˜๊ณ  ๊ฒŒ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด

์ด ๊ธฐ์‚ฌ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” Telegram ๋ธ”๋ก์ฒด์ธ ๋Œ€ํšŒ ์ค‘ ์ฒซ ๋ฒˆ์งธ ๋Œ€ํšŒ์— ์ฐธ๊ฐ€ํ•˜์—ฌ ์ƒ์„ ๋ฐ›์ง€ ๋ชปํ•œ ๋ฐฉ๋ฒ•๊ณผ ๋ง๊ฐ์— ๋น ์ง€์ง€ ์•Š๊ณ  ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋„๋ก ๋‚ด ๊ฒฝํ—˜์„ ๊ธฐ์‚ฌ์— ๊ธฐ๋กํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ.

์ถ”์ƒ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ญ”๊ฐ€ ์ž‘๋™ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๊ณ  ์‹ถ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ์ฆ‰์„ ๋ณต๊ถŒ์„ ์œ„ํ•œ ์Šค๋งˆํŠธ ๊ณ„์•ฝ๊ณผ ์ค‘๊ฐ„ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  TON์—์„œ ์ง์ ‘ ์Šค๋งˆํŠธ ๊ณ„์•ฝ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์›น ์‚ฌ์ดํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ์‚ฌ๋Š” TON์—์„œ ์ฒ˜์Œ์œผ๋กœ ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€๋งŒ ์–ด๋””์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ณต๊ถŒ์„ ์˜ˆ๋กœ ๋“ค์–ด ํ™˜๊ฒฝ ์„ค์น˜๋ถ€ํ„ฐ ์Šค๋งˆํŠธ ๊ณ„์•ฝ ๊ฒŒ์‹œ, ์ƒํ˜ธ ์ž‘์šฉ, ๋ฐ์ดํ„ฐ ์ˆ˜์‹  ๋ฐ ๊ฒŒ์‹œ๋ฅผ ์œ„ํ•œ ์›น ์‚ฌ์ดํŠธ ์ž‘์„ฑ๊นŒ์ง€ ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ณต๋ชจ์ „ ์ฐธ๊ฐ€์— ๋Œ€ํ•ด

์ง€๋‚œ XNUMX์›” ํ…”๋ ˆ๊ทธ๋žจ์€ ์ƒˆ๋กœ์šด ์–ธ์–ด๋กœ ๋ธ”๋ก์ฒด์ธ ๋Œ€ํšŒ๋ฅผ ๋ฐœํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค. Fift ะธ FunC. ์ œ์•ˆ๋œ XNUMX๊ฐœ์˜ ์Šค๋งˆํŠธ ๊ณ„์•ฝ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๋‹ค๋ฅธ ๊ธ€์„ ์“ฐ์ง€ ์•Š์•„๋„ ๋ญ”๊ฐ€ ๋‹ค๋ฅธ ์ผ์„ ํ•˜๊ณ , ์–ธ์–ด๋ฅผ ๋ฐฐ์šฐ๊ณ , ๋ญ”๊ฐ€๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๋ฉด ์ข‹๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์–ด์š”. ๋˜ํ•œ ์ฃผ์ œ๋Š” ๋Š์ž„์—†์ด ์ž…์ˆ ์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์Šค๋งˆํŠธ ๊ณ„์•ฝ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์ด ์—†์—ˆ๋‹ค๊ณ  ๋งํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๋๊นŒ์ง€ ์ฐธ์—ฌํ•˜๊ณ  ๋ฆฌ๋ทฐ๊ธ€์„ ์“ฐ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ์ฒซ ๋ฒˆ์งธ์— ๋ฐ”๋กœ ์‹คํŒจํ–ˆ์–ด์š”. ๋‚˜ ์ง€๊ฐ‘์„ ์ผ๋‹ค ๋‹ค์ค‘ ์„œ๋ช… ์‚ฌ์šฉ FunC ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ธฐ์ดˆ๋กœ ์‚ผ์•˜๋‹ค. Solidity์˜ ์Šค๋งˆํŠธ ๊ณ„์•ฝ.

๋‹น์‹œ์—๋Š” ์ด ์ •๋„๋ฉด ์ ์–ด๋„ ์ƒ์„ ๋ฐ›๊ธฐ์— ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ์ฐธ๊ฐ€์ž 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 ๋‹น์‹ ์€ ์ฝ์„ ์ˆ˜์žˆ๋‹ค Fift ๋ฌธ์„œ์—์„œ.

๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

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๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค(์‹ค์ œ๋กœ ์Šค๋งˆํŠธ ๊ณ„์•ฝ ์ €์žฅ์†Œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค).

get ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด์ž. ์Šค๋งˆํŠธ ๊ณ„์•ฝ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•„๋ž˜์— ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ๊ฒŒ์‹œํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ปค๋ฐ‹. ๊ทธ๋ฆฌ๊ณ  ๋” ๋‚˜์•„๊ฐ€ ์ˆ˜์ • ๊ธˆ์•ก์˜ 1/3์„ ์†Œ์œ ์ž ๊ณ„์ •์œผ๋กœ ๋ณด๋‚ด๋Š” ๋ฒ„๊ทธ.

๋‹ค์Œ ๋‹จ๊ณ„๋Š” ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด๋”๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž 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์— ๊ฒŒ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋งํฌ.

ํ•ด๋ณด์ž

์ด์ œ ๋ณด์ถฉ์„ ์œ„ํ•ด ๊ทธ๋žจ์„ ๊ทธ๊ณณ์œผ๋กœ ๋ณด๋‚ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ง€๊ฐ‘. 40g์„ ๋ณด๋‚ด๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ๋ฒ ํŒ…์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์‚ฌ์ดํŠธ์—๋Š” ๋ฒ ํŒ… ๋‚ด์—ญ, ํ˜„์žฌ ์Šน๋ฅ  ๋ฐ ๊ธฐํƒ€ ์œ ์šฉํ•œ ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š”๋ณด๋‹ค์šฐ๋ฆฌ๊ฐ€ ์ฒซ ๋ฒˆ์งธ๋Š” ์ด๊ฒผ๊ณ  ๋‘ ๋ฒˆ์งธ๋Š” ์กŒ๋‹ค๋Š” ๊ฑฐ์ฃ .

์‚ฌํ›„

๊ธฐ์‚ฌ๋Š” ์ œ๊ฐ€ ์˜ˆ์ƒํ•œ ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๊ธธ์—ˆ๊ณ , ๋” ์งง์•˜์„ ์ˆ˜๋„ ์žˆ๊ณ , ์•„๋‹ˆ๋ฉด ๋‹จ์ง€ TON์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅด๊ณ  ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋ฆฌ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์€ ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ์ž‘์„ฑํ•˜๊ณ  ๊ฒŒ์‹œํ•˜๋ ค๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•œ ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ. ์•„๋งˆ๋„ ์–ด๋–ค ๊ฒƒ๋“ค์€ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…๋  ์ˆ˜ ์žˆ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๊ตฌํ˜„์˜ ์ผ๋ถ€ ์ธก๋ฉด์„ ๋” ํšจ์œจ์ ์ด๊ณ  ์šฐ์•„ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ ‡๊ฒŒ ๋˜์—ˆ๋‹ค๋ฉด ๊ธฐ์‚ฌ๋ฅผ ์ค€๋น„ํ•˜๋Š” ๋ฐ ํ›จ์”ฌ ๋” ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋”˜๊ฐ€์—์„œ ์‹ค์ˆ˜๋ฅผ ํ–ˆ๊ฑฐ๋‚˜ ๋ญ”๊ฐ€๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์„ ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ ์‹ฌ๊ฐํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ TON ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๊ณต์‹ ๋ฌธ์„œ๋‚˜ ๊ณต์‹ ์ €์žฅ์†Œ์— ์˜์กดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

TON ์ž์ฒด๋Š” ์—ฌ์ „ํžˆ ํ™œ๋ฐœํ•œ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ธฐ์‚ฌ์˜ ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ์ค‘๋‹จ์‹œํ‚ค๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ(์ด ๊ธ€์„ ์“ฐ๋Š” ๋™์•ˆ ๋ฐœ์ƒํ–ˆ์œผ๋ฉฐ ์ด๋ฏธ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค) ์ผ๋ฐ˜์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฐ”๋€” ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

TON์˜ ๋ฏธ๋ž˜์— ๋Œ€ํ•ด์„œ๋Š” ์ด์•ผ๊ธฐํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ํ”Œ๋žซํผ์ด ํฌ๊ฒŒ ์„ฑ์žฅํ•  ๊ฒƒ์ด๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ๋“ค์—ฌ ํ”Œ๋žซํผ์„ ์—ฐ๊ตฌํ•˜๊ณ  ์ง€๊ธˆ ์šฐ๋ฆฌ ์ œํ’ˆ์œผ๋กœ ํ‹ˆ์ƒˆ ์‹œ์žฅ์„ ์ฑ„์›Œ์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

TON๋ณด๋‹ค ๋” ๋งŽ์€ ์ž ์žฌ ๊ณ ๊ฐ์„ ๋ณด์œ ํ•œ Facebook์˜ Libra๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” Libra์— ๋Œ€ํ•ด ๊ฑฐ์˜ ์•„๋Š” ๋ฐ”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํฌ๋Ÿผ์— ๋”ฐ๋ฅด๋ฉด TON ์ปค๋ฎค๋‹ˆํ‹ฐ๋ณด๋‹ค Libra์—์„œ ํ›จ์”ฌ ๋” ๋งŽ์€ ํ™œ๋™์ด ์žˆ๋‹ค๊ณ  ํŒ๋‹จ๋ฉ๋‹ˆ๋‹ค. TON์˜ ๊ฐœ๋ฐœ์ž์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ์–ธ๋”๊ทธ๋ผ์šด๋“œ์— ๋” ๊ฐ€๊น์ง€๋งŒ ๊ทธ๊ฒƒ๋„ ๋ฉ‹์ง€๋„ค์š”.

์ฐธ์กฐ

  1. ๊ณต์‹ TON ๋ฌธ์„œ: https://test.ton.org
  2. ๊ณต์‹ TON ์ €์žฅ์†Œ: https://github.com/ton-blockchain/ton
  3. ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์˜ ๊ณต์‹ ์ง€๊ฐ‘: https://wallet.ton.org
  4. ์ด ๊ธฐ์‚ฌ์˜ ์Šค๋งˆํŠธ ๊ณ„์•ฝ ์ €์žฅ์†Œ: https://github.com/raiym/astonished
  5. ์Šค๋งˆํŠธ ๊ณ„์•ฝ ์›น์‚ฌ์ดํŠธ ๋งํฌ: https://ton-lottery.appspot.com
  6. FunC์šฉ Visual Studio Code ํ™•์žฅ์„ ์œ„ํ•œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ: https://github.com/raiym/func-visual-studio-plugin
  7. ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ์ด๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋œ Telegram์˜ TON์— ๋Œ€ํ•ด ์ฑ„ํŒ…ํ•˜์„ธ์š”. TON์— ๊ธ€์„ ์“ฐ์‹  ๋ถ„๋“ค์€ ๋‹ค ๊ฑฐ๊ธฐ ๊ณ„์‹œ๋‹ค๊ณ  ํ•ด๋„ ํ‹€๋ฆฌ์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์•„์š”. ๊ฑฐ๊ธฐ์—์„œ ํ…Œ์ŠคํŠธ ๊ทธ๋žจ์„ ์š”์ฒญํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. https://t.me/tondev_ru
  8. ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ์ฐพ์€ TON์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ๋Œ€ํ™”: https://t.me/TONgramDev
  9. ๋Œ€ํšŒ์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„: https://contest.com/blockchain
  10. ๋Œ€ํšŒ์˜ ๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„: https://contest.com/blockchain-2

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€