Kako izraditi DApp na maglicama (2. dio)

Izdali smo nekoliko knjižnica kako bismo olakšali pisanje pametnih ugovora. To znači da ne morate izričito stvarati nijedan od tih pametnih ugovora ispočetka, jer smo već radili početni posao za vas.

U drugom dijelu "Kako izgraditi DApp na maglicama" upoznat ćemo s tim knjižnicama, što oni rade i kako ih koristiti.

BigNumber

Modul BigNumber koristi bignumber.js, JavaScript biblioteku za aritmetiku s proizvoljnom preciznošću i nedetaksnom aritmetikom. Ugovor može BigNumber izravno koristiti za obračun vrijednosti transakcije i drugih prijenosa vrijednosti.

var vrijednost = novi BigNumber (0);
value.plus (1);
...

skladištenje

Modul za pohranu omogućuje pohranu podataka na maglu. Preciznije, omogućava trajno pohranjivanje varijabli stanja na Nebulasima kad se izvrši plaćanje, tj. GAS, slično tradicionalnom sustavu za pohranu ključa i vrijednosti. Objekt LocalContractStorage je ugrađeni objekt za pohranu u Nebulasima koji možete koristiti i prihvaćati brojeve, žice i JavaScript objekte u string formatu. Samo ugovor koji pohranjuje ove podatke može pristupiti njima i njima manipulirati.

Osnove

LocalContractStorage podržava tri operacije, tj. Postavljanje, dobivanje i preusmjeravanje koje omogućuju pohranu, čitanje i brisanje podataka:

"koristiti strogi";
var BankVaultContract = funkcija () {
    // ništa
};
BankVaultContract.prototype = {
    init: function () {
        // ništa
    }
    set: funkcija (ime, vrijednost) {// name = "robin", vrijednost = 10000
        LocalContractStorage.set ("ime", ime);
        // 'put' je operacija jednaka 'set'
        LocalContractStorage.put ("vrijednost", vrijednost);
    }
    get: funkcija () {
        var ime = LocalContractStorage.get ("ime");
        console.log (ime); // ispisuje 'robin'
        vrijednost vrijednost = LocalContractStorage.get ("vrijednost");
        console.log (vrijednost); // otiskuje „10000“
    }
    del: function () {
        var rezultat = LocalContractStorage.del ("ime");
        console.log (rezultat); // ispisuje 'robin'
        // 'delete' je operacija ekvivalentna 'del'
        rezultat = LocalContractStorage.delete ("vrijednost");
        console.log (rezultat); // otiskuje „10000“
    
        // nakon brisanja podaci se više nisu mogli pročitati
    }
};
module.exports = BankVaultContract;

Napredna

Pored gore navedenih osnovnih upotreba, LocalContractStorage također podržava definiranje svojstava skladištenja i spremanje karata u objekte, kao i metode serializacije.

  • Skladišna svojstva

Svojstvo ugovora može se vezati za skladišni objekt, gdje se i čitanje i pisanje ugovora izvode na LocalContractStorage. Postoje dvije metode za definiranje takvog vezivanja:

// vezati svojstvo objekta pod nazivom `fieldName` za` obj` s deskriptorom.
// zadani deskriptor je JSON.parse () / JSON.stringify (). Bilo da je deskriptor 'null' ili 'undefined', koristit će se zadani.
// vratite ovo.
defineProperty (obj, poljeName, [deskriptor]);

// veže više svojstava za `obj` u nizu.
// vratite ovo.
defineProperties (obj, {
    fieldName1: deskriptor1,
    fieldName2: deskriptor2
});

Obično mapiramo svojstva ugovora za spremanje bitova u inicijalizaciji na sljedeći način:

"koristiti strogi";
var BankVaultContract = funkcija () {
    // zbog 'null' koristit će se zadani deskriptor.
    LocalContractStorage.defineProperty (ovo, "ime1", nula);
    
    // prilagođena implementacija `deskriptora`.
    // vratiti objekt BigNumber tijekom raščlanjivanja.
    LocalContractStorage.defineProperty (ovo, "value1", {
        stringify: function (obj) {
            vratiti obj.toString ();
        }
        raščlaniti: funkcija (str) {
            vrati novi BigNumber (str);
        }
    });
    
    // vezivanje skupa sa zadanom implementacijom serializacije.
    LocalContractStorage.defineProperties (ovo, {
        name2: null,
        value2: null
    });
};
module.exports = BankVaultContract;

