ΠΡ Π½Π°Π²Π΅ΡΠ½ΡΠΊΠ° ΡΠ»ΡΡΠ°Π»ΠΈ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Telegram
ΠΠΎΠΌΠ°Π½Π΄Π° Serokell Ρ Π±ΠΎΠ³Π°ΡΡΠΌ ΠΎΠΏΡΡΠΎΠΌ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΊΡΡΠΏΠ½ΡΡ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² Π½Π΅ ΠΌΠΎΠ³Π»Π° ΠΎΡΡΠ°ΡΡΡΡ Π² ΡΡΠΎΡΠΎΠ½Π΅. ΠΡ Π΄Π΅Π»Π΅Π³ΠΈΡΠΎΠ²Π°Π»ΠΈ Π½Π° ΠΊΠΎΠ½ΠΊΡΡΡ ΠΏΡΡΠ΅ΡΡΡ ΡΠΎΡΡΡΠ΄Π½ΠΈΠΊΠΎΠ², Π° ΡΠΆΠ΅ ΡΠ΅ΡΠ΅Π· Π΄Π²Π΅ Π½Π΅Π΄Π΅Π»ΠΈ ΠΎΠ½ΠΈ Π·Π°Π½ΡΠ»ΠΈ Π² Π½Π΅ΠΌ ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ ΠΏΠΎΠ΄ (Π½Π΅)ΡΠΊΡΠΎΠΌΠ½ΡΠΌ ΡΠ°Π½Π΄ΠΎΠΌΠ½ΡΠΌ Π½ΠΈΠΊΠΎΠΌ Sexy Chameleon. Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Ρ ΡΠ°ΡΡΠΊΠ°ΠΆΡ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈΠΌ ΡΡΠΎ ΡΠ΄Π°Π»ΠΎΡΡ. ΠΠ°Π΄Π΅Π΅ΠΌΡΡ, Π·Π° Π±Π»ΠΈΠΆΠ°ΠΉΡΠΈΠ΅ Π΄Π΅ΡΡΡΡ ΠΌΠΈΠ½ΡΡ Π²Ρ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ ΠΏΡΠΎΡΠΈΡΠ°Π΅ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ ΠΈΡΡΠΎΡΠΈΡ, Π° ΠΊΠ°ΠΊ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ Π½Π°ΠΉΠ΄Π΅ΡΠ΅ Π² Π½Π΅ΠΉ ΡΡΠΎ-ΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅, ΡΡΠΎ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ Π² ΡΠ²ΠΎΠ΅ΠΉ ΡΠ°Π±ΠΎΡΠ΅.
ΠΠΎ Π΄Π°Π²Π°ΠΉΡΠ΅ Π½Π°ΡΠ½Π΅ΠΌ Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ³ΡΡΠΆΠ΅Π½ΠΈΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ.
ΠΠΎΠ½ΠΊΡΡΡ ΠΈ Π΅Π³ΠΎ ΡΡΠ»ΠΎΠ²ΠΈΡ
ΠΡΠ°ΠΊ, ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌΠΈ Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ² ΡΡΠ°Π»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ· ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΡΡ ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠΎΠ², Π° ΡΠ°ΠΊΠΆΠ΅ Π²Π½Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΏΠΎ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ ΡΠΊΠΎΡΠΈΡΡΠ΅ΠΌΡ TON. ΠΠΎΠ½ΠΊΡΡΡ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΠ» Ρ 24 ΡΠ΅Π½ΡΡΠ±ΡΡ ΠΏΠΎ 15 ΠΎΠΊΡΡΠ±ΡΡ, Π° ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΎΠ±ΡΡΠ²ΠΈΠ»ΠΈ Π»ΠΈΡΡ 15 Π½ΠΎΡΠ±ΡΡ. ΠΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π΄ΠΎΠ»Π³ΠΎ, ΡΡΠΈΡΡΠ²Π°Ρ, ΡΡΠΎ Π·Π° ΡΡΠΎ Π²ΡΠ΅ΠΌΡ Telegram ΡΡΠΏΠ΅Π» ΠΏΡΠΎΠ²Π΅ΡΡΠΈ ΠΈ ΠΎΠ³Π»Π°ΡΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΡΡΠΎΠ² ΠΏΠΎ Π΄ΠΈΠ·Π°ΠΉΠ½Ρ ΠΈ ΠΏΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° C++ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΎΡΠ΅Π½ΠΊΠΈ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° VoIP-Π·Π²ΠΎΠ½ΠΊΠΎΠ² Π² Telegram.
ΠΡ Π²ΡΠ±ΡΠ°Π»ΠΈ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ°, ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΎΡΠ°ΠΌΠΈ, Π΄Π²Π° ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ°. ΠΠ»Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ, ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΡΡΠΈΠ΅ΡΡ Π²ΠΌΠ΅ΡΡΠ΅ Ρ TON, Π° Π²ΡΠΎΡΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ Π½Π° Π½ΠΎΠ²ΠΎΠΌ ΡΠ·ΡΠΊΠ΅, ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Π½ΠΎΠΌ Π½Π°ΡΠΈΠΌΠΈ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠ°ΠΌΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ Π΄Π»Ρ TON ΠΈ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠΌ Π² Haskell.
ΠΡΠ±ΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π΅ ΡΠ»ΡΡΠ°Π΅Π½. Π Π½Π°ΡΠ΅ΠΌ
ΠΠΎΡΠ΅ΠΌΡ ΠΌΡ Π²ΠΎΠΎΠ±ΡΠ΅ ΡΠ΅ΡΠΈΠ»ΠΈ ΡΡΠ°ΡΡΠ²ΠΎΠ²Π°ΡΡ
ΠΡΠ»ΠΈ Π²ΠΊΡΠ°ΡΡΠ΅, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π°ΡΠ° ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ β ΡΡΠΎ Π½Π΅ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΠΈ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΡ, ΡΡΠ΅Π±ΡΡΡΠΈΠ΅ ΠΎΡΠΎΠ±ΡΡ Π½Π°Π²ΡΠΊΠΎΠ² ΠΈ Π·Π°ΡΠ°ΡΡΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠΈΠ΅ Π½Π°ΡΡΠ½ΡΡ ΡΠ΅Π½Π½ΠΎΡΡΡ Π΄Π»Ρ IT-ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Π°. ΠΡ Π³ΠΎΡΡΡΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌ open-source ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ ΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡΡ Π΅Π΅ ΠΏΠΎΠΏΡΠ»ΡΡΠΈΠ·Π°ΡΠΈΠ΅ΠΉ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΡΡΡΠ΄Π½ΠΈΡΠ°Π΅ΠΌ Ρ Π²Π΅Π΄ΡΡΠΈΠΌΠΈ ΡΠ½ΠΈΠ²Π΅ΡΡΠΈΡΠ΅ΡΠ°ΠΌΠΈ Π ΠΎΡΡΠΈΠΈ Π² ΠΎΠ±Π»Π°ΡΡΠΈ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ½ΡΡ Π½Π°ΡΠΊ ΠΈ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΠΊΠΈ.
ΠΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ ΠΊΠΎΠ½ΠΊΡΡΡΠ° ΠΈ ΠΏΡΠΈΡΠ°ΡΡΠ½ΠΎΡΡΡ ΠΊ Π³ΠΎΡΡΡΠΎ Π»ΡΠ±ΠΈΠΌΠΎΠΌΡ Π½Π°ΠΌΠΈ ΠΏΡΠΎΠ΅ΠΊΡΡ Π’Π΅Π»Π΅Π³ΡΠ°ΠΌ ΡΠ°ΠΌΠΈ ΠΏΠΎ ΡΠ΅Π±Π΅ Π±ΡΠ»ΠΈ ΠΎΡΠ»ΠΈΡΠ½ΠΎΠΉ ΠΌΠΎΡΠΈΠ²Π°ΡΠΈΠ΅ΠΉ, Π½Ρ Π° ΠΏΡΠΈΠ·ΠΎΠ²ΠΎΠΉ ΡΠΎΠ½Π΄ ΡΡΠ°Π» Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΡΡΠΈΠΌΡΠ»ΠΎΠΌ. π
ΠΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π° TON
ΠΡ ΠΏΡΠΈΡΡΠ°Π»ΡΠ½ΠΎ ΡΠ»Π΅Π΄ΠΈΠΌ Π·Π° Π½ΠΎΠ²ΡΠΌΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΠΌΠΈ Π² Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π΅, ΠΈΡΠΊΡΡΡΡΠ²Π΅Π½Π½ΠΎΠΌ ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΠ΅ ΠΈ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠΌ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠΈ ΠΈ ΡΡΠ°ΡΠ°Π΅ΠΌΡΡ Π½Π΅ ΠΏΡΠΎΠΏΡΡΠΊΠ°ΡΡ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅Π»ΠΈΠ·Π° Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΡΡΠ΅Ρ, Π² ΠΊΠΎΡΠΎΡΡΡ
ΡΠ°Π±ΠΎΡΠ°Π΅ΠΌ. ΠΠΎΡΡΠΎΠΌΡ ΠΊ ΠΌΠΎΠΌΠ΅Π½ΡΡ ΡΡΠ°ΡΡΠ° ΠΊΠΎΠ½ΠΊΡΡΡΠ° Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠΆΠ΅ Π±ΡΠ»Π° Π·Π½Π°ΠΊΠΎΠΌΠ° Ρ ΠΈΠ΄Π΅ΡΠΌΠΈ ΠΈΠ·
Π Π½Π°ΡΠ°Π»Ρ ΠΊΠΎΠ½ΠΊΡΡΡΠ° ΠΊΠΎΠ΄ ΡΠΆΠ΅ Π±ΡΠ» ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½, ΠΏΠΎΡΡΠΎΠΌΡ, ΡΡΠΎΠ±Ρ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡΡ Π²ΡΠ΅ΠΌΡ, ΠΌΡ ΡΠ΅ΡΠΈΠ»ΠΈ ΠΏΠΎΠΈΡΠΊΠ°ΡΡ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΈΠ»ΠΈ Π²ΡΠΆΠΈΠΌΠΊΡ, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌΠΈ. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° ΡΡΠΎ Π½Π΅ Π΄Π°Π»ΠΎ β ΠΊΡΠΎΠΌΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΏΠΎ ΡΠ±ΠΎΡΠΊΠ΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ Π½Π° Ubuntu, Π΄ΡΡΠ³ΠΈΡ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΎΠ² ΠΌΡ Π½Π΅ Π½Π°ΡΠ»ΠΈ.
Π‘Π°ΠΌΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΎΠΊΠ°Π·Π°Π»Π°ΡΡ ΡΡΠ°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΡΠ°Π±ΠΎΡΠ°Π½Π½ΠΎΠΉ, Π½ΠΎ ΡΠΈΡΠ°ΡΡ Π΅Π΅ Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠΌΠ΅Π½ΡΠ°Ρ Π±ΡΠ»ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ. ΠΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ°ΡΡΠΎ Π½Π°ΠΌ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΠ»ΠΎΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ ΡΠ΅ΠΌ ΠΈΠ»ΠΈ ΠΈΠ½ΡΠΌ ΠΏΡΠ½ΠΊΡΠ°ΠΌ ΠΈ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΡΡΡ Ρ Π²ΡΡΠΎΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΡ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΉ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΡ ΠΈΠ΄Π΅ΠΉ Π½Π° Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ.
ΠΡΠ»ΠΎ Π±Ρ ΠΏΡΠΎΡΠ΅, Π΅ΡΠ»ΠΈ Π±Ρ Π² ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ Π±ΡΠ»ΠΎ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ. ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ Π²ΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΠΌΠ°ΡΠΈΠ½Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ²ΠΎΠΉ ΡΡΠ΅ΠΊ, ΡΠΊΠΎΡΠ΅Π΅ ΠΎΡΠ²Π»Π΅ΠΊΠ°Π΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ², ΡΠΎΠ·Π΄Π°ΡΡΠΈΡ ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΡ Π΄Π»Ρ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ TON, ΡΠ΅ΠΌ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΠΈΠΌ.
Nix: ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡ
Π Serokell ΠΌΡ Π±ΠΎΠ»ΡΡΠΈΠ΅ ΠΏΠΎΠΊΠ»ΠΎΠ½Π½ΠΈΠΊΠΈ
ΠΠΎΡΡΠΎΠΌΡ ΠΌΡ Π½Π°ΡΠ°Π»ΠΈ Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ
$ 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, Ubuntu ΠΈΠ»ΠΈ macOS.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π»Ρ TON
ΠΠΎΠ΄ ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠΎΠ² Π² TON Network Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π½Π° TON Virtual Machine (TVM). TVM ΡΠ»ΠΎΠΆΠ½Π΅Π΅, ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ Π΄ΡΡΠ³ΠΈΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΠΌΠ°ΡΠΈΠ½, ΠΈ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ Π²Π΅ΡΡΠΌΠ° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΌ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΠΎΠΌ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΎΠ½Π° ΡΠΌΠ΅Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΡΠΌΠΈ (continuations) ΠΈ ΡΡΡΠ»ΠΊΠ°ΠΌΠΈ Π½Π° Π΄Π°Π½Π½ΡΠ΅.
ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, ΡΠ΅Π±ΡΡΠ° ΠΈΠ· TON ΡΠΎΠ·Π΄Π°Π»ΠΈ ΡΠ΅Π»ΡΡ ΡΡΠΈ Π½ΠΎΠ²ΡΡ ΡΠ·ΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ:
Fift β ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΉ ΡΡΠ΅ΠΊΠΎΠ²ΡΠΉ ΡΠ·ΡΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡΡΠΈΠΉ
FunC β ΡΠ·ΡΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΌΠ°ΡΡ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΡ
ΠΎΠΆ Π½Π°
Fift Assembler β Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Fift Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π΄Π²ΠΎΠΈΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π΄Π»Ρ TVM. Π£ Fift Assembler ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ. ΠΡΠΎ
ΠΠ°ΡΠΈ ΠΊΠΎΠ½ΠΊΡΡΡΠ½ΡΠ΅ ΡΠ°Π±ΠΎΡΡ
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, ΠΏΡΠΈΡΠ»ΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π½Π°ΡΠΈΡ ΡΡΠΈΠ»ΠΈΠΉ.
ΠΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ ΠΏΠ»Π°ΡΠ΅ΠΆΠ½ΡΠΉ ΠΊΠ°Π½Π°Π»
ΠΠ»Π°ΡΠ΅ΠΆΠ½ΡΠΉ ΠΊΠ°Π½Π°Π» (payment channel) β ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΄Π²ΡΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΏΠ»Π°ΡΠ΅ΠΆΠΈ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Π°ΠΌΠΈ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π°. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠΊΠΎΠ½ΠΎΠΌΡΡΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π΅Π½ΡΠ³ΠΈ (ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ ΠΊΠΎΠΌΠΈΡΡΠΈΡ), Π½ΠΎ ΠΈ Π²ΡΠ΅ΠΌΡ (Π²Π°ΠΌ Π½Π΅ Π½Π°Π΄ΠΎ ΠΆΠ΄Π°ΡΡ, ΠΏΠΎΠΊΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π΅ΡΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΉ Π±Π»ΠΎΠΊ). ΠΠ»Π°ΡΠ΅ΠΆΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠΊΠΎΠ»Ρ ΡΠ³ΠΎΠ΄Π½ΠΎ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΠΌΠΈ ΠΈ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡΡ Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΡΡΠΎ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ. ΠΡΠΈ ΡΡΠΎΠΌ ΡΡΠΎΡΠΎΠ½Π°ΠΌ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π΄ΠΎΠ²Π΅ΡΡΡΡ Π΄ΡΡΠ³ Π΄ΡΡΠ³Ρ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠΏΡΠ°Π²Π΅Π΄Π»ΠΈΠ²ΠΎΡΡΡ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΡΠ΅ΡΠ° Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π° ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠΎΠΌ.
ΠΡ Π½Π°ΡΠ»ΠΈ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. ΠΠ²Π΅ ΡΡΠΎΡΠΎΠ½Ρ ΠΌΠΎΠ³ΡΡ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡΡΡΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½Π½ΡΠΌΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ
ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π΄Π²Π° ΡΠΈΡΠ»Π° β ΠΏΠΎΠ»Π½ΡΡ ΡΡΠΌΠΌΡ, ΡΠΏΠ»Π°ΡΠ΅Π½Π½ΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΌ ΠΈΠ· ΡΡΠ°ΡΡΠ½ΠΈΠΊΠΎΠ². ΠΡΠΈ Π΄Π²Π° ΡΠΈΡΠ»Π° ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΊΠ°ΠΊ
ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠΎΠΉ ΠΈΠ΄Π΅ΠΈ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΈΡΠ»Π°, Π½ΠΎ ΠΌΡ ΠΎΡΡΠ°Π²ΠΈΠ»ΠΈ ΠΎΠ±Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ°ΠΊ ΠΌΡ ΡΠΌΠΎΠ³Π»ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ. ΠΠΎΠΌΠΈΠΌΠΎ ΡΡΠΎΠ³ΠΎ, ΠΌΡ ΡΠ΅ΡΠΈΠ»ΠΈ Π²ΠΊΠ»ΡΡΠΈΡΡ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΠ»Π°ΡΠ΅ΠΆΠ°. ΠΠ΅Π· Π½Π΅Π³ΠΎ, Π΅ΡΠ»ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-ΡΠΎ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ ΠΏΠΎΡΠ΅ΡΡΠ΅ΡΡΡ, ΡΠΎ, Ρ ΠΎΡΡ Π²ΡΠ΅ ΡΡΠΌΠΌΡ ΠΈ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠ°ΡΡΡΠ΅Ρ Π±ΡΠ΄ΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΌΠΈ, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠΎΡΠ΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ Π·Π°ΠΌΠ΅ΡΠΈΡΡ.
Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π½Π°ΡΡ ΠΈΠ΄Π΅Ρ, ΠΌΡ ΠΏΠΎΠΈΡΠΊΠ°Π»ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΠΈ Π»Π°ΠΊΠΎΠ½ΠΈΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° ΠΏΠ»Π°ΡΠ΅ΠΆΠ½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°. Π ΡΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΡ, ΠΌΡ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ»ΠΈ Π²ΡΠ΅Π³ΠΎ Π΄Π²Π°:
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΠΎΡ ΠΎΠΆΠ΅Π³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π°, ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΠ»ΡΡΠ°Ρ ΠΎΠ΄Π½ΠΎΠ½Π°ΠΏΡΠ°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°.Π’ΡΡΠΎΡΠΈΠ°Π» , Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠΏΠΈΡΠ°Π½Π° ΡΠ° ΠΆΠ΅ ΠΈΠ΄Π΅Ρ, ΡΡΠΎ ΠΈ Ρ Π½Π°Ρ, ΡΠΎΠ»ΡΠΊΠΎ Π±Π΅Π· ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΈΡ ΠΌΠ½ΠΎΠ³ΠΈΡ Π²Π°ΠΆΠ½ΡΡ Π΄Π΅ΡΠ°Π»Π΅ΠΉ, ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ°Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΡ ΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ².
Π‘ΡΠ°Π»ΠΎ ΡΡΠ½ΠΎ, ΡΡΠΎ Π΅ΡΡΡ ΡΠΌΡΡΠ» ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΠ°ΡΡ Π½Π°Ρ ΠΏΡΠΎΡΠΎΠΊΠΎΠ», ΡΠ΄Π΅Π»ΠΈΠ² ΠΎΡΠΎΠ±ΠΎΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π΅Π³ΠΎ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΠΈ. ΠΠΎΡΠ»Π΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π±ΡΠ»Π° Π³ΠΎΡΠΎΠ²Π°, ΠΈ ΡΠ΅ΠΏΠ΅ΡΡ Π²Ρ ΡΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅
ΠΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ Π½Π° FunC, Π° ΡΡΠΈΠ»ΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ Π½Π°ΡΠΈΠΌ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠΎΠΌ ΠΌΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π½Π°ΠΏΠΈΡΠ°Π»ΠΈ Π½Π° Fift, ΠΊΠ°ΠΊ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π»ΠΈ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΎΡΡ. ΠΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π²ΡΠ±ΡΠ°ΡΡ Π»ΡΠ±ΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ ΡΠ·ΡΠΊ Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ CLI, Π½ΠΎ Π½Π°ΠΌ Π±ΡΠ»ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Fift, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΠΊΠ°ΠΊ ΠΎΠ½ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ ΡΠ΅Π±Ρ Π² Π΄Π΅Π»Π΅.
Π§Π΅ΡΡΠ½ΠΎ Π³ΠΎΠ²ΠΎΡΡ, ΠΏΠΎΡΠ°Π±ΠΎΡΠ°Π² Ρ Fift, ΠΌΡ Π½Π΅ ΡΠ²ΠΈΠ΄Π΅Π»ΠΈ Π²Π΅ΡΠΊΠΈΡ ΠΏΡΠΈΡΠΈΠ½ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°ΡΡ ΡΡΠΎΡ ΡΠ·ΡΠΊ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠΌ ΠΈ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΌ ΡΠ·ΡΠΊΠ°ΠΌ Ρ ΡΠ°Π·Π²ΠΈΡΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅ΠΌ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΠΌΠΈ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°ΡΡ Π½Π° ΡΡΠ΅ΠΊΠΎΠ²ΠΎΠΌ ΡΠ·ΡΠΊΠ΅ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π½Π΅ΠΏΡΠΈΡΡΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Π΄Π΅ΡΠΆΠ°ΡΡ Π² Π³ΠΎΠ»ΠΎΠ²Π΅ ΡΡΠΎ Π³Π΄Π΅ Π»Π΅ΠΆΠΈΡ Π² ΡΡΠ΅ΠΊΠ΅, ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Ρ ΡΡΠΈΠΌ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ.
ΠΠΎΡΡΠΎΠΌΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌ, Π½Π° Π½Π°Ρ Π²Π·Π³Π»ΡΠ΄, ΠΎΠΏΡΠ°Π²Π΄Π°Π½ΠΈΠ΅ΠΌ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ Fift ΡΠ²Π»ΡΠ΅ΡΡΡ Π΅Π³ΠΎ ΡΠΎΠ»Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Ρ ΠΎΡΡ-ΡΠ·ΡΠΊΠ° Π΄Π»Ρ Fift Assembler. ΠΠΎ Π½Π΅ Π»ΡΡΡΠ΅ Π»ΠΈ Π±ΡΠ»ΠΎ Π±Ρ Π²ΡΡΡΠΎΠΈΡΡ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ TVM Π² ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ ΡΠ·ΡΠΊ, Π° Π½Π΅ ΠΏΡΠΈΠ΄ΡΠΌΡΠ²Π°ΡΡ Π½ΠΎΠ²ΡΠΉ Π΄Π»Ρ ΡΡΠΎΠΉ, ΠΏΠΎ ΡΡΡΠΈ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠΉ, ΡΠ΅Π»ΠΈ?
TVM Haskell eDSL
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΡΠΈΡΠ»ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ°ΡΡΠΊΠ°Π·Π°ΡΡ ΠΎ Π²ΡΠΎΡΠΎΠΌ Π½Π°ΡΠ΅ΠΌ ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ΅. ΠΡ ΡΠ΅ΡΠΈΠ»ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΊΠΎΡΠ΅Π»Π΅ΠΊ Ρ ΠΌΡΠ»ΡΡΠΈΠΏΠΎΠ΄ΠΏΠΈΡΡΡ, Π½ΠΎ ΠΏΠΈΡΠ°ΡΡ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ Π½Π° FunC Π±ΡΠ»ΠΎ Π±Ρ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΠΊΡΡΠ½ΠΎ. ΠΠ°ΠΌ Ρ ΠΎΡΠ΅Π»ΠΎΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΊΠ°ΠΊΡΡ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΈΠ·ΡΠΌΠΈΠ½ΠΊΡ, ΠΈ Π΅Ρ ΡΡΠ°Π» Π½Π°Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠ·ΡΠΊ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ° Π΄Π»Ρ TVM.
ΠΠ°ΠΊ ΠΈ Fift Assembler, Π½Π°Ρ Π½ΠΎΠ²ΡΠΉ ΡΠ·ΡΠΊ Π²ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΠΉ, ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Ρ ΠΎΡΡΠ° Π²ΠΌΠ΅ΡΡΠΎ Fift ΠΌΡ Π²ΡΠ±ΡΠ°Π»ΠΈ Haskell, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ Π½Π°ΠΌ Π² ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΌΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΡΠΈΠΏΠΎΠ². ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ ΡΠΎ ΡΠΌΠ°ΡΡ-ΠΊΠΎΠ½ΡΡΠ°ΠΊΡΠ°ΠΌΠΈ, Π³Π΄Π΅ ΡΠ΅Π½Π° Π΄Π°ΠΆΠ΅ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠ΅Π½Ρ Π²ΡΡΠΎΠΊΠΎΠΉ, ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΡ, Π½Π° Π½Π°Ρ Π²Π·Π³Π»ΡΠ΄, ΡΠ²Π»ΡΠ΅ΡΡΡ Π±ΠΎΠ»ΡΡΠΈΠΌ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎΠΌ.
Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°ΡΡ, ΠΊΠ°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ TVM, Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ Π² 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 ΡΠ°ΡΠΎΠ² (Π²ΠΌΠ΅ΡΡΠ΅ ΡΠΎ Π·Π½Π°ΠΊΠΎΠΌΡΡΠ²ΠΎΠΌ Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅ΠΉ, ΡΠΎΠ²Π΅ΡΠ°Π½ΠΈΡΠΌΠΈ ΠΈ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ). Π ΠΊΠΎΠ½ΠΊΡΡΡΠ½ΠΎΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΏΡΠΈΠ½ΡΠ»ΠΈ ΡΡΠ°ΡΡΠΈΠ΅ ΠΏΡΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ²: Π‘Π’Π, ΡΠΈΠΌ-Π»ΠΈΠ΄, ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡΡ ΠΏΠΎ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½-ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΠΌ ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π½Π° Haskell.
Π Π΅ΡΡΡΡΡ Π΄Π»Ρ ΡΡΠ°ΡΡΠΈΡ Π² ΠΊΠΎΠ½ΡΠ΅ΡΡΠ΅ ΠΌΡ Π½Π°ΡΠ»ΠΈ Π±Π΅Π· ΡΡΡΠ΄Π°, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π΄ΡΡ Ρ Π°ΠΊΠ°ΡΠΎΠ½Π°, ΡΠ΅ΡΠ½Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½Π°Ρ ΡΠ°Π±ΠΎΡΠ°, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ Π±ΡΡΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ³ΡΡΠΆΠ΅Π½ΠΈΡ Π² Π°ΡΠΏΠ΅ΠΊΡΡ Π½ΠΎΠ²ΡΡ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ β ΡΡΠΎ Π²ΡΠ΅Π³Π΄Π° ΡΠ²Π»Π΅ΠΊΠ°ΡΠ΅Π»ΡΠ½ΠΎ. ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±Π΅ΡΡΠΎΠ½Π½ΡΡ Π½ΠΎΡΠ΅ΠΉ ΡΠ°Π΄ΠΈ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° Π² ΡΡΠ»ΠΎΠ²ΠΈΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΡΡ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠΈΡΡΡΡΡΡ Π±Π΅ΡΡΠ΅Π½Π½ΡΠΌ ΠΎΠΏΡΡΠΎΠΌ ΠΈ ΠΎΡΠ»ΠΈΡΠ½ΡΠΌΠΈ Π²ΠΎΡΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΡΠΌΠΈ. Π ΡΠΎΠΌΡ ΠΆΠ΅ ΡΠ°Π±ΠΎΡΠ° Π½Π°Π΄ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠΌΠΈ Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ β Π²ΡΠ΅Π³Π΄Π° Ρ ΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π΄ΠΎΠ±ΠΈΡΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π΄ΠΎΡΡΠΎΠΉΠ½ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² Π±Π΅Π· ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΠΎΡΠ»Π°ΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΊΡΠ°ΠΉΠ½Π΅ ΡΡΠΆΠ΅Π»ΠΎ.
ΠΡΠΎΠΌΠ΅ Π»ΠΈΡΠΈΠΊΠΈ: ΠΌΡ Π±ΡΠ»ΠΈ Π²ΠΏΠ΅ΡΠ°ΡΠ»Π΅Π½Ρ ΠΎΠ±ΡΠ΅ΠΌΠΎΠΌ ΡΠ°Π±ΠΎΡΡ, ΠΏΡΠΎΠ΄Π΅Π»Π°Π½Π½ΡΠΌ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ TON. ΠΠΌ ΡΠ΄Π°Π»ΠΎΡΡ ΠΏΠΎΡΡΡΠΎΠΈΡΡ ΡΠ»ΠΎΠΆΠ½ΡΡ, ΠΊΡΠ°ΡΠΈΠ²ΡΡ, ΠΈ ΡΠ°ΠΌΠΎΠ΅ Π³Π»Π°Π²Π½ΠΎΠ΅, ΡΠ°Π±ΠΎΡΠ°ΡΡΡΡ ΡΠΈΡΡΠ΅ΠΌΡ. TON ΠΏΠΎΠΊΠ°Π·Π°Π» ΡΠ΅Π±Ρ ΠΊΠ°ΠΊ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°, ΠΈΠΌΠ΅ΡΡΠ°Ρ Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π». ΠΠ΄Π½Π°ΠΊΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΡΠ° ΡΠΊΠΎΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ°Π·Π²ΠΈΠ²Π°Π»Π°ΡΡ, Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π΅ΡΠ΅ ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½ ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ , ΡΠ°ΠΊ ΠΈ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΡΠΎΠ²Π΅ΡΡΠ΅Π½ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ. ΠΡ Π³ΠΎΡΠ΄ΠΈΠΌΡΡ ΡΠ΅ΠΌ, ΡΡΠΎ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ²Π»ΡΠ΅ΠΌΡΡ ΡΠ°ΡΡΡΡ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°.
ΠΡΠ»ΠΈ ΠΏΠΎΡΠ»Π΅ ΠΏΡΠΎΡΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠΈ Ρ Π²Π°Ρ ΠΎΡΡΠ°Π»ΠΈΡΡ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π²ΠΎΠΏΡΠΎΡΡ ΠΈΠ»ΠΈ ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ ΠΈΠ΄Π΅ΠΈ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ TON Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π²Π°ΡΠΈΡ
Π·Π°Π΄Π°Ρ,
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com