ื”ืคื™ื›ืช FunC ืœ- FunCtional ืขื Haskell: ืื™ืš ื–ื›ื” ืกืจื•ืงืœ ื‘ืชื—ืจื•ืช ื”ื‘ืœื•ืงืฆ'ื™ื™ืŸ ืฉืœ ื˜ืœื’ืจื

ื‘ื˜ื— ืฉืžืขืชื ืืช ื”ื˜ืœื’ืจื ื”ื–ื” ืขื•ืžื“ืช ืœื”ืฉื™ืง ืืช ืคืœื˜ืคื•ืจืžืช ื”ื‘ืœื•ืงืฆ'ื™ื™ืŸ Ton. ืื‘ืœ ืื•ืœื™ ืคืกืคืกืช ืืช ื”ื—ื“ืฉื•ืช ืฉืœื ืžื–ืžืŸ ื˜ืœื’ืจื ื”ื›ืจื™ื–ื” ืขืœ ืชื—ืจื•ืช ืœื™ื™ืฉื•ื ื—ื•ื–ื” ื—ื›ื ืื—ื“ ืื• ื™ื•ืชืจ ืขื‘ื•ืจ ืคืœื˜ืคื•ืจืžื” ื–ื•.

ืฆื•ื•ืช Serokel, ื‘ืขืœ ื ื™ืกื™ื•ืŸ ืจื‘ ื‘ืคื™ืชื•ื— ืคืจื•ื™ืงื˜ื™ ื‘ืœื•ืงืฆ'ื™ื™ืŸ ื’ื“ื•ืœื™ื, ืœื ื™ื›ื•ืœ ื”ื™ื” ืœืขืžื•ื“ ืžื ื’ื“. ื”ืืฆืœื ื• ื—ืžื™ืฉื” ืขื•ื‘ื“ื™ื ืœืชื—ืจื•ืช, ื•ื›ืขื‘ื•ืจ ืฉื‘ื•ืขื™ื™ื ื”ื ื–ื›ื• ื‘ืžืงื•ื ื”ืจืืฉื•ืŸ ื‘ื” ื‘ื›ื™ื ื•ื™ ื”ืืงืจืื™ (ื”ืœื) ื”ืฆื ื•ืข (Sexy Chameleon). ื‘ืžืืžืจ ื–ื” ืื“ื‘ืจ ืขืœ ืื™ืš ื”ื ืขืฉื• ืืช ื–ื”. ืื ื• ืžืงื•ื•ื™ื ืฉื‘ืขืฉืจ ื”ื“ืงื•ืช ื”ืงืจื•ื‘ื•ืช ืœืคื—ื•ืช ืชืงืจืื• ืกื™ืคื•ืจ ืžืขื ื™ื™ืŸ, ื•ืœื›ืœ ื”ื™ื•ืชืจ ืชืžืฆืื• ื‘ื• ืžืฉื”ื• ืฉื™ืžื•ืฉื™ ืฉืชื•ื›ืœื• ืœื™ื™ืฉื ื‘ืขื‘ื•ื“ืชื›ื.

ืื‘ืœ ื ืชื—ื™ืœ ืขื ืงืฆืช ื”ืงืฉืจ.

ืชื—ืจื•ืช ื•ืชื ืื™ื”

ืื–, ื”ืžืฉื™ืžื•ืช ื”ืขื™ืงืจื™ื•ืช ืฉืœ ื”ืžืฉืชืชืคื™ื ื”ื™ื• ื™ื™ืฉื•ื ืฉืœ ืื—ื“ ืื• ื™ื•ืชืจ ืžื”ื—ื•ื–ื™ื ื”ื—ื›ืžื™ื ื”ืžื•ืฆืขื™ื, ื›ืžื• ื’ื ื”ืฆืขืช ื”ืฆืขื•ืช ืœืฉื™ืคื•ืจ ื”ืžืขืจื›ืช ื”ืืงื•ืœื•ื’ื™ืช ืฉืœ TON. ื”ืชื—ืจื•ืช ื”ืชืงื™ื™ืžื” ื‘ื™ืŸ ื”-24 ื‘ืกืคื˜ืžื‘ืจ ืœ-15 ื‘ืื•ืงื˜ื•ื‘ืจ, ื•ื”ืชื•ืฆืื•ืช ืคื•ืจืกืžื• ืจืง ื‘-15 ื‘ื ื•ื‘ืžื‘ืจ. ื“ื™ ื”ืจื‘ื” ื–ืžืŸ, ื‘ื”ืชื—ืฉื‘ ื‘ื›ืš ืฉื‘ื–ืžืŸ ื–ื” ื”ืฆืœื™ื—ื” ื˜ืœื’ืจื ืœืงื™ื™ื ื•ืœื”ื›ืจื™ื– ืขืœ ืชื•ืฆืื•ืช ืชื—ืจื•ื™ื•ืช ืขืœ ืขื™ืฆื•ื‘ ื•ืคื™ืชื•ื— ืืคืœื™ืงืฆื™ื•ืช ื‘-C++ ืœื‘ื“ื™ืงื” ื•ื”ืขืจื›ืช ืื™ื›ื•ืช ืฉื™ื—ื•ืช ื”-VoIP ื‘ื˜ืœื’ืจื.

