Тази поредица ще даде обяснение стъпка по стъпка как да започнете пътуването си за разработване на DApp в блокчейна Nebulas. Предполага се, че читателите вече са усвоили основите на Nebulas. Ако не сте, моля, първо посетете нашите уроци.

Можете също така да посетите нашите FAQ, ако имате някакви въпроси, или да се свържете с нас директно на [email protected].

Въведение в интелигентния договор

Интелигентните договори в Nebulas са подобни на класовете в ООП езиците. Те могат да съдържат постоянни данни в променливи на състоянието, както и функции, които могат да променят тези променливи.

Nebulas внедрява NVM като двигател за изпълнение на договори. JavaScript е избран за нашия първи интелигентен договорен език.

Следното е най-простият JS договор:

"use strict";
var BankVaultContract = function () {
    // nothing
};
BankVaultContract.prototype = {
    init: function() {
        // nothing
    }
};
module.exports = BankVaultContract;

В допълнение към JavaScript поддържаме и TypeScript. Ето TS версията на горната проба.

class BankVaultContract {
    constructor() {
        // nothing
    }
    init() {
        // nothing    
    }
}
module.exports = BankVaultContract;

Както можете да видите, тези празни договори са безсмислени, но структурно правилни. Имайте предвид тези две ключови точки:

Едно. Договорът трябва да съдържа функция init, която ще бъде изпълнена само веднъж, когато бъде внедрена. init може да се предава за 0 или повече аргумента:

init: function(arg1, arg2, …) {
    // do something with arg1, arg2, ...
}

Две. В Nebulas дефинираме два вида видимост за функции (JavaScript няма такава видимост):

  • public Всички функции, чието име съответства на regexp ^[a-zA-Z$][A-Za-z0-9_$]*$, са публични, с изключение на init. Публичните функции могат да бъдат извикани чрез транзакции.
  • private Всички функции, чието име започва с _, са лични. Частна функция може да бъде извикана само от публични функции.

Договор за внедряване

Всеки договор се идентифицира уникално с адрес на Nebulas (напр. n1qsgj2C5zmYzS9TSkPTnp15bhCCocRPwno), стига да изпратите договора (в JS или TS) до който и да е възел на Nebulas.

// Request
curl -i -H 'Accept: application/json' -X POST http://localhost:8685/v1/admin/transaction -H 'Content-Type: application/json' -d '{"from":"n1NaY2ywi1J6ENA1htPa4FdeTRMo2hjpD8f","to":"n1NaY2ywi1J6ENA1htPa4FdeTRMo2hjpD8f","gasLimit":200000,"gasPrice":1000000,"value":"0","contract":{"source":"\"use strict\";\nvar BankVaultContract = function () {\n    // nothing\n};\nBankVaultContract.prototype = {\n    init: function() {\n        // nothing\n    }\n};\nmodule.exports = BankVaultContract;","sourceType":"js","args":""},"nonce":1}'

// Result
{
    "result":
    {	    "txhash":"2dd7186d266c2139fcc92446b364ef1a1037bc96d571f7c8a1716bec44fe25d8","contract_address":"n1qsgj2C5zmYzS9TSkPTnp15bhCCocRPwno"
    }
}

Изчакайте за момент, след това проверете получаването на транзакцията, докато статусът се промени на 1, което означава, че договорът е успешно внедрен.

> curl -i -H ‘Content-Type: application/json’ -X POST http://localhost:8685/v1/user/getTransactionReceipt -d ‘{“hash”:”2dd7186d266c2139fcc92446b364ef1a1037bc96d571f7c8a1716bec44fe25d8"}’
{"result":{"hash":"2dd7186d266c2139fcc92446b364ef1a1037bc96d571f7c8a1716bec44fe25d8",...,"status":1}}

Вече всеки може да получи достъп до този договор с contract_address.

Какво следва в тази серия?

Libs, например съхранение, събитие и т.н. И как да извикате функция на договор.