Haskell์„ ์‚ฌ์šฉํ•˜์—ฌ FunC๋ฅผ FunCtional๋กœ ์ „ํ™˜: Serokell์ด Telegram ๋ธ”๋ก์ฒด์ธ ๋Œ€ํšŒ์—์„œ ์šฐ์Šนํ•œ ๋ฐฉ๋ฒ•

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

๋Œ€๊ทœ๋ชจ ๋ธ”๋ก์ฒด์ธ ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ์— ๋Œ€ํ•œ ๊ด‘๋ฒ”์œ„ํ•œ ๊ฒฝํ—˜์„ ๋ณด์œ ํ•œ Serokell ํŒ€์€ ์˜†์œผ๋กœ ์„ค ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” XNUMX๋ช…์˜ ์ง์›์„ ๋Œ€ํšŒ์— ์œ„์ž„ํ–ˆ๊ณ , XNUMX์ฃผ ํ›„ ๊ทธ๋“ค์€ ์„น์‹œ ์นด๋ฉœ๋ ˆ์˜จ(Sexy Chameleon)์ด๋ผ๋Š” ๊ฒธ์†ํ•œ ๋ณ„๋ช…์œผ๋กœ ๋Œ€ํšŒ์—์„œ XNUMX์œ„๋ฅผ ์ฐจ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ๊ทธ๋“ค์ด ์–ด๋–ป๊ฒŒํ–ˆ๋Š”์ง€์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ XNUMX๋ถ„ ์•ˆ์— ์ตœ์†Œํ•œ ํฅ๋ฏธ๋กœ์šด ์ด์•ผ๊ธฐ๋ฅผ ์ฝ๊ณ , ๊ธฐ๊ปํ•ด์•ผ ์—…๋ฌด์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์šฉํ•œ ๋‚ด์šฉ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์•ฝ๊ฐ„์˜ ๋งฅ๋ฝ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฒฝ์Ÿ๊ณผ ๊ทธ ์กฐ๊ฑด

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

์šฐ๋ฆฌ๋Š” ์ฃผ์ตœ์ธก์ด ์ œ์•ˆํ•œ ๋ชฉ๋ก์—์„œ ๋‘ ๊ฐœ์˜ ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” TON๊ณผ ํ•จ๊ป˜ ๋ฐฐํฌ๋œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ , ๋‘ ๋ฒˆ์งธ๋Š” ์—”์ง€๋‹ˆ์–ด๊ฐ€ TON์šฉ์œผ๋กœ ํŠน๋ณ„ํžˆ ๊ฐœ๋ฐœํ•˜๊ณ  Haskell์— ๋‚ด์žฅ๋œ ์ƒˆ๋กœ์šด ์–ธ์–ด๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์šฐ๋ฆฌ๊ฐ€ ์ฐธ์—ฌํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ์šฐ๋ฆฌ์˜ ์ „๋ฌธ ๋ถ„์•ผ๋Š” ํŠน๋ณ„ํ•œ ๊ธฐ์ˆ ์ด ํ•„์š”ํ•˜๊ณ  ์ข…์ข… IT ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ณผํ•™์  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๋น„ํ‘œ์ค€์ ์ด๊ณ  ๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์˜คํ”ˆ์†Œ์Šค ๊ฐœ๋ฐœ์„ ๊ฐ•๋ ฅํžˆ ์ง€์ง€ํ•˜๊ณ  ๋Œ€์ค‘ํ™”์— ํž˜์“ฐ๊ณ  ์žˆ์œผ๋ฉฐ, ์ปดํ“จํ„ฐ ๊ณผํ•™ ๋ฐ ์ˆ˜ํ•™ ๋ถ„์•ผ์˜ ๋Ÿฌ์‹œ์•„ ์œ ์ˆ˜์˜ ๋Œ€ํ•™๋“ค๊ณผ๋„ ํ˜‘๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฝ์Ÿ์ด๋ผ๋Š” ํฅ๋ฏธ๋กœ์šด ๊ณผ์ œ์™€ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ๋ž‘ํ•˜๋Š” ํ…”๋ ˆ๊ทธ๋žจ ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•˜๋Š” ๊ฒƒ์€ ๊ทธ ์ž์ฒด๋กœ ํ›Œ๋ฅญํ•œ ๋™๊ธฐ ๋ถ€์—ฌ๊ฐ€ ๋˜์—ˆ์ง€๋งŒ ์ƒ๊ธˆ์€ ์ถ”๊ฐ€์ ์ธ ์ธ์„ผํ‹ฐ๋ธŒ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ™‚

