Русский
Русский
English
Статистика
Реклама

Hello Word смарт-контракт для TON (FreeTON)

Одна из интересных тем, о которой мне хотелось бы сегодня рассказать - это программирование смарт-контрактов. За язык на котором мы будем программировать свой смарт возьмем Solidity, а в качестве платформы будем использовать FreeTON

В технологию blockchain сегодня не будем погружаться, ибо про него уже много статей. Поэтому рассмотрим простой смарт-контракт в следующем порядке:

  1. Как он устроен;

  2. С чего начать;

  3. "Hello World";

  4. Особенности TON смарт-контрактов;

  5. Ссылки на дополнительную информацию.

Как устроен смарт-контракт

По сути смарт-контракт это обычный файл, как небольшая компьютерная программа он состоит из исполняемого кода, данных программы и мета-данных. Чтобы его запустить вовсе необязательно нужен blockchain. Для простого "Hello World" или калькулятора достаточно только компилятора и программы, запускающей функции смарт-контракта (назовем ее run executor).
У скомпилированного смарт-контракта нет единой точки входа (функции main), вызывать можно любые public функции на свой вкус, для этого в комплекте с ним при компиляции генерируется ABI (благодаря которому внешняя вызывающая программа отыскивает нужную функцию, то есть точку входа, внутри откомпилированного бинарного образа смарт-контракта).
Поэтому мы можем представить себе его как микро-сервис, либо еще проще как веб-сервис в виде, скажем PHP-скрипта.
Как можно догадаться такой скрипт сам по себе не генерирует пользовательское UI или HTML-разметку, а следовательно, ему требуется Frontend.
Поэтому у подобных blockchain-проектов есть JavaScript-фреймворки, обеспечивающие такое взаимодействие (и конечно они все используют ABI смарт-контракта с которым хотят иметь дело).
Про взаимодействие и deploy в blockchain стоит написать отдельную статью.

Теперь взглянем на смарт-контракт с точки зрения программиста. Программисты думают о них как о классах ООП. Поэтому следует рассмотреть отличия классов и смарт-контрактов.

Хранение в памяти глобальных переменных (свойств) смарт-контрактов своеобразно тем, что они хранятся в blockchain как в базе данных, доступ к их значениям обеспечивается через вызов функций. Когда речь идет про обычный класс, то такие данные необходимо записывать на носитель постоянной памяти самостоятельно.

Помимо хранения данных переменных у языков смарт-контрактов не имеется (по крайней мере на данном этапе их развития) стандартной библиотеки функций и классов, пока что мы лишь имеем дело со встроенным в виртуальную машину API.

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

Быстрый старт

Для работы нам понадобиться VSCode и плагин TONDev, установив его выполним следующее:

В области проводника VSCode кликнем правой кнопкой мыши, и в контекстном меню снизу выберем Create Solidity Contract:

Выбор пункта Create Solidity Contract в VSCodeВыбор пункта Create Solidity Contract в VSCode

Появится сгенерированный плагином файл Contract.sol:

Созданный смарт-контракт по умолчанию в VSCodeСозданный смарт-контракт по умолчанию в VSCode

Теперь мы его можем скомпилировать, кликнув по нему и в контекстном меню выбрав Compile Solidity Contract:

Компиляция смарт-контракта в VSCodeКомпиляция смарт-контракта в VSCode

Таким образом мы можем сразу же получить готовый, но не особо полезный смарт-контракт. В рабочую директорию проекта добавится скомпилированный .tvc и .abi.json.
Подсветка ошибок связана с особенностями, о которых поговорим далее, а пока давайте напишем свой собственный HelloWorld.sol.

Hello World!

В самом простом виде наш "Hello World" будет выглядеть так:

pragma ton-solidity >= 0.35.0;pragma AbiHeader expire;contract HelloWorld {    function HelloWorld() public pure returns (string) {        tvm.accept();        return 'Hello World!';    }}

Или можно написать внутри нашей функции вот так tvm.log("Hello World!"); это инструкция для виртуальной машины TON, поэтому давайте поговорим про TON Solidity Compiller API.

Особенности TON смарт-контрактов

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

Как видно из примера нашего "Hello World", первой инструкцией мы выставляем tvm.accept(); это и есть обращение к API виртуальной машины TON. Таким образом мы сообщаем смарт контракту, что необходимо выполнить данную функцию даже в том случае если аккаунт не профинансировал требуемый вызов функции, а функция будет вызвана за счет средств на балансе аккаунта смарт-контракта (как и пользовательские аккаунты, у смарт-контрактов имеется похожий счет).

Так как "газ" для смарт-контрактов служит средством защиты от спам-атак, он требует финансовых затрат, выраженных в криптовалюте blockchain-сети. Cледовательно, вызов tvm.accept(); расходующий средства со счета смарт-контракта не очень-то и выгоден с точки зрения предоставления услуг (в большинстве случаев). Чтобы сбалансировать расходы и определить есть ли необходимость выполнять смарт контракт за счет баланса аккаунта самого смарт-контракта или же возложить расходы на вызывающий аккаунт, можно воспользоваться инструкцией require().

Инструкция require() (требование) позволяет задать условия, только при выполнении которого начнется выполнение функции смарт-контракта. Например, мы можем перед вызовом tvm.accept(); добавить требование require(msg.pubkey()==tvm.pubkey()); которое не допустит вызов функции смарт-контракта, если публичный ключ отправителя смарт-контракта не соответствует ключу аккаунта самого смарт-контракта.

Пока я думаю для первой стати хватит. Давайте сделаем так. Если читателям данная тема будет интересна я буду писать тут статьи про смарт-контракты и взаимодействие с ними из JavaScript, а так же отвечать на вопросы. Буду рад любым замечаниям, поправкам и напутствиям. А пока расскажу, где можно найти информацию по данной теме самостоятельно.

Ссылки

Для получения основополагающей информации о проекте TON можно зайти на официальный сайт проекта Павла и Николая Дуровых. К сожалению из-за сложностей с регуляторами в США проект, как часть Telegram, закрыт. Проект который продолжил путь стал независимым сообществом. А тут находится документация для разработчиков. Ну и github.

Источник: habr.com
К списку статей
Опубликовано: 08.03.2021 18:14:03
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Solidity

Криптовалюты

Smartcontract

Смарт-контракты

Helloworld

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru