Kako komunicirati s Ethereum blockchainom i stvoriti bazu podataka s Python i SQL

Uvodne radionice o blockchainu često započinju s lako probavljivom pričom o vršnjačkoj mreži i poslovnim knjigama, a zatim prelaze ravno na kodiranje pametnih ugovora, što je prilično naglo. Umjesto toga, zamislite sebe kako hodate u džungli i zamislite Ethereum blockchain kao neobično biće koje tek trebate proučiti. Danas ćemo promatrati stvorenje, komunicirati s njim i prikupiti sve podatke o njemu u centralizirani prostor za vlastitu upotrebu.

Postavljanje za prvi susret

Prvo, morat ćete instalirati web3py. Web3py je Python knjižnica za povezivanje s Ethereum blockchainom. Ono što prije trebate znati je da ne postoji središnji administrativni sustav s kojeg se podaci mogu preuzeti. Međusobno povezani čvorovi („vršnjaci“), koji međusobno dijele resurse, pohranjuju ovjerenu kopiju podataka (ili njegovog dijela). Mreža izvršava Ethereum protokol koji definira pravila interakcije čvorova jedni s drugima i / ili pametne ugovore preko te mreže.

Ako želite pristupiti informacijama o transakcijama, saldovima, blokovima ili bilo čemu drugom zapisanom u blockchain koji još ne znate, protokol zahtijeva da se povežete s čvorovima. Čvorovi kontinuirano dijele nove podatke jedni s drugima i provjeravaju podatke, tako da ste na ovaj način sigurni da ste dobili 1) podatke koji nisu ugroženi i 2) koji su najsuvremeniji.

Postoje dvije osnovne kategorije čvorova koje možete upotrijebiti u svom prvom pristupu biću: lokalni ili domaćin. Lokalni čvor može se pokrenuti na vašem računalu, što znači da prvo morate preuzeti klijent poput geth koji će sinkronizirati blockchain na vaš uređaj, zauzimajući pohranu i potrebno je vrijeme za dovršavanje. Za prvi susret hostirani čvor je bolji izbor - njime upravlja netko drugi, ali možete se lako povezati s njim i samostalno se igrati oko blockchaina.

Idite na Infuru i napravite vlastiti besplatni račun kako biste pristupili takvom hostiranom čvorištu. Kada završite, vidjet ćete popis mreža na koje biste se mogli povezati: mainnet (glavni Ethereum blockchain) i gomilu testneta koji u osnovi mogu testirati pametne ugovore kako biste mogli pogriješiti na njima i ispravite ih prije implementacije skupog koda u glavnu mrežu.

Vrijeme je za prvi pristup. Uvozite Web3 objekt i uspostavite HTTP vezu.

iz uvoza
web3 = Web3 (Web3.HTTPProvider ("https://mainnet.infura.io/your-own-personal-number"))

I sve ste spremni! Sada možete istražiti strukturu podataka pomoću web3 API-ja.

Dohvaćanje informacija o određenim blokovima ...

#current broj bloka
>>> web3.eth.blockNumber
5658173
#get sadržaj najnovijeg miniranog bloka
>>> web3.eth.getBlock ('najnoviji')

Ova naredba vraća strukturu podataka AttributeDict, koja je rječnik parova ključ-vrijednost koji izgleda ovako:

Neće vam sve ove varijable biti odmah korisne, jer su neke prilično tehničke i njihovo značenje će imati smisla tek kada budete dublje shvatili kako blockchain zapravo djeluje. Više o njima možete pročitati u tzv. "Žutoj knjizi" ili ih zasad preskočiti te raditi s lako razumljivim.

Ukratko, blok sadrži zaglavlje bloka, popis provjerenih transakcija koje su napisane u njemu i popis ujaka (blok identifikatori rudara koji su bili malo prespori sa svojim blokovima da bi došli u glavni blockchain, ali su ipak nagrađeni s Ether-om za njihov računski napor). Ispod možete pročitati što znači svaka varijabla koju sam podijelio u potkategorije.

General

Rudarstvo u svezi

stričevi

tehnička

... transakcije i njihovi primici

Sada također možemo potražiti pojedinačne transakcije u bloku pomoću njihovih jedinstvenih identifikatora, tj. Hashera transakcija.

Kao i ranije, web3py nam vraća rječnik atributa. Donja tablica sažima ono što znači svaki ključ.

Konačno, možemo razmotriti i primitke od transakcija:

Račun za transakciju sadrži nekoliko ponovljenih i novih unosa; nove su objašnjene u nastavku.

Za referencu sam osim Žute knjige uključio i razne dodatne resurse za sastavljanje ovih tablica [2, 3, 4, 5].

Kao što vidite, s samo nekoliko jednostavnih naredbi već se možete povezati na mrežu i dobiti osnovne informacije o transakcijama, blokovima ili stanjima u sirovom obliku. Ovo otvara novi prozor za ono što se može učiniti s takvim podacima!

Sustav upravljanja bazama podataka

Kada planirate zapisati svoje podatke u odgovarajuću bazu podataka, vjerojatno shvatite da postoji mnogo rješenja za sustave upravljanja vani za ljubitelje Pythona, kao što su SQLite bez poslužitelja ili poslužitelji MySQL, PostgreSQL ili Hadoop. Ovisno o tome što namjeravate učiniti, morat ćete odrediti koja je opcija najbolja za vaš projekt. Općenito, smatrali smo da su ove točke korisne:

  • Koja je predviđena veličina baze podataka (tj. Može li se ona obraditi na jednom strojnom sustavu)?
  • Hoće li se unosi često uređivati ​​ili će ostati fiksni?
  • Bi li toj bazi trebalo pristupiti i uređivati ​​više stranaka / aplikacija istovremeno?