ื‘ื—ืจื ื• ืฉื ื™ ื—ื•ื–ื™ื ื—ื›ืžื™ื ืžื”ืจืฉื™ืžื” ืฉื”ืฆื™ืขื• ื”ืžืืจื’ื ื™ื. ืขื‘ื•ืจ ืื—ื“ ืžื”ื, ื”ืฉืชืžืฉื ื• ื‘ื›ืœื™ื ื”ืžื•ืคืฆื™ื ืขื TON, ื•ื”ืฉื ื™ ื™ื•ืฉื ื‘ืฉืคื” ื—ื“ืฉื” ืฉืคื•ืชื—ื” ืขืœ ื™ื“ื™ ื”ืžื”ื ื“ืกื™ื ืฉืœื ื• ื‘ืžื™ื•ื—ื“ ืขื‘ื•ืจ TON ื•ืžื•ื‘ื ื™ืช ื‘ืชื•ืš Haskell.

ื”ื‘ื—ื™ืจื” ื‘ืฉืคืช ืชื›ื ื•ืช ืคื•ื ืงืฆื™ื•ื ืœื™ืช ืื™ื ื” ืžืงืจื™ืช. ื‘ืฉืœื ื• ื‘ืœื•ื’ ืชืื’ื™ื“ื™ ืœืขืชื™ื ืงืจื•ื‘ื•ืช ืื ื• ืžื“ื‘ืจื™ื ืขืœ ืžื“ื•ืข ืื ื• ื—ื•ืฉื‘ื™ื ืฉื”ืžื•ืจื›ื‘ื•ืช ืฉืœ ืฉืคื•ืช ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ื”ื™ื ื”ื’ื–ืžื” ืขืฆื•ืžื” ื•ืžื“ื•ืข ืื ื• ืžืขื“ื™ืคื™ื ืื•ืชืŸ ื‘ื“ืจืš ื›ืœืœ ืขืœ ืคื ื™ ืฉืคื•ืช ืžื•ื ื—ื” ืขืฆืžื™ื. ืื’ื‘, ื–ื” ื’ื ืžื›ื™ืœ ื”ืžืงื•ืจื™ ืฉืœ ืžืืžืจ ื–ื”.

ืœืžื” ื‘ื›ืœืœ ื”ื—ืœื˜ื ื• ืœื”ืฉืชืชืฃ?

ื‘ืงื™ืฆื•ืจ, ื›ื™ ื”ื”ืชืžื—ื•ืช ืฉืœื ื• ื”ื™ื ืคืจื•ื™ืงื˜ื™ื ืœื ืกื˜ื ื“ืจื˜ื™ื™ื ื•ืžื•ืจื›ื‘ื™ื ืฉื“ื•ืจืฉื™ื ื›ื™ืฉื•ืจื™ื ืžื™ื•ื—ื“ื™ื ื•ืœืจื•ื‘ ื”ื ื‘ืขืœื™ ืขืจืš ืžื“ืขื™ ืœืงื”ื™ืœืช ื”-IT. ืื ื• ืชื•ืžื›ื™ื ืžืื•ื“ ื‘ืคื™ืชื•ื— ืงื•ื“ ืคืชื•ื— ื•ืขื•ืกืงื™ื ื‘ืคื•ืคื•ืœืจื™ื•ืช ืฉืœื•, ื•ื’ื ืžืฉืชืคื™ื ืคืขื•ืœื” ืขื ืื•ื ื™ื‘ืจืกื™ื˜ืื•ืช ืจื•ืกื™ื•ืช ืžื•ื‘ื™ืœื•ืช ื‘ืชื—ื•ื ืžื“ืขื™ ื”ืžื—ืฉื‘ ื•ื”ืžืชืžื˜ื™ืงื”.

ื”ืžืฉื™ืžื•ืช ื”ืžืขื ื™ื™ื ื•ืช ืฉืœ ื”ืชื—ืจื•ืช ื•ื”ืžืขื•ืจื‘ื•ืช ื‘ืคืจื•ื™ืงื˜ ื”ื˜ืœื’ืจื ื”ืื”ื•ื‘ ืฉืœื ื• ื”ื™ื• ื›ืฉืœืขืฆืžืŸ ืžื•ื˜ื™ื‘ืฆื™ื” ืžืฆื•ื™ื ืช, ืื‘ืœ ืงืจืŸ ื”ืคืจืกื™ื ื”ืคื›ื” ืœืชืžืจื™ืฅ ื ื•ืกืฃ. ๐Ÿ™‚

ืžื—ืงืจ ื‘ืœื•ืงืฆ'ื™ื™ืŸ ืฉืœ TON

ืื ื• ืขื•ืงื‘ื™ื ืžืงืจื•ื‘ ืื—ืจ ื”ืชืคืชื—ื•ื™ื•ืช ื—ื“ืฉื•ืช ื‘ื‘ืœื•ืงืฆ'ื™ื™ืŸ, ื‘ื™ื ื” ืžืœืื›ื•ืชื™ืช ื•ืœืžื™ื“ืช ืžื›ื•ื ื” ื•ืžืฉืชื“ืœื™ื ืœื ืœืคืกืคืก ืืฃ ืžื”ื“ื•ืจื” ืžืฉืžืขื•ืชื™ืช ื‘ื›ืœ ืื—ื“ ืžื”ืชื—ื•ืžื™ื ื‘ื”ื ืื ื• ืขื•ื‘ื“ื™ื. ืœื›ืŸ, ื›ืฉื”ืชื—ืจื•ืช ื”ืชื—ื™ืœื”, ื”ืฆื•ื•ืช ืฉืœื ื• ื›ื‘ืจ ื”ื›ื™ืจ ืจืขื™ื•ื ื•ืช ืž ื ื™ื™ืจ ืœื‘ืŸ ื˜ื•ืŸ. ืขื ื–ืืช, ืœืคื ื™ ื”ืชื—ืœืช ื”ืขื‘ื•ื“ื” ืขื TON, ืœื ื ื™ืชื—ื ื• ืืช ื”ืชื™ืขื•ื“ ื”ื˜ื›ื ื™ ื•ืืช ืงื•ื“ ื”ืžืงื•ืจ ื‘ืคื•ืขืœ ืฉืœ ื”ืคืœื˜ืคื•ืจืžื”, ื›ืš ืฉื”ืฉืœื‘ ื”ืจืืฉื•ืŸ ื”ื™ื” ื“ื™ ื‘ืจื•ืจ - ืžื—ืงืจ ื™ืกื•ื“ื™ ืฉืœ ื”ืชื™ืขื•ื“ ื”ืจืฉืžื™ ืขืœ ืžืงื•ื•ืŸ ื• - ืžืื’ืจื™ ืคืจื•ื™ืงื˜ื™ื.

ืขื“ ืชื—ื™ืœืช ื”ืชื—ืจื•ืช, ื”ืงื•ื“ ื›ื‘ืจ ืคื•ืจืกื, ืื– ื›ื“ื™ ืœื—ืกื•ืš ื–ืžืŸ, ื”ื—ืœื˜ื ื• ืœื—ืคืฉ ืžื“ืจื™ืš ืื• ืชืงืฆื™ืจ ืฉื ื›ืชื‘ ืขืœ ื™ื“ื™ ืžืฉืชืžืฉื™ื. ืœืžืจื‘ื” ื”ืฆืขืจ, ื–ื” ืœื ื ืชืŸ ืชื•ืฆืื•ืช - ืžืœื‘ื“ ื”ื ื—ื™ื•ืช ืœื”ืจื›ื‘ืช ื”ืคืœื˜ืคื•ืจืžื” ื‘ืื•ื‘ื•ื ื˜ื•, ืœื ืžืฆืื ื• ื—ื•ืžืจื™ื ื ื•ืกืคื™ื.

ื”ืชื™ืขื•ื“ ืขืฆืžื• ื ื—ืงืจ ื”ื™ื˜ื‘, ืืš ื”ื™ื” ืงืฉื” ืœืงืจื™ืื” ื‘ืื–ื•ืจื™ื ืžืกื•ื™ืžื™ื. ืœืขืชื™ื ืงืจื•ื‘ื•ืช ื”ื™ื™ื ื• ืฆืจื™ื›ื™ื ืœื—ื–ื•ืจ ืœื ืงื•ื“ื•ืช ืžืกื•ื™ืžื•ืช ื•ืœืขื‘ื•ืจ ืžืชื™ืื•ืจื™ื ื‘ืจืžื” ื’ื‘ื•ื”ื” ืฉืœ ืจืขื™ื•ื ื•ืช ืžื•ืคืฉื˜ื™ื ืœืคืจื˜ื™ ื™ื™ืฉื•ื ื‘ืจืžื” ื ืžื•ื›ื”.

ื™ื”ื™ื” ืงืœ ื™ื•ืชืจ ืื ื”ืžืคืจื˜ ืœื ื™ื›ืœื•ืœ ืชื™ืื•ืจ ืžืคื•ืจื˜ ืฉืœ ื”ื™ื™ืฉื•ื ื›ืœืœ. ืžื™ื“ืข ืขืœ ื”ืื•ืคืŸ ืฉื‘ื• ืžื›ื•ื ื” ื•ื™ืจื˜ื•ืืœื™ืช ืžื™ื™ืฆื’ืช ืืช ื”ืขืจื™ืžื” ืฉืœื” ืกื‘ื™ืจ ื™ื•ืชืจ ืœื”ืกื™ื— ืืช ื“ืขืชื ืฉืœ ืžืคืชื—ื™ื ืฉื™ื•ืฆืจื™ื ื—ื•ื–ื™ื ื—ื›ืžื™ื ืขื‘ื•ืจ ืคืœื˜ืคื•ืจืžืช TON ืžืืฉืจ ืœืขื–ื•ืจ ืœื”ื.

ื ื™ืงืก: ืœื”ืจื›ื™ื‘ ืืช ื”ืคืจื•ื™ืงื˜

ื‘ืกืจื•ืงืœ ืื ื—ื ื• ืžืขืจื™ืฆื™ื ื’ื“ื•ืœื™ื ื ื™ืงืก. ืื ื—ื ื• ืื•ืกืคื™ื ืืช ื”ืคืจื•ื™ืงื˜ื™ื ืฉืœื ื• ืขื ื–ื” ื•ืคื•ืจืกื™ื ืื•ืชื ื‘ืืžืฆืขื•ืช NixOps, ื•ืžื•ืชืงืŸ ื‘ื›ืœ ื”ืฉืจืชื™ื ืฉืœื ื• ืžืขืจื›ืช ื”ื”ืคืขืœื” Nix. ื”ื•ื“ื•ืช ืœื›ืš, ื›ืœ ื”-builds ืฉืœื ื• ื ื™ืชื ื™ื ืœืฉื—ื–ื•ืจ ื•ืขื•ื‘ื“ื™ื ืขืœ ื›ืœ ืžืขืจื›ืช ื”ืคืขืœื” ืขืœื™ื” ื ื™ืชืŸ ืœื”ืชืงื™ืŸ ืืช Nix.

ืื– ื”ืชื—ืœื ื• ื‘ื™ืฆื™ืจื” ืฉื›ื‘ืช Nix ืขื ื”ื‘ืขื” ืœื”ืจื›ื‘ืช TON. ื‘ืขื–ืจืชื•, ืงื•ืžืคื™ืœืฆื™ื” ืฉืœ TON ื”ื™ื ืคืฉื•ื˜ื” ื›ื›ืœ ื”ืืคืฉืจ:

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

