О Ρ‚ΠΎΠΌ ΠΊΠ°ΠΊ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π² Telegram Open Network (TON)

О Ρ‚ΠΎΠΌ ΠΊΠ°ΠΊ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π² TON

О Ρ‡Π΅ΠΌ эта ΡΡ‚Π°Ρ‚ΡŒΡ?

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я расскаТу ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ поучаствовал Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ (ΠΈΠ· Π΄Π²ΡƒΡ…) конкурсС Telegram ΠΏΠΎ Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Ρƒ, Π½Π΅ занял ΠΏΡ€ΠΈΠ·ΠΎΠ²ΠΎΠ΅ мСсто ΠΈ Ρ€Π΅ΡˆΠΈΠ» Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ‹Ρ‚ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Π½Π΅ ΠΊΠ°Π½ΡƒΠ» Π² Π›Π΅Ρ‚Ρƒ ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΠΌΠΎΠ³ ΠΊΠΎΠΌΡƒ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ.

Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΠ½Π΅ Π½Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ ΠΏΠΈΡΠ°Ρ‚ΡŒ абстрактный ΠΊΠΎΠ΄, Π° ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‡Π΅Π΅, для ΡΡ‚Π°Ρ‚ΡŒΠΈ я написал смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ Π»ΠΎΡ‚Π΅Ρ€Π΅ΡŽ ΠΈ сайт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΈΠ· TON Π±Π΅Π· использования ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰.

Π‘Ρ‚Π°Ρ‚ΡŒΡ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½Π° Ρ‚Π΅ΠΌ, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ свой ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π² TON, Π½ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ с Ρ‡Π΅Π³ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ.

На ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π»ΠΎΡ‚Π΅Ρ€Π΅ΠΈ я ΠΏΡ€ΠΎΠΉΠ΄Ρƒ ΠΎΡ‚ установки окруТСния Π΄ΠΎ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°, взаимодСйствия с Π½ΠΈΠΌ ΠΈ Π½Π°ΠΏΠΈΡˆΡƒ сайт для получСния ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

Об участии Π² конкурсС

Π’ октябрС ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ³ΠΎ Π³ΠΎΠ΄Π° Telegram объявил конкурс ΠΏΠΎ Π±Π»ΠΎΠΊΡ‡Π΅ΠΉΠ½Ρƒ с Π½ΠΎΠ²Ρ‹ΠΌΠΈ языками Fift ΠΈ FunC. НуТно Π±Ρ‹Π»ΠΎ Π½Π° Π²Ρ‹Π±ΠΎΡ€ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ ΠΈΠ· пяти ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ². Π― посчитал, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ Π·Π°Π½ΡΡ‚ΡŒΡΡ Ρ‡Π΅ΠΌ-Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ, ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ язык ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ, Π΄Π°ΠΆΠ΅ Ссли Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ Π½Π΅ придСтся ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Π΅Ρ‰Π΅. Плюс, Ρ‚Π΅ΠΌΠ° постоянно Π½Π° слуху.

Π‘Ρ‚ΠΎΠΈΡ‚ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ‹Ρ‚Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ² Ρƒ мСня Π½Π΅ Π±Ρ‹Π»ΠΎ.

Π― ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π» ΡƒΡ‡Π°ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎ самого ΠΊΠΎΠ½Ρ†Π° ΠΏΠΎΠΊΠ° получаСтся ΠΈ послС Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ±Π·ΠΎΡ€Π½ΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ, Π½ΠΎ зафСйлился сразу Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ. Π― написал кошСлСк с ΠΌΡƒΠ»ΡŒΡ‚ΠΈ-подписью Π½Π° FunC ΠΈ ΠΎΠ½ Π² ΠΎΠ±Ρ‰Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π». Π—Π° основу взял смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π½Π° Solidity.

На Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚ я посчитал, этого Ρ‚ΠΎΡ‡Π½ΠΎ достаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π½ΡΡ‚ΡŒ хотя Π±Ρ‹ ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ ΠΏΡ€ΠΈΠ·ΠΎΠ²ΠΎΠ΅ мСсто. Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΎΠΊΠΎΠ»ΠΎ 40 ΠΈΠ· 60 участников стали ΠΏΡ€ΠΈΠ·Π΅Ρ€Π°ΠΌΠΈ ΠΈ мСня срСди Π½ΠΈΡ… Π½Π΅ Π±Ρ‹Π»ΠΎ. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, Π² этом Π½ΠΈΡ‡Π΅Π³ΠΎ ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎΠ³ΠΎ, Π½ΠΎ мСня напрягла ΠΎΠ΄Π½Π° Π²Π΅Ρ‰ΡŒ. На ΠΌΠΎΠΌΠ΅Π½Ρ‚ объявлСниС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Ρ€Π΅Π²ΡŒΡŽ с тСстом ΠΊ ΠΌΠΎΠ΅ΠΌΡƒ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρƒ Π½Π΅ Π±Ρ‹Π»ΠΎ сдСлано, я спросил Ρƒ участников Π² Ρ‡Π°Ρ‚Π΅ Π΅ΡΡ‚ΡŒ Π»ΠΈ ΠΊΡ‚ΠΎ Π΅Ρ‰Π΅ Ρƒ ΠΊΠΎΠ³ΠΎ Π΅Π³ΠΎ Π½Π΅Ρ‚, Ρ‚Π°ΠΊΠΈΡ… Π½Π΅ Π±Ρ‹Π»ΠΎ.

Π’ΠΈΠ΄ΠΈΠΌΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ² Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΌΠΎΠΈ сообщСния Ρ‡Π΅Ρ€Π΅Π· Π΄Π²Π° дня ΡΡƒΠ΄ΡŒΠΈ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»ΠΈ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ ΠΈ я Ρ‚Π°ΠΊ ΠΈ Π½Π΅ понял, ΠΎΠ½ΠΈ случайно пропустили ΠΌΠΎΠΉ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π²ΠΎ врСмя судСйства ΠΈΠ»ΠΈ просто посчитали, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ»ΠΎΡ…, Ρ‡Ρ‚ΠΎ Π½Π΅ нуТдаСтся Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ. Π― Π·Π°Π΄Π°Π» вопрос Π½Π° страницС, Π½ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ». Π₯отя ΠΊΡ‚ΠΎ судил β€” Π½Π΅ сСкрСт, ΠΏΠΈΡΠ°Ρ‚ΡŒ Π»ΠΈΡ‡Π½Ρ‹Π΅ сообщСния я посчитал лишним.

Π’Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½ΠΎ Π½Π΅ ΠΌΠ°Π»ΠΎ, поэтому Π±Ρ‹Π»ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΡŽ. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ, Ρ‚ΠΎ ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ врСмя всСм заинтСрСсованным.

ΠšΠΎΠ½Ρ†Π΅ΠΏΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ² Π² TON

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π°Π΄ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с ΠΊΠ°ΠΊΠΎΠΉ стороны Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΏΠΎΠ΄ΠΎΠΉΡ‚ΠΈ ΠΊ этой ΡˆΡ‚ΡƒΠΊΠ΅. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ сСйчас я расскаТу ΠΈΠ· ΠΊΠ°ΠΊΠΈΡ… частСй систСма состоит. Π’ΠΎΡ‡Π½Π΅Π΅ ΠΊΠ°ΠΊΠΈΠ΅ части Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ хотя Π±Ρ‹ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚.

ΠœΡ‹ сосрСдоточимся Π½Π° написании смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с TON Virtual Machine (TVM), Fift ΠΈ FunC, поэтому ΡΡ‚Π°Ρ‚ΡŒΡ большС ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° описаниС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. На Ρ‚ΠΎΠΌ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ сама ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° Ρ‚ΡƒΡ‚ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ.

Π’ΠΎΠΎΠ±Ρ‰Π΅ ΠΎ Ρ‚ΠΎΠΌ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ TVM ΠΈ язык Fift Π΅ΡΡ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ докумСнтация. Π’ΠΎ врСмя участия Π² конкурсС ΠΈ сСйчас Π²ΠΎ врСмя написания Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° я часто обращался ΠΊ Π½Π΅ΠΉ.

Основной язык Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΈΡˆΡƒΡ‚ΡΡ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρ‹ β€” FunC. Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ Π½Π΅ΠΌΡƒ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π΅Ρ‚, поэтому Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π°Π΄ΠΎ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ² ΠΈΠ· ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ рСпозитория ΠΈ саму Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ языка Ρ‚Π°ΠΌ ΠΆΠ΅, плюс ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠ² Π·Π° ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠΈΠ΅ Π΄Π²Π° конкурса. Бсылки Π² ΠΊΠΎΠ½Ρ†Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ.

Допустим ΠΌΡ‹ ΡƒΠΆΠ΅ написали смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π½Π° FunC, послС этого ΠΌΡ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠΎΠ΄ Π² Fift-ассСмблСр.

Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ смартконтракт остаСтся ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ. Для этого Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π° Fift, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π° Π²Ρ…ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° ΠΈ Π΅Ρ‰Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Π° Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ получится Ρ„Π°ΠΉΠ» с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ .boc (Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ "bag of cells"), ΠΈ, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ напишСм, ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ ΠΈ адрСс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ гСнСрируСтся Π½Π° основС ΠΊΠΎΠ΄Π° смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°. На адрСс смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Ρ‰Π΅ Π½Π΅ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π³Ρ€Π°ΠΌΡ‹.

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

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΌΡ‹ поняли ΠΊΠ°ΠΊ публикуСтся ΠΊΠΎΠ΄, дальшС становится ΠΏΡ€ΠΎΡ‰Π΅. ΠœΡ‹ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π·Π½Π°Π΅ΠΌ Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‚ΠΈΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°. И Π²ΠΎ врСмя написания ΠΈΡ‰Π΅ΠΌ ΠΊΠ°ΠΊ это ΡƒΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°Ρ…, Π»ΠΈΠ±ΠΎ заглядываСм Π² ΠΊΠΎΠ΄ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Fift ΠΈ FunC Π² ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, Π»ΠΈΠ±ΠΎ смотрим Π² ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

