Kuinka rakentaa DApp Nebulasiin (osa 2)

Olemme julkaissut useita kirjastoja helpottaaksesi älykkäiden sopimusten kirjoittamista. Tämä tarkoittaa, että sinun ei tarvitse luoda mitään näistä älykkäistä sopimuksista tyhjästä, koska olemme jo tehneet ensimmäisen työn puolestasi.

Kohdassa ”Kuinka rakentaa DApp Nebulasille” -osiossa aiomme oppia näistä kirjastoista, niiden tekemistä ja niiden käytöstä.

BigNumber

BigNumber-moduuli käyttää bignumber.js-koodia, JavaScript-kirjastoa mielivaltaisen tarkkoihin desimaalien ja desimaalien aritmeettisiin arvoihin. Sopimus voi käyttää BigNumberia suoraan transaktioiden ja muiden arvonsiirtojen käsittelemiseen.

var arvo = uusi BigNumber (0);
value.plus (1);
...

varastointi

Tallennusmoduuli mahdollistaa tiedon tallentamisen Nebulasissa. Tarkemmin sanottuna se mahdollistaa tilamuuttujien pysyvän tallentamisen Nebulasissa, kun maksu suoritetaan, ts. GAS, samankaltaisena kuin perinteinen avain-arvoinen tallennusjärjestelmä. LocalContractStorage-objekti on Nebulasissa sisäänrakennettu tallennusobjekti, jota voit käyttää ja hyväksyä numeroita, merkkijonoja ja JavaScript-objekteja merkkijonomuodossa. Vain näitä tietoja tallentava sopimus voi käyttää niitä ja käyttää niitä.

Perusasiat

LocalContractStorage tukee kolmea toimintoa, ts. Asetusta, saamista ja poistamista, joiden avulla voit tallentaa, lukea ja poistaa tietoja:

"käytä tiukasti";
var BankVaultContract = toiminto () {
    // ei mitään
};
BankVaultContract.prototype = {
    init: funktio () {
        // ei mitään
    },
    asetettu: toiminto (nimi, arvo) {// nimi = "robin", arvo = 10000
        LocalContractStorage.set ("nimi", nimi);
        // 'put' vastaa operaatiota 'set'
        LocalContractStorage.put ("arvo", arvo);
    },
    get: function () {
        var nimi = LocalContractStorage.get ("nimi");
        console.log (nimi); // tulostaa 'robin'
        var arvo = LocalContractStorage.get ("arvo");
        console.log (arvo); // tulostaa '10000'
    },
    del: toiminto () {
        var tulos = LocalContractStorage.del ("nimi");
        console.log (tulos); // tulostaa 'robin'
        // 'poista' vastaa toimintoa 'del'
        tulos = LocalContractStorage.delete ("arvo");
        console.log (tulos); // tulostaa '10000'
    
        // poiston jälkeen tietoja ei voitu enää lukea
    }
};
module.exports = BankVaultContract;

Pitkälle kehittynyt

Edellä mainittujen peruskäyttöjen lisäksi LocalContractStorage tukee myös tallennusominaisuuksien määrittelemistä ja karttojen tallentamista kohteille sekä sarjoitusmenetelmiä.

  • Tallennusominaisuudet

Sopimuksen omaisuus voidaan sitoa varasto-omaisuuteen, jossa sekä sopimuksen lukeminen että kirjoittaminen suoritetaan LocalContractStoragessa. On olemassa kaksi tapaa määritellä tällainen sitominen:

// sido objektin ominaisuus nimeltä `fieldName`` obj`: ksi kuvauksella.
// oletuskuvaus on JSON.parse () / JSON.stringify (). Oletusarvoa käytetään riippumatta siitä, onko kuvaaja 'nolla' tai 'määrittelemätön'.
// palauta tämä.
defineProperty (obj, kentänimi, [kuvaaja]);

// sitoa useita ominaisuuksia erässä "obj".
// palauta tämä.
defineProperties (obj, {
    fieldName1: deskriptor1,
    fieldName2: deskriptor2
});

Yleensä kartoitamme sopimusominaisuudet bittien tallentamiseksi alustamisessa seuraavasti:

"käytä tiukasti";
var BankVaultContract = toiminto () {
    // 'nollan' takia käytetään oletuskuvausta.
    LocalContractStorage.defineProperty (tämä, "nimi1", nolla);
    
    // mukautettu "kuvaajan" toteutus.
    // palauta BigNumber-objekti jäsentämisen aikana.
    LocalContractStorage.defineProperty (tämä, "arvo1", {
        stringify: function (obj) {
            paluu obj.toString ();
        },
        jäsentää: funktio (str) {
            palauta uusi BigNumber (str);
        }
    });
    
    // eränsidonta oletusarvoisella sarjanmuodostuksella.
    LocalContractStorage.defineProperties (tämä, {
        nimi2: nolla,
        arvo2: nolla
    });
};
module.exports = BankVaultContract;

Sen jälkeen voit lukea ja kirjoittaa sidontaominaisuudet samalla tavalla kuin käytät suoraan tallennustilaa:

BankVaultContract.prototype = {
    init: toiminto (nimi, arvo) {// nimi = "robin", arvo = 1
        this.name1 = nimi;
        tämä.arvo1 = arvo;
    },
    testStorage: toiminto (nimi, arvo) {// nimi = "ROBIN", arvo = 2
        this.name2 = nimi;
        tämä.arvo2 = arvo;
        
        bool r = this.value1.lessThan (uusi BigNumber (0));
        konsoli.logi (tämä.nimi1 + ":" + r); // robin: väärä
        console.log (this.name2 + ":" + this.value2); // ROBIN: 2
    }
};
  • Karttatietojen tallentaminen

Nebulas-tallennus toteuttaa karttarakenteen, jossa on / poistetaan, haetaan, asetetaan / laitetaan operaattoreita joillekin skenaarioille, joissa joudut tallentamaan avain-arvotiedot. Tämän saavuttamiseksi voit määritellä sopimuksen omaisuuden kartalla. Tässä on jälleen kaksi tapaa:

// yhden sitovan, oletuskuvaajan toteutus on sama defineProperty: n kanssa.
// palauta tämä.
defineMapProperty (obj, mapName, [deskriptor]);

// erä sidonta.
// palauta tämä.
defineMapProperties (obj, {
    mapName1: deskriptor1,
    mapName2: kuvaaja2
});

Katsotaan esimerkki karttojen käytöstä:

'käytä tiukasti';

var BankVaultContract = toiminto () {
    LocalContractStorage.defineMapProperty (tämä, "userMap");
    
    LocalContractStorage.defineMapProperty (tämä, "userBalanceMap", {
        stringify: function (obj) {
            paluu obj.toString ();
        },
        jäsentää: funktio (str) {
            palauta uusi BigNumber (str);
        }
    });
    
    LocalContractStorage.defineMapProperties (tämä, {
        key1Map: nolla,
        key2Map: nolla
    });
};

BankVaultContract.prototype = {
    init: funktio () {
    },
    testStorage: toiminto () {
        this.userMap.set ("robin", "1");
        this.userBalanceMap.set ("robin", uusi BigNumber (1));
    },
    testRead: function () {
        // Lue ja tallenna tiedot
        var tasapaino = this.userBalanceMap.get ("robin");
        this.key1Map.set ("robin", balance.toString ());
        this.key2Map.set ("robin", balance.toString ());
    }
};

module.exports = BankVaultContract;

Blockchain

Blockchain-moduulia käytetään tapahtuman hankkimiseen ja estoon parhaillaan toteutettavassa sopimuksessa. Myös NAS voidaan siirtää sopimuksesta ja osoitteen varmennus toimitetaan.

Blockchainilla on kaksi ominaisuutta:

  1. lohko nykyinen lohko sopimuksen toteuttamiselle määritteillä:

- aikaleima estää aikaleiman

- hash block hash

- korkeuslohkon korkeus

2. tapahtuman nykyinen tapahtuma sopimuksen toteuttamiseksi määritteillä:

- hash tapahtuma hash

- tapahtumasta osoitteesta

- kauppaan osoitteeseen

- arvo transaktioarvo, BigNumber-objekti sopimuksen käyttöön

- nonce-kauppa

- aikaleima tapahtuman aikaleima

- gasPrice-tapahtuma gasPrice, BigNumber-objekti sopimukseen

- gasLimit-tapahtuma gasLimit, BigNumber-objekti sopimukseen

Ja Blockchain tarjoaa kaksi tapaa:

  1. siirto (osoite, arvo) siirtää NAS: n sopimuksesta osoitteeseen.
  • param-osoite: Nebulas-osoite vastaanottaa NAS
  • parametriarvo: siirretty arvo, BigNumber-objekti

paluu: 0-siirto onnistunut, 1-siirto epäonnistui.

2. checkAddress (address) tarkistaa onko parametriosoite kelvollinen Nebulas-osoite.

paluu: 1-osoite on kelvollinen, 0-osoite on virheellinen.

Tässä on yksinkertainen esimerkki toteutetusta moduulista:

