Kā mijiedarboties ar Ethereum blokķēdi un izveidot datu bāzi ar Python un SQL

Ievadsemināri par blokķēdi bieži sākas ar viegli sagremojamu stāstu par vienādranga tīkliem un banku virsgrāmatām, un pēc tam pāriet tieši uz viedo līgumu kodēšanu, kas ir diezgan pēkšņi. Tā vietā iedomājieties, ka ejat džungļos un domājat par Ethereum blokķēdi kā par dīvainu radījumu, kuru jūs tikai gatavojaties studēt. Šodien mēs novērosim radījumu, mijiedarbosimies ar to un apkoposim visus datus par to centralizētā krātuvē jūsu lietošanai.

Iestatīšana pirmajai tikšanās reizei

Pirmkārt, jums būs jāinstalē web3py. Web3py ir Python bibliotēka, lai izveidotu savienojumu ar Ethereum blokķēdi. Iepriekš jāzina, ka nav centrālās administratīvās sistēmas, no kuras datus var lejupielādēt. Savstarpēji savienotie mezgli (“vienaudži”), kas savā starpā apmainās ar resursiem, glabā pārbaudītu datu (vai tā daļas) kopiju. Tīkls izpilda Ethereum protokolu, kas nosaka mezglu mijiedarbības noteikumus savā starpā un / vai viedos līgumus šajā tīklā.

Ja vēlaties piekļūt informācijai par darījumiem, atlikumiem, blokiem vai jebko citu, kas ir ierakstīts blokķēdē, par kuru jūs vēl nezināt, protokols pieprasa savienojumu ar mezgliem. Mezgli nepārtraukti apmainās ar jauniem datiem savā starpā un pārbauda datus, tāpēc šādā veidā esat pārliecināts, ka saņemat 1) datus, kas nav sagrozīti, un 2) visjaunākos.

Ir divas mezglu pamatkategorijas, kuras jūs varētu izmantot savā pirmajā pieejā radībai: vietējie vai mitinātie. Vietējais mezgls var darboties jūsu mašīnā, kas nozīmē, ka vispirms ir jālejupielādē tāds klients kā geth, kurš sinhronizēs blokķēdi jūsu ierīcē, aizņemot krātuvi un aizņemot laiku, lai to pabeigtu. Pirmajā tikšanās reizē labāks ir mitināts mezgls - to kontrolē kāds cits, bet jūs varat viegli ar to izveidot savienojumu un pats spēlēties.

Dodieties uz Infura un izveidojiet savu bezmaksas kontu, lai piekļūtu šādam mitinātam mezglam. Kad esat pabeidzis, jūs redzēsit to tīklu sarakstu, ar kuriem varētu izveidot savienojumu: mainnet (galvenais Ethereum blokķēde) un ķekars testnetu, kas ir paredzēti, lai pamatā pārbaudītu jūsu viedos līgumus, lai jūs varētu pieļaut kļūdas un izlabojiet tos pirms dārga koda izvietošanas mainnet.

Laiks pirmajai pieejai. Importējiet Web3 objektu un izveidojiet HTTP savienojumu.

no Web3 importēt Web3
web3 = Web3 (Web3.HTTPProvider ("https://mainnet.infura.io/your-own-personal-number"))

Un jūs esat gatavs! Tagad jūs varat izpētīt datu struktūru, izmantojot web3 API.

Notiek informācijas iegūšana par konkrētiem blokiem ...

# pašreizējā bloka numurs
>>> web3.eth.blockNumber
5658173
#uzņemiet nesen izmocītā bloka saturu
>>> web3.eth.getBlock (“jaunākais”)

Šī komanda atgriež datu struktūru AttributeDict, kas ir atslēgas vērtību pāru vārdnīca, kas izskatās šādi:

Ne visi no šiem mainīgajiem jums tūlīt būs noderīgi, jo daži no tiem ir diezgan tehniski, un to nozīmei būs jēga tikai tad, kad būsit ieguvis dziļāku izpratni par to, kā blockchain faktiski darbojas. Jūs varat lasīt vairāk par tiem tā dēvētajā “dzeltenajā grāmatā” vai pagaidām izlaist tos un strādāt ar viegli saprotamiem.

Īsāk sakot, bloks satur bloka galveni, tam uzrakstītu pārbaudītu darījumu sarakstu un onkuļu sarakstu (to kalnraču identifikatori, kuri bija pārāk lēni ar saviem blokiem, lai nokļūtu galvenajā blokķēdē, bet tomēr tika apbalvoti ar Ēteri par viņu skaitļošanas piepūle). Zemāk jūs varat izlasīt, kāda nozīme ir katram mainīgajam, ko es sadalīju apakškategorijās.

Vispārīgi

Ar ieguves rūpniecību saistīti

Onkuļi

Tehnisks

… Darījumi un to ieņēmumi

Tagad mēs varam meklēt atsevišķus darījumus blokā pēc to unikālajiem identifikatoriem, t.i., transakciju jaucieniem.

Tāpat kā iepriekš, web3py atgriež mums atribūtu vārdnīcu. Zemāk esošajā tabulā ir apkopots, ko nozīmē katra atslēga.

Visbeidzot, mēs varam izpētīt arī darījumu ieņēmumus:

Darījuma kvīts satur dažus atkārtotus un jaunus ierakstus; jaunie ir paskaidroti zemāk.

Uzziņai es papildus dzeltenajai grāmatai es iekļāvu dažādus papildu resursus, lai apkopotu šīs tabulas [2, 3, 4, 5].

Kā redzat, tikai ar dažām vienkāršām komandām jūs jau varat izveidot savienojumu ar tīklu un iegūt neapstrādātā formātā pamatinformāciju par darījumiem, blokiem vai stāvokļiem. Tas atver jaunu logu, ko var darīt ar šādiem datiem!

Datu bāzes pārvaldības sistēma

Plānojot rakstīt savus datus pareizā datu bāzē, jūs, iespējams, saprotat, ka Python entuziastiem ir daudz vadības sistēmu risinājumu, piemēram, bez servera SQLite vai uz serveriem balstīta MySQL, PostgreSQL vai Hadoop. Atkarībā no tā, ko plānojat darīt, jums būs jānosaka, kura opcija ir vislabākā jūsu projektam. Kopumā es uzskatu, ka šie punkti ir noderīgi:

  • Kāds ir paredzētais datu bāzes lielums (t.i., vai to var apstrādāt vienas mašīnas sistēmā)?
  • Vai ierakstus bieži rediģēs vai arī tie paliks fiksēti?
  • Vai datu bāzei vajadzētu vienlaikus piekļūt un rediģēt vairākas puses / lietotnes?

Ethereum blokķēde laika gaitā stabili pieaug, no 2018. gada jūnija iegūstot tuvu 1 TB, kas ir mazs, tāpēc nav optimāls tādai izplatītai apstrādes sistēmai kā Hadoop. Blokķēdes datu bāze tiks rakstīta vienreiz un pēc tam tiks paplašināta tikai ar jauniem ierakstiem, atstājot vecos ierakstus nemainītus. Paredzētais šīs datu bāzes izmantošanas gadījums ir jāraksta vienā kanālā, un pārējiem kanāliem tam jābūt pieejamai tikai lasāmai, tāpēc mums tas faktiski nav jāvada serverī. Turot datu bāzi lokāli uz jūsu datora, tiks ātri nolasīts, kas ir vēlams un sasniedzams ar tādu bezkontaktu pārvaldības sistēmu kā SQLite. Python ir iebūvēta bibliotēka sqlite3, tāpēc mums pat nav jāinstalē jaunas paketes.

Datu bāzes dizains

Nākamais solis ir datu bāzes projektēšana. Ņemiet vērā, kuri datu lauki ir visatbilstošākie jūsu analīzei, un mēģiniet optimizēt gan meklēšanu, gan glabāšanu. Piemēram, ja jūs neplānojat izmantot stateRoot, iespējams, vēlēsities to pilnībā izlaist vai paturēt atsevišķā tabulā. Tabulu ar mazāk kolonnām var meklēt ātrāk, un, ja vēlāk jūs sapratīsit, ka jums tiešām ir stateRoot lietošanas gadījums, jūs joprojām varēsit tam piekļūt. Jūs varat arī nodalīt bloķēšanas informāciju no darījuma informācijas; Pretējā gadījumā bloka rekvizīti, piemēram, laika zīmogs, tiks atkārtoti N reizes visiem bloka darījumiem, tērējot daudz vietas. Darījumu ar JOIN vēlāk būs viegli saskaņot ar tā bloka īpašībām.

