Kaip bendrauti su „Ethereum“ grandine ir sukurti duomenų bazę naudojant Python ir SQL

Įvadiniai seminarai apie „blockchain“ dažnai prasideda nuo lengvai suprantamo „peer-to-peer“ tinklo ir bankų vadovų pasakojimo, tada pereinama prie intelektualiųjų sutarčių kodavimo, o tai yra gana staigiai. Taigi užuot įsivaizdavę save einantį į džiungles ir pagalvokite apie „Ethereum“ grandinėlę kaip apie keistą padarą, kurį ketinate studijuoti. Šiandien mes stebėsime tvarinį, bendrausime su juo ir surinksime visus duomenis apie jį į centralizuotą saugyklą savo reikmėms.

Pasiruošimas pirmajam susitikimui

Pirmiausia turėsite įdiegti „web3py“. „Web3py“ yra „Python“ biblioteka, skirta prisijungti prie „Ethereum“ grandinės. Ką reikia žinoti iš anksto, nėra centrinės administracinės sistemos, iš kurios būtų galima atsisiųsti duomenis. Sujungti mazgai („bendraamžiai“), kurie tarpusavyje dalijasi ištekliais, saugo patikrintą duomenų (ar jų dalies) kopiją. Tinklas vykdo „Ethereum“ protokolą, kuris nusako mazgų sąveikos tarpusavyje ir (arba) išmaniųjų sutarčių per tą tinklą taisykles.

Jei norite gauti informaciją apie operacijas, likučius, blokus ar dar ką nors, kas parašyta blokinėje grandinėje, apie kurią jūs dar nežinote, pagal protokolą turite prisijungti prie mazgų. Mazgai nepertraukiamai dalijasi naujais duomenimis tarpusavyje ir tikrina duomenis, taigi tokiu būdu esate tikri, kad gausite 1) duomenis, kurie nebuvo pažeisti, ir 2) pačius naujausius duomenis.

Yra dvi pagrindinės mazgų kategorijos, kurias galėtumėte naudoti atlikdami savo pirmąjį požiūrį į tvarinį: vietinius arba priglobtus. Vietinis mazgas gali veikti jūsų kompiuteryje, o tai reiškia, kad pirmiausia turite atsisiųsti tokį klientą kaip „geth“, kuris sinchronizuos „blockchain“ jūsų įrenginyje, užimdamas saugyklą ir užimdamas daug laiko. Pirmajam susitikimui geresnis pasirinkimas yra priglobtas mazgas - jį kontroliuoja kažkas kitas, tačiau jūs galite lengvai prie jo prisijungti ir patys žaisti su „blockchain“.

Eikite į „Infura“ ir sukurkite savo nemokamą sąskaitą, kad galėtumėte pasiekti tokį priglobtą mazgą. Baigę pamatysite tinklų, prie kurių galite prisijungti, sąrašą: „mainnet“ (pagrindinis „Ethereum“ blokinis grandinėlė) ir krūva testinių tinklų, kurie yra skirti iš esmės išbandyti jūsų išmaniąsias sutartis, kad galėtumėte padaryti klaidų ant jų ir ištaisykite, prieš diegdami brangų kodą į pagrindinį tinklą.

Laikas pirmajam požiūriui. Importuokite „Web3“ objektą ir užmegzkite HTTP ryšį.

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

Ir viskas! Dabar galite ištirti duomenų struktūrą naudodami „web3“ API.

Gaunama informacija apie konkrečius blokus ...

# dabartinio bloko numeris
>>> web3.eth.blockNumber
5658173
#pažvelkite į neseniai iškasto bloko turinį
>>> web3.eth.getBlock („vėliausias“)

Ši komanda grąžina „AttributeDict“ duomenų struktūrą, kuri yra raktų ir reikšmių porų žodynas, kuris atrodo taip:

Ne visi šie kintamieji jums bus iškart naudingi, nes kai kurie yra gana techniniai ir jų reikšmė turės prasmę tik tada, kai giliau suprasite, kaip „blockchain“ iš tikrųjų veikia. Galite skaityti daugiau apie juos vadinamojoje „geltonojoje knygoje“ arba kol kas juos praleisti ir dirbti su lengvai suprantamais.

