Tutorial Hyperledger Fabric: Ghid cuprinzător – Partea 3

Următoarea serie de tutoriale constă din trei articole care vă vor învăța diverse aspecte despre dezvoltarea codului de cod Hyperledger Fabric, de la operații CRUD, protecția datelor și testarea codului de cod.

Partea 1

Partea 2

Partea 3

Tutorial Hyperledger Fabric: Ghid cuprinzător - Partea 2

#Crypto ExchangeBenefits

1

Binance
Best exchange


VISIT SITE
  • ? The worlds biggest bitcoin exchange and altcoin crypto exchange in the world by volume.
  • Binance provides a crypto wallet for its traders, where they can store their electronic funds.

2

Coinbase
Ideal for newbies


Visit SITE
  • Coinbase is the largest U.S.-based cryptocurrency exchange, trading more than 30 cryptocurrencies.
  • Very high liquidity
  • Extremely simple user interface

3

eToro
Crypto + Trading

VISIT SITE
  • Multi-Asset Platform. Stocks, crypto, indices
  • eToro is the world’s leading social trading platform, with thousands of options for traders and investors.

O prezentare generală a seriei:

  • Articolul 1: Dezvoltarea codului de bază de bază și stocarea datelor private în colecții
  • Articolul 2: interogări avansate de cod de cod și interfața grafică CouchDB
  • Articolul 3: Un tutorial pentru testarea codului de chainc cu MockStub

Cerințe

  • 4 GB RAM (se preferă mai mult)
  • Docker, Docker-Compose, editor de cod (de ex. Visual Studio Code), Git
  • NodeJS versiunea 8.9+ (Preferat este 8.9.4 – Sfat: schimbați versiunea cu un manager de versiuni precum „n’)
  • Cunoștințe de bază despre JavaScript

Obiective

  • Aflați să vă testați funcțiile codului de cod
  • Învață să batjocorești și să invoci funcții
  • Comparați rezultatele cu testarea Chai

Introducere

#CRYPTO BROKERSBenefits

1

eToro
Best Crypto Broker

VISIT SITE
  • Multi-Asset Platform. Stocks, crypto, indices
  • eToro is the world’s leading social trading platform, with thousands of options for traders and investors.

2

Binance
Cryptocurrency Trading


VISIT SITE
  • ? Your new Favorite App for Cryptocurrency Trading. Buy, sell and trade cryptocurrency on the go
  • Binance provides a crypto wallet for its traders, where they can store their electronic funds.

#BITCOIN CASINOBenefits

1

Bitstarz
Best Crypto Casino

VISIT SITE
  • 2 BTC + 180 free spins First deposit bonus is 152% up to 2 BTC
  • Accepts both fiat currencies and cryptocurrencies

2

Bitcoincasino.io
Fast money transfers


VISIT SITE
  • Six supported cryptocurrencies.
  • 100% up to 0.1 BTC for the first
  • 50% up to 0.1 BTC for the second

În cele două articole anterioare, am învățat să creăm atât funcții de bază, cât și funcții de cod de cod mai avansate. Importanța testării codului de legătură nu poate fi subestimată. O singură greșeală poate avea consecințe dramatice atunci când se ocupă de contracte inteligente. Prin urmare, vom pune la încercare calitatea funcțiilor noastre de cod de cod.

Incepe

Asigurați-vă că aveți o copie a codului care poate fi găsită pe Github michielmulders / hyperledger-fabric-blockgeeks. Se recomandă utilizarea git clona https://github.com/michielmulders/hyperledger-fabric-blockgeeks.git pentru a crea o clonă locală a depozitului pe computerul dvs. Utilizare tutorial git checkout-3 pentru a deschide codul pentru acest tutorial și a verifica a treia parte a tutorialului cu tutorial git checkout-3

Dacă nu sunteți nou la acest tutorial, asigurați-vă că ați verificat secțiunea „Configurare Boilerplate” din primul articol pentru a porni în funcțiune.

Acum, să navigăm cu terminalul la cod de cod / nod pliant. De aici, putem fugi npm test de rulare pentru a începe testele noastre. Testele în sine sunt localizate la chaincode / nod / tests / tests.spec.ts. Să aruncăm o privire la aceste teste.

Testarea utilizând Mockstub

Jonas Snellinckx de la TheLedger explică ce este ChaincodeMockStub, „Acest ChaincodeMockStub este o implementare falsă a butucului de șapă. Aceasta înseamnă că vă puteți testa codul de chainc fără a vă porni de fapt rețeaua. Implementează aproape fiecare funcție pe care o face stubul real, dar în memorie. Doar aceste funcții nu sunt (încă) acceptate: getHistoryForKey, getBinding, getTransient, setEvent, getChannelID. ”

