Sådan interageres med Ethereum blockchain og oprettes en database med Python og SQL

Indledende workshops om blockchain starter ofte med den letfordøjelige historie om peer-to-peer-netværk og bankbøger, og spring derefter direkte til kodning af smarte kontrakter, som er ret pludselig. Så forestil dig i stedet at gå ind i en jungle og tænk på Ethereum blockchain som en underlig væsen, du lige er ved at studere. I dag observerer vi væsenet, interagerer med det og samler alle dataene om det til et centraliseret lager til dit eget brug.

At stille op til det første møde

Først skal du installere web3py. Web3py er et Python-bibliotek til forbindelse med Ethereum blockchain. Hvad du skal vide på forhånd er, at der ikke er noget centralt administrativt system, hvor dataene kan downloades fra. De sammenkoblede noder (“peers”), der deler ressourcer mellem hinanden, gemmer en verificeret kopi af dataene (eller deres del). Netværket udfører Ethereum-protokollen, der definerer reglerne for interaktion af noder med hinanden og / eller smarte kontrakter over det netværk.

Hvis du vil have adgang til oplysninger om transaktioner, saldi, blokke eller andet, der er skrevet i den blockchain, som du endnu ikke kender, kræver protokollen, at du opretter forbindelse til noder. Knuderne deler kontinuerligt nye data med hinanden og verificerer dataene, så på denne måde er du sikker på, at du får 1) data, som ikke er blevet manipuleret med, og 2) som er mest opdateret.

Der er to grundlæggende kategorier af noder, du kan bruge i din første tilgang til væsen: lokal eller vært. En lokal knude kan køre på din maskine, hvilket betyder, at du først skal downloade en klient som geth, der synkroniserer blockchain til din enhed, besætter lagring og tager tid at gennemføre. For det første møde er en hostet node et bedre valg - det styres af en anden, men du kan nemt oprette forbindelse til det og lege med blockchain på egen hånd.

Gå til Infura og opret din egen gratis konto for at få adgang til en sådan hostet node. Når du er færdig, ser du en liste over netværk, du kan oprette forbindelse til: mainnet (den vigtigste Ethereum blockchain), og en masse testnet, der er der for dybest set at teste dine smarte kontrakter, så du kan begå fejl på dem og korriger dem, før du implementerer dyre kode til mainnet.

Tid til den første tilgang. Importer Web3-objektet, og oprett en HTTP-forbindelse.

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

Og du er klar! Nu kan du udforske datastrukturen med web3 API.

Henter info om specifikke blokke ...

# nuværende bloknummer
>>> web3.eth.blockNumber
5658173
#get indholdet af den senest udvindede blok
>>> web3.eth.getBlock ('seneste')

Denne kommando returnerer AttributeDict-datastrukturen, som er en ordbog med nøgleværdipar, der ser sådan ud:

Ikke alle disse variabler vil være umiddelbart nyttige for dig, da nogle er ganske tekniske, og deres betydning vil kun give mening, når du har en dybere forståelse af, hvordan blockchain faktisk fungerer. Du kan læse mere om dem i den såkaldte 'Yellow Paper' eller springe dem for tiden og arbejde med de let forståelige.

Kort sagt indeholder en blok blokhovedet, en liste over bekræftede transaktioner skrevet til den og en liste over onkler (blokidentifikatorer for minearbejdere, der var lidt for langsomme med deres blokke til at nå det til hoved blockchain men stadig blev belønnet med Ether for deres beregningsmæssige indsats). Nedenfor kan du læse, hvad betydningen er for hver variabel, som jeg har opdelt i underkategorier.

Generel

Mining-relaterede

onkler

Teknisk

... transaktioner og deres kvitteringer

Nu kan vi også slå enkelttransaktioner op i en blok ved hjælp af deres unikke identifikatorer, dvs. transaktionshascher.

Som tidligere returnerer web3py os en attributordbog. Tabellen nedenfor opsummerer, hvad hver nøgle står for.

Endelig kan vi også undersøge transaktionskvitteringer:

En transaktionskvittering indeholder et par gentagne og nye poster; de nye forklares nedenfor.

Som reference inkluderede jeg forskellige ekstra ressourcer udover den gule papir til at udarbejde disse tabeller [2, 3, 4, 5].

Som du kan se, med bare et par enkle kommandoer kan du allerede oprette forbindelse til netværket og få grundlæggende info om transaktioner, blokke eller tilstande i det rå format. Dette åbner et nyt vindue til hvad der kan gøres med sådanne data!

Databasestyringssystem

Når du planlægger at skrive dine data til en ordentlig database, er du sandsynligvis klar over, at der er mange løsninger til styringssystemer derude for Python-entusiaster, såsom serverløs SQLite eller serverbaseret MySQL, PostgreSQL eller Hadoop. Afhængigt af hvad du agter at gøre, bliver du nødt til at bestemme, hvilken mulighed der er bedst til dit projekt. Generelt har jeg fundet disse punkter være nyttige:

  • Hvad er den tilsigtede størrelse på databasen (dvs. kan den behandles på et enkelt maskinsystem)?
  • Kommer posterne ofte at blive redigeret, eller forbliver de faste?
  • Skal databasen have adgang til og redigere af flere parter / apps samtidig?

