8 августа 2022

Идеально для новичков: визуальное программирование смарт-контрактов с помощью VisualTez

Кому нужно визуальное программирование

В мае на Tezos появился сервис визуального программирования VisualTez. Разработчик выбирает мышкой нужные блоки, объединяет их и задает аргументы, а сервис делает все остальное.  Мы собрали в Visual Tez простейший контракт-калькулятор и тут же его протестировали. Делимся ощущениями от визуального программирования смарт-контрактов на Tezos и рассказываем о фичах этого инструмента.

Во-первых, оно подходит для создания простых скриптов без изучения платформы. Например, с помощью приложения Automate можно запрограммировать смартфон выключать WiFi, если по GPS-координатам он находится вне вашего дома или офиса. При этом не нужно знать Java и функций для работы с WiFi и GPS. 

Во-вторых, визуальное программирование позволяет узким специалистам сконцентрироваться на решении конкретной творческой задачи. Примеры — Blueprints в Unreal Engine для работы с графическими шейдерами, AudioMulch для написания музыки, Houdini для 3D-анимации. 

В третьих, программирование с помощью блоков и стрелок полезно для обучения новичков, которые еще не привыкли оперировать абстракциями или путаются в синтаксисе и семантике языка.

В общем, визуальное программирование подходит для людей, которые знают что делать, но еще не полностью освоились с языком программирования или не имеют времени его учить. Также оно полезно для прототипирования и экспериментов, когда выходит быстрее собрать несколько блоков мышью, чем писать двадцать строк.

Как работать с VisualTez

На главном экране есть две основные ссылки — на редактор (IDE) и документацию. При этом в документации объясняется только работа с блоками, компиляция и тестирование контрактов в VisualTez. Если вам нужно узнать чем big_map отличается от record и что такое хранилище — читайте наш курс по разработке или документацию SmartPy.

VisualTez сохраняет прогресс воркспейса и позволяет делиться перманентными ссылками на ваш контракт. Содержание воркспейса не исчезнет, если случайно закрыть браузер или перезагрузить вкладку.

В левой части находится меню с блоками:

  • главные блоки (Main Blocks) — контейнеры, которые отвечают за компиляцию смарт-контрактов, значений и типов;
  • значения (Data Values);
  • типы данных (Types);
  • операции по типам (Operations by Type) — получить длину строки, удалить ключ из map и другие;
  • операции с переменными (Variables) — объявление, присвоение, доступ;
  • логические операции (Logic);
  • циклы и итерации (Loops);
  • математические функции (Arithmetics/Math) вроде ABS и операторов сдвига;
  • трансфер и делегирование tez (Transfer), а также вызов стороннего контракта и деплой;
  • доступ к ончейн данным (Block/Tx Properties) — функции вроде Get Sender;
  • криптографические функции (Cryptography), например проверка подписи;
  • продвинутые выражения для упаковки и распаковки данных;
  • лямбда-вычисления;
  • on-chain views;
  • функции для тестирования.

В правой части — инструменты для работы с контрактами: компиляция и тестирование, шаблоны FA1.2 и FA2, генерация ссылки на воркспейс с вашим контрактом, импорт и экспорт контрактов в формате .xml и другие. 

Контракты компилируются в Michelson, JSON или SmartPy. 

Пишем простой контракт-калькулятор

Тут мы описываем весь процесс создания контракта с тупняками и ошибками для того, чтобы показать, где были проблемы и насколько такой способ программирования интуитивно понятный.

В нашем контракте будут две точки входа — addition и subtraction, сложение и вычитание соответственно. При вызове точки входа пользователь передает аргумент типа int, который контракт добавляет или отнимает от значения в хранилище.

Сначала добавляем блок Contract Compilation из Main Blocks — в нем задаем тип хранилища и его изначальное состояние.

Меняем тип хранилища с Unit на int и задаем изначальное значение 0. Для этого в меню слева выбираем типы int и перетаскиваем блоки на соответствующие места.

Первый тупняк — в Initial Storage пытались перетащить блок int из меню Types, но надо было из Values. Мы задаем значение, а не просто тип. 

Добавляем две точки входа, даем им названия и ставим тип входящего параметра Int. В них нужно реализовать функцию вида «хранилище = хранилище + параметр». 

Второй тупняк — долго искали в Values и Types блок для присвоения нового значения хранилищу. Все оказалось просто: в меню Variables выбираем блок «Присвоить значение» (Assign), в него добавляем хранилище и математическую операцию, а уже в нее — две переменные Storage и Parameter. 

Таким же образом заполняем функцию вычитания, только с минусом в функции. Кстати, VisualTez позволяет копировать блоки со всем содержимым, так что мы просто скопировали блок с присвоением нового значения Storage.

Теперь можно скомпилировать смарт-контракт. На SmartPy он выглядит так.

В VisualTez нет Dry Run, то есть тестового запуска контракта с заданным входящим параметром. Поэтому пишем тест: деплоим контракт, вызываем точки входа и передаем им аргументы. В первом тесте добавляем 10, во втором — отнимаем 15, в третьем пробуем отнять строку «kek», чтобы получить ошибку.

При тестировании мы сначала получили незапланированную ошибку виртуальной машины, потому что забыли про важную вещь: Michelson не умеет в строки и их нужно перевести в байтовый формат. Поэтому заменили строку «kek» на натуральное число 0, и наш контракт успешно прошел тесты.

Серьезно, попробуйте VisualTez

В целом, мы довольны результатом и опытом работы с VisualTez. Единственное, что немного сбивает с толку — практически одинаковый фон для общего воркспейса с контрактом и меню выбора блока. Например, когда вы нажимаете Main Blocks, на несколько секунд можно подумать, что вы добавили на экран сразу четыре доступных блока. 

Собрать контракт в VisualTez оказалось намного проще и быстрее, чем мы ожидали. Если вы ранее пробовали разрабатывать на LIGO или SmartPy, но бросили из-за сложности — попробуйте написать что-то в VisualTez. Вам понравится.

Если же вы — опытный разработчик, тоже попробуйте. VisualTez может вам подойти как инструмент для прототипирования или экспериментов.

Подписывайтесь на социальные сети Tezos Ukraine, чтобы ничего не пропустить:

  1. Telegram-канал
  2. Facebook.
  3. Twitter на русском и украинском языках
  4. Twitter на английском языке
  5. YouTube-канал
  6. Instagram
  7. LinkedIn
  8. hub на ForkLog

Изначально мы опубликовали этот материал в блоге Tezos Ukraine.

Обсудить в Discord!