Author

Topic: Смарт-контракты на javascript (Read 109 times)

full member
Activity: 411
Merit: 135
November 11, 2018, 07:07:21 AM
#1
Всем привет.

С некоторых пор (с конца октября) на Тере можно писать смарт-контракты. Язык смарт-контрактов javascript. Среда исполнения - node.js

В блокчейне Тера идея смарт-контрактов (далее по тексту смарты) была развита:
1. Код пишется на просто javascript и сразу отправляется в сеть без каких-либо манипуляций с компилированием кода или утилитами командной строки - достаточно буквально пары кликов мышки.
2. Можно писать смарты как шаблоны (библиотеки). Т.е. написав один раз им могут пользоваться все люди (создавая собственные экземпляры). Для этого человек просто прикрепляет его к своему счету (в Тере деньги хранятся на счетах по аналогии с расчетными счетами банка) и после этого управление деньгами контролируется кодом блокчейна. Смарт можно отвязать от счета, но при условии что он это разрешает.
3. Добавлена клиентская визуальная часть

Пример простого смарт-контракта под именем Promise, логика которого описана тут: https://bitcointalksearch.org/topic/m.47790792
Code:

function CheckPermission()
{
    if(context.Account.Num!==context.FromNum)
        throw "Access is allowed only from your own account.";
}

function OnGet()
{
    if(context.Description==="UNFREEZE")
        UnFreeze();
}


function OnSend()
{
    CheckFreeze();
}

function OnDeleteSmart()
{
    CheckFreeze();
}


function CheckFreeze()
{
    var State=ReadState(context.Account.Num);
    if(State.Freeze)
        throw "Account is frozen";
}


"public"
function Freeze(Params)
{
    CheckPermission();
    CheckFreeze(0);

    var State=ReadState(context.Account.Num);
    State.Freeze=1;
    State.UnFreezeNum=Params.UnFreezeNum;

    State.DescBlock=context.BlockNum;
    State.DescTr=context.TrNum;
    WriteState(State);

    Event("Freeze");
}

"public"
function UnFreeze(Params)
{
    var State=ReadState(context.Account.Num);
    if(!State.Freeze)
        throw "Account already unfreeze";
    if(context.FromNum===State.UnFreezeNum
        || context.FromNum===context.Smart.Owner)
    {
        State.UnFreezeNum=context.FromNum;
        State.Freeze=0;
        WriteState(State);
        Event("UnFreeze");
    }
    else
    {
        throw "Access is allowed only from: "+State.UnFreezeNum+" or "+context.Smart.Owner;
    }
}



Чтобы отправлять команды смарты нужна клиентская часть кода, клиент создается в виде HTML-странички. Например:
Code:



Can unfreeze:





В качестве базы данных используется сам счет, привязанный к смарту, чтобы описать структуру его полей введите в поле State format строку:
Code:
{Freeze:byte, UnFreezeNum:uint, DescBlock:uint, DescTr:uint16}


Чтобы отправить этот смарт в сеть, поместите его в окошко Dap-editor-а (верхний код в верхнее окошко, нижний с html - в нижнее), укажите имя и отправьте в сеть (Dap-editor - есть в каждом клиенте).


Jump to: