Ako interagovať s blockchainom Ethereum a vytvoriť databázu s Python a SQL

Úvodné semináre o blockchainu často začínajú ľahko stráviteľným príbehom sietí typu peer-to-peer a účtovných kníh bánk, a potom skočia priamo do kódovania inteligentných zmlúv, čo je dosť prudké. Namiesto toho si predstavte, že idete do džungle a pomyslite si na blockchain z Ethereum ako podivné stvorenie, ktoré práve študujete. Dnes budeme stvorenie pozorovať, pracovať s ním a zhromažďovať všetky údaje o ňom do centralizovaného úložiska pre vaše vlastné použitie.

Pripravuje sa na prvé stretnutie

Najprv musíte nainštalovať web3py. Web3py je knižnica Python, ktorá umožňuje spojenie s blockchainom Ethereum. Čo potrebujete vedieť vopred je, že neexistuje žiadny centrálny administratívny systém, z ktorého je možné údaje sťahovať. Prepojené uzly („peers“), ktoré zdieľajú zdroje medzi sebou, uchovávajú overenú kópiu údajov (alebo ich častí). Sieť vykonáva protokol Ethereum, ktorý definuje pravidlá vzájomného pôsobenia uzlov medzi sebou a / alebo inteligentných kontraktov v tejto sieti.

Ak chcete získať prístup k informáciám o transakciách, zostatkoch, blokoch alebo čomkoľvek inom, čo je zapísané do blockchainu, o ktorom ešte neviete, protokol vyžaduje, aby ste sa pripojili k uzlom. Uzly priebežne zdieľajú nové údaje navzájom a overujú ich, takže týmto spôsobom ste si istí, že dostanete 1) údaje, s ktorými nebolo manipulované, a 2) ktoré sú najaktuálnejšie.

Pri prvom prístupe k stvoreniu môžete použiť dve základné kategórie uzlov: miestne alebo hostené. Na vašom počítači môže bežať lokálny uzol, čo znamená, že si musíte najprv stiahnuť klienta, ako je geth, ktorý bude synchronizovať blockchain do vášho zariadenia, zaberať ukladací priestor a chvíľu trvať, kým sa dokončí. Pri prvom stretnutí je hostený uzol lepšou voľbou - ovláda ho niekto iný, ale môžete sa k nemu ľahko pripojiť a hrať sa s blockchainom sami.

Prejdite do Infury a vytvorte si svoj vlastný bezplatný účet, aby ste sa dostali k takému hostenému uzlu. Po dokončení sa zobrazí zoznam sietí, ku ktorým by ste sa mohli pripojiť: mainnet (hlavný blok Ethereum blockchain) a veľa testovacích sietí, ktoré slúžia na testovanie vašich inteligentných zmlúv, aby ste mohli robiť chyby na nich a opravte ich pred nasadením nákladného kódu do mainnetu.

Čas na prvý prístup. Importujte objekt Web3 a vytvorte pripojenie HTTP.