Trumpai tariant, bloke yra bloko antraštė, jam parašytų patikrintų operacijų sąrašas ir dėdžių sąrašas (kalnakasių, kurios buvo šiek tiek per lėtai su savo blokais, kad patektų į pagrindinę „blockchain“, tačiau vis tiek buvo apdovanotos Eteriu, blokų identifikatoriai jų skaičiavimo pastangos). Žemiau galite perskaityti, ką reiškia kiekvienas kintamasis, kurį aš suskirstiau į pogrupius.

Generolas

Su kasyba susijęs

Dėdės

Techninis

… Operacijos ir jų kvitai

Dabar atskiras operacijas bloke galime ieškoti pagal jų unikalius identifikatorius, t. Y. Operacijų maišos.

Kaip ir anksčiau, „web3py“ mums pateikia atributų žodyną. Žemiau esančioje lentelėje apibendrinta, ką reiškia kiekvienas raktas.

Galiausiai taip pat galime išnagrinėti operacijų kvitus:

Sandorio kvite yra keli pakartoti ir nauji įrašai; naujos paaiškintos žemiau.

Šioms lentelėms sudaryti, be geltonosios knygos, pateikiau įvairių papildomų šaltinių [2, 3, 4, 5].

Kaip matote, vos keliomis paprastomis komandomis jau galite prisijungti prie tinklo ir gauti pagrindinę informaciją apie operacijas, blokus ar būsenas neapdorotu formatu. Tai atveria naują langą, ką galima padaryti su tokiais duomenimis!

Duomenų bazių valdymo sistema

Planuodami įrašyti savo duomenis į tinkamą duomenų bazę, tikriausiai suprantate, kad „Python“ entuziastams yra daugybė valdymo sistemų sprendimų, tokių kaip be serverio SQLite arba serverio pagrindu sukurtas „MySQL“, „PostgreSQL“ ar „Hadoop“. Priklausomai nuo to, ką ketinate daryti, turėsite nustatyti, kuris variantas yra geriausias jūsų projektui. Apskritai manau, kad šie punktai yra naudingi:

  • Koks yra numatytas duomenų bazės dydis (t. Y. Ar ją galima apdoroti vienos mašinos sistemoje)?
  • Ar įrašai bus dažnai taisomi, ar jie išliks fiksuoti?
  • Ar duomenų bazę turėtų pasiekti ir taisyti kelios šalys / programos vienu metu?

„Ethereum“ grandininė grandinė bėgant laikui stabiliai auga, nuo 2018 m. Birželio mėn. Ji priartėja prie 1 TB, o tai yra maža, taigi nėra optimali paskirstytai apdorojimo sistemai, kaip „Hadoop“. „Blockchain“ duomenų bazė bus parašyta vieną kartą ir tik tada bus plečiama naujais įrašais, paliekant nepakeistus senus įrašus. Numatytą šios duomenų bazės naudojimo atvejį turi parašyti vienas kanalas, o kitiems kanalams - tik skaityti, taigi mums nereikia jo naudoti serveryje. Laikydami duomenų bazę savo kompiuteryje, gausite greitą duomenų skaitymą, kuris yra pageidautinas ir pasiekiamas naudojant be serverio esančią valdymo sistemą, tokią kaip SQLite. „Python“ turi integruotą biblioteką „sqlite3“, todėl mums net nereikia diegti naujų paketų.

Duomenų bazės dizainas

Kitas žingsnis yra duomenų bazės kūrimas. Atminkite, kurie duomenų laukai yra tinkamiausi jūsų analizei, ir stenkitės optimizuoti paiešką ir saugojimą. Pvz., Jei neketinate naudoti „stateRoot“, galbūt norėsite jį visiškai praleisti arba laikyti atskiroje lentelėje. Lentelės su mažiau stulpelių galima ieškoti greičiau, ir jei vėliau suvoksite, kad iš tikrųjų turite „stateRoot“ naudojimo atvejį, vis tiek galėsite juo naudotis. Taip pat galite atskirti blokavimo informaciją nuo operacijos informacijos; Jei to nepadarysite, visos bloko operacijos, pavyzdžiui, laiko žyma, bus pakartotos N kartus, eikvojant daug vietos. Vėliau suderinti operaciją su jos bloko savybėmis bus lengva.