TON ๋ธ”๋ก์ฒด์ธ ์—ฐ๊ตฌ

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

๋Œ€ํšŒ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ์ฏค์—๋Š” ์ฝ”๋“œ๊ฐ€ ์ด๋ฏธ ๊ณต๊ฐœ๋˜์—ˆ์œผ๋ฏ€๋กœ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ€์ด๋“œ๋‚˜ ์š”์•ฝ์„ ์ฐพ์•„๋ณด๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๋ณ„. ๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์€ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. Ubuntu์—์„œ ํ”Œ๋žซํผ์„ ์กฐ๋ฆฝํ•˜๋Š” ์ง€์นจ ์™ธ์— ๋‹ค๋ฅธ ์ž๋ฃŒ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ ์ž์ฒด๋Š” ์ž˜ ์กฐ์‚ฌ๋˜์—ˆ์ง€๋งŒ ์ผ๋ถ€ ์˜์—ญ์—์„œ๋Š” ์ฝ๊ธฐ๊ฐ€ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค. ์ข…์ข… ์šฐ๋ฆฌ๋Š” ํŠน์ • ์ง€์ ์œผ๋กœ ๋Œ์•„๊ฐ€ ์ถ”์ƒ์  ์•„์ด๋””์–ด์— ๋Œ€ํ•œ ๋†’์€ ์ˆ˜์ค€์˜ ์„ค๋ช…์—์„œ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์œผ๋กœ ์ „ํ™˜ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

Nix: ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๊ธฐ

Serokell์—์„œ ์šฐ๋ฆฌ๋Š” ์—ด๋ ฌํ•œ ํŒฌ์ž…๋‹ˆ๋‹ค. ๊ฑฐ์ ˆํ•˜๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๋“ค๊ณผ ํ•จ๊ป˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. ๋‹‰์Šค์˜ต์Šค, ๋ชจ๋“  ์„œ๋ฒ„์— ์„ค์น˜๋ฉ๋‹ˆ๋‹ค. ๋‹‰์ŠคOS. ๋•๋ถ„์— ์šฐ๋ฆฌ์˜ ๋ชจ๋“  ๋นŒ๋“œ๋Š” ์žฌํ˜„ ๊ฐ€๋Šฅํ•˜๋ฉฐ Nix๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์šด์˜ ์ฒด์ œ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋งŒ๋“œ๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. TON ์–ด์…ˆ๋ธ”๋ฆฌ์šฉ ํ‘œํ˜„์‹์ด ํฌํ•จ๋œ Nix ์˜ค๋ฒ„๋ ˆ์ด. ๋„์›€์„ ๋ฐ›์œผ๋ฉด TON ์ปดํŒŒ์ผ์ด ์ตœ๋Œ€ํ•œ ๊ฐ„๋‹จํ•ด์ง‘๋‹ˆ๋‹ค.

$ cd ~/.config/nixpkgs/overlays && git clone https://github.com/serokell/ton.nix
$ cd /path/to/ton/repo && nix-shell
[nix-shell]$ cmakeConfigurePhase && make

์ข…์†์„ฑ์„ ์„ค์น˜ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. NixOS, Ubuntu, macOS ๋“ฑ ๋ฌด์—‡์„ ์‚ฌ์šฉํ•˜๋“  Nix๋Š” ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ๋ชจ๋“  ๊ฒƒ์„ ๋Œ€์‹ ํ•ด ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

TON ํ”„๋กœ๊ทธ๋ž˜๋ฐ

TON ๋„คํŠธ์›Œํฌ์˜ ์Šค๋งˆํŠธ ๊ณ„์•ฝ ์ฝ”๋“œ๋Š” TON ๊ฐ€์ƒ ๋จธ์‹ (TVM)์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. TVM์€ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ๊ฐ€์ƒ ๋จธ์‹ ๋ณด๋‹ค ๋” ๋ณต์žกํ•˜๋ฉฐ ๋งค์šฐ ํฅ๋ฏธ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฐ์† ะธ ๋ฐ์ดํ„ฐ ๋งํฌ.