z web3 importujte Web3
web3 = Web3 (Web3.HTTPProvider („https://mainnet.infura.io/your-own-personal-number“))

A ste všetci pripravení! Teraz môžete preskúmať štruktúru údajov pomocou rozhrania API web3.

Načítavajú sa informácie o konkrétnych blokoch ...

# číslo aktuálneho bloku
>>> web3.eth.blockČíslo
5658173
#get obsah posledného vyťaženého bloku
>>> web3.eth.getBlock („najnovší“)

Tento príkaz vráti dátovú štruktúru AttributeDict, čo je slovník párov kľúč - hodnota, ktorý vyzerá takto:

Nie všetky tieto premenné budú pre vás okamžite užitočné, pretože niektoré sú dosť technické a ich význam bude mať zmysel, len ak budete mať hlbšie pochopenie toho, ako blockchain skutočne funguje. Viac sa o nich môžete dozvedieť v takzvanom „žltom papieri“ alebo ich zatiaľ preskočiť a pracovať s ľahko pochopiteľnými.

Stručne povedané, blok obsahuje hlavičku bloku, zoznam overených transakcií, ktoré sú doň zapísané, a zoznam strýkov (identifikátory blokov baníkov, ktorí boli so svojimi blokmi príliš pomaly na to, aby sa dostali na hlavný blok, ale stále boli odmenení Etherom za ich výpočtové úsilie). Nižšie si môžete prečítať, aký význam má každá premenná, ktorú som rozdelil do podkategórií.

všeobecný

ťažobné súvisiace

strýkovia

technický

… Transakcie a ich príjmy

Teraz môžeme tiež vyhľadať jednotlivé transakcie v bloku podľa ich jedinečných identifikátorov, t. J. Hash transakcií.

Ako predtým, web3py nám vracia slovník atribútov. V nasledujúcej tabuľke sú zhrnuté, čo znamená každý kľúč.

Nakoniec sa môžeme pozrieť aj na príjem z transakcií:

Potvrdenie transakcie obsahuje niekoľko opakovaných a nových záznamov; nové sú vysvetlené nižšie.

Na porovnanie som do žltej knihy zahrnul rôzne ďalšie zdroje na zostavenie týchto tabuliek [2, 3, 4, 5].

Ako vidíte, pomocou niekoľkých jednoduchých príkazov sa už môžete pripojiť k sieti a získať základné informácie o transakciách, blokoch alebo stavoch v surovom formáte. Tým sa otvorí nové okno, čo sa dá s takýmito údajmi urobiť!

Systém správy databáz

Pri plánovaní zápisu údajov do správnej databázy si pravdepodobne uvedomíte, že existuje množstvo riešení pre systémy riadenia pre nadšencov Pythonu, ako je SQLite bez serverov alebo MySQL, PostgreSQL alebo Hadoop založené na serveroch. V závislosti od toho, čo plánujete urobiť, musíte určiť, ktorá možnosť je pre váš projekt najlepšia. Vo všeobecnosti som zistil, že tieto body sú užitočné:

  • Aká je zamýšľaná veľkosť databázy (t. J. Môže sa spracovať na jednom strojovom systéme)?
  • Budú záznamy často upravované alebo zostanú opravené?
  • Má k databáze pristupovať a upravovať ju viac strán / aplikácií súčasne?

Blockchain Ethereum v priebehu času stabilne rastie a od júna 2018 sa približuje k 1 TB, čo je malé, a preto nie je optimálne pre distribuovaný systém spracovania, ako je Hadoop. Databáza blockchainov sa zapíše raz a potom sa rozšíri iba o nové záznamy, pričom staré záznamy zostanú nezmenené. Zamýšľaný prípad použitia tejto databázy má byť napísaný jedným kanálom a prístupný iba na čítanie ostatnými kanálmi, takže ho naozaj nemusíme spúšťať na serveri. Udržiavanie databázy lokálne na vašom počítači bude mať za následok rýchle načítanie, čo je žiaduce a dosiahnuteľné pomocou systému riadenia bez serverov, ako je SQLite. A Python má vstavanú knižnicu sqlite3, takže ani nemusíme inštalovať nové balíčky.

Návrh databázy

Ďalším krokom je navrhnutie databázy. Nezabudnite, ktoré dátové polia sú pre vašu analýzu najrelevantnejšie a ich cieľom je optimalizácia vyhľadávania aj ukladania. Napríklad, ak neplánujete používať stateRoot, môžete ho úplne preskočiť alebo ponechať v samostatnej tabuľke. Tabuľku s menším počtom stĺpcov je možné prehľadávať rýchlejšie a ak si neskôr uvedomíte, že v skutočnosti máte stav stateRoot, budete mať k nemu stále prístup. Môžete tiež chcieť oddeliť informácie o bloku od informácií o transakcii; Ak tak neurobíte, vlastnosti bloku ako timestamp sa pre všetky transakcie v bloku zopakujú N-krát, a zbytočne míňajú veľa miesta. Priraďovanie transakcie k jej vlastnostiam bloku bude ľahké s operáciou JOIN neskôr.

Databáza, ktorú som navrhol, sa skladá z 3 tabuliek:

  • Rýchly: najdôležitejšie informácie o transakciách pre rýchly prístup a analýzu,
  • TX: všetky ostatné informácie o transakcii,
  • Block: block-specific info.

Konvencia pomenovávania premenných sa v porovnaní s pôvodnou web3py mierne zmenila, aby sa odstránili nejasnosti, ako napríklad volanie blokových hashov a transakčných hashov na „hash“ alebo použitie „od“ / „do“ ako názvov stĺpcov, ktoré v SQL má iný význam a program by zlyhal.

Hodnoty transakcií, zostatky a iné veľké čísla je potrebné uložiť do databázy ako reťazce. Dôvod je ten, že SQLite dokáže spracovať iba celé čísla podpísané uložené do 8 bajtov, s maximálnou hodnotou 2⁶³-1 = 9223372036854775807. To je často oveľa nižšie ako hodnoty transakcie vo wei (napr. Iba 1 ETH = 10 ⁸ wei).

Zostavte si svoju mini databázu

Celý kód nájdete na serveri GitHub. Usporiada informácie o blockchaine podľa hornej schémy a vydá súbor blockchain.db obsahujúci údaje vopred určeného počtu blokov. Ak ho chcete otestovať, prejdite do súboru database.py a vyberte si primeraný počet pre počet blokov, ktoré sa majú zapísať, napr.

Nblocks = 10 000

V predvolenom nastavení by ste mali nasmerovať objekt web3 na váš koncový bod Infura. Môžete tiež prepnúť na poskytovateľa IPC, ak ho máte (t. J. Váš miestny uzol), iba odškrtnite riadok

# alebo pripojenie cez uzol na VM
# web3 = Web3 (Web3.IPCProvider ('/ cesta k geth.ipc /'))

a opraviť cestu. Potom jednoducho spustite príkazový riadok python database.py. Kód vypíše číslo posledného zapísaného bloku do súboru lastblock.txt pre prípad, že budete musieť reštartovať, kde ste prestali.

Ako používať databázu

Akonáhle napíšete prvé záznamy do databázy, môžete s ňou začať komunikovať cez ipsthon shell. Napríklad, ak chcete vytlačiť prvých 5 riadkov tabuľky „Rýchlo“, môžete spustiť kód uvedený nižšie.

Miestny uzol vs. Infura

Ak chcete vytvoriť veľkú databázu, mali by ste si stiahnuť geth a synchronizovať uzol. Synchronizáciu je možné vykonať v 3 základných režimoch:

Ak nepotrebujete predchádzajúce stavy účtu, môžete uzol synchronizovať v rýchlom režime [6].

Nižšie je uvedený graf ukazujúci rýchlosť, akou sa tento kód zapisuje do databázy a komunikuje s plne synchronizovaným uzlom lokálne (IPC) v porovnaní s adresou na infúre (Infura). Ako vidíte, vyplatí sa spustiť tento kód v miestnom uzle, pretože získate zvýšenie rýchlosti o takmer 2 rády (aka 100x)!

Čas potrebný na zapísanie 10 blokov transakcií medzi blokmi 2000000 a 2000400. Čas je v logaritmickej stupnici (10⁰ = 1, 10¹ = 10 a tak ďalej;).

zhrnutie

Teraz, keď máte svoju vlastnú miestnu databázu toho, čo sa stalo a čo sa deje na blockchainu, môžete začať skúmať. Napríklad môžete spočítať počet transakcií od ich vzniku, zistiť, koľko adries je generovaných ako funkcia času - obloha je limitom toho, čo sa môžete dozvedieť o svojom stvorení. Práve sme pripravili pôdu pre vaše ihrisko pre vedu údajov. Tak choďte do toho a preskúmajte to, alebo si pozrite ďalšie príspevky na potenciálne aplikácie.

Ak máte záujem o analytické služby blockchainu spoločnosti Validity Labs, kontaktujte analytics@validitylabs.org.