ืฉื™ื ืœื‘ ืฉืื™ื ืš ืฆืจื™ืš ืœื”ืชืงื™ืŸ ืชืœื•ืช ื›ืœืฉื”ื™. Nix ื™ืขืฉื” ื”ื›ืœ ื‘ืฉื‘ื™ืœืš ื‘ืื•ืคืŸ ืงืกื•ื, ื‘ื™ืŸ ืื ืืชื” ืžืฉืชืžืฉ ื‘-NixOS, ืื•ื‘ื•ื ื˜ื• ืื• macOS.

ืชื›ื ื•ืช ืขื‘ื•ืจ TON

ืงื•ื“ ื”ื—ื•ื–ื” ื”ื—ื›ื ื‘ืจืฉืช TON ืคื•ืขืœ ืขืœ ื”-TON Virtual Machine (TVM). TVM ืžื•ืจื›ื‘ืช ื™ื•ืชืจ ืžืจื•ื‘ ื”ืžื›ื•ื ื•ืช ื”ื•ื•ื™ืจื˜ื•ืืœื™ื•ืช ื”ืื—ืจื•ืช, ื•ื™ืฉ ืœื” ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ืžืื•ื“ ืžืขื ื™ื™ื ืช, ืœืžืฉืœ, ื”ื™ื ื™ื›ื•ืœื” ืœืขื‘ื•ื“ ืื™ืชื” ื”ืžืฉืš ะธ ืงื™ืฉื•ืจื™ื ืœื ืชื•ื ื™ื.

ื™ืชืจ ืขืœ ื›ืŸ, ื”ื—ื‘ืจ'ื” ืž-TON ื™ืฆืจื• ืฉืœื•ืฉ ืฉืคื•ืช ืชื›ื ื•ืช ื—ื“ืฉื•ืช:

ื—ืžืฉ ื”ื™ื ืฉืคืช ืชื›ื ื•ืช ืขืจื™ืžื” ืื•ื ื™ื‘ืจืกืœื™ืช ื”ื“ื•ืžื” ืœ ืจื‘ื™ืขื™ืช. ื™ื›ื•ืœืช ื”ืขืœ ืฉืœื• ื”ื™ื ื”ื™ื›ื•ืœืช ืœื™ืฆื•ืจ ืื™ื ื˜ืจืืงืฆื™ื” ืขื TVM.

FunC ื”ื™ื ืฉืคืช ืชื›ื ื•ืช ื—ื•ื–ื™ื ื—ื›ืžื” ื”ื“ื•ืžื” ืœ C ื•ื”ื•ื ืžื•ืจื›ื‘ ืœืฉืคื” ืื—ืจืช - Fift Assembler.

ืืกืžื‘ืœืจ ื—ืžื™ืฉื™ - ืกืคืจื™ื™ืช Fift ืœื”ืคืงืช ืงื•ื“ ื”ืคืขืœื” ื‘ื™ื ืืจื™ ืขื‘ื•ืจ TVM. ืœ-Fifth Assembler ืื™ืŸ ืžื”ื“ืจ. ื–ึถื” ืฉืคื” ืกืคืฆื™ืคื™ืช ืœืชื—ื•ื ืžืฉื•ื‘ืฅ (eDSL).

ื”ืชื—ืจื•ืช ืฉืœื ื• ืขื•ื‘ื“ืช

ืœื‘ืกื•ืฃ, ื”ื’ื™ืข ื”ื–ืžืŸ ืœื”ืกืชื›ืœ ืขืœ ืชื•ืฆืื•ืช ื”ืžืืžืฆื™ื ืฉืœื ื•.

ืขืจื•ืฅ ืชืฉืœื•ื ืืกื™ื ื›ืจื•ื ื™

ืขืจื•ืฅ ืชืฉืœื•ื ื”ื•ื ื—ื•ื–ื” ื—ื›ื ื”ืžืืคืฉืจ ืœืฉื ื™ ืžืฉืชืžืฉื™ื ืœืฉืœื•ื— ืชืฉืœื•ืžื™ื ืžื—ื•ืฅ ืœื‘ืœื•ืงืฆ'ื™ื™ืŸ. ื›ืชื•ืฆืื” ืžื›ืš, ืืชื” ื—ื•ืกืš ืœื ืจืง ื›ืกืฃ (ืื™ืŸ ืขืžืœื”), ืืœื ื’ื ื–ืžืŸ (ืื™ื ืš ืฆืจื™ืš ืœื—ื›ื•ืช ืœืขื™ื‘ื•ื“ ื”ื‘ืœื•ืง ื”ื‘ื). ื”ืชืฉืœื•ืžื™ื ื™ื›ื•ืœื™ื ืœื”ื™ื•ืช ืงื˜ื ื™ื ื›ื›ืœ ื”ืจืฆื•ื™ ื•ื‘ืชื“ื™ืจื•ืช ื”ื ื“ืจืฉืช. ื‘ืžืงืจื” ื–ื”, ื”ืฆื“ื“ื™ื ืื™ื ื ืฆืจื™ื›ื™ื ืœืกืžื•ืš ื–ื” ืขืœ ื–ื”, ืฉื›ืŸ ื”ื’ื™ื ื•ืช ื”ืคืฉืจื” ื”ืกื•ืคื™ ืžื•ื‘ื˜ื—ืช ื‘ื—ื•ื–ื” ื”ื—ื›ื.

