ΠΠ΅ΡΠΎΡΡΠ½ΠΎ ΡΡΠ΅ ΡΡΠ²Π°Π»ΠΈ ΡΠΎΠ·ΠΈ Telegram
ΠΠΊΠΈΠΏΡΡ Π½Π° Serokell, Ρ Π±ΠΎΠ³Π°Ρ ΠΎΠΏΠΈΡ Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½ ΠΏΡΠΎΠ΅ΠΊΡΠΈ, Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΡΡΠ°Π½Π΅ Π½Π°ΡΡΡΠ°Π½Π°. ΠΠ΅Π»Π΅Π³ΠΈΡΠ°Ρ ΠΌΠ΅ ΠΏΠ΅ΡΠΈΠΌΠ° ΡΠ»ΡΠΆΠΈΡΠ΅Π»ΠΈ Π½Π° ΡΡΡΡΠ΅Π·Π°Π½ΠΈΠ΅ΡΠΎ ΠΈ Π΄Π²Π΅ ΡΠ΅Π΄ΠΌΠΈΡΠΈ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ ΡΠ΅ Π·Π°Π΅Ρ Π° ΠΏΡΡΠ²ΠΎ ΠΌΡΡΡΠΎ Π² Π½Π΅Π³ΠΎ ΠΏΠΎΠ΄ (Π½Π΅)ΡΠΊΡΠΎΠΌΠ½ΠΈΡ ΡΠ»ΡΡΠ°Π΅Π½ ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌ Sexy Chameleon. Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ ΡΠ° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠ»ΠΈ. ΠΠ°Π΄ΡΠ²Π°ΠΌΠ΅ ΡΠ΅, ΡΠ΅ Π² ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡΠ΅ Π΄Π΅ΡΠ΅ΡΠΈΠ½Π° ΠΌΠΈΠ½ΡΡΠΈ ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ ΠΏΠΎΠ½Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π° ΠΈΡΡΠΎΡΠΈΡ, Π° Π½Π°ΠΉ-ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅ Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π½Π΅ΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² Π½Π΅Ρ, ΠΊΠΎΠ΅ΡΠΎ Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠΈΡΠ΅ Π² ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΡΠΈ.
ΠΠΎ Π½Π΅ΠΊΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Ρ ΠΌΠ°Π»ΠΊΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ.
ΠΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠΈΡ ΠΈ Π½Π΅ΠΉΠ½ΠΈΡΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΡ
Π ΡΠ°ΠΊΠ°, ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ Π·Π°Π΄Π°ΡΠΈ Π½Π° ΡΡΠ°ΡΡΠ½ΠΈΡΠΈΡΠ΅ Π±ΡΡ Π° ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ΡΠΎ Π½Π° Π΅Π΄ΠΈΠ½ ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡΠ΅ ΠΈΠ½ΡΠ΅Π»ΠΈΠ³Π΅Π½ΡΠ½ΠΈ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈ, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΏΡΠ°Π²Π΅Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ Π·Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°Π½Π΅ Π½Π° Π΅ΠΊΠΎΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° TON. ΠΠΎΠ½ΠΊΡΡΡΡΡ ΡΠ΅ ΠΏΡΠΎΠ²Π΅Π΄Π΅ ΠΎΡ 24 ΡΠ΅ΠΏΡΠ΅ΠΌΠ²ΡΠΈ Π΄ΠΎ 15 ΠΎΠΊΡΠΎΠΌΠ²ΡΠΈ, Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ Π±ΡΡ Π° ΠΎΠ±ΡΠ²Π΅Π½ΠΈ Π΅Π΄Π²Π° Π½Π° 15 Π½ΠΎΠ΅ΠΌΠ²ΡΠΈ. ΠΠΎΡΡΠ° Π΄ΡΠ»Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅, ΠΊΠ°ΡΠΎ ΡΠ΅ ΠΈΠΌΠ° ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΠ΅ ΠΏΡΠ΅Π· ΡΠΎΠ²Π° Π²ΡΠ΅ΠΌΠ΅ Telegram ΡΡΠΏΡ Π΄Π° ΠΏΡΠΎΠ²Π΅Π΄Π΅ ΠΈ ΠΎΠ±ΡΠ²ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ ΠΊΠΎΠ½ΠΊΡΡΡΠΈ Π·Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ°Π½Π΅ ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² C++ Π·Π° ΡΠ΅ΡΡΠ²Π°Π½Π΅ ΠΈ ΠΎΡΠ΅Π½ΠΊΠ° Π½Π° ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎΡΠΎ Π½Π° VoIP ΡΠ°Π·Π³ΠΎΠ²ΠΎΡΠΈ Π² Telegram.
ΠΠ·Π±ΡΠ°Ρ ΠΌΠ΅ Π΄Π²Π° ΠΈΠ½ΡΠ΅Π»ΠΈΠ³Π΅Π½ΡΠ½ΠΈ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠ° ΠΎΡ ΡΠΏΠΈΡΡΠΊΠ°, ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ ΠΎΡ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΎΡΠΈΡΠ΅. ΠΠ° Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΡΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ, ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½ΡΠ²Π°Π½ΠΈ Ρ TON, Π° Π²ΡΠΎΡΠΈΡΡ Π±Π΅ΡΠ΅ Π²Π½Π΅Π΄ΡΠ΅Π½ Π½Π° Π½ΠΎΠ² Π΅Π·ΠΈΠΊ, ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ΅Π½ ΠΎΡ Π½Π°ΡΠΈΡΠ΅ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎ Π·Π° TON ΠΈ Π²Π³ΡΠ°Π΄Π΅Π½ Π² Haskell.
ΠΠ·Π±ΠΎΡΡΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π΅Π½ Π΅Π·ΠΈΠΊ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ Π½Π΅ Π΅ ΡΠ»ΡΡΠ°Π΅Π½. Π Π½Π°ΡΠ°ΡΠ°
ΠΠ°ΡΠΎ ΠΈΠ·ΠΎΠ±ΡΠΎ ΡΠ΅ΡΠΈΡ ΠΌΠ΅ Π΄Π° ΡΡΠ°ΡΡΠ²Π°ΠΌΠ΅?
ΠΠ°ΠΊΡΠ°ΡΠΊΠΎ, Π·Π°ΡΠΎΡΠΎ Π½Π°ΡΠ°ΡΠ° ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ° Π½Π΅ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈ ΠΈ ΡΠ»ΠΎΠΆΠ½ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π°Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΈ ΡΠΌΠ΅Π½ΠΈΡ ΠΈ ΡΠ΅ΡΡΠΎ ΠΈΠΌΠ°Ρ Π½Π°ΡΡΠ½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡ Π·Π° ΠΠ’ ΠΎΠ±ΡΠ½ΠΎΡΡΡΠ°. ΠΠΈΠ΅ ΡΠΈΠ»Π½ΠΎ ΠΏΠΎΠ΄ΠΊΡΠ΅ΠΏΡΠΌΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ ΠΈ ΡΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π²Π°ΠΌΠ΅ Ρ Π½Π΅ΠΉΠ½ΠΎΡΠΎ ΠΏΠΎΠΏΡΠ»ΡΡΠΈΠ·ΠΈΡΠ°Π½Π΅, Π° ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠΈ ΡΡΡΡΡΠ΄Π½ΠΈΡΠΈΠΌ Ρ Π²ΠΎΠ΄Π΅ΡΠΈ ΡΡΡΠΊΠΈ ΡΠ½ΠΈΠ²Π΅ΡΡΠΈΡΠ΅ΡΠΈ Π² ΠΎΠ±Π»Π°ΡΡΡΠ° Π½Π° ΠΊΠΎΠΌΠΏΡΡΡΡΠ½ΠΈΡΠ΅ Π½Π°ΡΠΊΠΈ ΠΈ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΠΊΠ°ΡΠ°.
ΠΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈΡΠ΅ Π·Π°Π΄Π°ΡΠΈ Π½Π° ΡΡΡΡΠ΅Π·Π°Π½ΠΈΠ΅ΡΠΎ ΠΈ ΡΡΠ°ΡΡΠΈΠ΅ΡΠΎ Π² Π½Π°ΡΠΈΡ Π»ΡΠ±ΠΈΠΌ ΠΏΡΠΎΠ΅ΠΊΡ Telegram ΡΠ°ΠΌΠΈ ΠΏΠΎ ΡΠ΅Π±Π΅ ΡΠΈ Π±ΡΡ Π° ΠΎΡΠ»ΠΈΡΠ½Π° ΠΌΠΎΡΠΈΠ²Π°ΡΠΈΡ, Π½ΠΎ Π½Π°Π³ΡΠ°Π΄Π½ΠΈΡΡ ΡΠΎΠ½Π΄ ΡΠ΅ ΠΏΡΠ΅Π²ΡΡΠ½Π° Π² Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π΅Π½ ΡΡΠΈΠΌΡΠ». π
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 ΡΠ°Π±ΠΎΡΠΈ Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° TON (TVM). TVM Π΅ ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ΅Π½ ΠΎΡ ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ Π΄ΡΡΠ³ΠΈ Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ ΠΈ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ, Ρ ΠΊΠΎΡΡΠΎ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ΅Π½ΠΈΡ ΠΈ Π²ΡΡΠ·ΠΊΠΈ ΠΊΡΠΌ Π΄Π°Π½Π½ΠΈ.
ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, ΠΌΠΎΠΌΡΠ΅ΡΠ°ΡΠ° ΠΎΡ TON ΡΡΠ·Π΄Π°Π΄ΠΎΡ Π° ΡΡΠΈ Π½ΠΎΠ²ΠΈ Π΅Π·ΠΈΠΊΠ° Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅:
ΠΏΠ΅ΡΠ° Π΅ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»Π΅Π½ ΡΡΠ΅ΠΊΠΎΠ² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅Π½ Π΅Π·ΠΈΠΊ, ΠΊΠΎΠΉΡΠΎ Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΡΠ²Π°
FunC Π΅ Π΅Π·ΠΈΠΊ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ½ΡΠ΅Π»ΠΈΠ³Π΅Π½ΡΠ½ΠΈ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈ, ΠΊΠΎΠΉΡΠΎ Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π°
ΠΠ΅ΡΠΈ Π°ΡΠ΅ΠΌΠ±Π»Π΅Ρ β ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π½Π° Fift Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π²ΠΎΠΈΡΠ΅Π½ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ ΠΊΠΎΠ΄ Π·Π° TVM. Fifth Assembler Π½ΡΠΌΠ° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡ. Π’ΠΎΠ²Π°
ΠΠ°ΡΠ°ΡΠ° ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠΈΡ ΡΠ°Π±ΠΎΡΠΈ
ΠΠ°ΠΉ-Π½Π°ΠΊΡΠ°Ρ Π΅ Π²ΡΠ΅ΠΌΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ Π½Π°ΡΠΈΡΠ΅ ΡΡΠΈΠ»ΠΈΡ.
ΠΡΠΈΠ½Ρ ΡΠΎΠ½Π΅Π½ ΠΊΠ°Π½Π°Π» Π·Π° ΠΏΠ»Π°ΡΠ°Π½Π΅
ΠΠ°Π½Π°Π»ΡΡ Π·Π° ΠΏΠ»Π°ΡΠ°Π½Π΅ Π΅ ΠΈΠ½ΡΠ΅Π»ΠΈΠ³Π΅Π½ΡΠ΅Π½ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π° Π΄Π²Π°ΠΌΠ° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ Π΄Π° ΠΈΠ·ΠΏΡΠ°ΡΠ°Ρ ΠΏΠ»Π°ΡΠ°Π½ΠΈΡ ΠΈΠ·Π²ΡΠ½ Π±Π»ΠΎΠΊΡΠ΅ΠΉΠ½Π°. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° ΡΠΏΠ΅ΡΡΡΠ²Π°ΡΠ΅ Π½Π΅ ΡΠ°ΠΌΠΎ ΠΏΠ°ΡΠΈ (Π½ΡΠΌΠ° ΠΊΠΎΠΌΠΈΡΠΈΠΎΠ½Π½Π°), Π½ΠΎ ΠΈ Π²ΡΠ΅ΠΌΠ΅ (Π½Π΅ Π΅ Π½ΡΠΆΠ½ΠΎ Π΄Π° ΡΠ°ΠΊΠ°ΡΠ΅ ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ Π±Π»ΠΎΠΊ Π΄Π° Π±ΡΠ΄Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ΅Π½). ΠΠ»Π°ΡΠ°Π½ΠΈΡΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΡΠΎΠ»ΠΊΠΎΠ²Π° ΠΌΠ°Π»ΠΊΠΈ, ΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΠΆΠ΅Π»Π°Π΅ΡΠ΅, ΠΈ ΡΠΎΠ»ΠΊΠΎΠ²Π° ΡΠ΅ΡΡΠΎ, ΠΊΠΎΠ»ΠΊΠΎΡΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ. Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΡΡΡΠ°Π½ΠΈΡΠ΅ Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π΄ΠΎΠ²Π΅ΡΡΠ²Π°Ρ Π΅Π΄Π½Π° Π½Π° Π΄ΡΡΠ³Π°, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΅ΡΡΠ½ΠΎΡΡΡΠ° Π½Π° ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»Π½ΠΎΡΠΎ ΡΠΏΠΎΡΠ°Π·ΡΠΌΠ΅Π½ΠΈΠ΅ Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠ°Π½Π° ΠΎΡ ΠΈΠ½ΡΠ΅Π»ΠΈΠ³Π΅Π½ΡΠ½ΠΈΡ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ.
ΠΠ°ΠΌΠ΅ΡΠΈΡ
ΠΌΠ΅ Π΄ΠΎΡΡΠ° ΠΏΡΠΎΡΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°. ΠΠ²Π΅ ΡΡΡΠ°Π½ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΎΠ±ΠΌΠ΅Π½ΡΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½ΠΈ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡ, Π²ΡΡΠΊΠΎ ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΡΡΠ΄ΡΡΠΆΠ° Π΄Π²Π΅ ΡΠΈΡΠ»Π° β ΠΏΡΠ»Π½Π°ΡΠ° ΡΡΠΌΠ°, ΠΏΠ»Π°ΡΠ΅Π½Π° ΠΎΡ Π²ΡΡΠΊΠ° ΡΡΡΠ°Π½Π°. Π’Π΅Π·ΠΈ Π΄Π²Π΅ ΡΠΈΡΠ»Π° ΡΠ°Π±ΠΎΡΡΡ ΠΊΠ°ΡΠΎ
ΠΡΡΡΠ½ΠΎΡΡ Π΅Π΄ΠΈΠ½ Π½ΠΎΠΌΠ΅Ρ Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ΅Π½ Π·Π° ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π·ΠΈ ΠΈΠ΄Π΅Ρ, Π½ΠΎ Π½ΠΈΠ΅ ΠΎΡΡΠ°Π²ΠΈΡ ΠΌΠ΅ ΠΈ Π΄Π²Π°ΡΠ°, Π·Π°ΡΠΎΡΠΎ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΠΏΠΎ-ΡΠ΄ΠΎΠ±Π΅Π½ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΡΠ΅ΡΠΈΡ ΠΌΠ΅ Π΄Π° Π²ΠΊΠ»ΡΡΠΈΠΌ ΡΡΠΌΠ°ΡΠ° Π½Π° ΠΏΠ»Π°ΡΠ°Π½Π΅ΡΠΎ Π²ΡΠ² Π²ΡΡΠΊΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅. ΠΠ΅Π· Π½Π΅Π³ΠΎ, Π°ΠΊΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ Π·Π°Π³ΡΠ±ΠΈ ΠΏΠΎ Π½ΡΠΊΠ°ΠΊΠ²Π° ΠΏΡΠΈΡΠΈΠ½Π°, ΡΠΎΠ³Π°Π²Π°, Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΡΠΌΠΈ ΠΈ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»Π½ΠΎΡΠΎ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΈ, ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ Π·Π°Π±Π΅Π»Π΅ΠΆΠΈ Π·Π°Π³ΡΠ±Π°ΡΠ°.
ΠΠ° Π΄Π° ΡΠ΅ΡΡΠ²Π°ΠΌΠ΅ Π½Π°ΡΠ°ΡΠ° ΠΈΠ΄Π΅Ρ, ΠΏΠΎΡΡΡΡΠΈΡ ΠΌΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠ°ΠΊΡΠ² ΠΏΡΠΎΡΡ ΠΈ ΠΊΡΠ°ΡΡΠΊ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» Π·Π° ΠΏΠ»Π°ΡΠ΅ΠΆΠ΅Π½ ΠΊΠ°Π½Π°Π». ΠΠ·Π½Π΅Π½Π°Π΄Π²Π°ΡΠΎ ΠΎΡΠΊΡΠΈΡ ΠΌΠ΅ ΡΠ°ΠΌΠΎ Π΄Π²Π΅:
ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ ΠΏΠΎΠ΄Ρ ΠΎΠ΄, ΡΠ°ΠΌΠΎ Π·Π° ΡΠ»ΡΡΠ°Ρ Π½Π° Π΅Π΄Π½ΠΎΠΏΠΎΡΠΎΡΠ΅Π½ ΠΊΠ°Π½Π°Π».Π£ΡΠΎΠΊ , ΠΊΠΎΠΉΡΠΎ ΠΎΠΏΠΈΡΠ²Π° ΡΡΡΠ°ΡΠ° ΠΈΠ΄Π΅Ρ ΠΊΠ°ΡΠΎ Π½Π°ΡΠ°ΡΠ°, Π½ΠΎ Π±Π΅Π· Π΄Π° ΠΎΠ±ΡΡΠ½ΡΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°ΠΆΠ½ΠΈ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ, ΠΊΠ°ΡΠΎ ΠΎΠ±ΡΠ° ΠΊΠΎΡΠ΅ΠΊΡΠ½ΠΎΡΡ ΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠΈ Π·Π° ΡΠ°Π·ΡΠ΅ΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΈ.
Π‘ΡΠ°Π½Π° ΡΡΠ½ΠΎ, ΡΠ΅ ΠΈΠΌΠ° ΡΠΌΠΈΡΡΠ» Π΄Π° ΠΎΠΏΠΈΡΠ΅ΠΌ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Π½Π°ΡΠΈΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ», ΠΊΠ°ΡΠΎ ΠΎΠ±ΡΡΠ½Π΅ΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΠΊΠΎΡΠ΅ΠΊΡΠ½ΠΎΡΡ. Π‘Π»Π΅Π΄ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΡΠ° Π±Π΅ΡΠ΅ Π³ΠΎΡΠΎΠ²Π° ΠΈ ΡΠ΅Π³Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈ Π²ΠΈΠ΅.
ΠΠ·ΠΏΡΠ»Π½ΠΈΡ ΠΌΠ΅ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠ° Π²ΡΠ² FunC ΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ ΠΌΠ΅ ΠΏΠΎΠΌΠΎΡΠ½Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π·Π° ΠΊΠΎΠΌΠ°Π½Π΄Π΅Π½ ΡΠ΅Π΄ Π·Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ Π½Π°ΡΠΈΡ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ ΠΈΠ·ΡΡΠ»ΠΎ Π²ΡΠ² Fift, ΠΊΠ°ΠΊΡΠΎ Π±Π΅ΡΠ΅ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ°Π½ΠΎ ΠΎΡ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΎΡΠΈΡΠ΅. ΠΠΎΠΆΠ΅Ρ ΠΌΠ΅ Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΠΌ Π²ΡΠ΅ΠΊΠΈ Π΄ΡΡΠ³ Π΅Π·ΠΈΠΊ Π·Π° Π½Π°ΡΠΈΡ CLI, Π½ΠΎ Π½ΠΈ Π±Π΅ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ Π΄Π° ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Fit, Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Ρ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°.
Π§Π΅ΡΡΠ½ΠΎ ΠΊΠ°Π·Π°Π½ΠΎ, ΡΠ»Π΅Π΄ ΠΊΠ°ΡΠΎ ΡΠ°Π±ΠΎΡΠΈΡ ΠΌΠ΅ Ρ Fift, Π½Π΅ Π²ΠΈΠ΄ΡΡ ΠΌΠ΅ ΡΠ±Π΅Π΄ΠΈΡΠ΅Π»Π½ΠΈ ΠΏΡΠΈΡΠΈΠ½ΠΈ Π΄Π° ΠΏΡΠ΅Π΄ΠΏΠΎΡΠ΅ΡΠ΅ΠΌ ΡΠΎΠ·ΠΈ Π΅Π·ΠΈΠΊ ΠΏΡΠ΅Π΄ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΈΡΠ΅ ΠΈ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ Π΅Π·ΠΈΡΠΈ Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ΅Π½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π΅Π·ΠΈΠΊ, Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° ΡΡΠ΅ΠΊ, Π΅ Π΄ΠΎΡΡΠ° Π½Π΅ΠΏΡΠΈΡΡΠ½ΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΡΡΠ±Π²Π° ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Π΄Π° Π΄ΡΡΠΆΠΈΡΠ΅ Π² Π³Π»Π°Π²Π°ΡΠ° ΡΠΈ ΠΊΠ°ΠΊΠ²ΠΎ Π΅ Π² ΡΡΠ΅ΠΊΠ°, Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΎΡΡΡ Π½Π΅ ΠΏΠΎΠΌΠ°Π³Π° Ρ ΡΠΎΠ²Π°.
Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ, ΠΏΠΎ Π½Π°ΡΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅, Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΎΡΠΎ ΠΎΠΏΡΠ°Π²Π΄Π°Π½ΠΈΠ΅ Π·Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Fift Π΅ ΡΠΎΠ»ΡΡΠ° ΠΌΡ Π½Π° Ρ ΠΎΡΡ Π΅Π·ΠΈΠΊ Π·Π° Fift Assembler. ΠΠΎ Π½Π΅ Π±ΠΈ Π»ΠΈ Π±ΠΈΠ»ΠΎ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅ Π΄Π° Π²Π³ΡΠ°Π΄ΠΈΡΠ΅ TVM Π°ΡΠ΅ΠΌΠ±Π»Π΅ΡΠ° Π² Π½ΡΠΊΠΎΠΉ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ Π΅Π·ΠΈΠΊ, Π²ΠΌΠ΅ΡΡΠΎ Π΄Π° ΠΈΠ·ΠΌΠΈΡΠ»ΡΡΠ΅ Π½ΠΎΠ² Π·Π° ΡΠ°Π·ΠΈ ΠΏΠΎ ΡΡΡΠ΅ΡΡΠ²ΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π° ΡΠ΅Π»?
TVM Haskell eDSL
Π‘Π΅Π³Π° Π΅ Π²ΡΠ΅ΠΌΠ΅ Π΄Π° ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° Π½Π°ΡΠΈΡ Π²ΡΠΎΡΠΈ ΠΈΠ½ΡΠ΅Π»ΠΈΠ³Π΅Π½ΡΠ΅Π½ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ. Π Π΅ΡΠΈΡ ΠΌΠ΅ Π΄Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΈΠΌ ΠΏΠΎΡΡΡΠ΅ΠΉΠ» Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ, Π½ΠΎ ΠΏΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π΄ΡΡΠ³ ΠΈΠ½ΡΠ΅Π»ΠΈΠ³Π΅Π½ΡΠ΅Π½ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ Π²ΡΠ² FunC Π±ΠΈ Π±ΠΈΠ»ΠΎ ΡΠ²ΡΡΠ΄Π΅ ΡΠΊΡΡΠ½ΠΎ. ΠΡΠΊΠ°Ρ ΠΌΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΌΠ°Π»ΠΊΠΎ Π²ΠΊΡΡ ΠΈ ΡΠΎΠ²Π° Π±Π΅ΡΠ΅ Π½Π°ΡΠΈΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½ Π΅Π·ΠΈΠΊ Π·Π° Π°ΡΠ΅ΠΌΠ±Π»ΠΈΡΠ°Π½Π΅ Π·Π° TVM.
ΠΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° Fift Assembler, Π½Π°ΡΠΈΡΡ Π½ΠΎΠ² Π΅Π·ΠΈΠΊ Π΅ Π²Π³ΡΠ°Π΄Π΅Π½, Π½ΠΎ Π½ΠΈΠ΅ ΠΈΠ·Π±ΡΠ°Ρ ΠΌΠ΅ Haskell ΠΊΠ°ΡΠΎ Ρ ΠΎΡΡ Π²ΠΌΠ΅ΡΡΠΎ Fift, ΠΊΠΎΠ΅ΡΠΎ Π½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ Π²ΡΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π½Π°ΠΏΡΠ»Π½ΠΎ ΠΎΡ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΡΡΡΠ²ΡΡΡΠ΅Π½ΡΡΠ²Π°Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° ΠΎΡ ΡΠΈΠΏΠΎΠ²Π΅. ΠΠΎΠ³Π°ΡΠΎ ΡΠ°Π±ΠΎΡΠΈΡΠ΅ Ρ ΠΈΠ½ΡΠ΅Π»ΠΈΠ³Π΅Π½ΡΠ½ΠΈ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈ, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ΅Π½Π°ΡΠ° Π΄ΠΎΡΠΈ Π½Π° ΠΌΠ°Π»ΠΊΠ° Π³ΡΠ΅ΡΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΠΈΡΠΎΠΊΠ°, ΡΡΠ°ΡΠΈΡΠ½ΠΎΡΠΎ Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅ ΡΠΏΠΎΡΠ΅Π΄ Π½Π°Ρ Π΅ Π³ΠΎΠ»ΡΠΌΠΎ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²ΠΎ.
ΠΠ° Π΄Π° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° 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 Π·Π° ΡΠ΅ΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅ ΡΠΈ,
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com