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

У травні на Tezos з'явився сервіс візуального програмування VisualTez. Розробник вибирає мишкою необхідні блоки, об'єднує їх і задає аргументи, а сервіс робить все інше.
Ми зібрали у VisualTez найпростіший контракт-калькулятор і відразу його протестували. Ділимося відчуттями від візуального програмування смарт-контрактів на 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