ΠžΡ‡Π΅Π½ΡŒ часто я искал ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словам Π² Telegram Ρ‡Π°Ρ‚Π΅ Π³Π΄Π΅ ΡΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ всС участники конкурса ΠΈ сотрудники Telegram Π² Ρ‚ΠΎΠΌ числС, Ρ‚Π°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Ρ‡Ρ‚ΠΎ Π²ΠΎ врСмя конкурса всС ΡΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΌ ΠΈ Π½Π°Ρ‡Π°Π»ΠΈ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ Fift ΠΈ FunC. Бсылка Π² ΠΊΠΎΠ½Ρ†Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ.

ΠŸΠΎΡ€Π° ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΎΡ‚ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ ΠΊ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅.

ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° окруТСния для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с TON

ВсС Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ описано Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Π΄Π΅Π»Π°Π» Π½Π° MacOS ΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ» Π² чистой Ubuntu 18.04 LTS Π½Π° Docker.

ΠŸΠ΅Ρ€Π²ΠΎΠ΅ Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ lite-client с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ запросы Π² TON.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ Π½Π° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ сайтС довольно ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΈ понятно описываСт процСсс установки ΠΈ опускаСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅Ρ‚Π°Π»ΠΈ. Π’ΡƒΡ‚ ΠΌΡ‹ слСдуСм инструкции ΠΏΠΎΠΏΡƒΡ‚Π½ΠΎ устанавливая Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΠ΅ зависимости. Π― Π½Π΅ стал сам ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ устанавливал ΠΈΠ· ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ рСпозитория Ubuntu (Π½Π° MacOS я использовал brew).

apt -y install git 
apt -y install wget 
apt -y install cmake 
apt -y install g++ 
apt -y install zlib1g-dev 
apt -y install libssl-dev 

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ всС зависимости установлСны ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ lite-client, Fift, FunC.

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΊΠ»ΠΎΠ½ΠΈΡ€ΡƒΠ΅ΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ TON вмСстС с зависимостями. Для удобства всС Π±ΡƒΠ΄Π΅ΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ Π² ΠΏΠ°ΠΏΠΊΠ΅ ~/TON.

cd ~/TON
git clone https://github.com/ton-blockchain/ton.git
cd ./ton
git submodule update --init --recursive

Π’ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€Ρ‚ΠΈΠΈ Ρ‚Π°ΠΊΠΆΠ΅ хранятся Ρ€Π΅Π°Π»Π·ΠΈΠ°Ρ†ΠΈΠΈ Fift ΠΈ FunC.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Код рСпозитория склонирован Π² ΠΏΠ°ΠΏΠΊΡƒ ~/TON/ton. Π’ ~/TON создаСм ΠΏΠ°ΠΏΠΊΡƒ build ΠΈ собираСм Π² Π½Π΅ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚.

mkdir ~/TON/build 
cd ~/TON/build
cmake ../ton

Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ собираСмся ΠΏΠΈΡΠ°Ρ‚ΡŒ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ lite-client, Π½ΠΎ ΠΈ Fift с FunC, поэтому ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ всС. НС быстрый процСсс поэтому ΠΆΠ΄Π΅ΠΌ.

cmake --build . --target lite-client
cmake --build . --target fift
cmake --build . --target func

Π”Π°Π»Π΅Π΅ скачиваСм ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π»Π΅ΠΆΠ°Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ Π½ΠΎΠ΄Π΅ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ lite-client Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ.

wget https://test.ton.org/ton-lite-client-test1.config.json

Π”Π΅Π»Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ запросы Π² TON

Π’Π΅ΠΏΠ΅Ρ€ΡŒ запустим lite-client.

cd ~/TON/build
./lite-client/lite-client -C ton-lite-client-test1.config.json

Если сборка ΠΏΡ€ΠΎΡˆΠ»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, Ρ‚ΠΎ послС запуска Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π»ΠΎΠ³ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π»Π°ΠΉΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΊ Π½ΠΎΠ΄Π΅.

[ 1][t 2][1582054822.963129282][lite-client.h:201][!testnode]   conn ready
[ 2][t 2][1582054823.085654020][lite-client.cpp:277][!testnode] server version is 1.1, capabilities 7
[ 3][t 2][1582054823.085725069][lite-client.cpp:286][!testnode] server time is 1582054823 (delta 0)
...

МоТно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ help ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ доступны.

help

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅.

list of available commands:
last    Get last block and state info from server
sendfile <filename> Load a serialized message from <filename> and send it to server
getaccount <addr> [<block-id-ext>]  Loads the most recent state of specified account; <addr> is in [<workchain>:]<hex-or-base64-addr> format
runmethod <addr> [<block-id-ext>] <method-id> <params>...   Runs GET method <method-id> of account <addr> with specified parameters

last ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ послСдний созданный Π±Π»ΠΎΠΊ с сСрвСра. 

sendfile <filename> отправляСт Π² TON Ρ„Π°ΠΉΠ» с сообщСниСм, ΠΈΠΌΠ΅Π½Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ публикуСтся смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΈ запрсосы ΠΊ Π½Π΅ΠΌΡƒ. 

getaccount <addr> Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ адрСсом. 

runmethod <addr> [<block-id-ext>] <method-id> <params>  запускаСт get-ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ смартконтракта. 

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ написанию самого ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°.

РСализация

ИдСя

Как ΡƒΠΆΠ΅ писал Π²Ρ‹ΡˆΠ΅, смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ пишСм это лотСрСя.

ΠŸΡ€ΠΈΡ‡Π΅ΠΌ это Π½Π΅ лотСрСя Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π°Π΄ΠΎ ΠΊΡƒΠΏΠΈΡ‚ΡŒ Π±ΠΈΠ»Π΅Ρ‚ ΠΈ ΠΆΠ΄Π°Ρ‚ΡŒ час, дСнь ΠΈΠ»ΠΈ мСсяц, Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ Π½Π° адрСс ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° N Π³Ρ€Π°ΠΌΠΎΠ², ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ 2 * N Π³Ρ€Π°ΠΌΠΎΠ² ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Π΅Ρ‚. Π’Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ±Π΅Π΄Ρ‹ сдСлаСм ΠΎΠΊΠΎΠ»ΠΎ 40%. Если Π³Ρ€Π°ΠΌΠΎΠ² для Π²Ρ‹ΠΏΠ»Π°Ρ‚Ρ‹ Π½Π΅ достаточно, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ ΠΏΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ.

ΠŸΡ€ΠΈΡ‡Π΅ΠΌ Π²Π°ΠΆΠ½ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ставки ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ Π² ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ сразу ΠΌΠΎΠ³ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π²Ρ‹ΠΈΠ³Ρ€Π°Π» ΠΎΠ½ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π». ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Π΅Π±-сайт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ ставки ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΈΠ· TON.

НаписаниС смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°

Для удобства я сдСлал подствСтку ΠΊΠΎΠ΄Π° для FunC, ΠΏΠ»Π°Π³ΠΈΠ½ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π² поискС Visual Studio Code, Ссли Π²Π΄Ρ€ΡƒΠ³ захочСтся Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ, Ρ‚ΠΎ Π²Ρ‹Π»ΠΎΠΆΠΈΠ» ΠΏΠ»Π°Π³ΠΈΠ½ Π² ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ доступ. Π’Π°ΠΊΠΆΠ΅ Ρ€Π°Π½Π΅Π΅ ΠΊΠ΅ΠΌ-Ρ‚ΠΎ Π±Ρ‹Π» сдСлан ΠΏΠ»Π°Π³ΠΈΠ½ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Fift, Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π°ΠΉΡ‚ΠΈ Π² VSC.

Π‘Ρ€Π°Π·Ρƒ создадим Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΊΡƒΠ΄Π° Π±ΡƒΠ΄Π΅ΠΌ ΠΊΠΎΠΌΠΈΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ΡŒ сСбС Тизнь ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΈ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ локально, Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€ ΠΏΠΎΠΊΠ° ΠΎΠ½ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ². Волько послС этого ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ Π΅Π³ΠΎ Π² TON.

Π£ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° Π΅ΡΡ‚ΡŒ Π΄Π²Π° Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ, recv_external() эта функция выполняСтся ΠΊΠΎΠ³Π΄Π° запрос ΠΊ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρƒ происходит ΠΈΠ· внСшнСго ΠΌΠΈΡ€Π°, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½Π΅ ΠΈΠ· TON, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ сами Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ сообщСниС ΠΈ отправляСм Π΅Π³ΠΎ Ρ‡Π΅Ρ€Π΅Π· lite-client. Π’Ρ‚ΠΎΡ€ΠΎΠΉ, recv_internal() это ΠΊΠΎΠ³Π΄Π° Π²Π½ΡƒΡ‚Ρ€ΠΈ самого TON ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ обращаСтся ΠΊ Π½Π°ΡˆΠ΅ΠΌΡƒ. Π’ ΠΎΠ±ΠΎΠΈΡ… случаях ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ с простого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ссли Π΅Π³ΠΎ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ, Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π² Π½Π΅ΠΌ Π½Π΅Ρ‚.

() recv_internal(slice in_msg) impure {
    ;; TODO: implementation 
}

() recv_external(slice in_msg) impure {
    ;; TODO: implementation  
}

Π’ΡƒΡ‚ Π½Π°Π΄ΠΎ ΠΏΠΎΡΡΠ½ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ slice. ВсС хранящиССся Π΄Π°Π½Π½Ρ‹Π΅ Π² TON Blockchain это коллСкция TVM cell ΠΈΠ»ΠΈ просто cell, Π² Ρ‚Π°ΠΊΠΎΠΉ ячСйкС ΠΌΠΎΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄ΠΎ 1023 Π±ΠΈΡ‚ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π΄ΠΎ 4 ссылок Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ячСйки.

