Laborator 1

Tematica laboratorului

1. Pregatirea mediului de lucru

Optional: Instalarea unei masini virtuale Linux

Exemplele si utilitarele folosite in demonstratiile de laborator vor fi cel putin in prima parte rulate sub Linux. Exista insa in majoritatea cazurilor si alternative de instalare si rulare pe Windows. Materialul din pagina laborator va fi insa prezentat in special relativ la Linux in ce priveste necesitatile de pachete pentru instalare.

Pentru instalarea unei masini virtuale Linux se poate utiliza VirtualBox (cu Extension Pack). Avand in vedere disponibilitatea pachetelor de instalare se recomanda o distributie din gama Ubuntu. Una din optiunile ce ofera un consum redus de resurse este Lubuntu in varianta LXDE (penultima versiune stabila recomandata LTS 22.04.5).

Dupa instalarea distributiei pentru lucrul in cadrul laboratoarelor se recomanda instalarea pachetelor de mai jos.
Nota: pentru anumite pachete poate fi recomandabil si un upgrade al versiunii de node existenta pe sistem, care se poate realiza folosind nvm:

wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash # urmat de o repornire a terminalului
nvm install node # "node" is an alias for the latest version

2. Ganache

Ganache este un utilitar ce simuleaza o retea Ethereum de test, ce ofera tranzactii instant, si care pune la dispozitie un set de conturi initializate cu o suma default ce poate fi utilizata in tranzactiile de test. Fiecare cont de test expune o cheie privata prin care poate fi accesat si folosit pentru a initia tranzactii. Initierea respectiva se face prin intermediul unui tool extern ce trebuie conectat la reteaua Ganache - Ganache simuleaza doar nodul Ethereum ce primeste tranzactii si le executa, fara a oferi o posibilitate directa de a initia tranzactiile. Interfata vizuala permite monitorizarea facila a executiei si a efectelor asupra starii conturilor.
Ganache este in curs de retragere, functionand in prezent limitat la o versiune mai veche a retelei Ethereum (Paris/Merge). Avantajul ce inca este oferit de varianta vizuala Ganache fata de alternative este posibilitatea de a defini mai multe retele de test si a schimba facil mediul de lucru intre ele, precum si persistenta operatiilor facute de la o sesiune la alta (pastrarea adreselor de conturi, balantelor asociate, etc.).

Ganache este disponibil pentru download la aceasta adresa https://www.trufflesuite.com/ganache

Nota: Dupa downloadul de pachete binare cu rulare directa ca Ganache e posibil necesara acordarea de drepturi de executie pentru pachetul respectiv. Exemplu:

sudo chmod u+x [nume fisier pachet Ganache]

3. MetaMask

MetaMask este un plugin de browser ce asigura una din principalele modalitati de a interactiona cu o retea blockchain dintr-o aplicatie web descentralizata (DApp). MetaMask are un rol principal de "wallet" ce permite administrarea unor conturi in retele Ethereum sau bazate pe Ethereum, mai precis acces securizat la acestea si initierea de tranzactii. MetaMask poate fi folosit atat pentru simularea de operatii pe retele private de test, prin adaugarea unei noi retele Ethereum si conectarea la aceasta, cat si pentru tranzactii in retelele publice reale.
Adaugarea unei retele de test in pluginul MetaMask se face prin intermediul Networks->Add a custom network si configurarea retelei respective, cum ar fi Ganache ce poate fi rulata local sau Hardhat Network referita mai jos. In unele situatii este necesara ajustarea ChainID-ului sau a numelui retelei pentru acces la aceasta. Ulterior, dupa conectare se pot adauga conturi din reteaua respectiva in MetaMask prin import pe baza cheilor private.

4. Remix

Remix este un IDE browser-based accesibil public la adresa https://remix.ethereum.org ce ofera o serie de plugins care faciliteaza programarea de smart contracts, precum si compilarea si testarea acestora. Remix ofera atat o retea integrata de test, cat si posibilitatea de conectarea la o alta retea cum ar fi cea oferita de Ganache. In cazul conectarii la o retea de test locala, la compilarea contractelor in Remix trebuie avuta atentie la versiunea retelei de test - in sectiunea Advanced Configurations din pluginul de compilare pentru Ganache se va selecta "paris" sau mai redusa, la EVM version.
Un exemplu de baza de smart contract pentru un prim test al mediului oferit de Remix:

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