Manis izveidotā datu bāze sastāv no 3 tabulām:

  • Ātri: visatbilstošākā informācija par darījumu ātrai piekļuvei un analīzei,
  • TX: visa atlikušā informācija par darījumu,
  • Bloķēt: informācija par bloku.

Mainīgo nosaukšanas kārtība ir nedaudz mainīta attiecībā uz sākotnējo web3py, lai atbrīvotos no neskaidrībām, piemēram, gan bloka hash, gan transakcijas hash izsaukšana “hash” vai “from” / ”to” izmantošana kā kolonnu nosaukumi, kas SQL nozīme ir atšķirīga, un tā varētu sagraut programmu.

Darījuma vērtības, atlikumi un citi lielie skaitļi ir jāuzglabā datu bāzē kā virknes. Iemesls ir tāds, ka SQLite var apstrādāt tikai parakstītus veselus skaitļus, kas tiek glabāti līdz 8 baitiem, ar maksimālo vērtību 2⁶³-1 = 9223372036854775807. Tas bieži ir daudz zemāks nekā darījuma vērtības wei (piemēram, tikai 1 ETH = 10¹⁸ wei).

Jūsu mini datu bāzes izveidošana

Pilns kods ir atrodams vietnē GitHub. Tas sakārtos blockchain informāciju atbilstoši augšējai shēmai un izvadīs blockchain.db failu, kas satur datus par iepriekš noteiktu bloku skaitu. Lai to pārbaudītu, dodieties uz database.py failu un izvēlieties saprātīgu skaitu rakstāmo bloku skaitam, piem.

Nblocks = 10000

Pēc noklusējuma jums vajadzētu norādīt web3 objektu uz savu Infura gala punktu. Varat arī pārslēgties uz IPC nodrošinātāju, ja jums tāds ir (t.i., jūsu vietējais mezgls), vienkārši atvienojiet līniju

# vai savienojums caur mezglu VM
# web3 = Web3 (Web3.IPCProvider ('/ ceļš uz geth.ipc /'))

un salabot ceļu. Pēc tam vienkārši palaidiet komandrindas python database.py. Kodā tiks ievietots pēdējā rakstītā bloka numurs failā lastblock.txt, ja jums vajadzēs restartēt tur, kur pārtraucāt darbu.

Kā izmantot datu bāzi

Kad esat ierakstījis pirmos ierakstus datu bāzē, varat sākt ar to sazināties, izmantojot ipython apvalku. Piemēram, lai izdrukātu pirmās 5 tabulas “Ātrās” rindas, varat palaist zemāk esošo kodu.

Vietējais mezgls pret Infuru

Ja vēlaties izveidot lielu datu bāzi, jums vajadzētu lejupielādēt geth un sinhronizēt mezglu. Sinhronizāciju var veikt trīs pamatrežīmos:

Ja jums nav nepieciešami iepriekšējie konta stāvokļi, varat sinhronizēt savu mezglu ātrajā režīmā [6].

Zemāk ir parādīts diagramma, kas parāda ātrumu, ar kādu šis kods tiek ierakstīts datu bāzē, lokāli sazinoties ar pilnībā sinhronizētu mezglu (IPC) salīdzinājumā ar adresi Infura (Infura). Kā redzat, šī koda palaišana vietējā mezglā atmaksājas, jo jūs iegūstat ātruma palielinājumu gandrīz par 2 lieluma kārtām (aka 100x)!

Laiks, kas nepieciešams, lai uzrakstītu 10 darījumu blokus starp blokiem 2000000 un 2000400. Laiks ir logaritmiskajā skalā (10⁰ = 1, 10¹ = 10 un tā tālāk;).

Kopsavilkums

Tagad, kad jums ir sava lokālā datu bāze par to, kas notika un notiek blokķēdē, varat sākt to izpētīt. Piemēram, jūs varat saskaitīt darījumu skaitu kopš tā rašanās, redzēt, cik adreses tiek ģenerētas kā laika funkcija - debesis ir robeža tam, ko varat uzzināt par savu radību. Mēs tikko uzstādījām posmu jūsu datu zinātnes rotaļu laukumam. Tāpēc dodieties uz priekšu un izpētiet to, vai arī pārbaudiet nākamos ierakstus par iespējamām lietojumprogrammām.

Sazinieties ar analytics@validitylabs.org, ja jūs interesē Validity Labs blokķēdes analīzes pakalpojumi.