...
- "на чтение" - получить результаты расчета КТУ, с учетом текущих данных в смарт-контракте.
- "на запись" - добавить данные в смарт-контракт в соотвествии с зашитым в него шаблоном.
Чтобы добавить смарт-контракт в игровой блокчейн, необходимо через клиент(в данном случае бот в телеграмме) выбрать опцию "Создать смарт-контракт".
Чтобы просмотреть "код" смарт-контракта, добавленного в блокчейн, необходимо написать в чат бота, ведущего блокчейн: "id_смарт_контракта", где "id_смарт_контракта" - номер контракта, присвоенный автоматически при добавлении его в блокчейн.
...
Чтобы обратиться к смарт-контракту в режиме "на чтение" - нужно написать в чат бота, ведущего блокчейн: "id_смарт_контракта→итог".
(Пример: 7435→итог)
Игровой банк может исполнять платежные поручения, в соотвествии с результатами смарт-контракта.
- Отправить платежное поручение, можно в разделе "Счет", указав типа платежа "смарт-контракт" и выбрав списке ID соответствующего смарт-контракта.
- Смарт-контракт автоматически распределяет средства со счета в соответствии с полученным КТУ.
- Если КТУ не был получен к окончанию раунда (за счет ошибки или недостатка данных) - средства вернутся отправителям.
- В случае, если условиями смарт-контракта распределяется больше средств, чем содержится на балансе - ВСЕ средства вернутся отправителямне распределятся.
- В случае, если условиями смарт-контракта распределяется меньше средств, чем содержится на балансе - остаток от не распределенных средств вернется отправителям (пропорционально вкладам).останется на балансе контракта.
- Вывести деньги со счета смарт-контракта можно только через кнопку "распределить средства" ( то есть только на основе рассчитанного КТУ)
Общая конструкция языка:
Смарт-контракт состоит из двух обязательных (Контракт и Результат) блоков и одного опционального (Данные).
КОНТРАКТ#
...
ДАННЫЕ#
...
РЕУЗЛЬТАТ#
...
В блоке КОНТРАКТ# описываются все поля, которые должны быть заполнены пользователями смарт-контракта через обращение к нему в режиме "на запись".
Поля описываются в три этапа:
- Название поля
- Тип данных
- Уровень доступа
...
...
- Название переменной
- Формула
В блоке РЕЗУЛЬТАТ# описываются получатели средств и размер дохода по заданным в контракте формулам. В данном блоке результаты могут быть представлены только в виде числовых значений.
Результаты описываются в два этапа:
...
Типы данных начинаются со знака "$". Всего в игре есть 4 типа данных:
$слово - текстовое поле состоящее из кириллицы от 1 2 до 20 16 символов;
$буква - текстовое поле, содержит в себе ровно 1 символ кириллицы;
$время - время в секундах;
$игрок - логин (уникальный идентификатор) конкретного игрока$число - неотрицательное число от 0 до 9007199254740992
;
Уровни доступа:
{ВСЕ} - любой игрок
{УПСК} - любой склад
{ПР} - любой производитель
{ТР} - любой транспортироващик
{ПТ} - любой потребитель
{Y02} - конкретный логин
Поля и переменные:
Наименование поля начинается с символа "_", завершается символом ":", далее тип
Длина наименования от 2 символов после "_" до 2030 символов.
_Наименование_поля: $тип_данных {уровень доступа};
(Пример: _слово1: $слово: {A1})
Математика:
поддерживается +, -, /, *
все операции необходимо указывать в скобках по парно, последовательность исполнения слева направо, приоритезации между умножением, сложением и пр. - отсуствует.
правильно:
(2+3)
((2*3)+4)
((1/1)+(3/4))
не правильно:
2+3
(2+3+4)
((1+3)+(3+4)+(3+5))
Логика:
базовые, применяются в ^УСЛ:
&&, ||, >=, <=, !=, >, <
знак @@ - проверят, заполнено ли поле, используется внутри ^УСЛ как "@@_переменная"{}
Формулы:
Условия
^УСЛ( утверждение ? [версиявыражение_если_да ] [версия| выражение_если нет])
Встроенные методы и переменные:
^ВЕС(arg1) - вес слова/буквы
^АВТОР(arg1) - кто заполнил поле
^СИМВОЛ^ДЛИНА(arg1, arg2) - число символов в слове
Примеры смарт-
...
контракта:
КОНТРАКТ#
_цена: $число {Y02};
_стартовоеСлово: $слово {Y02};
РЕЗУЛЬТАТ#
Bank: 0;
Y02: ^УСЛ(@@_цена ? (^ДЛИНА(_стартовоеСлово) + _цена) | 0);
Смарт-контракт №1
Ситуация:
Производитель(А1) планирует создать 3 слова, неважно кто их упакует, но упаковщик получает 10% от цены продажи если успел упаковать за минуту, если за успел за две 5 у.е., если не успел за две, то только 1 у.е.; Транспортная компания (B3) обязуется купить продукты за 2 себестоимости, если их ей передадут за 5 мину до конца раунда; если за 2 минуты - то по себестоимости букв, в ином случае - не платит.
Сценарий использования:
....
Код:
КОНТРАКТ#
_слово1: $слово {A1};
_слово2: $слово {A1};
_слово3: $слово {А1};
_упаковка: $время {УП};
_получениеСлов: $время {^АВТОР(_упаковка)};
_получилПродукт: $время {B3};ДАННЫЕ#
_себестоимостьСлов: ^ВЕС(_слово1)+^ВЕС(_слово2)+^ВЕС(_слово3);
_времяУпаковки: _упаковка - _получениеСлов;
РЕЗУЛЬТАТ#A1: ^УСЛ(_ВРЕМЯ - _получилПродукт > 300 ? _себестоимостьСлов*2 , ^УСЛ(_себестоимостьСлов > 120 ) ? _себестоимостьСлов , 0);
^АВТОР(_упаковка): ^УСЛ( _времяУпаковки < 60 ? _себестоимостьСлов*0.1 , ^УСЛ(_времяУпаковки < 120 ? 5 : 1) );
...
Смарт-контракт №2
Ситуация:
....
Сценарий использования:
....
Код:
КОНТРАКТ#
...
ДАННЫЕ#...
РЕЗУЛЬТАТ#...
Итоговое распределение средств:
...