Ethereum blockchain s vremenom neprestano raste, približavajući se 1 TB od lipnja 2018., što je malo, stoga nije optimalno za distribuirani procesni sustav poput Hadoopa. Blok blok podataka bit će napisan jednom, a potom će se proširiti samo novim unosima, ostavljajući stare unose nepromijenjene. Predviđeni slučaj ove baze podataka treba pisati jednim kanalom, a drugi kanali pristupati samo za čitanje, tako da zapravo ne trebamo pokrenuti na poslužitelju. Ako lokalno držite bazu podataka na svom računalu, postići ćete brzo čitanje, što je poželjno i ostvarivo s upravljačkim sustavom bez poslužitelja kao što je SQLite. A Python ima ugrađenu biblioteku sqlite3, tako da čak i ne trebamo instalirati nove pakete.

Dizajn baze podataka

Sljedeći je korak dizajniranje vaše baze podataka. Imajte na umu koja su podatkovna polja najrelevantnija za vašu analizu i nastojte optimizirati i pretraživanje i pohranu. Na primjer, ako ne planirate koristiti stateRoot, možda ćete ga htjeti u potpunosti preskočiti ili držati u zasebnoj tablici. Tablica s manje stupaca može se brže pretraživati, a ako kasnije shvatite da zapravo imate slučaj upotrebe za stateRoot, i dalje ćete mu moći pristupiti. Možda ćete također htjeti odvojiti podatke o bloku od podataka o transakciji; ako to ne učinite, svojstva bloka poput vremenske oznake ponovit će se N puta za sve transakcije u bloku, trošeći puno prostora. Usklađivanje transakcije s njezinim svojstvima bloka bit će lako kasnije s operacijom JOIN.

Baza podataka koju sam dizajnirao sastoji se od 3 tablice:

  • Brzo: najrelevantnije informacije o transakcijama za brzi pristup i analizu,
  • TX: sve preostale informacije o transakciji,
  • Blokiraj: informacije o bloku.

Konvencija imenovanja varijabli malo je izmijenjena u odnosu na izvorni web3py da biste se riješili nejasnoća, poput pozivanja i bloka s oznakom i hash-a transakcije "hash" ili upotrebom "from" / "to" kao imena stupaca, što u SQL imaju drugačije značenje i srušili bi program.

Vrijednosti transakcija, saldi i ostali veliki brojevi trebaju se pohraniti u bazu podataka kao nizovi. Razlog je taj što SQLite može obraditi samo potpisane cjelobrojne brojeve pohranjene u do 8 bajtova, s maksimalnom vrijednošću 2⁶³-1 = 9223372036854775807. To je često mnogo manje od vrijednosti transakcija u wei (npr. Samo 1 ETH = 10i wei).

Izgradnja vaše mini baze podataka

Cijeli kod možete pronaći na GitHub-u. Organizirat će informacije o blockchainu u skladu s gornjom shemom i ispisati blockchain.db datoteku koja sadrži podatke unaprijed određenog broja blokova. Da biste ga testirali, idite na datoteku database.py i odaberite razuman broj za broj blokova koji će se upisati, npr.

Nblokovi = 10000

Prema zadanim postavkama trebali biste web3 objekt usmjeriti na krajnju točku Infura. Možete se prebaciti i na davatelja IPC usluga ako ga imate (tj. Vaš lokalni čvor), samo komentirajte liniju

# ili veza putem čvora na VM-u
# web3 = Web3 (Web3.IPCProvider ('/ put-do-geth.ipc /'))

i popraviti put. Zatim jednostavno pokrenite u naredbenom retku python database.py. Kôd će izbaciti broj zadnjeg pisanog bloka u datoteku lastblock.txt, u slučaju da trebate ponovo pokrenuti mjesto na kojem ste stali.

Kako koristiti bazu podataka

Nakon što napišete prve unose u bazu podataka, možete početi komunicirati s njom preko ljuske ipython. Na primjer, da biste ispisali prvih 5 redaka tablice "Brzo", možete pokrenuti kôd u nastavku.

Lokalni čvor protiv Infure

Ako želite izgraditi veliku bazu podataka, trebali biste preuzeti geth i sinkronizirati čvor. Sinkronizacija se može obaviti u 3 osnovna načina:

Ako vam ne trebaju prošla stanja računa, možete čv. Sinkronizirati u brzom načinu [6].

Ispod je grafikon koji prikazuje brzinu kojom ovaj kôd piše u bazu podataka, komunicirajući s potpuno sinkroniziranim čvorom lokalno (IPC) nasuprot adresi na Infuri (Infura). Kao što vidite, isplativanje ovog koda na lokalnom čvoru isplati se jer povećavate brzinu od gotovo 2 reda veličine (aka 100x)!

Vrijeme potrebno za pisanje 10 blokova transakcija između blokova 2000000 i 2000400. Vrijeme je na logaritamskoj skali (10⁰ = 1, 10¹ = 10 i tako dalje;).

Sažetak

Sada kada imate vlastitu lokalnu bazu podataka o onome što se događalo i događalo na blockchainu, možete početi istraživati. Na primjer, možete prebrojati broj transakcija od njihove generacije, vidjeti koliko je adresa generirano kao funkcija vremena - nebo je granica onoga što možete naučiti o svom stvorenju. Upravo smo postavili pozornicu za vaše znanstveno igralište o podacima. Dakle, nastavite i istražite ili provjerite sljedeće postove za potencijalne aplikacije.

Javite se analytics@validitylabs.org ako ste zainteresirani za usluge analitike blockchain Validity Labs.