Testarea codului de incidență

Pentru a începe, trebuie să importăm funcționalitatea „expect” din Chai pachet de testare, astfel încât să putem utiliza diferite mecanisme de comparație, cum ar fi compararea obiectelor de răspuns sau a codurilor de stare. Chai este o bibliotecă de afirmații BDD / TDD pentru nod și browser care poate fi asociată cu orice cadru de testare javascript.

import {expect} de la „chai”;

Dacă aruncați o privire la teste.spec.ts fișier, puteți vedea cum grupăm testele împreună cu descrie funcție, aceasta este doar o practică generală a stilului de cod. Apoi, folosim aceasta funcția de definire a testelor individuale.

Majoritatea testelor încep cu crearea unei noi instanțe a codului nostru de conexiune. Acest lucru nu este întotdeauna necesar, deoarece putem defini, de asemenea, o instanță globală a codului nostru de chainc pe care o putem apela și invoca funcții de la fiecare test. Acest lucru depinde de cum și ce doriți să testați, în principal vom încerca să scriem teste unitare, doar testând funcționalitatea de bază a unei funcții. De cele mai multe ori, vom defini o nouă instanță de cod de cod, dar vom instanția, de asemenea, o instanță de cod de cod global cu date instantanee despre mașină care pot fi utilizate în mai multe teste. Să scriem primele noastre teste!

1. Inițierea finalizării codului de incidență

Testați InitLedger

În primul rând, rețeaua noastră începe cu apelarea initLedger funcție care ne umple blockchain-ul cu date despre mașini. Pentru a ne asigura că restul codului nostru de funcționare funcționează corect, trebuie să testăm starea acestei funcții și să verificăm dacă toate datele sunt prezente în starea blockchain.

Începem cu importul codului de cod și creăm o instanță, astfel încât să putem accesa toate funcțiile pe care le-am definit.

importați {MyChaincode} din „../src/MyChaincode”;

const chaincode = nou MyChaincode ();

În continuare, putem defini primul nostru caz de testare, oferindu-i o descriere semnificativă. După cum puteți vedea, definim o nouă instanță de mockstub pe care o vom folosi doar în acest test, deoarece vrem să fim siguri că codul nostru de cod se compilează corect. mockInit funcția inițializează codul de legătură (apelează funcția initLedger). Îi oferim un ID de tranzacție unic tx1 și treceți o matrice goală, deoarece nu necesită argumente. Când este inițializat codul de sincronizare, vrem să testăm starea de execuție și să ne asigurăm că totul a avut succes. Metoda egală a funcționalității Chai expect este utilă pentru a compara starea.

aceasta("Ar trebui să inițieze fără probleme", async () => {

       const stub = new ChaincodeMockStub ("MyMockStub", cod de chainc);

       raspuns const = await stub.mockInit ("tx1", []);

       expect (response.status) .to.eql (200)

});

Amandoua mockInit și mockInvoke funcția returnează următorul obiect promis:

Promisiune<{

   stare: număr;

   mesaj: șir;

   sarcină utilă: tampon;

}>

Verificați datele inițializate

În acest moment, suntem siguri că codul de cod este compilat și inițializat corect. Cu toate acestea, nu suntem siguri dacă toate datele sunt corect adăugate la starea noastră blockchain. Să testăm interogarea tuturor funcționalităților pentru a compara obiectele mașinii returnate cu mașinile așteptate.

De data aceasta, vom crea o instanță globală a mockstub-ului de cod de cod.

aceasta("Ar trebui să poată iniția și interoga toate mașinile", async () => {

       stubWithInit = new ChaincodeMockStub ("MyMockStub", cod de chainc);

       …

}

De data aceasta, mockInvoke funcția este utilizată pentru a invoca funcția queryAllCars în codul de cod. queryResponse.payload conține un tampon pe care îl putem folosi în funcția noastră de comparare. TheLedger a furnizat un ajutor care convertește o sarcină utilă Buffer într-un obiect JSON folosind Transforma ajutor din @ theledger / fabric-mock-stub. Funcția expect conține o metodă profundă care poate compara în totalitate obiectele JSON. Comparăm rezultatul cu obiectele inițiale pe care le-am definit în initLedger funcţie.

const queryResponse = await stubWithInit.mockInvoke ("txID2", ["queryAllCars"]);

expect (Transform.bufferToObject (queryResponse.payload)). to.deep.eq ([

           {

               marca: „Toyota”,

               model: „Prius”,

               Culoarea albastra’,

               proprietar: „Tomoko”,

               docType: „mașină”,

               cheie: „CAR0”

           },

       ])

   });

