Laborator 2

Tematica laboratorului

Aspecte introductive

Dupa finalizarea migrarii Ethereum de la mecanismul Proof-of-Work (PoW) la mecanismul Proof-of-Stake (PoS) arhitectura unui nod participant in reteaua Ethereum a fost modificata fundamental. In linii mari, spre deosebire de variantele precedente corespondente PoW unde un nod avea de regula o implementare unitara, in cazul suportului pentru PoS un nod participant implica rularea unui client de executie si a unui client de consens.
Clientul de executie pastreaza majoritatea functionalitatilor ce au ramas comune cu versiunile anterioare in operarea retelei: primirea initiala si emiterea tranzactiilor in retea, procesarea acestora, stocarea starii conturilor si executarea operatiilor asupra acestora, si in general ceea ce tine de operarea EVM.
Clientul de consens a preluat functionalitatile de coordonare ce corespund protocolului implementat pentru PoS si comunicarea in retea a unui bloc de tranzactii - tranzactii care sunt pasate pentru verificare individuala catre clientul de executie, existand un canal local de comunicare intre cei doi clienti. Clientul de consens include de regula si o componenta ce poate asigura pentru nod un rol de validator pentru noile blocuri. Acest rol prin analogie poate fi asemanat cu cel de miner din PoW - nodul validator in cauza poate propune un nou bloc si obtine recompense. Rularea si ca validator implica insa din partea nodului respectiv o contributie ca "stake" in Ether, si participarea intr-un protocol mai complex ce implica votul (atestarea) pentru blocurile noi. Mai multe detalii privind mecanismul PoS sunt prezentate in curs.

Scopul acestui laborator este de a oferi o prezentare introductiva a unui client de executie. Rularea locala a unui astfel de client fie individual, fie intr-o mini-retea privata Ethereum, poate fi utila pentru teste si simulari de executie a unor tranzactii, mai apropiate de situatia practica ce exista intr-un mediu real de productie. Partea aceasta nu necesita neaparat un client de consens, layerul de executie fiind unul independent. Este necesara insa confirmarea de noi blocuri pentru a asigura operarea retelei.

Geth (Go-Ethereum) reprezinta una din cele mai populare implementari pentru un client de executie Ethereum (aproape 50% din noduri conform ethernodes.org) care ofera printre altele si un mod developer ce ruleaza un singur nod care va simula confirmarea de blocuri noi fara un client aditional de consens. Intern nodul foloseste un protocol de consens proof-of-authority (PoA) ce confera autoritate pentru confirmarea de noi blocuri. In cele ce urmeaza vom puncta principalele actiuni implicate in operarea acestuia. (Se presupune ca Geth a fost instalat conform indicatiilor din finalul laboratorului anterior.)

1. Pornirea si operarea unui nod Geth in modul dev

Un exemplu de pornire a Geth in modul dev este urmatorul:

geth --datadir [cale/director/blockchain] --dev --http --http.api web3,eth,net --http.corsdomain "https://remix.ethereum.org"

Optiunile adaugate de mai sus indica urmatoarele:

  • --datadir: calea in care nodul geth va retine persistent informatiile necesare pentru operare, precum structura blockchain si datele de acces
  • --http: expunerea nodului pentru acces via http
  • --http.api [api-uri expuse]: api-urile interne expuse pentru comenzi via http - o lista completa ar fi: eth,web3,admin,net,txpool,debug,clique,les dar in modul --dev geth poate impune anumite restrictii
  • --http.corsdomain [domeniu]: prefixul domeniului de la care se accepta conexiuni via http; se poate folosi "*" pentru orice alt host

Exista trei moduri de interactiune in general cu un nod Geth printr-o consola JavaScript dupa pornirea acestuia:

  • direct: se adauga comanda "console" la apelul de pornire geth ce va porni o consola in cadrul nodului
  • via ipc: prin comunicare interproces - nodul expune o interfata ipc implicit in directorul utilizat pentru stocarea blockchain - comanda: geth attach [cale/director/blockchain]/geth.ipc
  • via rpc: daca nodul geth expune rpc (similar http mai sus), cu utilizare limitata la api-urile expuse si anumite alte limitari de securitate - comanda: geth attach http://[adresa nod]:[port rpc nod]

Se recomanda interactiunea prin intermediul unei console separate via ipc pentru a nu intercala comenzile cu output-ul Geth din consola in care a fost rulat.

Prin intermediul Geth se pot realiza o multitudine de operatii precum: crearea de conturi, verificarea balantelor, instalarea de contracte, etc. O parte din aceste operatii sunt posibile utilizand direct diferite optiuni ale Geth la linia de comanda (geth -help). O parte sunt posibile prin intermediul unei console interne a Geth via o serie de biblioteci interne JavaScript.

API-urile disponibile din aceste biblioteci pentru control la consola unui nod Geth sunt detaliate la urmatoarele adrese:

2. Crearea unui cont Ethereum nou via Geth

Rularea Geth in modul dev creeaza implicit un cont cu informatiile pastrate in directorul specificat in "datadir" ce va avea un rol de coinbase ce implica faptul ca va detine totalitatea monedei disponibile initial la crearea retelei blockchain. Pentru crearea altor conturi ce vor opera pe blockchain-ul respectiv se poate folosi comanda (in alt terminal separat de cele deschise anterior):

geth -datadir [cale/director/blockchain] account new