TVM cell slice ΠΈΠ»ΠΈ slice это Ρ‡Π°ΡΡ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ cell ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π΅Π΅ парсинга, дальшС Π±ΡƒΠ΄Π΅Ρ‚ понятно. Π“Π»Π°Π²Π½ΠΎΠ΅ для нас, Ρ‡Ρ‚ΠΎ Π² смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ slice ΠΈ Π² зависимости ΠΎΡ‚ Π²ΠΈΠ΄Π° сообщСния ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² recv_external() ΠΈΠ»ΠΈ recv_internal().

impure β€” ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ функция измСняСт Π΄Π°Π½Π½Ρ‹Π΅ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°.

Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠΌ ΠΊΠΎΠ΄ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° Π² lottery-code.fc ΠΈ скомпилируСм.

~/TON/build/crypto/func -APSR -o lottery-compiled.fif ~/TON/ton/crypto/smartcont/stdlib.fc ./lottery-code.fc 

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„Π»Π°Π³ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

~/TON/build/crypto/func -help

Π£ нас получился скомпилированный Fift-ассСмблСр ΠΊΠΎΠ΄ Π² lottery-compiled.fif:

// lottery-compiled.fif

"Asm.fif" include
// automatically generated from `/Users/rajymbekkapisev/TON/ton/crypto/smartcont/stdlib.fc` `./lottery-code.fc` 
PROGRAM{
  DECLPROC recv_internal
  DECLPROC recv_external
  recv_internal PROC:<{
    //  in_msg
    DROP    // 
  }>
  recv_external PROC:<{
    //  in_msg
    DROP    // 
  }>
}END>c

Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ локально, для этого ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠΌ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅.

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, ΠΏΠ΅Ρ€Π²ΠΎΠΉ строчкой ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Asm.fif, это ΠΊΠΎΠ΄ написанный Π½Π° Fift для Fift-ассСмблСра.

Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΈ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ локально создадим Ρ„Π°ΠΉΠ» lottery-test-suite.fif ΠΈ скопируСм Ρ‚ΡƒΠ΄Π° скомпилированный ΠΊΠΎΠ΄ Π·Π°ΠΌΠ΅Π½ΠΈΠ² Π² Π½Π΅ΠΌ послСднюю строчку, которая записываСт ΠΊΠΎΠ΄ смартконтракта Π² константу code, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ:

"TonUtil.fif" include
"Asm.fif" include

PROGRAM{
  DECLPROC recv_internal
  DECLPROC recv_external
  recv_internal PROC:<{
    //  in_msg
    DROP    // 
  }>
  recv_external PROC:<{
    //  in_msg
    DROP    // 
  }>
}END>s constant code

Пока Π²Ρ€ΠΎΠ΄Π΅ понятно, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ„Π°ΠΉΠ» ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»Π»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для запуска TVM.

0 tuple 0x076ef1ea , // magic
0 , 0 , // actions msg_sents
1570998536 , // unix_time
1 , 1 , 3 , // block_lt, trans_lt, rand_seed
0 tuple 100000000000000 , dictnew , , // remaining balance
0 , dictnew , // contract_address, global_config
1 tuple // wrap to another tuple
constant c7

0 constant recv_internal // to run recv_internal() 
-1 constant recv_external // to invoke recv_external()

Π’ c7 ΠΌΡ‹ записываСм контСкст, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ TVM (ΠΈΠ»ΠΈ состояниС сСти). Π•Ρ‰Π΅ Π²ΠΎ врСмя конкурса ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΠΎΠΊΠ°Π·Π°Π» ΠΊΠ°ΠΊ создаСтся c7 ΠΈ я скопировал. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π½Π°ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒ rand_seed Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΡ‚ Π½Π΅Π³ΠΎ зависит гСнСрация случайного числа ΠΈ Π½Π΅ ΠΌΠ΅Π½ΡΡ‚ΡŒ, Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠΆΠ΅ самоС число.

recv_internal ΠΈ recv_external константы со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 0 ΠΈ -1 Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π·Π° Π²Ρ‹Π·ΠΎΠ² ΡΠΎΠΎΡ‚Π²Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½Ρ†ΠΈΠΉ Π² смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π΅.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ тСст ΠΊ Π½Π°ΡˆΠ΅ΠΌΡƒ пустому смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρƒ. Для наглядности ΠΏΠΎΠΊΠ° всС тСсты ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² этот ΠΆΠ΅ Ρ„Π°ΠΉΠ» lottery-test-suite.fif.

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ storage ΠΈ запишСм Π² Π½Π΅Π΅ пустой cell, это Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°.

message это сообщСниС, ΠΊΠΎΡ‚Ρ€ΠΎΠ΅ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ смарт-ΠΊΠΎΠ½Ρ€Ρ‚Π°ΠΊΡ‚Ρƒ ΠΈΠ·Π²Π½Π΅. Π•Π³ΠΎ Ρ‚ΠΎΠΆΠ΅ сдСлаСм ΠΏΠΎΠΊΠ° пустым.

variable storage 
<b b> storage ! 

variable message 
<b b> message ! 

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠ»ΠΈ конастанты ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΡ‹ запускаСм TVM с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ runvmctx ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ созданныС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π½Π° Π²Ρ…ΠΎΠ΄.

message @ 
recv_external 
code 
storage @ 
c7 
runvmctx 

Π’ ΠΈΡ‚ΠΎΠ³Π΅ Ρƒ нас получится Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π° Fift.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΡˆΠΈΠ²ΡˆΠΈΠΉΡΡ ΠΊΠΎΠ΄.

export FIFTPATH=~/TON/ton/crypto/fift/lib // выполняСм ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для удобства 
~/TON/build/crypto/fift -s lottery-test-suite.fif 

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π±Π΅Π· ошибок ΠΈ Π² Π²Ρ‹Π²ΠΎΠ΄Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Π»ΠΎΠ³ выполнСния:

execute SETCP 0
execute DICTPUSHCONST 19 (xC_,1)
execute DICTIGETJMPZ
execute DROP
execute implicit RET
[ 3][t 0][1582281699.325381279][vm.cpp:479]     steps: 5 gas: used=304, max=9223372036854775807, limit=9223372036854775807, credit=0

ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ, ΠΌΡ‹ написали ΠΏΠ΅Ρ€Π²Ρ‹ΡŽ Ρ€Π°Π±ΠΎΡ‡ΡŽΡŽ Π²Π΅Ρ€ΡΠΈΡŽ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π». Π‘Π½Π°Ρ‡Π°Π»Π° займСмся сообщСниями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· внСшнСго ΠΌΠΈΡ€Π° Π² recv_external()

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сам Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ сообщСния ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ.

Но ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ,

  • Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ наш ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΎΡ‚ внСшнСго ΠΌΠΈΡ€Π° ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π»Π°Π΄Π΅Π»Π΅Ρ† ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° ΠΌΠΎΠ³ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π½Π° Π½Π΅Π³ΠΎ внСшниС сообщСния.
  • Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ… ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ отправляСм Π²Π°Π»ΠΈΠ΄Π½ΠΎΠ΅ сообщСниС Π² TON ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ‡Ρ‚ΠΎΠ±Ρ‹ это ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ сообщСния смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΎΡ‚ΠΊΠ»ΠΎΠ½ΠΈΠ» Π΅Π³ΠΎ.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΠΎΡ‡Ρ‚ΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π΅ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ эти Π΄Π²Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ наш ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ внСшниС сообщСния, Π½Π°ΠΌ Ρ‚ΠΎΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΠ± этом.

Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΠΌΡ‹ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ порядкС. Π‘Π½Π°Ρ‡Π°Π»Π° Ρ€Π΅ΡˆΠΈΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ с ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠ΅ΠΌ, Ссли ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΡƒΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π» Ρ‚Π°ΠΊΠΎΠ΅ сообщСниС ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π» Π΅Π³ΠΎ, Ρ‚ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π·. И ΠΏΠΎΡ‚ΠΎΠΌ Ρ€Π΅ΡˆΠΈΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ с Ρ‚Π΅ΠΌ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π½Π½Ρ‹ΠΉ ΠΊΡ€ΡƒΠ³ Π»ΠΈΡ† ΠΌΠΎΠ³ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ сообщСния смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρƒ.

Π•ΡΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ способы Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ с ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠΌΠΈΡΡ сообщСниями. ΠœΡ‹ сдСлаСм Π²ΠΎΡ‚ ΠΊΠ°ΠΊ. Π’ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ счСтчик принятых сообщСний с ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 0. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ сообщСнии смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Ρƒ Π±ΡƒΠ΄Π΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ значСния счСтчика. Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика Π² сообщСнии Π½Π΅ совпадаСт со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π² смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π΅, Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ Π΅Π³ΠΎ, Ссли совпадаСт, Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ счСтчик Π² смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π΅ Π½Π° 1.

ВозрващаСмся Π² lottery-test-suite.fif ΠΈ дописываСм Π² Π½Π΅Π³ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ тСст. ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΠΌ Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€, ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΊΠΈΠ½ΡƒΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. НапримСр ΠΏΡƒΡΡ‚ΡŒ Π² Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° хранится 166, Π° ΠΌΡ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠΌ 165.

<b 166 32 u, b> storage !
<b 165 32 u, b> message !

message @ 
recv_external 
code 
storage @ 
c7 
runvmctx

drop 
exit_code ! 
."Exit code " exit_code @ . cr 
exit_code @ 33 - abort"Test #2 Not passed"

Запустим.

 ~/TON/build/crypto/fift -s lottery-test-suite.fif 

И ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Ρ‡Ρ‚ΠΎ тСст выполняСтся с ошибкой.

