Кому нужно визуальное программирование
В мае на 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, чтобы ничего не пропустить:
- Telegram-канал
- Facebook.
- Twitter на русском и украинском языках
- Twitter на английском языке
- YouTube-канал
- hub на ForkLog
Изначально мы опубликовали этот материал в блоге Tezos Ukraine.