ืžืฆืื ื• ืคืชืจื•ืŸ ืคืฉื•ื˜ ืœืžื“ื™ ืœื‘ืขื™ื”. ืฉื ื™ ืฆื“ื“ื™ื ื™ื›ื•ืœื™ื ืœื”ื—ืœื™ืฃ ื”ื•ื“ืขื•ืช ื—ืชื•ืžื•ืช, ืฉื›ืœ ืื—ืช ืžื”ืŸ ืžื›ื™ืœื” ืฉื ื™ ืžืกืคืจื™ื - ื”ืกื›ื•ื ื”ืžืœื ืฉืฉื•ืœื ืขืœ ื™ื“ื™ ื›ืœ ืฆื“. ืฉื ื™ ื”ืžืกืคืจื™ื ื”ืืœื” ืขื•ื‘ื“ื™ื ื›ืžื• ืฉืขื•ืŸ ื•ืงื˜ื•ืจ ื‘ืžืขืจื›ื•ืช ืžื‘ื•ื–ืจื•ืช ืžืกื•ืจืชื™ื•ืช ื•ืœื”ื’ื“ื™ืจ ืืช ืกื“ืจ ื”"ืงืจื” ืœืคื ื™" ื‘ืขืกืงืื•ืช. ื‘ืืžืฆืขื•ืช ื ืชื•ื ื™ื ืืœื”, ื”ื—ื•ื–ื” ื™ื•ื›ืœ ืœืคืชื•ืจ ื›ืœ ืขื™ืžื•ืช ืืคืฉืจื™.

ืœืžืขืฉื”, ืžืกืคืจ ืื—ื“ ืžืกืคื™ืง ื›ื“ื™ ืœื™ื™ืฉื ืืช ื”ืจืขื™ื•ืŸ ื”ื–ื”, ืื‘ืœ ืขื–ื‘ื ื• ืืช ืฉื ื™ื”ื ื›ื™ ื›ืš ื ื•ื›ืœ ืœื™ืฆื•ืจ ืžืžืฉืง ืžืฉืชืžืฉ ื ื•ื— ื™ื•ืชืจ. ื‘ื ื•ืกืฃ, ื”ื—ืœื˜ื ื• ืœื›ืœื•ืœ ืืช ืกื›ื•ื ื”ืชืฉืœื•ื ื‘ื›ืœ ื”ื•ื“ืขื”. ื‘ืœืขื“ื™ื•, ืื ื”ื”ื•ื“ืขื” ืื‘ื“ื” ืžืกื™ื‘ื” ื›ืœืฉื”ื™, ืื–ื™ ืœืžืจื•ืช ืฉื›ืœ ื”ืกื›ื•ืžื™ื ื•ื”ื—ื™ืฉื•ื‘ ื”ืกื•ืคื™ ื™ื”ื™ื• ื ื›ื•ื ื™ื, ื™ื™ืชื›ืŸ ืฉื”ืžืฉืชืžืฉ ืœื ื™ื‘ื—ื™ืŸ ื‘ืื•ื‘ื“ืŸ.

ื›ื“ื™ ืœื‘ื“ื•ืง ืืช ื”ืจืขื™ื•ืŸ ืฉืœื ื•, ื—ื™ืคืฉื ื• ื“ื•ื’ืžืื•ืช ืœืฉื™ืžื•ืฉ ื‘ืคืจื•ื˜ื•ืงื•ืœ ืขืจื•ืฅ ืชืฉืœื•ื ื›ื” ืคืฉื•ื˜ ื•ืชืžืฆื™ืชื™. ื‘ืื•ืคืŸ ืžืคืชื™ืข, ืžืฆืื ื• ืจืง ืฉื ื™ื™ื:

  1. ืชื™ืื•ืจ ื’ื™ืฉื” ื“ื•ืžื”, ืจืง ื‘ืžืงืจื” ืฉืœ ืขืจื•ืฅ ื—ื“-ื›ื™ื•ื•ื ื™.
  2. ื”ื“ืจื›ื”, ื”ืžืชืืจ ืืช ืื•ืชื• ืจืขื™ื•ืŸ ื›ืžื• ืฉืœื ื•, ืืš ืžื‘ืœื™ ืœื”ืกื‘ื™ืจ ืคืจื˜ื™ื ืจื‘ื™ื ื•ื—ืฉื•ื‘ื™ื, ื›ื’ื•ืŸ ืชืงื™ื ื•ืช ื›ืœืœื™ืช ื•ื ื”ืœื™ื ืœื™ื™ืฉื•ื‘ ืกื›ืกื•ื›ื™ื.

ื”ืชื‘ืจืจ ื›ื™ ื”ื’ื™ื•ื ื™ ืœืชืืจ ืืช ื”ืคืจื•ื˜ื•ืงื•ืœ ืฉืœื ื• ื‘ืคื™ืจื•ื˜, ืชื•ืš ืฉื™ืžืช ืœื‘ ืžื™ื•ื—ื“ืช ืœื ื›ื•ื ื•ืชื•. ืœืื—ืจ ืžืกืคืจ ืื™ื˜ืจืฆื™ื•ืช, ื”ืžืคืจื˜ ื”ื™ื” ืžื•ื›ืŸ, ื•ืขื›ืฉื™ื• ื’ื ืืชื” ื™ื›ื•ืœ. ืชืกืชื›ืœ ืขืœื™ื”.

