Kuidas luua DApp Nebulasse (2. osa)

Nutikate lepingute kirjutamise hõlbustamiseks oleme välja andnud mitu raamatukogu. See tähendab, et te ei pea ühtegi neist nutikatest lepingutest otse nullist looma, sest me oleme juba teinud teie heaks esialgse töö.

Rakenduse „Kuidas DApp Nebulale üles ehitada” teises osas õpime tundma neid raamatukogusid, nende toimimist ja kasutamist.

BigNumber

BigNumberi moodul kasutab suvalise täpsusega kümnendarvude ja mittekohaliste aritmeetikute jaoks JavaScripti teeki bignumber.js. Lepinguga saab BigNumberi kasutada otse tehingu väärtuse ja muude väärtuse ülekandmiste haldamiseks.

var väärtus = uus BigNumber (0);
väärtus.plus (1);
...

Ladustamine

Salvestusmoodul võimaldab andmete salvestamist Nebulase. Täpsemalt võimaldab see oleku muutujate püsivat salvestamist Nebulase, kui makse tehakse, s.o GAS, sarnaselt traditsioonilise võtmeväärtuse salvestussüsteemiga. Objekt LocalContractStorage on Nebulase sisseehitatud salvestusobjekt, mida saate kasutada numbrite, stringide ja JavaScripti objektide stringi vormingus kasutamiseks. Ainult leping, mis neid andmeid salvestab, pääseb sellele juurde ja saab sellega manipuleerida.

Põhitõed

LocalContractStorage toetab kolme toimingut, st seadistamine, hankimine ja eemaldamine, mis võimaldavad andmeid salvestada, lugeda ja kustutada:

"kasuta rangelt";
var BankVaultContract = function () {
    // mitte midagi
};
BankVaultContract.prototype = {
    init: funktsioon () {
        // mitte midagi
    },
    komplekt: funktsioon (nimi, väärtus) {// nimi = "robin", väärtus = 10000
        LocalContractStorage.set ("nimi", nimi);
        // 'panna' on samaväärne toiminguga 'seatud'
        LocalContractStorage.put ("väärtus", väärtus);
    },
    saada: funktsioon () {
        var nimi = LocalContractStorage.get ("nimi");
        console.log (nimi); // prindib 'robin'
        var väärtus = LocalContractStorage.get ("väärtus");
        console.log (väärtus); // prindib '10000'
    },
    del: funktsioon () {
        var tulemus = LocalContractStorage.del ("nimi");
        console.log (tulemus); // prindib 'robin'
        // 'kustutamine' on samaväärne toiminguga 'del'
        tulemus = LocalContractStorage.delete ("väärtus");
        console.log (tulemus); // prindib '10000'
    
        // pärast kustutamist ei olnud andmeid enam võimalik lugeda
    }
};
moodul.exports = BankVaultContract;

Täpsemad

Lisaks ülaltoodud põhilistele kasutusviisidele toetab LocalContractStorage ka salvestusomaduste määratlemist ja objektide kaartide salvestamist, samuti jadamismeetodeid.

  • Salvestuse omadused

Lepinguomandi saab siduda salvestusruumiga, kus LocalContractStorage'is teostatakse nii lepingu lugemine kui ka selle kirjutamine. Sellise köitmise määratlemiseks on kaks meetodit:

// seo objekti omadus nimega fieldName `obj 'kirjeldusega.
// vaikekirjeldaja on JSON.parse () / JSON.stringify (). Kas deskriptor on null või määratlemata, kasutatakse vaikekirjeldust.
// tagastage see.
defineProperty (obj, fieldName, [deskriptor]);

// seob mitu omadust partii obj-le.
// tagastage see.
defineProperties (obj, {
    fieldName1: deskriptor1,
    fieldName2: deskriptor2
});

Tavaliselt kaardistame lepingu atribuudid bittide salvestamiseks lähtestamisel järgmiselt:

"kasuta rangelt";
var BankVaultContract = function () {
    // 'null' tõttu kasutatakse vaikekirjeldajat.
    LocalContractStorage.defineProperty (see, "nimi1", null);
    
    // kohandatud "kirjelduse" teostus.
    // tagastab BigNumberi objekti sõelumise ajal.
    LocalContractStorage.defineProperty (see, "väärtus1", {
        stringify: function (obj) {
            tagasi obj.toString ();
        },
        parsimine: funktsioon (str) {
            tagastage uus BigNumber (str);
        }
    });
    
    // partii köitmine koos serialiseerimise vaikeseadistusega.
    LocalContractStorage.defineProperties (see, {
        nimi2: null,
        väärtus2: null
    });
};
moodul.exports = BankVaultContract;

