ืืื ืฉืืขืชื ืืช ืืืืืจื ืืื
ืฆืืืช Serokel, ืืขื ื ืืกืืื ืจื ืืคืืชืื ืคืจืืืงืื ืืืืงืฆ'ืืื ืืืืืื, ืื ืืืื ืืื ืืขืืื ืื ืื. ืืืฆืื ื ืืืืฉื ืขืืืืื ืืชืืจืืช, ืืืขืืืจ ืฉืืืขืืื ืื ืืื ืืืงืื ืืจืืฉืื ืื ืืืื ืื ืืืงืจืื (ืืื) ืืฆื ืืข (Sexy Chameleon). ืืืืืจ ืื ืืืืจ ืขื ืืื ืื ืขืฉื ืืช ืื. ืื ื ืืงืืืื ืฉืืขืฉืจ ืืืงืืช ืืงืจืืืืช ืืคืืืช ืชืงืจืื ืกืืคืืจ ืืขื ืืื, ืืืื ืืืืชืจ ืชืืฆืื ืื ืืฉืื ืฉืืืืฉื ืฉืชืืืื ืืืืฉื ืืขืืืืชืื.
ืืื ื ืชืืื ืขื ืงืฆืช ืืงืฉืจ.
ืชืืจืืช ืืชื ืืื
ืื, ืืืฉืืืืช ืืขืืงืจืืืช ืฉื ืืืฉืชืชืคืื ืืื ืืืฉืื ืฉื ืืื ืื ืืืชืจ ืืืืืืื ืืืืืื ืืืืฆืขืื, ืืื ืื ืืฆืขืช ืืฆืขืืช ืืฉืืคืืจ ืืืขืจืืช ืืืงืืืืืืช ืฉื TON. ืืชืืจืืช ืืชืงืืืื ืืื ื-24 ืืกืคืืืืจ ื-15 ืืืืงืืืืจ, ืืืชืืฆืืืช ืคืืจืกืื ืจืง ื-15 ืื ืืืืืจ. ืื ืืจืื ืืื, ืืืชืืฉื ืืื ืฉืืืื ืื ืืฆืืืื ืืืืจื ืืงืืื ืืืืืจืื ืขื ืชืืฆืืืช ืชืืจืืืืช ืขื ืขืืฆืื ืืคืืชืื ืืคืืืงืฆืืืช ื-C++ ืืืืืงื ืืืขืจืืช ืืืืืช ืฉืืืืช ื-VoIP ืืืืืจื.
ืืืจื ื ืฉื ื ืืืืื ืืืืื ืืืจืฉืืื ืฉืืฆืืขื ืืืืจืื ืื. ืขืืืจ ืืื ืืื, ืืฉืชืืฉื ื ืืืืื ืืืืคืฆืื ืขื TON, ืืืฉื ื ืืืฉื ืืฉืคื ืืืฉื ืฉืคืืชืื ืขื ืืื ืืืื ืืกืื ืฉืื ื ืืืืืื ืขืืืจ TON ืืืืื ืืช ืืชืื Haskell.
ืืืืืจื ืืฉืคืช ืชืื ืืช ืคืื ืงืฆืืื ืืืช ืืื ื ืืงืจืืช. ืืฉืื ื
ืืื ืืืื ืืืืื ื ืืืฉืชืชืฃ?
ืืงืืฆืืจ, ืื ืืืชืืืืช ืฉืื ื ืืื ืคืจืืืงืืื ืื ืกืื ืืจืืืื ืืืืจืืืื ืฉืืืจืฉืื ืืืฉืืจืื ืืืืืืื ืืืจืื ืื ืืขืื ืขืจื ืืืขื ืืงืืืืช ื-IT. ืื ื ืชืืืืื ืืืื ืืคืืชืื ืงืื ืคืชืื ืืขืืกืงืื ืืคืืคืืืจืืืช ืฉืื, ืืื ืืฉืชืคืื ืคืขืืื ืขื ืืื ืืืจืกืืืืืช ืจืืกืืืช ืืืืืืืช ืืชืืื ืืืขื ืืืืฉื ืืืืชืืืืงื.
ืืืฉืืืืช ืืืขื ืืื ืืช ืฉื ืืชืืจืืช ืืืืขืืจืืืช ืืคืจืืืงื ืืืืืจื ืืืืื ืฉืื ื ืืื ืืฉืืขืฆืื ืืืืืืฆืื ืืฆืืื ืช, ืืื ืงืจื ืืคืจืกืื ืืคืื ืืชืืจืืฅ ื ืืกืฃ. ๐
ืืืงืจ ืืืืงืฆ'ืืื ืฉื 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 ืืฆืจื ืฉืืืฉ ืฉืคืืช ืชืื ืืช ืืืฉืืช:
ืืืฉ ืืื ืฉืคืช ืชืื ืืช ืขืจืืื ืืื ืืืจืกืืืช ืืืืื ื
FunC ืืื ืฉืคืช ืชืื ืืช ืืืืื ืืืื ืืืืื ื
ืืกืืืืจ ืืืืฉื - ืกืคืจืืืช Fift ืืืคืงืช ืงืื ืืคืขืื ืืื ืืจื ืขืืืจ TVM. ื-Fifth Assembler ืืื ืืืืจ. ืึถื
ืืชืืจืืช ืฉืื ื ืขืืืืช
ืืืกืืฃ, ืืืืข ืืืื ืืืกืชืื ืขื ืชืืฆืืืช ืืืืืฆืื ืฉืื ื.
ืขืจืืฅ ืชืฉืืื ืืกืื ืืจืื ื
ืขืจืืฅ ืชืฉืืื ืืื ืืืื ืืื ืืืืคืฉืจ ืืฉื ื ืืฉืชืืฉืื ืืฉืืื ืชืฉืืืืื ืืืืฅ ืืืืืงืฆ'ืืื. ืืชืืฆืื ืืื, ืืชื ืืืกื ืื ืจืง ืืกืฃ (ืืื ืขืืื), ืืื ืื ืืื (ืืื ื ืฆืจืื ืืืืืช ืืขืืืื ืืืืืง ืืื). ืืชืฉืืืืื ืืืืืื ืืืืืช ืงืื ืื ืืื ืืจืฆืื ืืืชืืืจืืช ืื ืืจืฉืช. ืืืงืจื ืื, ืืฆืืืื ืืื ื ืฆืจืืืื ืืกืืื ืื ืขื ืื, ืฉืื ืืืื ืืช ืืคืฉืจื ืืกืืคื ืืืืืืช ืืืืื ืืืื.
ืืฆืื ื ืคืชืจืื ืคืฉืื ืืืื ืืืขืื. ืฉื ื ืฆืืืื ืืืืืื ืืืืืืฃ ืืืืขืืช ืืชืืืืช, ืฉืื ืืืช ืืื ืืืืื ืฉื ื ืืกืคืจืื - ืืกืืื ืืืื ืฉืฉืืื ืขื ืืื ืื ืฆื. ืฉื ื ืืืกืคืจืื ืืืื ืขืืืืื ืืื
ืืืขืฉื, ืืกืคืจ ืืื ืืกืคืืง ืืื ืืืืฉื ืืช ืืจืขืืื ืืื, ืืื ืขืืื ื ืืช ืฉื ืืื ืื ืื ื ืืื ืืืฆืืจ ืืืฉืง ืืฉืชืืฉ ื ืื ืืืชืจ. ืื ืืกืฃ, ืืืืื ื ืืืืื ืืช ืกืืื ืืชืฉืืื ืืื ืืืืขื. ืืืขืืื, ืื ืืืืืขื ืืืื ืืกืืื ืืืฉืื, ืืื ืืืจืืช ืฉืื ืืกืืืืื ืืืืืฉืื ืืกืืคื ืืืื ื ืืื ืื, ืืืชืื ืฉืืืฉืชืืฉ ืื ืืืืื ืืืืืื.
ืืื ืืืืืง ืืช ืืจืขืืื ืฉืื ื, ืืืคืฉื ื ืืืืืืืช ืืฉืืืืฉ ืืคืจืืืืงืื ืขืจืืฅ ืชืฉืืื ืื ืคืฉืื ืืชืืฆืืชื. ืืืืคื ืืคืชืืข, ืืฆืื ื ืจืง ืฉื ืืื:
ืชืืืืจ ืืืฉื ืืืื, ืจืง ืืืงืจื ืฉื ืขืจืืฅ ืื-ืืืืื ื.ืืืจืื , ืืืชืืจ ืืช ืืืชื ืจืขืืื ืืื ืฉืื ื, ืื ืืืื ืืืกืืืจ ืคืจืืื ืจืืื ืืืฉืืืื, ืืืื ืชืงืื ืืช ืืืืืช ืื ืืืื ืืืืฉืื ืกืืกืืืื.
ืืชืืจืจ ืื ืืืืื ื ืืชืืจ ืืช ืืคืจืืืืงืื ืฉืื ื ืืคืืจืื, ืชืื ืฉืืืช ืื ืืืืืืช ืื ืืื ืืชื. ืืืืจ ืืกืคืจ ืืืืจืฆืืืช, ืืืคืจื ืืื ืืืื, ืืขืืฉืื ืื ืืชื ืืืื.
ืืืืขื ื ืืช ืืืืื ื-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