Mano sukurtą duomenų bazę sudaro 3 lentelės:

  • Greita: tinkamiausia operacijų informacija, kad būtų galima greitai pasiekti ir analizuoti,
  • TX: visa likusi informacija apie operaciją,
  • Blokuoti: informacija apie bloką.

Kintamųjų pavadinimų sudarymo tvarka buvo šiek tiek pakeista, palyginti su pradiniu „web3py“, siekiant atsikratyti dviprasmybių, pvz., Tiek blokinių maišos, tiek operacijų maišos vadinimas „maiša“ arba „nuo“ / „iki“ naudojimas kaip stulpelių pavadinimus, kurie SQL reikšmė yra kitokia ir ji sudužtų.

Sandorių vertes, likučius ir kitus didelius skaičius reikia saugoti duomenų bazėje kaip eilutes. Priežastis ta, kad SQLite gali tvarkyti tik pasirašytus sveikus skaičius, saugomus iki 8 baitų, o didžiausia vertė yra 2⁶³-1 = 9223372036854775807. Tai dažnai yra daug mažesnė nei wei operacijų vertės (pvz., Tik 1 ETH = 10¹ 10 wei).

Savo mini duomenų bazės kūrimas

Visą kodą galite rasti „GitHub“. Ji sutvarkys „blockchain“ informaciją pagal viršutinę schemą ir išves „blockchain.db“ failą, kuriame bus duomenys apie iš anksto nurodytą blokų skaičių. Norėdami tai išbandyti, eikite į duomenų bazę.py ir pasirinkite pagrįstą skaičių užrašomų blokų skaičių, pvz.

Nblokai = 10000

Pagal numatytuosius nustatymus turėtumėte nukreipti web3 objektą į savo „Infura“ baigtį. Taip pat galite pereiti prie IPC teikėjo, jei tokį turite (t. Y. Vietinį mazgą), tiesiog atšaukite eilutę

# arba ryšys per mazgą VM
# web3 = Web3 („Web3.IPCProvider“ ('/ path-to-geth.ipc /'))

ir pataisyk kelią. Tada tiesiog paleiskite komandų eilutės python duomenų bazėje.py. Kodas nukreips paskutinio parašyto bloko numerį į failą lastblock.txt, jei jums reikės paleisti iš naujo ten, kur baigėte.

Kaip naudotis duomenų baze

Parašę pirmuosius duomenų bazės įrašus, galite pradėti su ja susisiekti naudodami „ipython“ apvalkalą. Pvz., Norėdami atspausdinti pirmąsias 5 lentelės „Greita“ eilutes, galite paleisti žemiau esantį kodą.

Vietinis mazgas vs Infura

Jei norite sukurti didelę duomenų bazę, turėtumėte atsisiųsti „geth“ ir sinchronizuoti mazgą. Sinchronizuoti galima trimis pagrindiniais režimais:

Jei jums nereikia ankstesnių paskyros būsenų, galite sinchronizuoti savo mazgą greitu režimu [6].

Žemiau yra parodytas greitis, kuriuo šis kodas rašo duomenų bazėje, susisiekdamas su visiškai sinchronizuotu mazgu vietoje (IPC), palyginti su adresu Infura (Infura). Kaip matote, šio kodo paleidimas vietiniame mazge atsiperka, nes gausite beveik 2 laipsnių (dar žinomą kaip 100x) greičio padidinimą!

Laikas, kurio reikia įrašyti 10 operacijų blokų tarp 2000000 ir 2000400 blokų. Laikas skaičiuojamas pagal logaritminę skalę (10⁰ = 1, 10¹ = 10 ir panašiai;).

Santrauka

Dabar, kai turite savo vietinę duomenų bazę apie tai, kas nutiko ir nutinka „blockchain“ tinkle, galite pradėti ją tyrinėti. Pavyzdžiui, galite suskaičiuoti operacijų skaičių nuo jos generavimo, pamatyti, kiek adresų sugeneruojama kaip laiko funkcija - dangus yra riba to, ko galite sužinoti apie savo tvarinį. Mes ką tik nustatėme jūsų duomenų mokslo žaidimų aikštelės etapą. Taigi eik į priekį ir tyrinėk tai, ar nėra kitų programų, kuriose yra galimų programų.

Susisiekite su analytics@validitylabs.org, jei jus domina „Validity Labs“ „blockchain“ analizės paslaugos.