ื”ื˜ืžืขื ื• ืืช ื”ื—ื•ื–ื” ื‘-FunC, ื•ื›ืชื‘ื ื• ืืช ื›ืœื™ ื”ืฉื™ืจื•ืช ืฉืœ ืฉื•ืจืช ื”ืคืงื•ื“ื” ืœืื™ื ื˜ืจืืงืฆื™ื” ืขื ื”ื—ื•ื–ื” ืฉืœื ื• ืœื—ืœื•ื˜ื™ืŸ ื‘-Fift, ื›ืคื™ ืฉื”ื•ืžืœืฅ ืขืœ ื™ื“ื™ ื”ืžืืจื’ื ื™ื. ื™ื›ื•ืœื ื• ืœื‘ื—ื•ืจ ื›ืœ ืฉืคื” ืื—ืจืช ืขื‘ื•ืจ ื”-CLI ืฉืœื ื•, ืื‘ืœ ื”ื™ื™ื ื• ืžืขื•ื ื™ื™ื ื™ื ืœื ืกื•ืช ืืช Fit ื›ื“ื™ ืœืจืื•ืช ืื™ืš ื”ื™ื ืžืชืคืงื“ืช ื‘ืคื•ืขืœ.

ืœืžืขืŸ ื”ืืžืช, ืœืื—ืจ ืฉืขื‘ื“ื ื• ืขื Fift, ืœื ืจืื™ื ื• ืกื™ื‘ื•ืช ืžืฉื›ื ืขื•ืช ืœื”ืขื“ื™ืฃ ืืช ื”ืฉืคื” ื”ื–ื• ืขืœ ืคื ื™ ืฉืคื•ืช ืคื•ืคื•ืœืจื™ื•ืช ื•ื‘ืฉื™ืžื•ืฉ ืคืขื™ืœ ืขื ื›ืœื™ื ื•ืกืคืจื™ื•ืช ืžืคื•ืชื—ื•ืช. ืชื›ื ื•ืช ื‘ืฉืคื” ืžื‘ื•ืกืกืช ืžื—ืกื ื™ืช ื”ื•ื ื“ื™ ืœื ื ืขื™ื, ืžื›ื™ื•ื•ืŸ ืฉืืชื” ืฆืจื™ืš ืœืฉืžื•ืจ ื›ืœ ื”ื–ืžืŸ ื‘ืจืืฉ ืืช ืžื” ืฉื™ืฉ ื‘ืขืจื™ืžื”, ื•ื”ืงื•ืžืคื™ื™ืœืจ ืœื ืขื•ื–ืจ ื‘ื–ื”.

ืœืคื™ื›ืš, ืœื“ืขืชื ื•, ื”ื”ืฆื“ืงื” ื”ื™ื—ื™ื“ื” ืœืงื™ื•ืžื” ืฉืœ ืคื™ืคื˜ ื”ื™ื ืชืคืงื™ื“ื” ื›ืฉืคื” ืžืืจื—ืช ืœ-Fift Assembler. ืื‘ืœ ื”ืื ืœื ืขื“ื™ืฃ ืœื”ื˜ืžื™ืข ืืช ื”-TVM assembler ื‘ืฉืคื” ืงื™ื™ืžืช ื›ืœืฉื”ื™, ื‘ืžืงื•ื ืœื”ืžืฆื™ื ืฉืคื” ื—ื“ืฉื” ืœืžื˜ืจื” ื”ื‘ืœืขื“ื™ืช ื”ื–ื•?

TVM Haskell eDSL

ืขื›ืฉื™ื• ื”ื’ื™ืข ื”ื–ืžืŸ ืœื“ื‘ืจ ืขืœ ื”ื—ื•ื–ื” ื”ื—ื›ื ื”ืฉื ื™ ืฉืœื ื•. ื”ื—ืœื˜ื ื• ืœืคืชื— ืืจื ืง ืžืจื•ื‘ื” ื—ืชื™ืžื•ืช, ืื‘ืœ ื›ืชื™ื‘ืช ื—ื•ื–ื” ื—ื›ื ื ื•ืกืฃ ื‘-FunC ืชื”ื™ื” ืžืฉืขืžืžืช ืžื“ื™. ืจืฆื™ื ื• ืœื”ื•ืกื™ืฃ ืงืฆืช ื˜ืขื, ื•ื–ื• ื”ื™ื™ืชื” ืฉืคืช ื”ื”ืจื›ื‘ื” ืฉืœื ื• ืขื‘ื•ืจ TVM.

ื‘ื“ื•ืžื” ืœ-Fift Assembler, ื”ืฉืคื” ื”ื—ื“ืฉื” ืฉืœื ื• ืžื•ื˜ืžืขืช, ืืš ื‘ื—ืจื ื• ื‘-Haskell ื›ืžืืจื— ื‘ืžืงื•ื ื‘-Fift, ืžื” ืฉืžืืคืฉืจ ืœื ื• ืœื ืฆืœ ืืช ืžืœื•ื ื”ื™ืชืจื•ื ื•ืช ืฉืœ ืžืขืจื›ืช ื”ืกื•ื’ ื”ืžืชืงื“ืžืช ืฉืœื”. ื›ืฉืขื•ื‘ื“ื™ื ืขื ื—ื•ื–ื™ื ื—ื›ืžื™ื, ืฉื‘ื”ื ื”ืขืœื•ืช ืฉืœ ืืคื™ืœื• ื˜ืขื•ืช ืงื˜ื ื” ื™ื›ื•ืœื” ืœื”ื™ื•ืช ื’ื‘ื•ื”ื” ืžืื•ื“, ื”ืงืœื“ื” ืกื˜ื˜ื™ืช, ืœื“ืขืชื ื•, ื”ื™ื ื™ืชืจื•ืŸ ื’ื“ื•ืœ.