๊ฒŒ๋‹ค๊ฐ€ TON์˜ ์‚ฌ๋žŒ๋“ค์€ ์„ธ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ค์‹ญ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ๋ฒ”์šฉ ์Šคํƒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ์•ž์œผ๋กœ. ๊ทธ์˜ ์ดˆ๋Šฅ๋ ฅ์€ TVM๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋Šฅ๋ ฅ์ด๋‹ค.

ํŽ€์”จ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ์Šค๋งˆํŠธ ๊ณ„์•ฝ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. C ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์–ธ์–ด์ธ Fift Assembler๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์„ฏ ๋ฒˆ์งธ ์–ด์…ˆ๋ธ”๋Ÿฌ โ€” TVM์šฉ ๋ฐ”์ด๋„ˆ๋ฆฌ ์‹คํ–‰ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์„ฏ ๋ฒˆ์งธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๋‹ค์„ฏ ๋ฒˆ์งธ ์–ด์…ˆ๋ธ”๋Ÿฌ์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ eDSL(์ž„๋ฒ ๋””๋“œ ๋„๋ฉ”์ธ ํŠน์ • ์–ธ์–ด).

์šฐ๋ฆฌ์˜ ๊ฒฝ์Ÿ์€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค

๋งˆ์ง€๋ง‰์œผ๋กœ, ์šฐ๋ฆฌ์˜ ๋…ธ๋ ฅ์˜ ๊ฒฐ๊ณผ๋ฅผ ์‚ดํŽด๋ณผ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ๊ฒฐ์ œ ์ฑ„๋„

๊ฒฐ์ œ ์ฑ„๋„์€ ๋‘ ๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋ธ”๋ก์ฒด์ธ ์™ธ๋ถ€๋กœ ๊ฒฐ์ œ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์Šค๋งˆํŠธ ๊ณ„์•ฝ์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋น„์šฉ(์ˆ˜์ˆ˜๋ฃŒ ์—†์Œ)๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‹œ๊ฐ„(๋‹ค์Œ ๋ธ”๋ก์ด ์ฒ˜๋ฆฌ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†์Œ)๋„ ์ ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค. ์ง€๋ถˆ ๊ธˆ์•ก์€ ์›ํ•˜๋Š” ๋งŒํผ ์†Œ์•ก์œผ๋กœ, ํ•„์š”ํ•œ ๋งŒํผ ์ž์ฃผ ์ง€๋ถˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ตœ์ข… ์ •์‚ฐ์˜ ๊ณต์ •์„ฑ์€ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ์— ์˜ํ•ด ๋ณด์žฅ๋˜๋ฏ€๋กœ ๋‹น์‚ฌ์ž๋“ค์€ ์„œ๋กœ๋ฅผ ์‹ ๋ขฐํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

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

์‚ฌ์‹ค ์ด ์•„์ด๋””์–ด๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์ˆซ์ž ํ•˜๋‚˜๋ฉด ์ถฉ๋ถ„ํ•˜์ง€๋งŒ, ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ข€ ๋” ํŽธ๋ฆฌํ•œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ์ˆซ์ž๋ฅผ ๋ชจ๋‘ ๋‚จ๊ฒจ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ ๋ฉ”์‹œ์ง€์— ๊ฒฐ์ œ ๊ธˆ์•ก์„ ํฌํ•จํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์—†์œผ๋ฉด ์–ด๋–ค ์ด์œ ๋กœ ๋ฉ”์‹œ์ง€๊ฐ€ ์†์‹ค๋˜๋ฉด ๋ชจ๋“  ๊ธˆ์•ก๊ณผ ์ตœ์ข… ๊ณ„์‚ฐ์ด ์ •ํ™•ํ•˜๋”๋ผ๋„ ์‚ฌ์šฉ์ž๋Š” ์†์‹ค์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ์•„์ด๋””์–ด๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ„๊ฒฐํ•œ ๊ฒฐ์ œ ์ฑ„๋„ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๋†€๋ž๊ฒŒ๋„ ์šฐ๋ฆฌ๋Š” ๋‹จ ๋‘ ๊ฐ€์ง€๋งŒ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ธฐ์ˆ  ๋‹จ๋ฐฉํ–ฅ ์ฑ„๋„์˜ ๊ฒฝ์šฐ์—๋งŒ ์œ ์‚ฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
  2. ์ง€๋„ ์‹œ๊ฐ„, ์ด๋Š” ์šฐ๋ฆฌ์™€ ๋™์ผํ•œ ์•„์ด๋””์–ด๋ฅผ ์„ค๋ช…ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ์ •ํ™•์„ฑ ๋ฐ ์ถฉ๋Œ ํ•ด๊ฒฐ ์ ˆ์ฐจ์™€ ๊ฐ™์€ ๋งŽ์€ ์ค‘์š”ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์„ค๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ”„๋กœํ† ์ฝœ์˜ ์ •ํ™•์„ฑ์— ํŠน๋ณ„ํ•œ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด๋ฉด์„œ ํ”„๋กœํ† ์ฝœ์„ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ๋ฐ˜๋ณต ๋์— ์‚ฌ์–‘์ด ์ค€๋น„๋˜์—ˆ์œผ๋ฉฐ ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„๋„ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋…€๋ฅผ ๋ด.