Ethereum blockchain vokser jævnligt med tiden og kommer tæt på 1 TB fra juni 2018, hvilket er lille, og derfor ikke optimalt for et distribueret behandlingssystem som Hadoop. Blockchain-databasen skrives en gang og udvides derefter kun med nye poster, hvor gamle poster er uændrede. Det påtænkte brugssag for denne database skal skrives af en kanal og fås adgang til skrivebeskyttet af de andre kanaler, så vi behøver ikke rigtig at køre den på en server. Opbevaring af databasen lokalt på din maskine vil resultere i en hurtig aflæsning, som er ønskelig og opnåelig med et serverløst styringssystem som SQLite. Og Python har et indbygget bibliotek sqlite3, så vi behøver ikke engang at installere nye pakker.

Databasedesign

Det næste trin er at designe din database. Husk, hvilke datafelter der er mest relevante for din analyse, og mål at optimere både søgning og opbevaring. For eksempel, hvis du ikke planlægger at bruge stateRoot, kan du måske springe det helt over eller opbevare det i en separat tabel. En tabel med færre kolonner kan søges hurtigere igennem, og hvis du senere indser, at du rent faktisk har en brugssag til stateRoot, vil du stadig kunne få adgang til den. Du ønsker måske også at adskille blokoplysninger fra transaktionsinformationen; Hvis du ikke gør det, blokeres egenskaber som tidsstempel N gange for alle transaktioner i blokken, og spilder meget plads. At matche en transaktion med dens blokegenskaber vil være let med JOIN-operationen senere.

Den database, jeg designede, består af 3 tabeller:

  • Hurtig: mest relevante transaktionsinfo til hurtig adgang og analyse,
  • TX: alle resterende transaktionsinfo,
  • Blokering: blokespecifik info.

Navnekonventionen af ​​variabler er blevet ændret lidt med hensyn til den originale web3py for at slippe af med uklarheder, såsom at kalde både blok hash og transaktions hash "hash", eller bruge "fra" / "til" som kolonnenavne, som i SQL har en anden betydning og ville nedbrud programmet.

Transaktionsværdier, balance og andre store numre skal gemmes i databasen som strenge. Årsagen er, at SQLite kun kan håndtere underskrevne heltal, der er gemt i op til 8 byte, med en maksimal værdi på 2⁶³-1 = 9223372036854775807. Dette er ofte meget lavere end transaktionsværdierne i wei (f.eks. Kun 1 ETH = 10¹⁸ wei).

Byg din mini-database

Den fulde kode findes på GitHub. Det organiserer blockchain-info i henhold til det øverste skema og udsender en blockchain.db-fil, der indeholder data fra et forudbestemt antal blokke. For at teste den skal du gå til database.py-filen og vælge et rimeligt antal for antallet af blokke, der skal skrives, f.eks.

Nblocks = 10000

Som standard skal du pege web3-objektet til dit Infura-endepunkt. Du kan også skifte til IPC-udbyder, hvis du har en (dvs. din lokale knude), bare fjern linien

# eller forbindelse via node på VM
# web3 = Web3 (Web3.IPCProvider ('/ path-to-geth.ipc /'))

og fikse stien. Kør derefter blot i din kommandolinje python database.py. Koden vil dumpe nummeret på den sidst skrevne blok i filen lastblock.txt, i tilfælde af at du bliver nødt til at genstarte, hvor du slap.

Sådan bruges databasen

Når du har skrevet de første poster til databasen, kan du begynde at kommunikere med den via ipython-shell. For eksempel at udskrive de første 5 rækker i tabellen "Hurtig" kan du køre koden nedenfor.

Lokal knude vs. Infura

Hvis du vil oprette en stor database, skal du downloade geth og synkronisere en node. Synkroniseringen kan udføres i 3 grundlæggende tilstande:

Hvis du ikke har brug for tidligere kontostatus, kan du synkronisere din knude i hurtigtilstand [6].

Nedenfor er et diagram, der viser, hvor hurtigt denne kode skriver til en database, der kommunikerer med den fuldt synkroniserede node lokalt (IPC) vs. en adresse på Infura (Infura). Som du kan se, lønner det sig at køre denne kode på en lokal knude, da du får hastighedsforøgelsen på næsten 2 størrelsesordrer (alias 100x)!

Tiden det tager at skrive 10 blokke transaktioner mellem blokke 2000000 og 2000400. Tiden er på den logaritmiske skala (10⁰ = 1, 10¹ = 10 og så videre;).

Resumé

Nu hvor du har din egen lokale database over, hvad der skete og sker på blockchain, kan du begynde at udforske den. For eksempel kan du tælle antallet af transaktioner siden dens oprettelse, se hvor mange adresser der genereres som en funktion af tiden - himlen er grænsen for, hvad du kan lære om dit væsen. Vi sætter netop scenen for din data science legeplads. Så gå videre og udforsk det, eller tjek de næste stillinger for potentielle applikationer.

Kontakt analytics@validitylabs.org, hvis du er interesseret i blockchain-analytics-tjenester fra Validity Labs.