'käytä tiukasti';

var BankVaultContract = toiminto () {};

BankVaultContract.prototype = {
    init: funktio () {
        console.log ('init: Blockchain.block.height =' + Blockchain.block.height);
        console.log ('init: Blockchain.transaction.from =' + Blockchain.transaction.from);
    },
    
    siirto: toiminto (osoite, arvo) {
        var tulos = Blockchain.transfer (osoite, arvo);
        console.log ("siirtotulos:", tulos);
    },
    
    checkAddress: toiminto (osoite) {
    var tulos = Blockchain.verifyAddress (address);
        console.log ("checkAddress tulos:", tulos);
    }
};

module.exports = BankVaultContract;

Tapahtuma

Tapahtumamoduulia käytetään tallentamaan toteutustapahtumat sopimukseen. Tallennetut tapahtumat tallennetaan tapahtumatie-ketjuun ketjussa, jonka rpc.getEventsByHash voi noutaa suoritustapahtuman hashilla. Kaikilla sopimustapahtumien aiheilla on ketju.sopimus. etuliite käyttäjän määrittelemillä aiheilla. Käyttö on:

Tapahtuma.Trigger (aihe, obj);
  • Aihe: käyttäjän määrittelemä aihe
  • obj: JSON-objekti

Tässä on esimerkki:

'käytä tiukasti';

var BankVaultContract = toiminto () {};

BankVaultContract.prototype = {
    init: funktio () {},
testEvent: function () {
        // tallennettu aihe on oikeastaan ​​"ketju.sopimus.topic"
        Tapahtuma.Trigger ("aihe", {
Tiedot: {
arvo: "Tapahtumatesti."
}
        });
    }
};

module.exports = BankVaultContract;

Konsoli

Konsolimoduuli tarjoaa yksinkertaisen virheenkorjauskonsolin, joka on samanlainen kuin selainten tarjoama JavaScript-konsolimekanismi. konsoli tulostaa kaikki vastaanotetut merkinnät Nebulas Loggerille tietyllä tasolla, joka liittyy kutsutun menetelmän nimeen.

  • console.log ([… args ]) - - infotaso
  • console.debug ([… args ]) - - debug-taso
  • console.warn ([… args ]) - - varoita taso
  • console.error ([… args ]) - - virhetaso
  • console.info ([… args ]) - - aliaksen console.log ()

Puhumme nyt johtavista ominaisuusmoduuleista. Seuraavaksi tarkastellaan sopimustoimintojen kutsumista.

Kuinka soittaa sopimukselle?

Suositeltava tapa on liittyä Nebulas-verkkoon tai testiverkkoon käynnistämällä paikallinen solmu. Tässä on nopea aloitusopas siitä, kuinka se tehdään.

Kun solmu on käynnistetty, sinun pitäisi ensin avata oma tili kerran kerran unlockAccount () -sovelluksella, ennen kuin soitat mihin tahansa sopimustoimintoon:

// Pyyntö
curl -i -H 'Sisältö-tyyppi: application / json' -X POST http: // localhost: 8685 / v1 / admin / account /lock -d '{"address": "n1czGUvbQQton6KUWga4wKDLLKYDEn39mEk", "passphrase": "passphrase ", "kesto": "1000000000"}'

// Tulos
{
    "tulos":{
        "Tulos": true
    }
}

Sitten voit käyttää SendTransaction () -menetelmää älykkään sopimuksen vetämiseen.

Kutsu esimerkiksi testEvent () edellisessä mallisopimuksessa:

// Pyyntö
curl -i -H 'Hyväksy: application / json' -X POST http: // localhost: 8685 / v1 / admin / transaktio -H 'Content-Type: application / json' -d '{"from": "n1NZttPdrJCwHgFN3V6YnSDaD5g8UbVppoC" , "to": "n1qsgj2C5zmYzS9TSkPTnp15bhCCocRPwno", "arvo": "100", "nonce": 8, "gasPrice": "1000000", "gasLimit": "2000000", "sopimus": {"toiminto": "testEvent ", "args": "[]"}}

// Tulos
{
"Tulos": { "txhash": "b55358c2e12c1d48d4e6beaee7002a59138294fb2896ea8059ff5277553af59f", "contract_address": ""}
}

Lisätietoja RPC-käsikirjasta on käyttäjän sovellusliittymässä ja järjestelmänvalvojan sovellusliittymässä.

Mitä tulee seuraavaksi?

Tulevassa artikkelissa jaamme älykkään sopimuksen uuden ominaisuuden, ts. ”Hyväksy” -toiminnon.