ื›ื“ื™ ืœื”ื“ื’ื™ื ืื™ืš ื ืจืื” TVM assembler ืžื•ื˜ื‘ืข ื‘- Haskell, ื”ื˜ืžืขื ื• ืขืœื™ื• ืืจื ืง ืกื˜ื ื“ืจื˜ื™. ื”ื ื” ื›ืžื” ื“ื‘ืจื™ื ืฉื›ื“ืื™ ืœืฉื™ื ืœื‘ ืืœื™ื”ื:

  • ื—ื•ื–ื” ื–ื” ืžื•ืจื›ื‘ ืžืคื•ื ืงืฆื™ื” ืื—ืช, ืืš ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ื›ืžื” ืฉืชืจืฆื”. ื›ืืฉืจ ืืชื” ืžื’ื“ื™ืจ ืคื•ื ืงืฆื™ื” ื—ื“ืฉื” ื‘ืฉืคื” ื”ืžืืจื—ืช (ื›ืœื•ืžืจ Haskell), ื”-eDSL ืฉืœื ื• ืžืืคืฉืจ ืœืš ืœื‘ื—ื•ืจ ืื ืืชื” ืจื•ืฆื” ืฉื”ื™ื ืชื”ืคื•ืš ืœืฉื’ืจื” ื ืคืจื“ืช ื‘-TVM ืื• ืคืฉื•ื˜ ืžื•ื˜ื‘ืขืช ื‘ื ืงื•ื“ืช ื”ืฉื™ื—ื”.
  • ื›ืžื• Haskell, ืœืคื•ื ืงืฆื™ื•ืช ื™ืฉ ืกื•ื’ื™ื ืฉื ื‘ื“ืงื™ื ื‘ื–ืžืŸ ื”ื”ื™ื“ื•ืจ. ื‘-eDSL ืฉืœื ื•, ืกื•ื’ ื”ืงืœื˜ ืฉืœ ืคื•ื ืงืฆื™ื” ื”ื•ื ืกื•ื’ ื”ืžื—ืกื ื™ืช ืฉื”ืคื•ื ืงืฆื™ื” ืžืฆืคื” ืœื”, ื•ืกื•ื’ ื”ืชื•ืฆืื” ื”ื•ื ืกื•ื’ ื”ืžื—ืกื ื™ืช ืฉืชื•ืคืง ืœืื—ืจ ื”ืงืจื™ืื”.
  • ืœืงื•ื“ ื™ืฉ ื”ืขืจื•ืช stacktype, ื”ืžืชืืจ ืืช ืกื•ื’ ื”ืžื—ืกื ื™ืช ื”ืฆืคื•ื™ ื‘ื ืงื•ื“ืช ื”ืงืจื™ืื”. ื‘ื—ื•ื–ื” ื”ืืจื ืง ื”ืžืงื•ืจื™ ืืœื• ื”ื™ื• ืจืง ื”ืขืจื•ืช, ืื‘ืœ ื‘-eDSL ืฉืœื ื• ื”ืŸ ืœืžืขืฉื” ื—ืœืง ืžื”ืงื•ื“ ื•ื ื‘ื“ืงื•ืช ื‘ื–ืžืŸ ื”ื”ื™ื“ื•ืจ. ื”ื ื™ื›ื•ืœื™ื ืœืฉืžืฉ ืชื™ืขื•ื“ ืื• ื”ืฆื”ืจื•ืช ืฉืขื•ื–ืจื™ื ืœืžืคืชื— ืœืžืฆื•ื ืืช ื”ื‘ืขื™ื” ืื ื”ืงื•ื“ ืžืฉืชื ื” ื•ืกื•ื’ ื”ืžื—ืกื ื™ืช ืžืฉืชื ื”. ื›ืžื•ื‘ืŸ, ื”ืขืจื•ืช ื›ืืœื” ืื™ื ืŸ ืžืฉืคื™ืขื•ืช ืขืœ ื‘ื™ืฆื•ืขื™ ื–ืžืŸ ื”ืจื™ืฆื”, ืžื›ื™ื•ื•ืŸ ืฉืœื ื ื•ืฆืจ ืขื‘ื•ืจืŸ ืงื•ื“ TVM.
  • ื–ื” ืขื“ื™ื™ืŸ ืื‘ ื˜ื™ืคื•ืก ืฉื ื›ืชื‘ ืชื•ืš ืฉื‘ื•ืขื™ื™ื, ืื– ื™ืฉ ืขื•ื“ ื”ืจื‘ื” ืขื‘ื•ื“ื” ืœืขืฉื•ืช ืขืœ ื”ืคืจื•ื™ืงื˜. ืœื“ื•ื’ืžื”, ื›ืœ ื”ืžื•ืคืขื™ื ืฉืœ ื”ืžื—ืœืงื•ืช ืฉืืชื” ืจื•ืื” ื‘ืงื•ื“ ืœืžื˜ื” ืฆืจื™ื›ื™ื ืœื”ื™ื•ื•ืฆืจ ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™.

ื›ืš ื ืจืื” ื”ื™ื™ืฉื•ื ืฉืœ ืืจื ืง multisig ื‘-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 ื•ื”ืืจื ืง ื”ืจื‘-ื—ืชื™ืžื•ืช ืฉืœื ื• ื‘ื›ืชื•ื‘ืช ื”ืžืื’ืจ ื”ื–ื”. ื•ืขื•ื“ ืžืกื•ืคืจ ื‘ืคื™ืจื•ื˜ ืขืœ ืฉืคื•ืช ืžื•ื‘ื ื•ืช, ืขืžื™ืชื ื• ื’ืื•ืจื’ื™ ืื’ืืคื•ื‘.

ืžืกืงื ื•ืช ืœื’ื‘ื™ ื”ืชื—ืจื•ืช ื•-TON

