ΠŸΡ€Π΅Π²Ρ€Π°Ρ‰Π°Ρ FunC Π² FunCtional с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Haskell: ΠΊΠ°ΠΊ Serokell ΠΏΠΎΠ±Π΅Π΄ΠΈΠ»ΠΈ Π² Telegram Blockchain Competition

Π’Ρ‹ навСрняка ΡΠ»Ρ‹ΡˆΠ°Π»ΠΈ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Telegram собираСтся Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡƒ Ton. Но Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π΅ Ρ‚Π°ΠΊ Π΄Π°Π²Π½ΠΎ Telegram объявил конкурс Π½Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ² для этой ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹.

Команда Serokell с Π±ΠΎΠ³Π°Ρ‚Ρ‹ΠΌ ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π½Π΅ ΠΌΠΎΠ³Π»Π° ΠΎΡΡ‚Π°Ρ‚ΡŒΡΡ Π² сторонС. ΠœΡ‹ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π½Π° конкурс пятСрых сотрудников, Π° ΡƒΠΆΠ΅ Ρ‡Π΅Ρ€Π΅Π· Π΄Π²Π΅ Π½Π΅Π΄Π΅Π»ΠΈ ΠΎΠ½ΠΈ заняли Π² Π½Π΅ΠΌ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ мСсто ΠΏΠΎΠ΄ (Π½Π΅)скромным Ρ€Π°Π½Π΄ΠΎΠΌΠ½Ρ‹ΠΌ Π½ΠΈΠΊΠΎΠΌ Sexy Chameleon. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я расскаТу ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈΠΌ это ΡƒΠ΄Π°Π»ΠΎΡΡŒ. НадССмся, Π·Π° блиТайшиС Π΄Π΅ΡΡΡ‚ΡŒ ΠΌΠΈΠ½ΡƒΡ‚ Π²Ρ‹ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠ½ΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ, Π° ΠΊΠ°ΠΊ максимум Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π² Π½Π΅ΠΉ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎ смоТСтС ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π² своСй Ρ€Π°Π±ΠΎΡ‚Π΅.

Но Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ с нСбольшого погруТСния Π² контСкст.

ΠšΠΎΠ½ΠΊΡƒΡ€Ρ ΠΈ Π΅Π³ΠΎ условия

Π˜Ρ‚Π°ΠΊ, основными Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ участников стали рСализация ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ· ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ внСсСниС ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΏΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡŽ экосистСмы TON. ΠšΠΎΠ½ΠΊΡƒΡ€Ρ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠ» с 24 сСнтября ΠΏΠΎ 15 октября, Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ объявили лишь 15 ноября. Π”ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ Π΄ΠΎΠ»Π³ΠΎ, учитывая, Ρ‡Ρ‚ΠΎ Π·Π° это врСмя Telegram успСл провСсти ΠΈ ΠΎΠ³Π»Π°ΡΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ контСстов ΠΏΠΎ Π΄ΠΈΠ·Π°ΠΉΠ½Ρƒ ΠΈ ΠΏΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° C++ для тСстирования ΠΈ ΠΎΡ†Π΅Π½ΠΊΠΈ качСства VoIP-Π·Π²ΠΎΠ½ΠΊΠΎΠ² Π² Telegram.

ΠœΡ‹ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ ΠΈΠ· списка, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ, Π΄Π²Π° смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°. Для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ… ΠΌΡ‹ использовали инструмСнты, Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡŽΡ‰ΠΈΠ΅ΡΡ вмСстС с TON, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ Π½Π° Π½ΠΎΠ²ΠΎΠΌ языкС, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠΌ нашими ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π°ΠΌΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для TON ΠΈ встроСнном Π² Haskell.

Π’Ρ‹Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ языка программирования Π½Π΅ случаСн. Π’ нашСм ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ Π±Π»ΠΎΠ³Π΅ ΠΌΡ‹ часто рассказываСм, ΠΏΠΎΡ‡Π΅ΠΌΡƒ считаСм ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… языков большим ΠΏΡ€Π΅ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ Π² Ρ†Π΅Π»ΠΎΠΌ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌ ΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ. ΠšΡΡ‚Π°Ρ‚ΠΈ, Π² Π½Π΅ΠΌ Π΅ΡΡ‚ΡŒ ΠΈ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π» этой ΡΡ‚Π°Ρ‚ΡŒΠΈ.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ Π²ΠΎΠΎΠ±Ρ‰Π΅ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΡƒΡ‡Π°ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ

Если Π²ΠΊΡ€Π°Ρ‚Ρ†Π΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ наша спСциализация β€” это нСстандартныС ΠΈ слоТныС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ особых Π½Π°Π²Ρ‹ΠΊΠΎΠ² ΠΈ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Π½Π°ΡƒΡ‡Π½ΡƒΡŽ Ρ†Π΅Π½Π½ΠΎΡΡ‚ΡŒ для IT-сообщСства. ΠœΡ‹ горячо ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌ open-source Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΈ занимаСмся Π΅Π΅ популяризациСй, Π° Ρ‚Π°ΠΊΠΆΠ΅ сотрудничаСм с Π²Π΅Π΄ΡƒΡ‰ΠΈΠΌΠΈ унивСрситСтами России Π² области ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Ρ… Π½Π°ΡƒΠΊ ΠΈ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΈ.

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ конкурса ΠΈ ΠΏΡ€ΠΈΡ‡Π°ΡΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΊ горячо Π»ΡŽΠ±ΠΈΠΌΠΎΠΌΡƒ Π½Π°ΠΌΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ Π’Π΅Π»Π΅Π³Ρ€Π°ΠΌ сами ΠΏΠΎ сСбС Π±Ρ‹Π»ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠΉ ΠΌΠΎΡ‚ΠΈΠ²Π°Ρ†ΠΈΠ΅ΠΉ, Π½Ρƒ Π° ΠΏΡ€ΠΈΠ·ΠΎΠ²ΠΎΠΉ Ρ„ΠΎΠ½Π΄ стал Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ стимулом. πŸ™‚

ИсслСдованиС Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π° TON

ΠœΡ‹ ΠΏΡ€ΠΈΡΡ‚Π°Π»ΡŒΠ½ΠΎ слСдим Π·Π° Π½ΠΎΠ²Ρ‹ΠΌΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°ΠΌΠΈ Π² Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π΅, искусствСнном ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚Π΅ ΠΈ машинном ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠΈ ΠΈ стараСмся Π½Π΅ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅Π»ΠΈΠ·Π° Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· сфСр, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΊ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ старта конкурса наша ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡƒΠΆΠ΅ Π±Ρ‹Π»Π° Π·Π½Π°ΠΊΠΎΠΌΠ° с идСями ΠΈΠ· TON white paper. Однако Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с TON ΠΌΡ‹ Π½Π΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Ρ‚Π΅Ρ…Π½ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΈ фактичСский исходный ΠΊΠΎΠ΄ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, поэтому ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ шаг Π±Ρ‹Π» достаточно ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½ β€” Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ исслСдованиС ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π½Π° сайтС ΠΈ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

К Π½Π°Ρ‡Π°Π»Ρƒ конкурса ΠΊΠΎΠ΄ ΡƒΠΆΠ΅ Π±Ρ‹Π» ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½, поэтому, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ врСмя, ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΏΠΎΠΈΡΠΊΠ°Ρ‚ΡŒ руководство ΠΈΠ»ΠΈ Π²Ρ‹ΠΆΠΈΠΌΠΊΡƒ, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ. К соТалСнию, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° это Π½Π΅ Π΄Π°Π»ΠΎ β€” ΠΊΡ€ΠΎΠΌΠ΅ инструкции ΠΏΠΎ сборкС ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Π½Π° Ubuntu, Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² ΠΌΡ‹ Π½Π΅ нашли.

Π‘Π°ΠΌΠ° докумСнтация оказалась Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠΉ, Π½ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Π΅ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°Ρ… Π±Ρ‹Π»ΠΎ слоТно. Π”ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ часто Π½Π°ΠΌ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Ρ‚Π΅ΠΌ ΠΈΠ»ΠΈ ΠΈΠ½Ρ‹ΠΌ ΠΏΡƒΠ½ΠΊΡ‚Π°ΠΌ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ с высокоуровнСвых описаний абстрактных ΠΈΠ΄Π΅ΠΉ Π½Π° Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π‘Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΡ€ΠΎΡ‰Π΅, Ссли Π±Ρ‹ Π² спСцификации Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ описания Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина прСдставляСт свой стСк, скорСС ΠΎΡ‚Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΡ… смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρ‹ для ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ TON, Ρ‡Π΅ΠΌ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΈΠΌ.

Nix: собираСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚

Π’ Serokell ΠΌΡ‹ большиС ΠΏΠΎΠΊΠ»ΠΎΠ½Π½ΠΈΠΊΠΈ Nix. ΠœΡ‹ собираСм ΠΈΠΌ наши ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ ΠΈ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π΅ΠΌ ΠΈΡ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ NixOps, Π° Π½Π° всСх Π½Π°ΡˆΠΈΡ… сСрвСрах установлСна NixOS. Благодаря этому всС наши Π±ΠΈΠ»Π΄Ρ‹ воспроизводимы ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΠΎΠ΄ любой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Nix.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ Π½Π°Ρ‡Π°Π»ΠΈ с создания Nix overlay с Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ для сборки 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, Ubuntu ΠΈΠ»ΠΈ macOS.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для TON

Код смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ² Π² TON Network выполняСтся Π½Π° TON Virtual Machine (TVM). TVM слоТнСС, Ρ‡Π΅ΠΌ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин, ΠΈ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ вСсьма интСрСсным Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΠΎΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠ½Π° ΡƒΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с продолТСниями (continuations) ΠΈ ссылками Π½Π° Π΄Π°Π½Π½Ρ‹Π΅.

Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, рСбята ΠΈΠ· TON создали Ρ†Π΅Π»Ρ‹Ρ… Ρ‚Ρ€ΠΈ Π½ΠΎΠ²Ρ‹Ρ… языка программирования:

Fift β€” ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ стСковый язык программирования, Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‰ΠΈΠΉ Forth. Π•Π³ΠΎ супСр-ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ β€” Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с TVM.

FunC β€” язык программирования смарт ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° C ΠΈ компилируСтся Π² Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ язык β€” Fift Assembler.

Fift Assembler β€” Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Fift для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ исполняСмого ΠΊΠΎΠ΄Π° для TVM. Π£ Fift Assembler отсутствуСт компилятор. Π­Ρ‚ΠΎ встраиваСмый ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ язык (eDSL).

Наши конкурсныС Ρ€Π°Π±ΠΎΡ‚Ρ‹

НаконСц, ΠΏΡ€ΠΈΡˆΠ»ΠΎ врСмя ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π½Π°ΡˆΠΈΡ… усилий.

Асинхронный ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π»

ΠŸΠ»Π°Ρ‚Π΅ΠΆΠ½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» (payment channel) β€” смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π΄Π²ΡƒΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠΈ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Π°. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ экономятся Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ дСньги (отсутствуСт комиссия), Π½ΠΎ ΠΈ врСмя (Π²Π°ΠΌ Π½Π΅ Π½Π°Π΄ΠΎ ΠΆΠ΄Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° обработаСтся ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ Π±Π»ΠΎΠΊ). ΠŸΠ»Π°Ρ‚Π΅ΠΆΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ сколь ΡƒΠ³ΠΎΠ΄Π½ΠΎ малСнькими ΠΈ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ часто, насколько это трСбуСтся. ΠŸΡ€ΠΈ этом сторонам Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΡΠΏΡ€Π°Π²Π΅Π΄Π»ΠΈΠ²ΠΎΡΡ‚ΡŒ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ расчСта Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π° смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠΌ.

ΠœΡ‹ нашли довольно простоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Π”Π²Π΅ стороны ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ подписанными сообщСниями, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… содСрТит Π΄Π²Π° числа β€” ΠΏΠΎΠ»Π½ΡƒΡŽ сумму, ΡƒΠΏΠ»Π°Ρ‡Π΅Π½Π½ΡƒΡŽ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΈΠ· участников. Π­Ρ‚ΠΈ Π΄Π²Π° числа Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΊΠ°ΠΊ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Π΅ часы Π² Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… распрСдСлСнных систСмах ΠΈ Π·Π°Π΄Π°ΡŽΡ‚ порядок Β«ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ Π΄ΠΎΒ» Π½Π° транзакциях. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ эти Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ смоТСт Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ любой Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚.

На самом Π΄Π΅Π»Π΅ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этой ΠΈΠ΄Π΅ΠΈ достаточно ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ числа, Π½ΠΎ ΠΌΡ‹ оставили ΠΎΠ±Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π°ΠΊ ΠΌΡ‹ смогли ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс. Помимо этого, ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ сообщСниС Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ°. Π‘Π΅Π· Π½Π΅Π³ΠΎ, Ссли сообщСниС ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ потСряСтся, Ρ‚ΠΎ, хотя всС суммы ΠΈ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ рассчСт Π±ΡƒΠ΄ΡƒΡ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌΠΈ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎΡ‚Π΅Ρ€ΡŽ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π°ΡˆΡƒ идСю, ΠΌΡ‹ поискали ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования Ρ‚Π°ΠΊΠΎΠ³ΠΎ простого ΠΈ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°. К ΡƒΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΡŽ, ΠΌΡ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΈ всСго Π΄Π²Π°:

  1. ОписаниС ΠΏΠΎΡ…ΠΎΠΆΠ΅Π³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для случая ΠΎΠ΄Π½ΠΎΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°.
  2. Π’ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ описана Ρ‚Π° ΠΆΠ΅ идСя, Ρ‡Ρ‚ΠΎ ΠΈ Ρƒ нас, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±Π΅Π· объяснСния ΠΌΠ½ΠΎΠ³ΠΈΡ… Π²Π°ΠΆΠ½Ρ‹Ρ… Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ общая ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ².

Π‘Ρ‚Π°Π»ΠΎ ясно, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ смысл ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ наш ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ», ΡƒΠ΄Π΅Π»ΠΈΠ² особоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π΅Π³ΠΎ коррСктности. ПослС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ спСцификация Π±Ρ‹Π»Π° Π³ΠΎΡ‚ΠΎΠ²Π°, ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π° Π½Π΅Ρ‘ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ.

ΠœΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π½Π° 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