Laborator 6

Tematica laboratorului: Aplicatii descentralizate - DApps

Exemplu de baza pentru structura unei DApp referit in curs

La urmatoarele adrese se gasesc arhivate doua variante ale aplicatiei descentralizate prezentata ca exemplu in cursul 6 (adaptare dupa un exemplu din "Blockchain by Example" - B. Badr, R. Horrocks, X. Wu): varianta ce foloseste framework-ul Express si varianta ce foloseste Truffle Webpack. Aplicatia web simuleaza o licitatie auto. Ambele variante includ un fisier readme.txt cu instructiuni pentru rulare. Mai jos sunt prezentate cateva detalii generale pentru crearea unui DApp folosind Truffle Webpack.

Instalarea truffle necesita ca pas preliminar instalarea node si npm. In particular, in versiunea curenta truffle nu este compatibil inca cu ultima versiune a node deci e recomandabil ca instalarea sa fie facuta pentru node.js in versiunea 18. Setarea versiunii node se poate face prin intermediul nvm:

wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash # daca nvm nu e deja instalat
nvm install 18 # pentru instalarea node versiunea 18
sudo apt install npm
npm install -g truffle

Dupa instalarea truffle, crearea proiectului initial se face intr-un director de proiect prin:

truffle unbox webpack

Pentru a folosi reteaua de test oferita de Ganache, in fisierul truffle-config.js din directorul proiectului se activeaza configuratiile aferente retelei de test (development, port: 7545).

Contractele se vor plasa in directorul contracts. In cazul exemplului considerat exista un singur fisier ce include contractele asociate aplicatiei (prezent in arhivele de mai sus): Auction.sol. In afara de acesta mai exista un contract predefinit Migrations.sol ce e utilizat de Truffle in procesul de deployment.
Compilarea contractelor va avea rezultatele (json) plasate in directorul build si se face prin:

truffle compile

In directorul migrations se vor plasa scripturile utilizate pentru deployment, avand numele fisierelor prefixate numeric in functie de ordinea de executie. Exemplul dat in arhiva contine doua scripturi, 1_initial_migration.js - un script implicit ce asigura operatia de deployment pentru contractul Migrations.sol si 2_migrate_auction.js - un script adaugat pentru operatia de deployment a celorlalte contracte, in cazul exemplului MyAuction din Auction.sol.
Deployment-ul contractelor se realizeaza prin comanda:

truffle migrate --network development

Sursele ce tin de componenta web a aplicatiei vor fi plasate in directorul app/src. In cadrul exemplului dat in arhiva acestea includ doar un fisier index.html si un script auction.js ce realizeaza interactiunea dintre pagina web si contracte (in scriptul de configurare app/webpack.config.js trebuie specificate corect aceste doua fisiere - implicit numele setate sunt index.html si index.js). Interactiunea dintre pagina web si contracte este posibila via MetaMask, dupa cum a fost descris in cadrul cursului. In directorul app/dist mai pot fi plasate si alte biblioteci js daca ar fi necesar.
Pentru posibile incompatibilitati intre webpack si versiunea de node e posibil sa fie necesara setarea urmatoarei variabile de mediu:

export NODE_OPTIONS=--openssl-legacy-provider

Pornirea serverului web ce va oferi aplicatia la portul 8080 se face in cadrul directorului app prin comanda:

npm run dev

Alte framework-uri posibil utile in dezvoltarea de DApps

Hardhat ofera ca si Truffle facilitati de organizare ale proiectelor, functionalitati specifice contextului Ethereum precum o retea simulata pentru teste, si poate fi folosit pentru automatizarea anumitor operatii. Un tutorial pentru utilizarea Hardhat este disponibil la aceasta adresa. Hardhat are o organizare modulara oferind posibilitatea de a integra o arie larga de plugins in dezvoltare, ce ofera suport pentru diverse functionalitati. Cele mai frecvente folosite plugins sunt grupate intr-un bundle numit Hardhat Toolbox.

Foundry este un framework organizat ca o colectie de tools ce pot fi rulate la linia de comanda, orientate in special spre interactiunea cu smart contracts. Tool-ul principal este forge folosit pentru testarea contractelor, deployment si debugging. Pe langa acesta, framework-ul ofera cast, un tool dedicat trimiterii de RPC calls catre un nod Ethereum, ce poate fi util in particular contextul dezvoltarii unei DApp pentru o eventuala a apelurilor catre un contract. Ca si celelalte variante de framework, si Foundry ofera o varianta simulata de nod Ethereum pentru teste, rulabil folosind anvil.

Pe langa framework-urile ce pot fi utilizate local cum sunt Truffle, Hardhat si Foundry, in ultimii ani au aparut numeroase variante accesibile online ce ofera anumite facilitati pentru dezvoltatorii de DApps.
Un serviciu online de tip provider, cum ar fi Infura sau Chainstack, ofera in mod traditional in principal un plan de acces la retelele blockchain, cuantificat in cereri RPC permise pentru un DApp, si posibil oferirea unui API propriu providerului pentru diverse functionalitati specifice.
In particular insa, o parte din serviciile provider ce ofera acces la reteaua Ethereum, au adaugat suport extins pentru development, dezvoltand variante proprii de SDK ce extind API-urile de baza. Exemple in acest sens sunt Alchemy si QuickNode (orientat in special pe operatii cu tokens).
De notat este ca utilizarea acestor API-uri este de regula limitata la providerii respectivi ce ofera suport pe infrastructura proprie folosita pentru acces la retea, deci portarea unui DApp pentru acces printr-un alt provider ar implica modificari la nivelul implementarii.
Pe langa cele de mai sus, mai exista platforme online care sunt orientate in particular pe suport pentru DApp development cum ar fi Thirdweb ce ofera o serie de SDKs pentru integrarea cu diverse limbaje si alte librarii folosite in web development, sau Tenderly cu o orientare semnificativa spre partea de simulari si debugging.

© 2023 Emanuel Onica. Parts of design by W3Layouts