[ 1][t 0][1582283084.210902214][words.cpp:3046] lottery-test-suite.fif:67: abort": Test #2 Not passed
[ 1][t 0][1582283084.210941076][fift-main.cpp:196]      Error interpreting file `lottery-test-suite.fif`: error interpreting included file `lottery-test-suite.fif` : lottery-test-suite.fif:67: abort": Test #2 Not passed

На этом этапС lottery-test-suite.fif Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΏΠΎ ссылкС.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ допишСм Π»ΠΎΠ³ΠΈΠΊΡƒ счСтчика Π² смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° Π² lottery-code.fc.

() recv_internal(slice in_msg) impure {
    ;; TODO: implementation 
}

() recv_external(slice in_msg) impure {
    if (slice_empty?(in_msg)) {
        return (); 
    }
    int msg_seqno = in_msg~load_uint(32);
    var ds = begin_parse(get_data());
    int stored_seqno = ds~load_uint(32);
    throw_unless(33, msg_seqno == stored_seqno);
}

Π’ slice in_msg Π»Π΅ΠΆΠΈΡ‚ сообщСниС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ отправляСм.

ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ провСряСм Ссли Π² сообщСнии Π΅ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, Ссли Π½Π΅Ρ‚, Ρ‚ΠΎ просто Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ.

Π”Π°Π»Π΅Π΅ ΠΌΡ‹ парсим сообщСниС. in_msg~load_uint(32) Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ число 165, 32-Ρ… Π±ΠΈΡ‚Π½ΠΎΠ΅ unsigned int ΠΈΠ· ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ сообщСния.

Π”Π°Π»ΡŒΡˆΠ΅ ΠΌΡ‹ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ 32 Π±ΠΈΡ‚Π° ΠΈΠ· Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ΅ число совпадаСт с ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΌ, Ссли Π½Π΅Ρ‚ выбрасываСм ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Π’ нашСм случаС, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π½Π΅ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅Π΅, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒΡΡ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ скомпилируСм.

~/TON/build/crypto/func -APSR -o lottery-compiled.fif ~/TON/ton/crypto/smartcont/stdlib.fc ./lottery-code.fc 

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠΈΠΉΡΡ ΠΊΠΎΠ΄ скопируСм Π² lottery-test-suite.fif, Π½Π΅ забывая Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ послСднюю строчку.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ тСст ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚:

~/TON/build/crypto/fift -s lottery-test-suite.fif

Π’ΠΎΡ‚ Ρ‚ΡƒΡ‚ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ.

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ постоянно ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ скомпилированный ΠΊΠΎΠ΄ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° Π² Ρ„Π°ΠΉΠ» с тСстами Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ, поэтому напишСм скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π² константу Π·Π° нас, Π° ΠΌΡ‹ просто ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠΌ скомпилированный ΠΊΠΎΠ΄ Π² наши тСсты с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ "include".

Π’ ΠΏΠ°ΠΏΠΊΠ΅ с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ создадим Ρ„Π°ΠΉΠ» build.sh со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ содСрТаниСм.

#!/bin/bash

~/TON/build/crypto/func -SPA -R -o lottery-compiled.fif ~/TON/ton/crypto/smartcont/stdlib.fc ./lottery-code.fc

Π‘Π΄Π΅Π»Π°Π΅ΠΌ Π΅Π³ΠΎ исполняСмым.

chmod +x ./build.sh

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, достаточно Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ наш скрипт, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚. Но ΠΊΡ€ΠΎΠΌΠ΅ этого Π½Π°ΠΌ Π½Π°Π΄ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Π³ΠΎ Π² константу code. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ создадим Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» lotter-compiled-for-test.fif, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠΌ Π² Ρ„Π°ΠΉΠ»Π΅ lottery-test-suite.fif.

Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π² sh скирпт ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ просто Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ скомплированный Ρ„Π°ΠΉΠ» Π² lotter-compiled-for-test.fif ΠΈ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π² Π½Π΅ΠΌ послСднюю строчку.

# copy and change for test 
cp lottery-compiled.fif lottery-compiled-for-test.fif
sed '$d' lottery-compiled-for-test.fif > test.fif
rm lottery-compiled-for-test.fif
mv test.fif lottery-compiled-for-test.fif
echo -n "}END>s constant code" >> lottery-compiled-for-test.fif

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, запустим ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠΈΠΉΡΡ скрипт ΠΈ Ρƒ нас сгСнСрируСтся Ρ„Π°ΠΉΠ» lottery-compiled-for-test.fif, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠΌ Π² наш lottery-test-suite.fif

Π’ lottery-test-suite.fif удаляСм ΠΊΠΎΠ΄ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΈ добавляСм строчку "lottery-compiled-for-test.fif" include.

ЗапускаСм тСсты, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ проходят.

~/TON/build/crypto/fift -s lottery-test-suite.fif

ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ запуск тСстов создаим Ρ„Π°ΠΉΠ» test.sh, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сначала Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ build.sh, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ тСсты.

touch test.sh
chmod +x test.sh

Π’Π½ΡƒΡ‚Ρ€ΡŒ пишСм

./build.sh 

echo "nCompilation completedn"

export FIFTPATH=~/TON/ton/crypto/fift/lib
~/TON/build/crypto/fift -s lottery-test-suite.fif

Π‘Π΄Π΅Π»Π°Π΅ΠΌ test.sh ΠΈ запустим, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² работоспособности тСстов.

chmod +x ./test.sh
./test.sh

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ компилируСтся ΠΈ тСсты Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ.

ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈ запускС test.sh сразу Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ компиляция ΠΈ запуск тСстов. Π’ΠΎΡ‚ ссылка Π½Π° ΠΊΠΎΠΌΠΌΠΈΡ‚.

ОкСй, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ Π΄Π°Π²Π°ΠΉΡ‚Π΅ для удобства сдСлаСм Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ Π²Π΅Ρ‰ΡŒ.

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΠ°ΠΏΠΊΡƒ build Π³Π΄Π΅ Π±ΡƒΠ΄Π΅ΠΌ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ скопилированный ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΈ Π΅Π³ΠΎ ΠΊΠ»ΠΎΠ½ записанный Π² константу lottery-compiled.fif, lottery-compiled-for-test.fif. Π’Π°ΠΊΠΆΠ΅ создадим ΠΏΠ°ΠΏΠΊΡƒ test Π³Π΄Π΅ Π±ΡƒΠ΄ΡƒΡ‚ хранится Ρ„Π°ΠΉΠ» с тСстами lottery-test-suite.fif ΠΈ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹. Бсылка Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ измСнСния.

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°.

Π”Π°Π»ΡŒΡˆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ тСст, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ провСряСт, Ρ‡Ρ‚ΠΎ сообщСниС принимаСтся ΠΈ счСтчик обновляСтся Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ отправляСм ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ число. Но ΠΌΡ‹ сдСлаСм это ΠΏΠΎΠ·ΠΆΠ΅.

БСйчас ΠΏΠΎΠ΄ΡƒΠΌΠ°Π΅ΠΌ Π½Π°Π΄ Ρ‚Π΅ΠΌ какая структура Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π² смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π΅.

ΠžΠΏΠΈΡˆΡƒ всС Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…Ρ€Π°Π½ΠΈΠΌ.

`seqno` 32-Ρ… Π±ΠΈΡ‚Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число счСтчик. 

`pubkey` 256-Ρ‚ΠΈ Π±ΠΈΡ‚Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ подпись ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠ·Π²Π½Π΅ сообщСния, ΠΎ Ρ‡Π΅ΠΌ Π½ΠΈΠΆΠ΅. 

`order_seqno` 32-Ρ… Π±ΠΈΡ‚Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число Ρ…Ρ€Π°Π½ΠΈΡ‚ счСтчик количСства ставок. 

`number_of_wins` 32-Ρ… Π±ΠΈΡ‚Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число Ρ…Ρ€Π°Π½ΠΈΡ‚  количСство ΠΏΠΎΠ±Π΅Π΄. 

`incoming_amount` Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… Gram (ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 4 Π±ΠΈΡ‚Π° ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Π΄Π»ΠΈΠ½Ρƒ), Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΎΠ±Ρ‰Π΅Π΅ количСство Π³Ρ€Π°ΠΌΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹ Π½Π° ΠΊΠΎΠ½Ρ‚Ρ€Ρ‚Π°ΠΊΡ‚. 

`outgoing_amount` ΠΎΠ±Ρ‰Π΅Π΅ количСство Π³Ρ€Π°ΠΌΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ΠΎ побСдитСлям. 

`owner_wc` Π½ΠΎΠΌΠ΅Ρ€ Π²ΠΎΡ€ΠΊΡ‡Π΅ΠΉΠ½Π°, 32-Ρ… Π±ΠΈΡ‚Π½ΠΎΠ΅ (Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… мСстах написано, Ρ‡Ρ‚ΠΎ 8-ΠΌΠΈ Π±ΠΈΡ‚Π½ΠΎΠ΅) Ρ†Π΅Π»ΠΎΠ΅ число. Π’ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ всСго Π΄Π²Π° -1 ΠΈ 0. 

`owner_account_id` 256-Ρ‚ΠΈ Π±ΠΈΡ‚Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число, адрСс ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ Π²ΠΎΡ€ΠΊΡ‡Π΅ΠΉΠ½Π΅. 

`orders` пСрСмСнная Ρ‚ΠΈΠΏΠ° ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ, Ρ…Ρ€Π°Π½ΠΈΡ‚ послСдниС Π΄Π²Π°Π΄Ρ†Π°Ρ‚ΡŒ ставок. 

Π”Π°Π»Π΅Π΅ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΠ΅Ρ€Π²ΡƒΡŽ Π½Π°Π·ΠΎΠ²Π΅ΠΌ pack_state(), которая Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ сохранСния Π΅Π³ΠΎ Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°. Π’Ρ‚ΠΎΡ€ΡƒΡŽ, Π½Π°Π·ΠΎΠ²Π΅ΠΌ unpack_state() Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°.