์šฐ๋ฆฌ๋Š” FunC์—์„œ ๊ณ„์•ฝ์„ ๊ตฌํ˜„ํ–ˆ์œผ๋ฉฐ, ์ฃผ์ตœ์ž์˜ ๊ถŒ์žฅ์— ๋”ฐ๋ผ ๊ณ„์•ฝ๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ช…๋ น์ค„ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ Fift์—์„œ ์™„์ „ํžˆ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. CLI์— ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ์„ ํƒํ•  ์ˆ˜๋„ ์žˆ์—ˆ์ง€๋งŒ Fit์ด ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ ๋งํ•ด์„œ, Fift์™€ ์ž‘์—…ํ•œ ํ›„์— ์šฐ๋ฆฌ๋Š” ๊ฐœ๋ฐœ๋œ ๋„๊ตฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ํ™œ๋ฐœํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ์–ธ์–ด๋ณด๋‹ค ์ด ์–ธ์–ด๋ฅผ ์„ ํ˜ธํ•  ๋งŒํ•œ ์„ค๋“๋ ฅ ์žˆ๋Š” ์ด์œ ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์Šคํƒ ๊ธฐ๋ฐ˜ ์–ธ์–ด๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋Š” ๊ฒƒ์€ ์Šคํƒ์— ์žˆ๋Š” ๋‚ด์šฉ์„ ๊ณ„์† ๋จธ๋ฆฟ์†์— ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด์— ๋Œ€ํ•ด ๋„์›€์„ ์ฃผ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๋ถˆ์พŒํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ ์˜๊ฒฌ์œผ๋กœ๋Š” Fift์˜ ์กด์žฌ์— ๋Œ€ํ•œ ์œ ์ผํ•œ ์ •๋‹น์„ฑ์€ Fift Assembler์˜ ํ˜ธ์ŠคํŠธ ์–ธ์–ด๋กœ์„œ์˜ ์—ญํ• ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณธ์งˆ์ ์œผ๋กœ ์œ ์ผํ•œ ๋ชฉ์ ์„ ์œ„ํ•ด ์ƒˆ๋กœ์šด ์–ธ์–ด๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค TVM ์–ด์…ˆ๋ธ”๋Ÿฌ๋ฅผ ๊ธฐ์กด ์–ธ์–ด์— ๋‚ด์žฅํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ์ง€ ์•Š์„๊นŒ์š”?

TVM ํ•˜์Šค์ผˆ eDSL

์ด์ œ ๋‘ ๋ฒˆ์งธ ์Šค๋งˆํŠธ ๊ณ„์•ฝ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋‹ค์ค‘ ์„œ๋ช… ์ง€๊ฐ‘์„ ๊ฐœ๋ฐœํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์ง€๋งŒ FunC์—์„œ ๋˜ ๋‹ค๋ฅธ ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ์ง€๋ฃจํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์•ฝ๊ฐ„์˜ ํ’๋ฏธ๋ฅผ ๋”ํ•˜๊ณ  ์‹ถ์—ˆ๊ณ  ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ๋งŒ์˜ TVM์šฉ ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด์˜€์Šต๋‹ˆ๋‹ค.

