Cum să interacționezi cu blockchain-ul Ethereum și să creezi o bază de date cu Python și SQL

Atelierele introductive despre blockchain încep adesea cu povestea ușor de digerat de rețeaua de la egal la egal și de conturile bancare și apoi sar direct la codarea contractelor inteligente, care este destul de bruscă. Deci, în schimb, imaginați-vă că mergeți într-o junglă și gândiți-vă la blockchain-ul Ethereum ca la o creatură ciudată pe care tocmai urmează să o studiați. Astăzi vom observa creatura, vom interacționa cu ea și vom strânge toate datele despre aceasta într-un spațiu de stocare centralizat pentru uz propriu.

Setarea pentru prima întâlnire

În primul rând, va trebui să instalați web3py. Web3py este o bibliotecă Python pentru conectarea cu blockchain-ul Ethereum. Ceea ce trebuie să știți dinainte este că nu există un sistem administrativ central din care să poată fi descărcate datele. Nodurile interconectate („colegii”), care împărtășesc resurse între ele, stochează o copie verificată a datelor (sau a părții sale). Rețeaua execută protocolul Ethereum, care definește regulile de interacțiune a nodurilor între ele și / sau contractele inteligente din rețeaua respectivă.

Dacă doriți să accesați informații despre tranzacții, solduri, blocuri sau orice altceva este scris în blockchain de care nu știți încă, protocolul vă solicită să vă conectați la noduri. Nodurile împărtășesc continuu date noi între ele și verifică datele, astfel încât sunteți sigur că primiți 1) date care nu au fost modificate și 2) care sunt cele mai actualizate.

Există două categorii de noduri de bază pe care le puteți utiliza în prima dvs. abordare a creaturii: local sau găzduit. Un nod local poate rula pe mașina dvs., ceea ce înseamnă că mai întâi trebuie să descărcați un client, cum ar fi geth, care va sincroniza blockchain-ul cu dispozitivul dvs., ocupând spațiul de stocare și luând timp pentru finalizare. Pentru prima întâlnire, un nod găzduit este o alegere mai bună - este controlat de altcineva, dar te poți conecta cu ușurință la el și te poți juca cu blockchainul de unul singur.

Accesați Infura și faceți-vă propriul cont gratuit pentru a accesa un astfel de nod găzduit. După ce ați terminat, veți vedea o listă de rețele la care v-ați putea conecta: rețeaua principală (blockchain-ul principal Ethereum) și o grămadă de testet-uri, care sunt acolo pentru a testa în general contractele dvs. inteligente, astfel încât să puteți greși pe ele și corectați-le înainte de a implementa coduri costisitoare pe rețeaua principală.

Timp pentru prima abordare. Importați obiectul Web3 și stabiliți o conexiune HTTP.

din importul Web3 Web3
web3 = Web3 (Web3.HTTPProvider („https://mainnet.infura.io/your-own-personal-number”))

Și sunteți totul setat! Acum puteți explora structura de date cu API-ul web3.

Se preia informații despre anumite blocuri ...

# număr bloc curent
>>> web3.eth.blockNumber
5658173
#getă conținutul celui mai recent bloc extras
>>> web3.eth.getBlock („cea mai recentă”)

Această comandă returnează structura de date AttributeDict, care este un dicționar de perechi cheie-valoare care arată astfel:

Nu toate aceste variabile vă vor fi imediat utile, deoarece unele sunt destul de tehnice, iar semnificația lor va avea sens numai după ce veți înțelege mai profund modul în care funcționează blockchainul. Puteți citi mai multe despre ele în așa-numita „Hartie galbenă” sau să le omiteți deocamdată și să lucrați cu cele ușor de înțeles.

Pe scurt, un bloc conține antetul blocului, o listă de tranzacții verificate scrise în el și o listă de unchi (identificatori de blocuri ai minerilor care au fost puțin prea lenti cu blocurile lor pentru a ajunge la blockchain-ul principal, dar încă au fost recompensați cu Ether pentru efortul lor de calcul). Mai jos puteți citi care este semnificația fiecărei variabile, pe care am împărțit-o în subcategorii.

General

legate de Minerit

unchii

Tehnic

... tranzacțiile și încasările acestora

Acum, de asemenea, putem căuta tranzacții individuale într-un bloc, prin identificatorii lor unici, adică hași de tranzacție.

Ca și anterior, web3py ne returnează un dicționar de atribute. Tabelul de mai jos rezumă ce înseamnă fiecare cheie.

În cele din urmă, putem analiza încasările tranzacțiilor:

O chitanță de tranzacție conține câteva intrări repetate și noi; cele noi sunt explicate mai jos.

Pentru referință, am inclus diferite resurse suplimentare pe lângă Cartea Galbenă pentru a compila aceste tabele [2, 3, 4, 5].

După cum vedeți, cu doar câteva comenzi simple, vă puteți conecta deja la rețea și puteți obține informații de bază despre tranzacții, blocuri sau stări în formatul brut. Aceasta deschide o nouă fereastră pentru ceea ce se poate face cu astfel de date!

Sistemul de gestionare a bazelor de date

Când plănuiți să vă scrieți datele într-o bază de date adecvată, vă dați seama probabil că există multe soluții pentru sistemele de management pentru pasionații de Python, cum ar fi SQLite fără server sau MySQL, PostgreSQL sau Hadoop pe server. În funcție de ceea ce intenționați să faceți, va trebui să determinați care opțiune este cea mai bună pentru proiectul dvs. În general, am considerat că aceste puncte sunt utile:

  • Care este dimensiunea prevăzută a bazei de date (adică poate fi procesată pe un singur sistem de mașini)?
  • Înscrierile vor fi editate frecvent sau vor rămâne fixe?
  • Se presupune că baza de date trebuie accesată și editată de mai multe partide / aplicații simultan?

Blockchain-ul Ethereum crește constant în timp, ajungând aproape la 1 TB din iunie 2018, ceea ce este mic, deci nu este optim pentru un sistem de procesare distribuit precum Hadoop. Baza de date blockchain va fi scrisă o singură dată și apoi extinsă doar cu noi intrări, lăsând intrările vechi neschimbate. Cazul de utilizare prevăzut al acestei baze de date trebuie să fie scris de un canal și accesat numai în citire de către celelalte canale, deci nu este nevoie să-l rulăm pe un server. Păstrarea bazei de date local pe aparatul dvs. va duce la o citire rapidă, care este de dorit și realizabil cu un sistem de gestionare fără server, cum ar fi SQLite. Și Python are o bibliotecă sqlite3 încorporată, astfel încât nu este nevoie să instalăm noi pachete.

Proiectarea bazei de date

Următorul pas este proiectarea bazei de date. Rețineți care câmpuri de date sunt cele mai relevante pentru analiza dvs. și vizați optimizarea atât a căutării, cât și a stocării. De exemplu, dacă nu intenționați să utilizați stateRoot, poate doriți să-l săriți complet sau să îl păstrați într-un tabel separat. Un tabel cu mai puține coloane poate fi căutat mai rapid și dacă mai târziu îți dai seama că de fapt ai un caz de utilizare pentru starea Root, vei putea totuși accesa. De asemenea, poate doriți să separați informațiile despre bloc de informațiile despre tranzacție; dacă nu, proprietățile de bloc cum ar fi timestamp vor fi repetate de N de ori pentru toate tranzacțiile din bloc, risipind mult spațiu. Potrivirea ulterioară a unei tranzacții cu proprietățile blocului va fi ușoară cu operațiunea JOIN.

Baza de date pe care am proiectat-o ​​este formată din 3 tabele:

  • Rapid: cele mai relevante informații despre tranzacții pentru acces rapid și analiză,
  • TX: toate informațiile privind tranzacțiile rămase,
  • Bloc: informații specifice blocului

Convenția de denumire a variabilelor a fost ușor modificată în ceea ce privește web3py-ul original pentru a scăpa de ambiguități, cum ar fi numirea hash-ului de bloc și hash-ul tranzacției „hash” sau utilizarea „de la” / ”la” ca nume de coloană, care în SQL are o altă semnificație și ar bloca programul.

Valorile tranzacției, soldurile și alte numere mari trebuie să fie stocate în baza de date sub formă de șiruri. Motivul este că SQLite poate gestiona numai numere întregi semnate stocate în până la 8 octeți, cu o valoare maximă de 2⁶³-1 = 9223372036854775807. Aceasta este adesea mult mai mică decât valorile tranzacției din wei (de exemplu, doar 1 ETH = 10¹⁸ wei).

Construirea mini bazei de date

Codul complet poate fi găsit pe GitHub. Acesta va organiza informațiile despre blockchain în conformitate cu schema superioară și va scoate un fișier blockchain.db care conține date dintr-un număr pre-specificat de blocuri. Pentru a-l testa, accesați fișierul database.py și alegeți un număr rezonabil pentru numărul de blocuri care vor fi scrise, de ex.

Blocuri = 10000

În mod implicit, ar trebui să îndreptați obiectul web3 către punctul final Infura. Puteți, de asemenea, să comutați la Furnizorul IPC dacă aveți unul (adică nodul dvs. local), decomandați doar linia

# sau conexiune prin nod pe VM
# web3 = Web3 (Web3.IPCProvider ('/ path-to-geth.ipc /'))

și repara calea. Apoi pur și simplu rulați în linia de comandă python database.py. Codul va arunca numărul ultimului bloc scris în fișierul lastblock.txt, în cazul în care trebuie să reporniți locul în care ați părăsit-o.

Cum se utilizează baza de date

După ce ați scris primele intrări în baza de date, puteți începe să comunicați cu ea prin intermediul unui shell ipython. De exemplu, pentru a tipări primele 5 rânduri ale tabelului „Rapid”, puteți rula codul de mai jos.

Nod local vs. Infura

Dacă doriți să construiți o bază de date mare, ar trebui să descărcați geth și să sincronizați un nod. Sincronizarea se poate face în 3 moduri de bază:

Dacă nu aveți nevoie de stări ale contului trecut, puteți sincroniza nodul în modul rapid [6].

Mai jos este un grafic care vă arată viteza cu care acest cod scrie într-o bază de date, comunicând cu nodul complet sincronizat local (IPC) față de o adresă de pe Infura (Infura). După cum puteți vedea, plătiți să rulați acest cod pe un nod local, deoarece veți obține o creștere a vitezei de aproape 2 ordine de mărime (aka 100x)!

Timpul necesar pentru a scrie 10 blocuri de tranzacții între blocurile 2000000 și 2000400. Timpul este pe scara logaritmică (10⁰ = 1, 10¹ = 10 și așa mai departe;).

rezumat

Acum că aveți propria dvs. bază de date locală despre ceea ce s-a întâmplat și se întâmplă pe blockchain, puteți începe să o explorați. De exemplu, puteți număra numărul de tranzacții de la geneza sa, vedeți câte adrese sunt generate în funcție de timp - cerul este limita pentru ceea ce puteți afla despre creatura voastră. Tocmai am stabilit scena pentru locul de joacă pentru știința datelor. Așa că mergeți mai departe și explorați-o sau verificați postările următoare pentru posibile aplicații.

Contactați analytics@validitylabs.org dacă sunteți interesat în serviciile de analiză blockchain ale Laboratorului de Validitate.