Com es crea un DApp a les nebuloses (part 2)

Hem publicat diverses biblioteques per facilitar l’escriptura de contractes intel·ligents. Això significa que no haureu de crear explícitament cap d'aquests contractes intel·ligents des de zero, ja que ja hem fet el treball inicial per vosaltres.

A la segona part de "Com construir DApp sobre les nebuloses" coneixerem aquestes biblioteques, què fan i com utilitzar-les.

Gran nombre

El mòdul BigNumber utilitza bignumber.js, una biblioteca JavaScript per a aritmètica decimal i no decimal amb precisió arbitrària. El contracte pot utilitzar BigNumber directament per processar el valor de la transacció i altres transferències de valor.

valor var = New BigNumber (0); value.plus (1); ...

magatzem

El mòdul de memòria permet emmagatzemar dades en nebuloses. Més precisament, permet l’emmagatzematge permanent de variables d’estat a les nebuloses quan es fa un pagament, és a dir, H. GAS, similar a un sistema convencional d’emmagatzematge de valors clau. L’objecte LocalContractStorage és l’objecte d’emmagatzematge integrat a Nebulas que permet utilitzar i acceptar números, cadenes i objectes JavaScript en format de cadena. Només el contracte on s’emmagatzemen aquestes dades pot accedir-hi i editar-los.

Conceptes bàsics

LocalContractStorage admet tres operacions, i. H. Configureu, obteniu i suprimiu les dades que us permetin desar, llegir i suprimir dades:

"utilitzar estricte";
var BankVaultContract = function () {// res};
BankVaultContract.prototype = {init: function () {// nothing}, set: function (name, value) {// name = "robin", value = 10000 LocalContractStorage.set ("name", name); // 'put' és una operació equivalent a 'set' LocalContractStorage.put ("valor", valor); }, get: function () {var name = LocalContractStorage.get ("nom"); console.log (nom); // imprimeix el valor var 'robin' = LocalContractStorage.get ("valor"); console.log (valor); // imprimeix '10000'}, del: function () {var result = LocalContractStorage.del ("nom"); console.log (resultat); // imprimeix 'robin' // 'esborra' és una operació equivalent a 'del' result = LocalContractStorage.delete ("valor"); console.log (resultat); // imprimeix '10000' // Després de suprimir les dades ja no es podien llegir}};
module.exports = BankVaultContract;

Avançat

A més dels usos bàsics esmentats anteriorment, LocalContractStorage també admet la definició de propietats d'emmagatzematge i l'emmagatzematge de mapes a objectes, així com mètodes de serialització.

  • Propietats d'emmagatzematge

Una propietat contractual es pot enllaçar amb una propietat d’emmagatzematge en què es realitzi tant la lectura com l’escriptura del contracte a LocalContractStorage. Hi ha dos mètodes per definir aquest vincle:

// lliga una propietat d'objecte anomenada "fieldName" a "obj" amb el descriptor. // El descriptor per defecte és JSON.parse () / JSON.stringify (). Independentment de si el descriptor és "nul" o "indefinit", s'utilitza el valor per defecte. // torna això. defineProperty (obj, fieldName, [descriptor]); // lliga diverses propietats a ʻobj` en un lot. // torna això. defineProperties (obj, {fieldName1: descriptor1, fieldName2: descriptor2});

Normalment, mapem propietats contractuals per emmagatzemar bits en inicialització com aquesta:

"utilitzar estricte";
var BankVaultContract = function () {// A causa de "nul" s'utilitza el descriptor estàndard. LocalContractStorage.defineProperty (aquest, "nom1", nul); // Una implementació personalitzada del descriptor. // Torna l'objecte BigNumber quan s'analitza. LocalContractStorage.defineProperty (this, "value1", {stringify: function (obj) {return obj.toString ();}, parse: function (str) {return new BigNumber (str);}}); // Enquadernació per lots amb implementació de serialització estàndard. LocalContractStorage.defineProperties (això, {nom2: nul, valor2: nul)); }; module.exports = BankVaultContract;

Després d'això, podeu llegir i escriure les propietats d'enquadernació com si accedís directament a la memòria:

BankVaultContract.prototype = {init: function (name, value) {// name = "robin", value = 1 this.name1 = name; this.value1 = valor; }, testStorage: funció (nom, valor) {// nom = "ROBIN", valor = 2 aquest.nom2 = nom; this.value2 = valor; bool r = this.value1.lessThan (New BigNumber (0)); console.log (this.name1 + ":" + r); // Robin: console.log incorrecte (this.name2 + ":" + this.value2); // ROBIN: 2}};
  • Deseu les dades de la targeta

La memòria Nebulas implementa una estructura de targeta amb operadors per esborrar, obtenir, configurar i configurar per a alguns escenaris on cal emmagatzemar dades de valor clau. Per aconseguir-ho, podeu definir la propietat del contracte com una targeta. Hi ha dos mètodes per a això:

// La implementació del descriptor estàndard d'enquadernació simple és idèntica a defineProperty. // torna això. defineMapProperty (obj, mapName, [descriptor]); // enquadernació de pila. // torna això. defineMapProperties (obj, {mapName1: descriptor1, mapName2: descriptor2});

Vegem un exemple d'ús de cartes:

"utilitzar estrictament"; var BankVaultContract = function () {LocalContractStorage.defineMapProperty (això, "userMap"); LocalContractStorage.defineMapProperty (això, "userBalanceMap", {stringify: function (obj) {return obj.toString ();}, parse: function (str) {return new BigNumber (str);}})); LocalContractStorage.defineMapProperties (això, {key1Map: null, key2Map: null}); }; BankVaultContract.prototype = {init: function () {}, testStorage: function () {this.userMap.set ("robin", "1"); this.userBalanceMap.set ("robin", nou BigNumber (1)); }, testRead: function () {// llegir i desar les dades var balance = this.userBalanceMap.get ("robin"); this.key1Map.set ("robin", balance.toString ()); this.key2Map.set ("robin", balance.toString ()); }}; module.exports = BankVaultContract;

Blockchain

El mòdul blockchain s’utilitza per recuperar la transacció i bloquejar-lo dins del contracte que s’executa actualment. A més, NAS es pot recuperar del contracte i es proporciona la verificació de l’adreça.

Blockchain té dues propietats:

  1. Bloqueja el bloc actual per al processament de contractes amb atributs:

- Marca de temps del bloc de marca de temps

- hash block hash

- alçada del bloc

2. Transacció Transacció actual per al processament del contracte amb atributs:

- Hash hash de transaccions

- des de la transacció des de l'adreça

- a la transacció a l'adreça

- valor de transacció de valor, un objecte BigNumber per a l'ús del contracte

- No transacció Nonce

- Marca de temps de transacció de marca de temps

- transacció gasPrice gasPrice, un objecte BigNumber per a ús contractual

- transacció gasLimit gasLimit, un objecte BigNumber per a l'ús del contracte

I blockchain ofereix dos mètodes:

  1. transferència (adreça, valor) transfereix NAS de contracte a adreça.
  • adreça param: l'adreça de la Nebulosa a la qual enviar el NAS
  • valor param: valor passat, un objecte BigNumber

Devolucions: 0 transferència realitzada, 1 transferència fallida.

2. verifyAddress (adreça) comprova si l'adreça del paràmetre és una adreça vàlida de Nebulas.

retorn: 1 adreça és vàlida, 0 adreça no vàlida.

Aquí teniu un exemple senzill d’aquest mòdul:

"utilitzar estrictament"; var BankVaultContract = function () {}; BankVaultContract.prototype = {init: function () {console.log ('init: Blockchain.block.height =' + Blockchain.block.height); console.log ('init: Blockchain.transaction.from =' + Blockchain.transaction.from); }, Transferència: funció (adreça, valor) {var result = Blockchain.transfer (adreça, valor); console.log ("resultat de la transferència:", resultat); }, verifyAddress: funció (adreça) {var result = Blockchain.verifyAddress (adreça); console.log ("resultAdverify result:", resultat); }}; module.exports = BankVaultContract;

esdeveniment

El mòdul Esdeveniments s'utilitza per registrar els esdeveniments d'execució del contracte. Els esdeveniments enregistrats s'emmagatzemen al registre d'esdeveniments de la cadena, que es pot recuperar des de rpc.getEventsByHash amb el hash de la transacció d'execució. Tots els temes d’esdeveniments contractuals tenen una cadena. Prefix amb temes personalitzats. L'ús és:

Event.Trigger (tema, obj);
  • topic: Tema personalitzat
  • obj: objecte JSON

Aquí teniu l'exemple:

"utilitzar estrictament"; var BankVaultContract = function () {}; BankVaultContract.prototype = {init: function () {},
testEvent: function () {// el tema desat és en realitat "chain.contract.topic" Event.Trigger ("topic", {data: {value: "event event."}}); }}; module.exports = BankVaultContract;

consola

El mòdul de consola proporciona una senzilla consola de depuració que és similar al mecanisme de consola JavaScript proporcionat pels navegadors web. La consola imprimeix tots els Args enviats a Nebulas Logger a un nivell específic assignat al nom del mètode anomenat.

  • console.log ([... args ]) - - Nivell d'informació
  • console.debug ([... args ]) - - Nivell de depuració
  • console.warn ([... args ]) - - Nivell d'advertència
  • console.error ([... args ]) - - Nivell d'error
  • console.info ([... args ]) - - Àlies per a console.log ()

Ara hem acabat de parlar dels principals mòduls funcionals. A continuació, fem una ullada a les funcions contractuals de trucades.

Com puc obrir un contracte?

L'enfocament recomanat és unir-se a la xarxa principal o de prova de la nebulosa iniciant un node local. Aquí teniu una guia ràpida sobre com fer-ho.

Després d'iniciar el node, primer haureu de desbloquejar el vostre propi compte amb unlockAccount () abans de trucar a una funció contractual:

// request curl -i -H 'tipus de contingut: application / json' -X POST http: // localhost: 8685 / v1 / admin / account / unlock -d '{"address": "n1czGUvbQQton6KUWga4wKDLLKYDEn39mEk", "passphrase": " frase de contrasenya "," duration ":" 1000000000 "} '// Resultat {" Result ": {" Result ": true}}

A continuació, podeu utilitzar el mètode sendTransaction () per trucar al contracte intel·ligent.

Per exemple, truqueu testEvent () al contracte de mostra anterior:

// Request curl -i -H 'Accept: application / json' -X POST http: // localhost: 8685 / v1 / admin / transaction -H 'Tipus de contingut: application / json' -d '{"from": "n1NZttPdrJCwHgFN3V6YnSDaD5g8UbVppoC "," to ":" n1qsgj2C5zmYzS9TSkPTnp15bhCCocRPwno "," value ":" 100 "," nonce ": 8," gasPrice ":" 1000000 "," gasLimit ":" 2000000 "," contract ": {" function ":" testEvent "," args ":" [] "}} '// Resultat {" Resultat ": {" txhash ":" b55358c2e12c1d48d4e6beaee7002a59138294fb2896ea8059ff5277553af59f "," contract_address ":" "}}

Per obtenir més informació sobre el manual de RPC, consulteu l’API d’usuari i administrador.

Que segueix?

Al següent article introduirem una nova característica de Smart Contract, i. H. La funció "Accepta".