Fift Assembler์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ƒˆ๋กœ์šด ์–ธ์–ด๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์žˆ์ง€๋งŒ Fift ๋Œ€์‹  Haskell์„ ํ˜ธ์ŠคํŠธ๋กœ ์„ ํƒํ•˜์—ฌ ๊ณ ๊ธ‰ ์œ ํ˜• ์‹œ์Šคํ…œ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ž‘์€ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋น„์šฉ์ด ๋งค์šฐ ๋†’์„ ์ˆ˜ ์žˆ๋Š” ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ์‚ฌ์šฉํ•  ๋•Œ ์ •์  ํƒ€์ดํ•‘์ด ํฐ ์ด์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Haskell์— ๋‚ด์žฅ๋œ TVM ์–ด์…ˆ๋ธ”๋Ÿฌ๊ฐ€ ์–ด๋–ค ๋ชจ์Šต์ธ์ง€ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ํ‘œ์ค€ ์ง€๊ฐ‘์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์˜ํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ด ๊ณ„์•ฝ์€ ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์œผ๋กœ ๊ตฌ์„ฑ๋˜์ง€๋งŒ ์›ํ•˜๋Š” ๋งŒํผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ ์–ธ์–ด(์˜ˆ: Haskell)๋กœ ์ƒˆ ๊ธฐ๋Šฅ์„ ์ •์˜ํ•  ๋•Œ eDSL์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ๊ธฐ๋Šฅ์ด TVM์—์„œ ๋ณ„๋„์˜ ๋ฃจํ‹ด์ด ๋˜๋„๋ก ํ• ์ง€ ์•„๋‹ˆ๋ฉด ํ˜ธ์ถœ ์‹œ์ ์— ๋‹จ์ˆœํžˆ ์ธ๋ผ์ธ์œผ๋กœ ์‚ฝ์ž…ํ• ์ง€ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Haskell๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•จ์ˆ˜์—๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ™•์ธ๋˜๋Š” ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. eDSL์—์„œ ํ•จ์ˆ˜์˜ ์ž…๋ ฅ ์œ ํ˜•์€ ํ•จ์ˆ˜๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ์Šคํƒ ์œ ํ˜•์ด๊ณ , ๊ฒฐ๊ณผ ์œ ํ˜•์€ ํ˜ธ์ถœ ํ›„์— ์ƒ์„ฑ๋  ์Šคํƒ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ์— ์ฃผ์„์ด ์žˆ์Šต๋‹ˆ๋‹ค stacktype, ์ฝœ ํฌ์ธํŠธ์—์„œ ์˜ˆ์ƒ๋˜๋Š” ์Šคํƒ ์œ ํ˜•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์›๋ž˜ ์ง€๊ฐ‘ ๊ณ„์•ฝ์—์„œ๋Š” ์ฃผ์„์— ๋ถˆ๊ณผํ–ˆ์ง€๋งŒ eDSL์—์„œ๋Š” ์‹ค์ œ๋กœ ์ฝ”๋“œ์˜ ์ผ๋ถ€์ด๋ฉฐ ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ™•์ธ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ณ  ์Šคํƒ ์œ ํ˜•์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฌธ์ œ๋ฅผ ์ฐพ๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋ฌธ์„œ ๋˜๋Š” ์„ค๋ช… ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๋Ÿฌํ•œ ์ฃผ์„์€ TVM ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์•„์ง XNUMX์ฃผ ๋งŒ์— ์ž‘์„ฑ๋œ ํ”„๋กœํ† ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— ์•„์ง ํ”„๋กœ์ ํŠธ์—์„œ ํ•ด์•ผ ํ•  ์ผ์ด ๋งŽ์ด ๋‚จ์•„์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜ ์ฝ”๋“œ์— ํ‘œ์‹œ๋˜๋Š” ํด๋ž˜์Šค์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋Š” ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

eDSL์—์„œ ๋‹ค์ค‘์„œ๋ช… ์ง€๊ฐ‘ ๊ตฌํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

main :: IO ()
main = putText $ pretty $ declProgram procedures methods
  where
    procedures =
      [ ("recv_external", decl recvExternal)
      , ("recv_internal", decl recvInternal)
      ]
    methods =
      [ ("seqno", declMethod getSeqno)
      ]

data Storage = Storage
  { sCnt :: Word32
  , sPubKey :: PublicKey
  }

instance DecodeSlice Storage where
  type DecodeSliceFields Storage = [PublicKey, Word32]
  decodeFromSliceImpl = do
    decodeFromSliceImpl @Word32
    decodeFromSliceImpl @PublicKey

instance EncodeBuilder Storage where
  encodeToBuilder = do
    encodeToBuilder @Word32
    encodeToBuilder @PublicKey

data WalletError
  = SeqNoMismatch
  | SignatureMismatch
  deriving (Eq, Ord, Show, Generic)

instance Exception WalletError

instance Enum WalletError where
  toEnum 33 = SeqNoMismatch
  toEnum 34 = SignatureMismatch
  toEnum _ = error "Uknown MultiSigError id"

  fromEnum SeqNoMismatch = 33
  fromEnum SignatureMismatch = 34

recvInternal :: '[Slice] :-> '[]
recvInternal = drop

recvExternal :: '[Slice] :-> '[]
recvExternal = do
  decodeFromSlice @Signature
  dup
  preloadFromSlice @Word32
  stacktype @[Word32, Slice, Signature]
  -- cnt cs sign

  pushRoot
  decodeFromCell @Storage
  stacktype @[PublicKey, Word32, Word32, Slice, Signature]
  -- pk cnt' cnt cs sign

  xcpu @1 @2
  stacktype @[Word32, Word32, PublicKey, Word32, Slice, Signature]
  -- cnt cnt' pk cnt cs sign

  equalInt >> throwIfNot SeqNoMismatch

  push @2
  sliceHash
  stacktype @[Hash Slice, PublicKey, Word32, Slice, Signature]
  -- hash pk cnt cs sign

  xc2pu @0 @4 @4
  stacktype @[PublicKey, Signature, Hash Slice, Word32, Slice, PublicKey]
  -- pubk sign hash cnt cs pubk

  chkSignU
  stacktype @[Bool, Word32, Slice, PublicKey]
  -- ? cnt cs pubk

  throwIfNot SignatureMismatch
  accept

  swap
  decodeFromSlice @Word32
  nip

  dup
  srefs @Word8

  pushInt 0
  if IsEq
  then ignore
  else do
    decodeFromSlice @Word8
    decodeFromSlice @(Cell MessageObject)
    stacktype @[Slice, Cell MessageObject, Word8, Word32, PublicKey]
    xchg @2
    sendRawMsg
    stacktype @[Slice, Word32, PublicKey]

  endS
  inc

  encodeToCell @Storage
  popRoot

getSeqno :: '[] :-> '[Word32]
getSeqno = do
  pushRoot
  cToS
  preloadFromSlice @Word32

eDSL ๋ฐ ๋‹ค์ค‘ ์„œ๋ช… ์ง€๊ฐ‘ ๊ณ„์•ฝ์˜ ์ „์ฒด ์†Œ์Šค ์ฝ”๋“œ๋Š” ๋‹ค์Œ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ €์žฅ์†Œ. ๊ธฐํƒ€ ์ž์„ธํžˆ ๋งํ–ˆ๋‹ค ๋‚ด์žฅ ์–ธ์–ด์— ๋Œ€ํ•ด ์šฐ๋ฆฌ ๋™๋ฃŒ Georgy Agapov๊ฐ€ ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

๋Œ€ํšŒ์™€ TON์— ๋Œ€ํ•œ ๊ฒฐ๋ก 

์šฐ๋ฆฌ ์ž‘์—…์—๋Š” ์ด 380์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค(๋ฌธ์„œ ์ˆ™์ง€, ํšŒ์˜ ๋ฐ ์‹ค์ œ ๊ฐœ๋ฐœ ํฌํ•จ). ๊ฒฝ์Ÿ ํ”„๋กœ์ ํŠธ์—๋Š” CTO, ํŒ€ ๋ฆฌ๋”, ๋ธ”๋ก์ฒด์ธ ํ”Œ๋žซํผ ์ „๋ฌธ๊ฐ€, Haskell ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์ž ๋“ฑ XNUMX๋ช…์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฐธ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

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

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

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

์ถœ์ฒ˜ : habr.com

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