Nakon toga možete pročitati i napisati svojstva povezivanja poput izravnog pristupa pohrani:

BankVaultContract.prototype = {
    init: funkcija (ime, vrijednost) {// name = "robin", vrijednost = 1
        this.name1 = ime;
        this.value1 = vrijednost;
    }
    testStorage: funkcija (ime, vrijednost) {// name = "ROBIN", vrijednost = 2
        this.name2 = ime;
        this.value2 = vrijednost;
        
        bool r = this.value1.lessThan (novi BigNumber (0));
        console.log (this.name1 + ":" + r); // robin: lažno
        console.log (this.name2 + ":" + this.value2); // ROBIN: 2
    }
};
  • Pohrana podataka karata

Skladište nebula implementira strukturu mapa s operaterima del / delete, get, set / put za neke scenarije u kojima trebate pohraniti podatke o ključu i vrijednosti. Da biste to postigli, možete odrediti ugovorno svojstvo kao mapu. Dva su načina za to:

// implementacija pojedinačnog uvezivanja, zadana deskripcija ista je s defineProperty.
// vratite ovo.
defineMapProperty (obj, mapName, [deskriptor]);

// vezanje serije.
// vratite ovo.
defineMapProperties (obj, {
    mapName1: deskriptor1,
    mapName2: deskriptor2
});

Pogledajmo uzorak kako koristiti karte:

'koristiti strogi';

var BankVaultContract = funkcija () {
    LocalContractStorage.defineMapProperty (ovo, "userMap");
    
    LocalContractStorage.defineMapProperty (ovo, "userBalanceMap", {
        stringify: function (obj) {
            vratiti obj.toString ();
        }
        raščlaniti: funkcija (str) {
            vrati novi BigNumber (str);
        }
    });
    
    LocalContractStorage.defineMapProperties (to {
        key1Map: null,
        key2Map: nula
    });
};

BankVaultContract.prototype = {
    init: function () {
    }
    testStorage: function () {
        this.userMap.set ("robin", "1");
        this.userBalanceMap.set ("robin", novi BigNumber (1));
    }
    testRead: function () {
        // Čitanje i pohranjivanje podataka
        var balance = this.userBalanceMap.get ("robin");
        this.key1Map.set ("robin", balance.toString ());
        this.key2Map.set ("robin", balance.toString ());
    }
};

module.exports = BankVaultContract;

Blockchain

Blockchain modul koristi se za dobivanje transakcije i blokade unutar trenutno izvršnog ugovora. Također, NAS se može prenijeti iz ugovora i pružiti provjeru adrese.

Blockchain ima dva svojstva:

  1. blokirati trenutni blok za izvršenje ugovora s atributima:

- vremenska oznaka bloka vremenske oznake

- hash blok hash

- visina bloka visine

2. tekuća transakcija transakcije za izvršenje ugovora s atributima:

- hash transakcije hash

- iz transakcije s adrese

- za transakciju na adresu

- vrijednost transakcijske vrijednosti, BigNumber objekt za korištenje ugovora

- bez ikakve transakcije

- vremenski žig transakcije

- gasPrice transakcija gasPrice, BigNumber objekt za korištenje ugovora

- gasLimit transakcija gasLimit, BigNumber objekt za korištenje ugovora

Blockchain nudi dvije metode:

  1. transfer (adresa, vrijednost) prenosi NAS iz ugovora u adresu.
  • param adresa: Nebulas adresa za primanje NAS
  • param vrijednost: prenesena vrijednost, objekt BigNumber

povratak: uspjeh 0 prijenosa, 1 prijenos nije uspio.

2. verifyAddress (adresa) provjerava je li adresa parametra valjana Nebulas adresa.

povratak: 1-adresa je valjana, 0-adresa nije valjana.

Evo jednostavnog primjera ovog implementiranog modula:

'koristiti strogi';

var BankVaultContract = funkcija () {};

BankVaultContract.prototype = {
    init: function () {
        console.log ('init: Blockchain.block.height =' + Blockchain.block.height);
        console.log ('init: Blockchain.transaction.from =' + Blockchain.transaction.from);
    }
    
    prijenos: funkcija (adresa, vrijednost) {
        var rezultat = Blockchain.transfer (adresa, vrijednost);
        console.log ("prijenos rezultata:", rezultat);
    }
    
    verifyAddress: funkcija (adresa) {
    var rezultat = Blockchain.verifyAddress (adresa);
        console.log ("rezultat verifyAddress:", rezultat);
    }
};

module.exports = BankVaultContract;

Događaj

Modul Event koristi se za snimanje izvršnih događaja u ugovoru. Zabilježeni događaji pohranjuju se u trie događaja na lancu koji može dohvatiti rpc.getEventsByHash s hashom izvršne transakcije. Sve teme o ugovornim događajima imaju lanac.ugovor. prefiks s korisnički definiranim temama. Običaj je:

Event.Trigger (tema, obj);
  • tema: korisnički definirana tema
  • obj: JSON objekt

Evo uzorka:

'koristiti strogi';

var BankVaultContract = funkcija () {};

BankVaultContract.prototype = {
    init: function () {},
testEvent: function () {
        // pohranjena tema je zapravo "chain.contract.topic"
        Event.Trigger ("tema", {
Podaci: {
vrijednost: "Test događaja."
}
        });
    }
};

module.exports = BankVaultContract;

Konzola

Modul konzole pruža jednostavnu konzolu za uklanjanje pogrešaka koja je slična mehanizmu JavaScript konzole koju pružaju web preglednici. konzola će ispisati sve argumente koje je primio u zapisnik Nebulas na određenoj razini koja je povezana s nazivom metode koja se poziva.

  • console.log ([… args ]) - razina informacija
  • console.debug ([… args ]) - - razina uklanjanja pogrešaka
  • console.warn ([… args ]) - - razina upozorenja
  • console.error ([… args ]) - - razina pogreške
  • console.info ([… args ]) - - pseudonim za console.log ()

Sada pričamo o vodećim modulima značajki. Zatim ćemo pogledati pozivanje funkcija ugovora.

Kako nazvati ugovor?

Preporučeni pristup je pridruživanje Nebulas mainnetu ili testnetu pokretanjem lokalnog čvora. Evo kratkog vodiča za početak kako to učiniti.

Nakon što je čvor pokrenut, prvo biste trebali otključati vlastiti račun s unlockAccount () prije nego što nazovete bilo koju funkciju ugovora:

// Zahtjev
curl -i -H 'Vrsta sadržaja: aplikacija / json' -X POST http: // localhost: 8685 / v1 / admin / account / unlock -d '{"adresa": "n1czGUvbQQton6KUWga4wKDLLKYDEn39mEk", "lozinka": "lozinka" ”, "trajanje": "1000000000"}”

// Rezultat
{
    "proizlaziti":{
        „Rezultat”: istina
    }
}

Tada možete koristiti metodu sendTransaction () za pozivanje na pametni ugovor.

Na primjer, pozovite testEvent () u prethodnom uzorku ugovora:

// Zahtjev
curl -i -H 'Prihvati: aplikacija / json' -X POST http: // localhost: 8685 / v1 / admin / transakcija -H 'Vrsta sadržaja: aplikacija / json' -d '{"iz": "n1NZttPdrJCwHgFN3V6YnSDaD5g8UbVppoC" , "to": "n1qsgj2C5zmYzS9TSkPTnp15bhCCocRPwno", "vrijednost": "100", "nonce": 8, "gasPrice": "1000000", "gasLimit": "2000000", "ugovor": {"funkcija": "testEvent ” "" argumenata "[]"}}”

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

Više o RPC priručniku potražite u korisničkom API-ju i admin API-ju.

Što slijedi?

U sljedećem ćemo članku podijeliti novu značajku pametnog ugovora, tj. Funkciju „Prihvati“.