ื‘ืกืš ื”ื›ืœ, ื”ืขื‘ื•ื“ื” ืฉืœื ื• ืืจื›ื” 380 ืฉืขื•ืช (ื›ื•ืœืœ ื”ื™ื›ืจื•ืช ืขื ืชื™ืขื•ื“, ืคื’ื™ืฉื•ืช ื•ืคื™ืชื•ื— ื‘ืคื•ืขืœ). ื—ืžื™ืฉื” ืžืคืชื—ื™ื ืœืงื—ื• ื—ืœืง ื‘ืคืจื•ื™ืงื˜ ื”ืชื—ืจื•ืช: CTO, ืจืืฉ ืฆื•ื•ืช, ืžื•ืžื—ื™ ืคืœื˜ืคื•ืจืžืช ื‘ืœื•ืงืฆ'ื™ื™ืŸ ื•ืžืคืชื—ื™ ืชื•ื›ื ื” Haskell.

ืžืฆืื ื• ืžืฉืื‘ื™ื ืœื”ืฉืชืชืฃ ื‘ืชื—ืจื•ืช ืœืœื ืงื•ืฉื™, ืฉื›ืŸ ื”ืจื•ื— ืฉืœ ื”ืืงืชื•ืŸ, ืขื‘ื•ื“ืช ืฆื•ื•ืช ืฆืžื•ื“ื” ื•ื”ืฆื•ืจืš ืœืฉืงื•ืข ื‘ืžื”ื™ืจื•ืช ื‘ื”ื™ื‘ื˜ื™ื ืฉืœ ื˜ื›ื ื•ืœื•ื’ื™ื•ืช ื—ื“ืฉื•ืช ืชืžื™ื“ ืžืจื’ืฉ. ืžืกืคืจ ืœื™ืœื•ืช ืœืœื ืฉื™ื ื” ื›ื“ื™ ืœื”ืฉื™ื’ ืชื•ืฆืื•ืช ืžืงืกื™ืžืœื™ื•ืช ื‘ืชื ืื™ื ืฉืœ ืžืฉืื‘ื™ื ืžื•ื’ื‘ืœื™ื ืžืชื•ื’ืžืœื™ื ืขืœ ื™ื“ื™ ื ื™ืกื™ื•ืŸ ืฉืœื ื™ืกื•ืœื ื‘ืคื– ื•ื–ื™ื›ืจื•ื ื•ืช ืžืฆื•ื™ื ื™ื. ื‘ื ื•ืกืฃ, ืขื‘ื•ื“ื” ืขืœ ืžืฉื™ืžื•ืช ื›ืืœื” ื”ื™ื ืชืžื™ื“ ืžื‘ื—ืŸ ื˜ื•ื‘ ืฉืœ ืชื”ืœื™ื›ื™ ื”ื—ื‘ืจื”, ืฉื›ืŸ ืงืฉื” ืžืื•ื“ ืœื”ืฉื™ื’ ืชื•ืฆืื•ืช ื”ื’ื•ื ื•ืช ื‘ืืžืช ืœืœื ืื™ื ื˜ืจืืงืฆื™ื” ืคื ื™ืžื™ืช ืžืชืคืงื“ืช ื”ื™ื˜ื‘.

ืžื™ืœื™ื ื‘ืฆื“: ื”ืชืจืฉืžื ื• ืžื›ืžื•ืช ื”ืขื‘ื•ื“ื” ืฉื”ืฉืงื™ืข ืฆื•ื•ืช TON. ื”ื ื”ืฆืœื™ื—ื• ืœื‘ื ื•ืช ืžืขืจื›ืช ืžื•ืจื›ื‘ืช, ื™ืคื”, ื•ื”ื›ื™ ื—ืฉื•ื‘, ืขื•ื‘ื“ืช. TON ื”ื•ื›ื™ื—ื” ืืช ืขืฆืžื” ื›ืคืœื˜ืคื•ืจืžื” ืขื ืคื•ื˜ื ืฆื™ืืœ ืจื‘. ืขื ื–ืืช, ื›ื“ื™ ืฉื”ืžืขืจื›ืช ื”ืืงื•ืœื•ื’ื™ืช ื”ื–ื• ืชืชืคืชื—, ืฆืจื™ืš ืœืขืฉื•ืช ื”ืจื‘ื” ื™ื•ืชืจ, ื”ืŸ ืžื‘ื—ื™ื ืช ื”ืฉื™ืžื•ืฉ ื‘ื” ื‘ืคืจื•ื™ืงื˜ื™ื ืฉืœ ื‘ืœื•ืงืฆ'ื™ื™ืŸ ื•ื”ืŸ ืžื‘ื—ื™ื ืช ืฉื™ืคื•ืจ ื›ืœื™ ื”ืคื™ืชื•ื—. ืื ื• ื’ืื™ื ืœื”ื™ื•ืช ื—ืœืง ืžื”ืชื”ืœื™ืš ื”ื–ื”.

ืื ืœืื—ืจ ืงืจื™ืืช ืžืืžืจ ื–ื” ืขื“ื™ื™ืŸ ื™ืฉ ืœืš ืฉืืœื•ืช ืื• ื™ืฉ ืœืš ืจืขื™ื•ื ื•ืช ื›ื™ืฆื“ ืœื”ืฉืชืžืฉ ื‘-TON ื›ื“ื™ ืœืคืชื•ืจ ืืช ื”ื‘ืขื™ื•ืช ืฉืœืš, ื›ืชื•ื‘ ืœื ื• - ื ืฉืžื— ืœื—ืœื•ืง ืืช ื”ื ื™ืกื™ื•ืŸ ืฉืœื ื•.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”