Pärast seda saate köitmisomadusi lugeda ja kirjutada nii, nagu pääsete otse mäluseadmele:

BankVaultContract.prototype = {
    init: funktsioon (nimi, väärtus) {// nimi = "robin", väärtus = 1
        see.nimi1 = nimi;
        this.value1 = väärtus;
    },
    testStorage: funktsioon (nimi, väärtus) {// nimi = "ROBIN", väärtus = 2
        see.nimi2 = nimi;
        this.value2 = väärtus;
        
        bool r = this.value1.lessThan (uus BigNumber (0));
        console.log (see.nimi1 + ":" + r); // robin: vale
        console.log (this.name2 + ":" + this.value2); // ROBIN: 2
    }
};
  • Kaardiandmete salvestamine

Nebulasi salvestusruum rakendab kaardistruktuuri, kustutades, kustutades, saades, määrates / pannes operaatoreid mõne stsenaariumi jaoks, kus peate salvestama võtmeväärtuse andmeid. Selle saavutamiseks võite määratleda lepingu vara kaardina. Jällegi on selleks kaks meetodit:

// ühekordne köitmine, vaikekirjeldaja rakendamine on sama mis defineProperty.
// tagastage see.
defineMapProperty (obj, mapName, [deskriptor]);

// partii köitmine.
// tagastage see.
defineMapProperties (obj, {
    mapName1: deskriptor1,
    mapName2: deskriptor2
});

Võimaldab vaadata kaartide kasutamise näidist:

'kasuta rangelt';

var BankVaultContract = function () {
    LocalContractStorage.defineMapProperty (see, "userMap");
    
    LocalContractStorage.defineMapProperty (see, "userBalanceMap", {
        stringify: function (obj) {
            tagasi obj.toString ();
        },
        parsimine: funktsioon (str) {
            tagastage uus BigNumber (str);
        }
    });
    
    LocalContractStorage.defineMapProperties (see, {
        key1Map: null,
        key2Map: null
    });
};

BankVaultContract.prototype = {
    init: funktsioon () {
    },
    testStorage: function () {
        this.userMap.set ("robin", "1");
        this.userBalanceMap.set ("robin", uus BigNumber (1));
    },
    testRead: function () {
        // Andmete lugemine ja salvestamine
        var balance = this.userBalanceMap.get ("robin");
        this.key1Map.set ("robin", balance.toString ());
        this.key2Map.set ("robin", balance.toString ());
    }
};

moodul.exports = BankVaultContract;

Blockchain

Blockchaini moodulit kasutatakse tehingu saamiseks ja blokeerimiseks hetkel täitva lepingu piires. Samuti saab NAS-i lepingust üle viia ja aadressi kontrollimist pakkuda.

Blockchainil on kaks omadust:

  1. blokeeri praegune plokk lepingu täitmiseks koos atribuutidega:

- ajatempel blokeerima ajatempel

- räsi ploki räsi

- kõrgusploki kõrgus

2. tehingu praegune tehing lepingu täitmiseks koos atribuutidega:

- räsi tehingu räsi

- tehingult aadressilt

- tehinguga aadressile

- tehinguväärtus, BigNumber-objekt lepingu kasutamiseks

- nonce tehingu nonce

- tehingute ajatempel

- gasPrice tehing gasPrice, BigNumber objekt lepinguliseks kasutamiseks

- gasLimit tehing gasLimit, lepinguks kasutamiseks mõeldud objekt BigNumber

Ja Blockchain pakub kahte meetodit:

  1. ülekanne (aadress, väärtus) kannab NAS-i üle lepingult aadressile.
  • parameetri aadress: Nebulase aadress NAS-i saamiseks
  • parameetri väärtus: ülekantud väärtus, BigNumber-objekt

tagastamine: 0-edastus õnnestus, 1-edastus ebaõnnestus.

2. verdiaadress (aadress) kontrollib, kas parameetri aadress on kehtiv Nebulase aadress.

tagastamine: 1-aadress on kehtiv, 0-aadress on kehtetu.

