Bitcoin Forum

Local => Альтернативные криптовалюты => Topic started by: Vtools on November 11, 2018, 11:07:21 AM



Title: Смарт-контракты на javascript
Post by: Vtools on November 11, 2018, 11:07:21 AM
Всем привет.

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

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

Пример простого смарт-контракта под именем Promise, логика которого описана тут: https://bitcointalk.org/index.php?topic=4711054.msg47790792#msg47790792
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:
<HTML>
<script>
    function Freeze()
    {
        var AccountNum=ACCOUNT_OPEN_NUM;//my account
        var UnFreezeNum=$("idUnfreezeNum").value;//account for unfreeze
        var Text="My promise text";//any text

        SendCall(AccountNum,"Freeze",{UnFreezeNum:UnFreezeNum,Text:Text},AccountNum);
    }
</script>

Can unfreeze:<input type="number" id="idUnfreezeNum">
<BR>
<button onclick="Freeze()">Freeze</button>
</HTML>

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


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