_ pack_state(int seqno, int pubkey, int order_seqno, int number_of_wins, int incoming_amount, int outgoing_amount, int owner_wc, int owner_account_id, cell orders) inline_ref {
    return begin_cell()
            .store_uint(seqno, 32)
            .store_uint(pubkey, 256)
            .store_uint(order_seqno, 32)
            .store_uint(number_of_wins, 32)
            .store_grams(incoming_amount)
            .store_grams(outgoing_amount)
            .store_int(owner_wc, 32)
            .store_uint(owner_account_id, 256)
            .store_dict(orders)
            .end_cell();
}

_ unpack_state() inline_ref {
    var ds = begin_parse(get_data());
    var unpacked = (ds~load_uint(32), ds~load_uint(256), ds~load_uint(32), ds~load_uint(32), ds~load_grams(), ds~load_grams(), ds~load_int(32), ds~load_uint(256), ds~load_dict());
    ds.end_parse();
    return unpacked;
}

ДобавляСм эти Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Π½Π°Ρ‡Π°Π»ΠΎ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡΡ Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½Ρ†ΠΊΠΈΠΈ set_data() ΠΈ ΠΎΠ½Π° Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· pack_state() Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°.

cell packed_state = pack_state(arg_1, .., arg_n); 
set_data(packed_state);

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΠ³Π΄Π° Ρƒ нас Π΅ΡΡ‚ΡŒ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ записи ΠΈ чтСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ дальшС.

Нам Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ входящСС ΠΈΠ·Π²Π½Π΅ сообщСниС подписано Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° (Π½Ρƒ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ доступ ΠΊ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠΌΡƒ ΠΊΠ»ΡŽΡ‡Ρƒ).

Когда ΠΌΡ‹ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ с Π½ΡƒΠΆΠ½Ρ‹ΠΌΠΈ Π½Π°ΠΌ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сохранятся для Π±ΡƒΠ΄ΡƒΡˆΠ΅Π³ΠΎ использования. ΠœΡ‹ запишСм Ρ‚ΡƒΠ΄Π° ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ подпись входящСго сообщСния Π±Ρ‹Π»Π° сдСлана ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ.

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ создадим ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ ΠΈ запишСм Π΅Π³ΠΎ Π² test/keys/owner.pk. Для этого запустим Fift Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.

`newkeypair` гСнСрация ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° ΠΈ запись ΠΈΡ… Π² стСк. 

`drop` удалСния ΠΈΠ· стСка Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ элСмСнта (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡)  

`.s` просто ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ Π»Π΅ΠΆΠΈΡ‚ Π² стСкС Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ 

`"owner.pk" B>file` запись ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° Π² Ρ„Π°ΠΉΠ» с ΠΈΠΌΠ΅Π½Π΅ΠΌ `owner.pk`. 

`bye` Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Fift. 

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΠ°ΠΏΠΊΡƒ keys Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΠ°ΠΏΠΊΠΈ test ΠΈ Ρ‚ΡƒΠ΄Π° запишСм ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡.

mkdir test/keys
cd test/keys
~/TON/build/crypto/fift -i 
newkeypair
 ok
.s 
BYTES:128DB222CEB6CF5722021C3F21D4DF391CE6D5F70C874097E28D06FCE9FD6917 BYTES:DD0A81AAF5C07AAAA0C7772BB274E494E93BB0123AA1B29ECE7D42AE45184128 
drop 
 ok
"owner.pk" B>file
 ok
bye

Π’ΠΈΠ΄ΠΈΠΌ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠ°ΠΏΠΊΠ΅ Ρ„Π°ΠΉΠ» owner.pk.

ΠœΡ‹ удаляСм ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ ΠΈΠ· стСка, ΠΊΠΎΠ³Π΄Π° понадобится ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΈΠ· ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠ³ΠΎ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ подписи. НачнСм с тСста. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ считываСм ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ file>B ΠΈ записываСм Π΅Π³ΠΎ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ owner_private_key, дальшС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ priv>pub ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ Π² ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΈ запишСм Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² owner_public_key.

variable owner_private_key
variable owner_public_key 

"./keys/owner.pk" file>B owner_private_key !
owner_private_key @ priv>pub owner_public_key !

Оба ΠΊΠ»ΡŽΡ‡Π° Π½Π°ΠΌ понадобятся.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ самой ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠ°ΠΊ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pack_state()ΠΈ запишСм Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ storage.

variable owner_private_key
variable owner_public_key 
variable orders
variable owner_wc
variable owner_account_id

"./keys/owner.pk" file>B owner_private_key !
owner_private_key @ priv>pub owner_public_key !
dictnew orders !
0 owner_wc !
0 owner_account_id !

<b 0 32 u, owner_public_key @ B, 0 32 u, 0 32 u, 0 Gram, 0 Gram, owner_wc @ 32 i, owner_account_id @ 256 u,  orders @ dict, b> storage !

Π”Π°Π»Π΅Π΅ составим подписанноС сообщСниС, Π² Π½Π΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ подпись ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика.

Π‘Π½Π°Ρ‡Π°Π»Π° создаСм Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ, ΠΏΠΎΡ‚ΠΎΠΌ подписываСм ΠΈΡ… ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ† Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ подписанноС сообщСниС.

variable message_to_sign
variable message_to_send
variable signature
<b 0 32 u, b> message_to_sign !
message_to_sign @ hashu owner_private_key @ ed25519_sign_uint signature !
<b signature @ B, 0 32 u, b> <s  message_to_send !  

Π’ ΠΈΡ‚ΠΎΠ³Π΅ сообщСниС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠΌ Π² смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ записано Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ message_to_send, ΠΏΡ€ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ hashu, ed25519_sign_uint ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ Fift.

И для запуска тСста снова Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ.

message_to_send @ 
recv_external 
code 
storage @
c7
runvmctx

Π’ΠΎΡ‚ Ρ‚Π°ΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π³Π»ΡΠ΄Ρ‚ΡŒ Ρ„Π°ΠΉΠ» с тСстами Π½Π° Π΄Π°Π½Π½ΠΎΠΌ этапС.

Запустим тСст ΠΈ ΠΎΠ½ ΡƒΠΏΠ°Π΄Π΅Ρ‚, поэтому ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ смог ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ сообщСния Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ подпись.

Π‘Π½Π°Ρ‡Π°Π»Π° считаСм ΠΈΠ· сообщСния 512 Π±ΠΈΡ‚ подписи ΠΈ запишСм Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Π΄Π°Π»Π΅Π΅ считаСм 32 Π±ΠΈΡ‚Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ счСтчика.

Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρƒ нас Π΅ΡΡ‚ΡŒ функция считывания Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° смарт-ΠΊΠΎΠ½Ρ€Π°ΠΊΡ‚Π° Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅.

Π”Π°Π»ΡŒΡˆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° счСтчика ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ с Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ΠΌ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° подписи. Если Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π΅ совпадСт, Ρ‚ΠΎ выбрасываСм ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ.

var signature = in_msg~load_bits(512);
var message = in_msg;
int msg_seqno = message~load_uint(32);
(int stored_seqno, int pubkey, int order_seqno, int number_of_wins, int incoming_amount, int outgoing_amount, int owner_wc, int owner_account_id, cell orders) = unpack_state();
throw_unless(33, msg_seqno == stored_seqno);
throw_unless(34, check_signature(slice_hash(in_msg), signature, pubkey));

Π‘ΠΎΠΎΡ‚Π²Π΅ΡΡ‚Π²ΡƒΡŽΡˆΠΈΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ Π²ΠΎΡ‚ Ρ‚ΡƒΡ‚.

Запустим тСсты ΠΈ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ тСст ΠΏΠ°Π΄Π°Π΅Ρ‚. По Π΄Π²ΡƒΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ, Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠ° Π±ΠΈΡ‚ΠΎΠ² Π² сообщСнии ΠΈ Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠ° Π±ΠΈΡ‚ΠΎΠ² Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, поэтому ΠΊΠΎΠ΄ ΠΏΠ°Π΄Π°Π΅Ρ‚ ΠΏΡ€ΠΈ парсингС. Надо Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ подпись сообщСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ отправляСм ΠΈ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΈΠ· послСднСго тСста.

Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ тСстС Π΄ΠΎΠ±Π°Π²ΠΈΠΌ подпись сообщСния ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°. Π’ΠΎΡ‚ Ρ‚Π°ΠΊ выглядит Ρ„Π°ΠΉΠ» с тСстами Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚.

НапишСм Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ тСст, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ сообщСниС подписанноС Ρ‡ΡƒΠΆΠΈΠΌ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ ΠΈ сохраним Π² Ρ„Π°ΠΉΠ» not-owner.pk. Π­Ρ‚ΠΈΠΌ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ подпишСм сообщСниС. Запустим тСсты ΠΈ убСдимся, Ρ‡Ρ‚ΠΎ всС тСсты проходят. ΠšΠΎΠΌΠΌΠΈΡ‚ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΊΠΎΠ½Π΅Ρ† ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π»ΠΎΠ³ΠΈΠΊΠΈ смартконтракта.
Π’ recv_external() ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π΄Π²Π° Ρ‚ΠΈΠΏΠ° сообщСний.

Π’Π°ΠΊ ΠΊΠ°ΠΊ наш ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π°ΠΊΠΊΡƒΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹ΡˆΠΈ ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ², эти дСньги Π½Π°Π΄ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΡŽ Π»ΠΎΡ‚Π΅Ρ€Π΅ΠΈ. АдрСс кошСлька создатСля Π»ΠΎΡ‚Π΅Ρ€Π΅ΠΈ записываСтся Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΏΡ€ΠΈ создании ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°.

На всякий случай Π½Π°ΠΌ Π½ΡƒΠΆΠ½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΌΠ΅Π½ΡΡ‚ΡŒ адрСс Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π³Ρ€Π°ΠΌΡ‹ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π²ΡˆΠΈΡ…. Π’Π°ΠΊΠΆΠ΅ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π³Ρ€Π°ΠΌΡ‹ с Π»ΠΎΡ‚Π΅Ρ€Π΅ΠΈ Π½Π° адрСс Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°.

НачнСм с ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ. НапишСм сначала тСст, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ послС ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСния смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ сохранил Π½ΠΎΠ²Ρ‹ΠΉ адрСс Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅. ΠžΠ±Ρ€Π°Ρ‚ΠΈΠΌ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² сообщСниС ΠΏΠΎΠΌΠΈΠΌΠΎ счСтчика ΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ адрСса ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π΅Ρ‰Π΅ action 7-ΠΌΠΈ Π±ΠΈΡ‚Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число, Π² зависиомсти ΠΎΡ‚ Π½Π΅Π³ΠΎ, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ сообщСниС Π² смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π΅.

<b 0 32 u, 1 @ 7 u, new_owner_wc @  32 i, new_owner_account_id @ 256 u, b> message_to_sign !

Π’ тСстС ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ происходит дСсСрСализация Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° смартконтратка storage Π² Fift. ДСсСриализация ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… описана Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ Fift.

Бсылка Π½Π° ΠΊΠΎΠΌΠΌΠΈΡ‚ с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ тСста.

ЗапускаСм тСст ΠΈ убСдимся, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΠ°Π΄Π°Π΅Ρ‚. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΏΠΎ измСнСнию адрСса Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° Π»ΠΎΡ‚Π΅Ρ€Π΅ΠΈ.

Π’ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π΅ ΠΌΡ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ ΠΏΠ°Ρ€ΡΠΈΡ‚ΡŒ message, считываСм Π² action. Напомним, Ρ‡Ρ‚ΠΎ Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π²Π° action: ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ адрСса ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π³Ρ€Π°ΠΌΠΎΠ².

ΠŸΠΎΡ‚ΠΎΠΌ считываСм Π½ΠΎΠ²Ρ‹ΠΉ адрСс Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° ΠΈ сохраняСм Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅.
ЗапускаСм тСсты ΠΈ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ тСст ΠΏΠ°Π΄Π°Π΅Ρ‚. ΠŸΠ°Π΄Π°Π΅Ρ‚ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ парсит 7 Π±ΠΈΡ‚ ΠΈΠ· сообщСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ Π² тСстС. Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π² сообщСниС нСсущСствущий action. Запустим тСсты ΠΈ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ всС проходят. Π’ΡƒΡ‚ ΠΊΠΎΠΌΠΌΠΈΡ‚ Π½Π° измСнСния. ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ напишСм Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ количСства Π³Ρ€Π°ΠΌΠΎΠ² Π½Π° сохранСнный Ρ€Π°Π½Π΅Π΅ адрСс.

Π‘Π½Π°Ρ‡Π°Π»Π° напишСм тСст. ΠœΡ‹ напишСм Π΄Π²Π° тСста ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠ³Π΄Π° баланса Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚, Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΠΎΠ³Π΄Π° всС Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ. ВСсты ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² этом ΠΊΠΎΠΌΠΌΠΈΡ‚Π΅.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ допишСм ΠΊΠΎΠ΄. Π‘Π½Π°Ρ‡Π°Π»Π° напишСм Π΄Π²Π° Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π³Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ баланс смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°.

int balance() inline_ref method_id {
    return get_balance().pair_first();
}

И Π²Ρ‚ΠΎΡ€ΠΎΠΉ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π³Ρ€Π°ΠΌΠΎΠ² Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ я ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ скопировал ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°.

() send_grams(int wc, int addr, int grams) impure {
    ;; int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool src:MsgAddress -> 011000
    cell msg = begin_cell()
    ;;  .store_uint(0, 1) ;; 0 <= format indicator int_msg_info$0 
    ;;  .store_uint(1, 1) ;; 1 <= ihr disabled
    ;;  .store_uint(1, 1) ;; 1 <= bounce = true
    ;;  .store_uint(0, 1) ;; 0 <= bounced = false
    ;;  .store_uint(4, 5)  ;; 00100 <= address flags, anycast = false, 8-bit workchain
        .store_uint (196, 9)
        .store_int(wc, 8)
        .store_uint(addr, 256)
        .store_grams(grams)
        .store_uint(0, 107) ;; 106 zeroes +  0 as an indicator that there is no cell with the data.
        .end_cell(); 
    send_raw_message(msg, 3); ;; mode, 2 for ignoring errors, 1 for sender pays fees, 64 for returning inbound message value
}

Π”ΠΎΠ±Π°Π²ΠΈΠΌ эти Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΈ напишСм Π»ΠΎΠ³ΠΈΠΊΡƒ. Π‘Π½Π°Ρ‡Π°Π»Π° парсим количСство Π³Ρ€Π°ΠΌΠΎΠ² ΠΈΠ· сообщСния. Π”Π°Π»ΡŒΡˆΠ΅ провСряСм баланс, Ссли Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ выбрасываСм ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Если всС Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Ρ‚ΠΎ отправляСм Π³Ρ€Π°ΠΌΡ‹ Π½Π° сохранСнный адрСс ΠΈ обновляСм счСтчик.

int amount_to_send = message~load_grams();
throw_if(36, amount_to_send + 500000000 > balance());
accept_message();
send_grams(owner_wc, owner_account_id, amount_to_send);
set_data(pack_state(stored_seqno + 1, pubkey, order_seqno, number_of_wins, incoming_amount, outgoing_amount, owner_wc, owner_account_id, orders));

Π’ΠΎΡ‚ Ρ‚Π°ΠΊ выглядит смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. Запустим тСсты ΠΈ убСдимся, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ проходят.

ΠšΡΡ‚Π°Ρ‚ΠΈ, Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ΅ сообщСниС Ρƒ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· списываСтся комиссия. Π§Ρ‚ΠΎΠ±Ρ‹ сообщСния смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π²Ρ‹ΠΎΠ»Π½ΠΈΠ» запрос, послС Π±Π°Π·ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ accept_message().

Π’Π΅ΠΏΠ΅Ρ€ΡŒ займСмся Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌΠΈ сообщСниями. По Ρ„Π°ΠΊΡ‚Ρƒ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π³Ρ€Π°ΠΌΡ‹ ΠΈ ΠΎΡ‚ΡΡ‹Π»Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΡƒ Π΄Π²ΠΎΠΉΠ½ΡƒΡŽ сумму ΠΏΡ€ΠΈ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ΅ ΠΈ Ρ‚Ρ€Π΅Ρ‚ΡŒ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Ρƒ ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹ΡˆΠ΅.

Π‘Π½Π°Ρ‡Π°Π»Π° напишСм простой тСст. Для этого Π½Π°ΠΌ понадобится тСстовый адрСс смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ Π±ΡƒΠ΄Ρ‚ΠΎ отправляСм Π³Ρ€Π°ΠΌΡ‹ Π½Π° смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚.

АдрСс смартконтракта состоит ΠΈΠ· Π΄Π²ΡƒΡ… чисСл, 32-Ρ… Π±ΠΈΡ‚Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° workchain ΠΈ 256-Ρ‚ΠΈ Ρ†Π΅Π»ΠΎΠ΅ Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° Π² этом workchain. НапримСр, -1 ΠΈ 12345, этот адрСс ΠΈ сохраним Π² Ρ„Π°ΠΉΠ».

Π― скопировал Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΠΎ ΡΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΡŽ адрСса ΠΈΠ· TonUtil.fif.

// ( wc addr fname -- )  Save address to file in 36-byte format
{ -rot 256 u>B swap 32 i>B B+ swap B>file } : save-address

Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ функция, это даст ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Fift. ЗапускаСм Fift Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅.

~/TON/build/crypto/fift -i 

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ ΠΊΠ»Π°Π΄Π΅ΠΌ Π² стСк -1, 12345 ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π° "sender.addr":

-1 12345 "sender.addr" 

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом выполняСтся функция -rot, которая сдвигаСт стСк, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°Π²Π΅Ρ€Ρ…Ρƒ стСка оказываСтся ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°:

"sender.addr" -1 12345

256 u>B ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ 256-Ρ‚ΠΈ Π±ΠΈΡ‚Π½ΠΎΠ΅ Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ Π² Π±Π°ΠΉΡ‚Ρ‹.

"sender.addr" -1 BYTES:0000000000000000000000000000000000000000000000000000000000003039

swap мСняСт мСстами Π΄Π²Π° Π²Π΅Ρ€Ρ…Π½ΠΈΡ… элСмСнта стСка.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 -1

32 i>B ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ 32-Ρ… Π±ΠΈΡ‚Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ Π² Π±Π°ΠΉΡ‚Ρ‹.

"sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039 BYTES:FFFFFFFF

B+ соСдиняСт Π΄Π²Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠ· Π±Π°ΠΉΡ‚ΠΎΠ².

 "sender.addr" BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF

Π‘Π½ΠΎΠ²Π° swap.

BYTES:0000000000000000000000000000000000000000000000000000000000003039FFFFFFFF "sender.addr" 

И Π½Π°ΠΊΠΎΠ½Π΅Ρ† выполняСтся запись Π±Π°ΠΉΡ‚ΠΎΠ² Π² Ρ„Π°ΠΉΠ» B>file. ПослС этого наш стСк пуст. ΠžΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Fift. Π’ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠ°ΠΏΠΊΠ΅ создан Ρ„Π°ΠΉΠ» sender.addr. ΠŸΠ΅Ρ€Π΅Π½Π΅ΡΠ΅ΠΌ Ρ„Π°ΠΉΠ» Π² ΡΠΎΠ·Π΄Π°Π½Π½ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ test/addresses/.

НапишСм простой тСст, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π³Ρ€Π°ΠΌΡ‹ Π½Π° смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚. Π’ΠΎΡ‚ ΠΊΠΎΠΌΠΌΠΈΡ‚.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ займСмся Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ Π»ΠΎΡ‚Π΅Ρ€Π΅ΠΈ.

ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ, провСряСм сообщСниС bounced ΠΈΠ»ΠΈ Π½Π΅Ρ‚, Ссли bounced, Ρ‚ΠΎ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌ. bounced Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π²Π΅Ρ€Π½Π΅Ρ‚ Π³Ρ€Π°ΠΌΡ‹ Ссли ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ какая-Ρ‚ΠΎ ошибка. ΠœΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π³Ρ€Π°ΠΌΡ‹ Ссли Π²Π΄Ρ€ΡƒΠ³ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ошибка, ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, баланс Ссли мСньшС Ρ‡Π΅ΠΌ ΠΏΠΎΠ»Π³Ρ€Π°ΠΌΠ°, Ρ‚ΠΎ просто ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ сообщСниС ΠΈ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌ.

Π”Π°Π»Π΅Π΅ парсим адрСс смартконтракта с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΡˆΠ»ΠΎ сообщСниС.

Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° ΠΈ дальшС удаляСм старыС ставки ΠΈΠ· истории Ссли ΠΈΡ… большС Π΄Π²Π°Π΄Ρ†Π°Ρ‚ΠΈ. Для удобства я написал Ρ‚Ρ€ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pack_order(), unpack_order(), remove_old_orders().

Π”Π°Π»ΡŒΡˆΠ΅ ΠΌΡ‹ смотрим Ссли баланса Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ Π½Π° Π²Ρ‹ΠΏΠ»Π°Ρ‚Ρƒ, Ρ‚ΠΎ считаСм, Ρ‡Ρ‚ΠΎ это Π½Π΅ ставка, Π° ΠΏΠΎΠΏΠΎΠ»Π΅Π½Π΅Π½ΠΈΠ΅ ΠΈ сохраняСм ΠΏΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π² orders.

Π”Π°Π»ΡŒΡˆΠ΅ Π½Π°ΠΊΠΎΠ½Π΅Ρ† ΡΡƒΡ‚ΡŒ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°.

Π‘Π½Π°Ρ‡Π°Π»Π° Ссли ΠΈΠ³Ρ€ΠΎΠΊ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π» ΠΌΡ‹ сохраняСм Π΅Π³ΠΎ Π² ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ставок ΠΈ Ссли сумма большС 3 Π³Ρ€Π°ΠΌΠΎΠ² отправялСм 1/3 Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Ρƒ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°.

Если ΠΆΠ΅ ΠΈΠ³Ρ€ΠΎΠΊ Π²Ρ‹ΠΈΠ³Ρ€Π°Π», Ρ‚ΠΎ ΠΌΡ‹ отправляСм ΡƒΠ΄Π²ΠΎΠ΅Π½Π½ΡƒΡŽ сумму Π½Π° адрСс ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠΈ дальшС сохраняСм ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΊΡ†ΠΈΡŽ ΠΎ ставкС Π² ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ.

() recv_internal(int order_amount, cell in_msg_cell, slice in_msg) impure {
    var cs = in_msg_cell.begin_parse();
    int flags = cs~load_uint(4);  ;; int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool
    if (flags & 1) { ;; ignore bounced
        return ();
    }
    if (order_amount < 500000000) { ;; just receive grams without changing state 
        return ();
    }
    slice src_addr_slice = cs~load_msg_addr();
    (int src_wc, int src_addr) = parse_std_addr(src_addr_slice);
    (int stored_seqno, int pubkey, int order_seqno, int number_of_wins, int incoming_amount, int outgoing_amount, int owner_wc, int owner_account_id, cell orders) = unpack_state();
    orders = remove_old_orders(orders, order_seqno);
    if (balance() < 2 * order_amount + 500000000) { ;; not enough grams to pay the bet back, so this is re-fill
        builder order = pack_order(order_seqno, 1, now(), order_amount, src_wc, src_addr);
        orders~udict_set_builder(32, order_seqno, order);
        set_data(pack_state(stored_seqno, pubkey, order_seqno + 1, number_of_wins, incoming_amount + order_amount, outgoing_amount, owner_wc, owner_account_id, orders));
        return ();
    }
    if (rand(10) >= 4) {
        builder order = pack_order(order_seqno, 3, now(), order_amount, src_wc, src_addr);
        orders~udict_set_builder(32, order_seqno, order);
        set_data(pack_state(stored_seqno, pubkey, order_seqno + 1, number_of_wins, incoming_amount + order_amount, outgoing_amount, owner_wc, owner_account_id, orders));
        if (order_amount > 3000000000) {
            send_grams(owner_wc, owner_account_id, order_amount / 3);
        }
        return ();
    }
    send_grams(src_wc, src_addr, 2 * order_amount);
    builder order = pack_order(order_seqno, 2, now(), order_amount, src_wc, src_addr);
    orders~udict_set_builder(32, order_seqno, order);
    set_data(pack_state(stored_seqno, pubkey, order_seqno + 1, number_of_wins + 1, incoming_amount, outgoing_amount + 2 * order_amount, owner_wc, owner_account_id, orders));
}

Π’ΠΎΡ‚ ΠΈ всС. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ остаСтся простоС, сдСлаСм Π³Π΅Ρ‚-ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ· внСшнСго ΠΌΠΈΡ€Π° ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ состоянии ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° (ΠΏΠΎ Ρ„Π°ΠΊΡ‚Ρƒ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΡ… Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° смартконтракта).

Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π³Π΅Ρ‚-ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹. О Ρ‚ΠΎΠΌ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π΅ напишСм Π½ΠΈΠΆΠ΅.

Π•Ρ‰Π΅ я Π·Π°Π±Ρ‹Π» Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ самый ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ запрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ происходит ΠΏΡ€ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚. И Π΅Ρ‰Π΅ исправил Π±Π°Π³ с ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ 1/3 суммы Π½Π° Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°.

Π”Π°Π»ΡŒΡˆΠ΅ остаСтся ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΠ°ΠΏΠΊΡƒ requests.

Π—Π° основу я взял ΠΊΠΎΠ΄ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ simple-wallet-code.fc ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ.

Из Ρ‚ΠΎΠ³ΠΎ Π½Π° Ρ‡Ρ‚ΠΎ стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅. ΠœΡ‹ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° ΠΈ сообщСниС Π½Π° Π²Ρ…ΠΎΠ΄. ПослС это гСнСрируСтся адрСс смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ адрСс извСстСн Π΅Ρ‰Π΅ Π΄ΠΎ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² TON. Π”Π°Π»ΡŒΡˆΠ΅ Π½Π° этот адрСс Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ нСсолько Π³Ρ€Π°ΠΌ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС этого Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» с самим смартконтрактом, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π·Π° Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ смартконтракта ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² Π½Π΅ΠΌ ΡΠ΅Ρ‚ΡŒ Π±Π΅Ρ€Π΅Ρ‚ комиссию (Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ хранят ΠΈ ΠΈΡΠΎΠΏΠ»Π½ΡΡŽΡ‚ смартконтракты). Код ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‚ΡƒΡ‚.

Π”Π°Π»ΡŒΡˆΠ΅ ΠΌΡ‹ исполняСм ΠΊΠΎΠ΄ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ lottery-query.boc Ρ„Π°ΠΉΠ» ΠΈ адрСс смартконтракта.

~/TON/build/crypto/fift -s requests/new-lottery.fif 0

НС Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ сгСнСрированныС Ρ„Π°ΠΉΠ»Ρ‹: lottery-query.boc, lottery.addr, lottery.pk.

Π‘Ρ€Π΅Π΄ΠΈ ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ Π² Π»ΠΎΠ³Π°Ρ… выполнСния ΡƒΠ²ΠΈΠ΄ΠΈΠΌ адрСс смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°.

new wallet address = 0:044910149dbeaf8eadbb2b28722e7d6a2dc6e264ec2f1d9bebd6fb209079bc2a 
(Saving address to file lottery.addr)
Non-bounceable address (for init): 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd
Bounceable address (for later access): kQAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8KpFY

Π Π°Π΄ΠΈ интСрСса сдСлаСм запрос Π² TON

$ ./lite-client/lite-client -C ton-lite-client-test1.config.json 
getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

И ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ с Ρ‚Π°ΠΊΠΈΠΌ адрСсом пуст.

account state is empty

ΠžΡ‚ΠΏΡ€Π°Π²ΡΠ»Π΅ΠΌ Π½Π° адрСс 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd 2 Gram ΠΈ Ρ‡Π΅Ρ€Π΅Π· нСсколько сСкунд выполняСм Ρ‚ΡƒΠΆΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ. Для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π³Ρ€Π°ΠΌΠΎΠ² я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ кошСлСк, Π° тСстовыС Π³Ρ€Π°ΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ Ρƒ ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΈΠ· Ρ‡Π°Ρ‚Π°, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ я скаТу Π² ΠΊΠΎΠ½Ρ†Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ.

> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π² сСти появился Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ (state:account_uninit) смартконтракт с Ρ‚Π°ΠΊΠΈΠΌ адрСсом ΠΈ балансом 1 000 000 000 Π½Π°Π½ΠΎΠ³Ρ€Π°ΠΌ.

account state is (account
  addr:(addr_std
    anycast:nothing workchain_id:0 address:x044910149DBEAF8EADBB2B28722E7D6A2DC6E264EC2F1D9BEBD6FB209079BC2A)
  storage_stat:(storage_info
    used:(storage_used
      cells:(var_uint len:1 value:1)
      bits:(var_uint len:1 value:103)
      public_cells:(var_uint len:0 value:0)) last_paid:1583257959
    due_payment:nothing)
  storage:(account_storage last_trans_lt:3825478000002
    balance:(currencies
      grams:(nanograms
        amount:(var_uint len:4 value:2000000000))
      other:(extra_currencies
        dict:hme_empty))
    state:account_uninit))