2. Testează Creați mașină

Să invocăm obiectul de creare a mașinii într-un nou caz de testare. Acesta este un exemplu bun, deoarece ne învață cum să transmitem argumente funcționalității mockInvoke. Acest test constă din două componente. În primul rând, adăugăm noua mașină la starea blockchain, apoi mașina este interogată pentru a compara ambele obiecte.

const stub = new ChaincodeMockStub ("MyMockStub", cod de chainc);

raspuns const = await stub.mockInvoke ("tx1", [‘createCar’, JSON.stringify ({

      cheie: „CAR0”,

      face: "prop1",

      model: "prop2",

      culoare: "prop3",

      proprietar: „proprietar”

})]);

expect (response.status) .to.eql (200)

După cum puteți vedea, putem transmite un obiect JSON complet strâns la mockInvoke funcție care conține toate proprietățile pentru crearea noului obiect Car. După crearea mașinii, verificăm starea de execuție.

Acum mașina este adăugată, o putem interoga din nou pentru a o utiliza în funcționalitatea noastră de comparare. Trecem în cheia Mașinii pe care tocmai am creat-o „CAR0” și realizăm o egalitate profundă.

3. Testarea colecțiilor private

Bine, am introdus ultima parte a acestui tutorial în care vom testa colecțiile private de perspectivă a datelor. Din nou, mockstub-ul are o alternativă în memorie pentru colecțiile private, așa că nu trebuie să pornim rețeaua noastră Hyperledger Fabric.

Din nou, primul lucru pe care îl vom face este să trecem argumentele pentru a crea mașina noastră privată prin intermediul createPrivateCar funcţie.

const stub = new ChaincodeMockStub ("MyMockStub", cod de chainc);

raspuns const = await stub.mockInvoke ("tx1", [‘createPrivateCar’, JSON.stringify ({

    cheie: „CAR0”,

    face: "prop1",

    model: "prop2",

    culoare: "prop3",

    proprietar: „proprietar”

})]);

expect (response.status) .to.eql (200);

Ok, să comparăm obiectul așteptat cu obiectul din colecția privată din memorie. Butonul este suficient de inteligent pentru a crea colecția în memorie atunci când invocați funcția de cod de cod. stub.privateCollections deține o serie de toate colecțiile de date private și specificăm ce colecție dorim și ce obiect să preluăm din această colecție. Acest obiect poate fi asortat cu obiectul Mașină așteptat.

expect (Transform.bufferToObject (stub.privateCollections ["privateCarCollection"] ["CAR0"])). to.deep.eq ({

           ‘make’: ‘prop1’,

           ‘model’: ‘prop2’,

           ‘color’: ‘prop3’,

           ‘proprietar’: ‘proprietar’,

           ‘docType’: ‘mașină’

       })

Rulați toate testele

Bine, este timpul să rulați din nou testele noastre, utilizați npm test de rulare. Dacă totul merge bine, ar trebui să vedeți o prezentare generală frumoasă a ceea ce s-a întâmplat pentru fiecare test și a rezultatului acestuia. Codul ar trebui să redea 8 rezultate trecute, după cum se arată mai jos.

Ce am învățat?

ChaincodeMockStub este foarte util, deoarece permite unui dezvoltator să-și testeze codul de chainc fără a porni rețeaua de fiecare dată. Acest lucru reduce timpul de dezvoltare deoarece poate folosi o abordare de dezvoltare bazată pe test (TDD) în care nu are nevoie să pornească rețeaua (aceasta durează + – 40-80 secunde în funcție de specificațiile computerului). De asemenea, accesarea colecțiilor private în memorie este foarte simplă prin intermediul stub.privateCollections matrice. Aveți nevoie doar de câteva dintre funcționalitățile de testare ale lui Chai, cum ar fi profundul egal, pentru a vă testa corect codul de legătură.

Foaie de cheats pentru cod

  1. Creați o instanță de cod de cod care apelează funcția initLedger.

așteaptă stub.mockInit ("tx1", []);

  1. Invocați o funcție normală și transmiteți argumente.

    raspuns const = await stub.mockInvoke ("tx1", [‘createCar’, JSON.stringify ({

          CarObject…

    })]);

    3. Invocați o funcție chaincode care utilizează colecții private și transmite argumente.

așteaptă stub.mockInvoke ("tx1", [‘createPrivateCar’, JSON.stringify ({

    CarObject…

})]);

  1. Promisiunea de răspuns standard a revenit de la ambele mockInit și mockInvoke:

Promisiune<{

   stare: număr;

   mesaj: șir;

   sarcină utilă: tampon;

}>

Citește în continuare

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me