contract HelloWorld {
    
 function sayHello () public pure returns (string memory) {
   return 'HelloWorld!!!';
 }

}

Optional Remix poate fi instalat si local in modul urmator:

sudo apt install npm
sudo apt install git
npm install -g remix-ide 
npm install -g remixd

5. HardHat si Foundry

Hardhat si Foundry sunt doua exemple de frameworks utile in dezvoltarea de aplicatii pentru Ethereum. In ce urmeaza sunt detaliati pasii necesar pentru instalare si utilizare a unui backend de simulare a retelei, similar cu Ganache de mai sus, dar la nivel de consola. Mai multe detalii despre aceste instrumente vor fi oferite in cursurile si laboratoarele viitoare.

HardHat pune la dispozitie o alternativa proprie de retea simulata Ethereum, insa doar in varianta de consola fara a asigura persistenta starii intre rulari. Aceasta poate fi rulata in modul urmator, dupa crearea unui director de lucru pentru HardHat, in care este necesara prezenta unui fisier de configurare.

mkdir HHNet
cd HHNet
npx hardhat init (se va selecta la acest pas Create an empty hardhat.config.js)
npx hardhat node

La conectarea MetaMask ID-ul retelei locale HardHat in mod implicit ar fi 31337. In cazul in care la conectarea MetaMask la reteaua de test HardHat intervin totusi probleme in ce priveste ChainID-ul acesteia, in fisierul de configurare hardhat.config.js se poate adauga urmatoarea optiune, incercand fortarea explicita a unui ID, fie 1337 sau 31337:

networks: {
  hardhat: {
    chainId: 1337
  }
}

Foundry poate fi instalat ruland comanda curl de mai jos, urmata de actiunea necesara pentru a obtine disponibilitate pentru foundryup in path-ul curent (source sau repornire terminal), si rularea foundryup:

curl -L https://foundry.paradigm.xyz | bash
[source sau repornire terminal]
foundryup

Nota: foundryup poate fi rulata cu o versiune anterioara in cazul unui sistem de operare mai vechi, in cazul in care apare probleme de compatibilitate cu glibc - ex. foundryup -i 0.3.0

Foundry pune la dispozitie un set de tools la linia de comanda, dintre care anvil poate fi utilizata pentru rularea unei retele de test, similara cu cea oferita de HardHat, dar care poate asigura persistenta. Exemplul urmator include o serie dintre posibilii parametri de configurare, persistenta starii fiind asigurata intr-un fisier json prin optiunile dump-state si load-state:

anvil --port 8545 --host 0.0.0.0 --chain-id 1337 --dump-state my_state.json // creare stare initiala
anvil --port 8545 --host 0.0.0.0 --chain-id 1337 --load-state my_state.json --dump-state my_state.json // incarcare si salvare stare

Reteaua simulata poate fi utlizata atat ca backend pentru Remix, precum si cele de mai sus, cat si apelata in mod direct pentru tranzactii sau interogari prin intermediul comenzii cast. Un exemplu pentru o verificare de balanta si un transfer ar fi urmatorul:

cast balance [adresa cont] --rpc-url http://127.0.0.1:8545
cast send [adresa destinatie] --value [x]ether --private-key [cheie cont sursa] --rpc-url http://127.0.0.1:8545

Tool-ul forge poate asigura compilarea (folosind compilatorul solc) si instantierea contractelor. De exemplu pentru un contract cu un constructor simplu fara parametri:

forge create [fisier contract]:[nume contract] --private-key [cheie cont sursa] --rpc-url http://127.0.0.1:8545 --broadcast

In cazul in care apar parametri acestia se specifica dupa nume contract. Apelurile de functii se pot face prin cast call sau cast send in functie de o functie read-only sau care modifica starea contractului:

cast call [adresa contract] ["signatura functie"] [parametri] --rpc-url http://127.0.0.1:8545
© 2025 Emanuel Onica. Parts of design by W3Layouts