Siin on lihtne näide selle mooduli rakendamisest:

'kasuta rangelt';

var BankVaultContract = function () {};

BankVaultContract.prototype = {
    init: funktsioon () {
        console.log ('init: Blockchain.block.height =' + Blockchain.block.height);
        console.log ('init: Blockchain.transaction.from =' + Blockchain.transaction.from);
    },
    
    ülekanne: funktsioon (aadress, väärtus) {
        var tulemus = Blockchain.transfer (aadress, väärtus);
        console.log ("ülekande tulemus:", tulemus);
    },
    
    checkAddress: funktsioon (aadress) {
    var tulemus = Blockchain.verifyAddress (aadress);
        console.log ("checkAddress tulemus:", tulemus);
    }
};

moodul.exports = BankVaultContract;

Üritus

Sündmuste moodulit kasutatakse täitmissündmuste registreerimiseks lepingus. Salvestatud sündmused salvestatakse ahelas olevasse sündmuse trie, mille saab rpc.getEventsByHash abil välja viia koos täitmistehingu räsiga. Kõigil lepinguliste sündmuste teemadel on kett-leping. eesliide kasutaja määratletud teemadega. Kasutamine on:

Üritus.Trigger (teema, obj);
  • teema: kasutaja määratletud teema
  • obj: JSON-objekt

Siin on näide:

'kasuta rangelt';

var BankVaultContract = function () {};

BankVaultContract.prototype = {
    init: funktsioon () {},
testEvent: function () {
        // salvestatud teema on tegelikult "chain.contract.topic"
        Sündmus.Trigger ("teema", {
Andmed: {
väärtus: "Sündmuse test."
}
        });
    }
};

moodul.exports = BankVaultContract;

Konsool

Konsoolimoodul pakub lihtsat silumiskonsooli, mis sarnaneb veebibrauserite pakutavale JavaScripti konsoolimehhanismile. konsool prindib kõik saadud argid Nebulase logijale konkreetsel tasemel, mis on seotud kutsutud meetodi nimega.

  • console.log ([… args ]) - - teabe tase
  • console.debug ([… args ]) - - silumise tase
  • console.warn ([… args
  • console.error ([… args ]) - - veatase
  • console.info ([… args ]) - - konsooli.log varjunimi ()

Nüüd räägime juhtivatest funktsioonimoodulitest. Järgmisena käsitleme lepingu funktsioonide helistamist.

Kuidas hankelepinguid sõlmida?

Soovitatav lähenemisviis on liituda Nebulase magneti või testvõrguga, käivitades kohaliku sõlme. Siit leiate lühikese juhise, kuidas seda teha.

Kui sõlm on käivitatud, peaksite enne mis tahes lepingufunktsiooni helistamist kõigepealt oma konto üksuse unlockAccount () abil lahti võtma:

// Taotlus
curl -i -H 'Content-Type: application / json' -X POST http: // localhost: 8685 / v1 / admin / account / unlock -d '{"address": "n1czGUvbQQton6KUWga4wKDLLKYDEn39mEk", "passphrase": "passphrase "," kestus ":" 1000000000 "} '

// Tulemus
{
    "tulemus":{
        "tulemus": tõsi
    }
}

Seejärel saate nutika lepingu käivitamiseks kasutada meetodit sendTransaction ().

Näiteks helistage eelmises näidislepingus testEvent ():

// Taotlus
curl -i -H 'Nõustun: application / json' -X POST http: // localhost: 8685 / v1 / admin / tehing -H 'Sisu tüüp: application / json' -d '{"from": "n1NZttPdrJCwHgFN3V6YnSDaD5g8UbVppoC" , "to": "n1qsgj2C5zmYzS9TSkPTnp15bhCCocRPwno", "value": "100", "nonce": 8, "gasPrice": "1000000", "gasLimit": "2000000", "leping": {"function": "testEvent "," args ":" [] "}} '

// Tulemus
{
"tulemus": {"txhash": "b55358c2e12c1d48d4e6beaee7002a59138294fb2896ea8059ff5277553af59f", "lepingu_aadress": ""}
}

RPC juhendi kohta lisateabe saamiseks vaadake kasutaja API ja administraatori API.

Mis saab edasi?

Eelolevas artiklis jagame nutika lepingu uut funktsiooni, st funktsiooni „Nõustu“.