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