x{C00044910149DBEAF8EADBB2B28722E7D6A2DC6E264EC2F1D9BEBD6FB209079BC2A20259C2F2F4CB3800000DEAC10776091DCD650004_}
last transaction lt = 3825478000001 hash = B043616AE016682699477FFF01E6E903878CDFD6846042BA1BFC64775E7AC6C4
account balance is 2000000000ng

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚. Запустим lite-client ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ.

> sendfile lottery-query.boc
[ 1][t 2][1583008371.631410122][lite-client.cpp:966][!testnode] sending query from file lottery-query.boc
[ 3][t 1][1583008371.828550100][lite-client.cpp:976][!query]    external message status is 1 

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½.

> last
> getaccount 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd

Π‘Ρ€Π΅Π΄ΠΈ ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ.

  storage:(account_storage last_trans_lt:3825499000002
    balance:(currencies
      grams:(nanograms
        amount:(var_uint len:4 value:1987150999))
      other:(extra_currencies
        dict:hme_empty))
    state:(account_active

Π’ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ account_active.

Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ с измСнСниями Π²ΠΎΡ‚ Ρ‚ΡƒΡ‚.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ создадим запросы для взаимодСйствия со смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ΠΎΠΌ.

Π’ΠΎΡ‡Π½Π΅Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ для измСнСния адрСса ΠΌΡ‹ оставим Π² качСствС ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π³Ρ€Π°ΠΌΠΎΠ² Π½Π° адрСс Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° сдСлаСм. По Ρ„Π°ΠΊΡ‚Ρƒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ Π² тСстС Π½Π° ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ Π³Ρ€Π°ΠΌΠΎΠ².

Π’ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠ΅ сообщСниС ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π½Π° смартконтракт, Π³Π΄Π΅ msg_seqno 165, action 2 ΠΈ 9.5 Π³Ρ€Π°ΠΌ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ.

<b 165 32 u, 2 7 u, 9500000000 Gram, b>

НС Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒ сообщСниС ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ lottery.pk, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сгСнСрировался Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΈ создании смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°. Π’ΠΎΡ‚ ΡΠΎΠΎΡ‚Π²Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠΌΠΈΡ‚.

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΈΠ½ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π³Π΅Ρ‚-ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим ΠΊΠ°ΠΊ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π³Π΅Ρ‚-ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ смартконтракта.

ЗапускаСм lite-client ΠΈ запускаСм Π³Π΅Ρ‚-ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ написали.

$ ./lite-client/lite-client -C ton-lite-client-test1.config.json
> runmethod 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd balance
arguments:  [ 104128 ] 
result:  [ 64633878952 ] 
...

Π’ result содСрТится Π·Π½Π°Ρ‡Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ функция balance() ΠΈΠ· нашСго смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°.
Π’ΠΎΠΆΠ΅ самоС Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ Π΅Ρ‰Π΅ для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².

> runmethod 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd get_seqno
...
arguments:  [ 77871 ] 
result:  [ 1 ] 

Запросим ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ставок.

> runmethod 0QAESRAUnb6vjq27KyhyLn1qLcbiZOwvHZvr1vsgkHm8Ksyd get_orders
...
arguments:  [ 67442 ] 
result:  [ ([0 1 1583258284 10000000000 0 74649920601963823558742197308127565167945016780694342660493511643532213172308] [1 3 1583258347 4000000000 0 74649920601963823558742197308127565167945016780694342660493511643532213172308] [2 1 1583259901 50000000000 0 74649920601963823558742197308127565167945016780694342660493511643532213172308]) ] 

ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ lite-client ΠΈ Π³Π΅Ρ‚-ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π΅ Π½Π° сайтС.

ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° Π½Π° сайтС

Π― написал простой Π²Π΅Π±-сайт Π½Π° Python для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° Π² ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅. Π’ΡƒΡ‚ я Π½Π΅ Π±ΡƒΠ΄Ρƒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π° Π½Π΅ΠΌ ΠΈ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΡƒΡŽ сайт ΠΎΠ΄Π½ΠΈΠΌ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠΌ.

Запросы ΠΊ TON Π΄Π΅Π»Π°ΡŽΡ‚ΡΡ ΠΈΠ· Python с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ lite-client. Для удобства сайт пакуСтся Π² Docker ΠΈ публикуСтся Π½Π° Google Cloud. Бсылка Π½Π° сайт.

ΠŸΡ€ΠΎΠ±ΡƒΠ΅ΠΌ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΡƒΠ΄Π° Π³Ρ€Π°ΠΌΠΎΠ² для пополнСния ΠΈΠ· кошСлька. ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΠΌ 40 Π³Ρ€Π°ΠΌ. И сдСлаСм ΠΏΠ°Ρ€Ρƒ ставок для наглядности. Π’ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ сайт ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ставок, Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ° ΠΈ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ.

Π’ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΌΡ‹ Π²Ρ‹ΠΈΠ³Ρ€Π°Π»ΠΈ, Π²Ρ‚ΠΎΡ€ΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π»ΠΈ.

ПослСсловиС

Π‘Ρ‚Π°Ρ‚ΡŒΡ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π°ΡΡŒ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π»ΠΈΠ½Π½Π΅ Ρ‡Π΅ΠΌ я ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π», ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈ ΠΊΠΎΡ€ΠΎΡ‡Π΅, Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠ°ΠΊ Ρ€Π°Π· для Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΎ TON ΠΈ Ρ…ΠΎΡ‡Π΅Ρ‚ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ самый простой смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ с Π½ΠΈΠΌ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ Π²Π΅Ρ‰ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡ‰Π΅.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ эффСктивно ΠΈ элСгантно, Π½ΠΎ Ρ‚ΠΎΠ³Π΄Π° Π±Ρ‹ Π½Π° ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΡƒ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΡƒΡˆΠ»ΠΎ Π±Ρ‹ Π΅Ρ‰Π΅ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ я Π³Π΄Π΅-Ρ‚ΠΎ ошибся ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π΅ понял, поэтому Ссли Π²Ρ‹ Π΄Π΅Π»Π°Π΅Ρ‚Π΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΠΈΡ€Π°Ρ‚ΡŒΡΡ Π½Π° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΈΠ»ΠΈ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ с ΠΊΠΎΠ΄ΠΎΠΌ TON.

Надо Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ сам TON Π΅Ρ‰Π΅ Π² Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ стадии Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ измСнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ»ΠΎΠΌΠ°ΡŽΡ‚ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ· шагов Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ (Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ ΠΏΠΎΠΊΠ° я писал, ΡƒΠΆΠ΅ исправил), Π½ΠΎ ΠΎΠ±Ρ‰ΠΈΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ врядли измСнится.

ΠŸΡ€ΠΎ Π±ΡƒΠ΄ΡƒΡ‰Π΅Π΅ TON Ρ€Π°ΡΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Ρƒ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° станСт Ρ‡Π΅ΠΌ-Ρ‚ΠΎ большим ΠΈ Π½Π°ΠΌ стоит ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя Π½Π° Π΅Π΅ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈ Π·Π°Π½ΡΡ‚ΡŒ Π½ΠΈΡˆΡƒ своими ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°ΠΌΠΈ ΡƒΠΆΠ΅ сСйчас.

Π•ΡΡ‚ΡŒ Π΅Ρ‰Π΅ Libra ΠΎΡ‚ Facebook, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ аудитория ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ большС Ρ‡Π΅ΠΌ Ρƒ TON. О Libra я ΠΏΠΎΡ‡Ρ‚ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ знаю, судя ΠΏΠΎ Ρ„ΠΎΡ€ΡƒΠΌΡƒ активности Ρ‚Π°ΠΌ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ большС Ρ‡Π΅ΠΌ Π² сообщСствС TON. Π₯отя Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈ сообщСство TON большС ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° Π°Π½Π΄Π΅Π³Ρ€Π°ΡƒΠ½Π΄, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠΆΠ΅ ΠΊΡ€ΡƒΡ‚ΠΎ.

Бсылки

  1. ΠžΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ докумСнтация ΠΏΠΎ TON: https://test.ton.org
  2. ΠžΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ TON: https://github.com/ton-blockchain/ton
  3. ΠžΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ кошСлСк для Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ: https://wallet.ton.org
  4. Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° ΠΈΠ· этой ΡΡ‚Π°Ρ‚ΡŒΠΈ: https://github.com/raiym/astonished
  5. Бсылка Π½Π° сайт смарт-ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π°: https://ton-lottery.appspot.com
  6. Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π½Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ для Visual Studio Code для FunC: https://github.com/raiym/func-visual-studio-plugin
  7. Π§Π°Ρ‚ ΠΏΡ€ΠΎ Π’ON Π² Telegram, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠΌΠΎΠ³ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π½Π° Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌ этапС. Π― Π΄ΡƒΠΌΠ°ΡŽ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ошибкой, Ссли скаТу, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ Π΅ΡΡ‚ΡŒ всС ΠΊΡ‚ΠΎ писал Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ для TON. Π’Π°ΠΌ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ тСстовых Π³Ρ€Π°ΠΌΠΎΠ². https://t.me/tondev_ru
  8. Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Ρ‡Π°Ρ‚ ΠΏΡ€ΠΎ TON Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ я Π½Π°Ρ…ΠΎΠ΄ΠΈΠ» ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ: https://t.me/TONgramDev
  9. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ этап конкурса: https://contest.com/blockchain
  10. Π’Ρ‚ΠΎΡ€ΠΎΠΉ этап конкурса: https://contest.com/blockchain-2

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