Comanda va genera o pereche cheie publica/privata ce va fi necesara pentru operarea de tranzactii pe platforma. Cheia publica va fi utilizata pentru a genera o adresa asociata contului. Cheia privata va fi criptata cu o parola solicitata la rularea comenzii si va fi retinuta pe disc, in subdirectorul "keystore" din directorul asociat comenzii anterioare.

Public address of the key:   0x9559cc76596beb3eBA56b3389f76C5DD7ECeE797
Path of the secret key file: /home/emi/test-rinkeby/keystore/
UTC--2019-09-29T23-21-07.222169511Z--9559cc76596beb3eba56b3389f76c5dd7ecee797

- You can share your public address with anyone. Others need it to interact with you.
- You must NEVER share the secret key with anyone! The key controls access to your funds!
- You must BACKUP your key file! Without the key, it's impossible to access account funds!
- You must REMEMBER your password! Without the password, it's impossible to decrypt the key!

Afisarea conturilor asociate unui director de date Ethereum se face prin comanda:

geth -datadir [cale/director/blockchain] account list

O alta varianta ce poate fi utilizata alternativ pentru crearea de conturi este utilitarul clef dedicat pentru operatiile ce implica credentiale, care este integrat in mod obisnuit la instalarea geth:

clef newaccount --keystore [cale/director/keystore]

3. Exemple de utilizare Geth

Dupa deschiderea unui mod de interactiune cu Geth prin consola interna JavaScript, cateva exemple de baza pentru utilizare prin intermediul acesteia ar fi:

  • Listarea conturilor:
    eth.accounts
  • Verificarea balantei unui cont:
    web3.fromWei(eth.getBalance([adresa cont - ex.: eth.accounts[0]]),"ether")
  • Trimiterea unei tranzactii simple de transfer:
    eth.sendTransaction({from: "[adresa sender]", to: "[adresa receiver]", value: web3.toWei([valoare trimisa in ETH], "ether")})
  • Observarea informatiilor dintr-o tranzactie:
    eth.getTransaction("[hash-ul tranzactiei ce este returnat fie la executie in consola sau vizibil in consola de operare geth]")

Remix poate fi conectat cu o rulare Geth in modul dev pentru o testare mai precisa a contractelor, alternativ simularii EVM inclusa in Remix. Pentru aceasta in Remix se va selecta ca mediu de rulare (environment) varianta Custom - External Http Provider ce implicit se va conecta pe localhost la portul 8545, portul deschis in mod implicit de Geth pentru acces. Mai multe detalii vor fi discutate in laborator.

4. Alte variante de operare a unei retele de test folosind Geth

Geth poate fi utilizat si pentru operarea unei retele de test private cu mai multe noduri. Exista pentru aceasta doua variante.

Varianta 1: Operarea retelei doar pe baza clientului de executie adica Geth, cu simularea consensului prin proof-of-authority (PoA) in loc de PoS. Indicatii in acest sens se pot regasi la aceasta adresa. (Nota: modul PoW bazat pe ethash nu mai este suportat in ultimele versiuni Geth)

Varianta 2: Operarea retelei in mod complet folosind si un client de consens cu validator. Pentru aceasta varianta exista mai multe optiuni in functie de clientul de consens ales. Doua exemple sunt disponibile pentru Prysm si respectiv Lighthouse, cu observatia ca pot necesita unele schimbari de configurare, iar complexitatea unei rulari este mai ridicata necesitand sicronizarea celor trei module: executie, consens si validare.

5. Conectarea la o retea publica Ethereum via Geth - informativ

Geth poate fi folosit evident si in mod efectiv pentru conectarea ca nod nou in platforma publica Ethereum. Aceasta este disponibila prin intermediul mai multor retele. Geth foloseste pentru conectare id-ul retelei respective, principalele fiind dupa cum urmeaza:

  • 1 - Reteaua principala Ethereum
  • 5 - Goerli - retea de test
  • 11155111 - Sepolia - retea de test

Pentru a descarca si sincroniza nodul cu structura blockchain de pe o retea se va utiliza comanda:

geth -datadir [cale/director/blockchain] -networkid [id retea] [-syncmode snap/full/light]

Modul de sincronizare determina tipul de nod si cantitatea de date ce va fi descarcata:

  • snap - nod complet operational ce va stoca structura blockchain completa fara a o downloada insa integral in prima faza, ci initial va prelua doar headerele blocurilor cu tranzactiile, fara o revalidare integrala a acestora pana la starea curenta
  • full - nod complet operational ce va stoca structura blockchain completa si va revalida toate tranzactiile incepand cu primul bloc
  • light - nod ce va prelua doar headerele ultimelor blocuri; nodurile light nu pot mina si trimit tranzactii in retea via noduri full

Modurile snap si full necesita timp indelungat pentru sincronizare, iar modul light depinde de disponibilitatea gasita pentru conectare la noduri complete. In plus, pentru a opera tranzactii, este necesara obtinerea de Ether (moneda Ethereum). Pe retelele de test moneda nu are valoare de tranzactionare, iar obtinerea ei se poate face de regula prin intermediul unor site-uri de tip "faucet" ce pun la dispozitie in mod gratuit aceasta facilitate. Obtinerea de Ether de test poate insa de asemenea dura timp. In concluzie in cadrul laboratoarelor viitoare vom utiliza in special o simulare a unei retele Ethereum (Ganache sau cea integrata in Remix).

© 2023 Emanuel Onica. Parts of design by W3Layouts