Сб. Июн 19th, 2021
    Hello World, smart contract, Free TON

    Автор статьи — Руслан Дорофеев. Источник — Хабр.

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

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

    1. С чего начать
    2. Hello World
    3. Особенности TON смарт-контракта Hello World

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

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

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

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

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

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

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

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

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

    Подсветка ошибок связана с особенностями, о которых поговорим позже, а пока давайте напишем свой собственный HelloWorld.sol.

    Hello World!

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

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

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

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

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

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

    Инструкция require() (требование) позволяет задать условия, только при выполнении которых запустится выполнение функции смарт-контракта.

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

    ________________________

    В следующей публикации Руслана речь пойдет об основах программирования смарт-контрактов Free TON.

    8
    1