Jak interagovat s blockchainem Ethereum a vytvořit databázi s Pythonem a SQL

Úvodní semináře o blockchainu často začínají snadno strávitelným příběhem peer-to-peer sítě a bankovních účetních knih, a poté skočí přímo na kódování inteligentních smluv, což je docela náhlé. Takže si místo toho představte, že vejdete do džungle a přemýšlejte o blockchainu Ethereum jako o podivném stvoření, které se chystáte studovat. Dnes budeme tvora pozorovat, budeme s ním spolupracovat a shromažďujeme veškerá data o něm do centralizovaného úložiště pro vlastní potřebu.

Příprava na první setkání

Nejprve musíte nainstalovat web3py. Web3py je knihovna Python pro připojení k blockchainu Ethereum. Co potřebujete vědět předem je, že neexistuje žádný centrální administrativní systém, ze kterého lze data stahovat. Propojené uzly („peers“), které sdílejí prostředky mezi sebou, ukládají ověřenou kopii dat (nebo jejich části). Síť provádí protokol Ethereum, který definuje pravidla vzájemné interakce uzlů a / nebo inteligentních kontraktů v této síti.

Pokud chcete získat přístup k informacím o transakcích, zůstatcích, blocích nebo čemkoli jiném, co je zapsáno do blockchainu, o kterém ještě nevíte, protokol vyžaduje připojení k uzlům. Uzly průběžně sdílejí nová data navzájem a ověřují je, takže tímto způsobem jste si jisti, že dostanete 1) data, s nimiž nebylo manipulováno, a 2) která jsou nejaktuálnější.

Existují dvě základní kategorie uzlů, které můžete použít při svém prvním přístupu k tvorovi: místní nebo hostované. Na vašem počítači může běžet místní uzel, což znamená, že musíte nejprve stáhnout klienta, jako je geth, který bude synchronizovat blockchain s vaším zařízením, zabírat úložiště a věnovat čas dokončení. Pro první setkání je hostovaný uzel lepší volbou - je ovládán někým jiným, ale můžete se k němu snadno připojit a hrát si s blockchainem sami.

Jděte do Infury a vytvořte si svůj vlastní bezplatný účet pro přístup k hostovanému uzlu. Až budete hotovi, uvidíte seznam sítí, k nimž se můžete připojit: mainnet (hlavní blok Ethereum blockchain) a spoustu testovacích sítí, které jsou zde k testování vašich chytrých smluv, takže můžete dělat chyby a opravte je před nasazením nákladného kódu do mainnetu.

Čas na první přístup. Importujte objekt Web3 a vytvořte připojení HTTP.

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

A jste všichni připraveni! Nyní můžete prozkoumat datovou strukturu pomocí rozhraní web3 API.

Načítání informací o konkrétních blocích ...

#current number number
>>> web3.eth.blockČíslo
5658173
#get obsah posledního těženého bloku
>>> web3.eth.getBlock („nejnovější“)

Tento příkaz vrací datovou strukturu AttributeDict, což je slovník párů klíč-hodnota, který vypadá takto:

Ne všechny tyto proměnné vám budou okamžitě užitečné, protože některé jsou docela technické a jejich význam bude mít smysl až poté, co budete lépe porozumět tomu, jak blockchain skutečně funguje. Více se o nich můžete dočíst v takzvaném „žlutém papíře“ nebo je prozatím přeskočit a pracovat s těmi, jimž snadno rozumíte.

Stručně řečeno, blok obsahuje záhlaví bloku, seznam ověřených transakcí, které jsou do něj zapsány, a seznam strýců (identifikátory bloků horníků, kteří byli se svými bloky trochu příliš pomalí na to, aby se dostali do hlavního blockchainu, ale stále byli odměněni Etherem za jejich výpočetní úsilí). Níže si můžete přečíst, jaký význam má každá proměnná, kterou jsem rozdělil do podkategorií.

Všeobecné

Těžba

Strýci

Technický

… Transakce a jejich příjmy

Nyní můžeme také vyhledat jednotlivé transakce v bloku podle jejich jedinečných identifikátorů, tj. Transakčních hashů.

Stejně jako dříve nám web3py vrací slovník atributů. Níže uvedená tabulka shrnuje, co každý klíč znamená.

Nakonec se také můžeme podívat na transakční příjmy:

Potvrzení transakce obsahuje několik opakovaných a nových záznamů; nové jsou vysvětleny níže.

Pro doplnění těchto tabulek jsem pro doplnění těchto tabulek [2, 3, 4, 5] zahrnul různé další zdroje.

Jak vidíte, pomocí několika jednoduchých příkazů se již můžete připojit k síti a získat základní informace o transakcích, blocích nebo stavech v surovém formátu. Tím se otevře nové okno, co lze s takovými daty udělat!

Systém pro správu databází

Při plánování zápisu dat do správné databáze si pravděpodobně uvědomíte, že existuje mnoho řešení pro systémy řízení pro nadšence Pythonu, jako je SQLite bez serverů nebo MySQL, PostgreSQL nebo Hadoop založené na serveru. V závislosti na tom, co chcete dělat, budete muset určit, která možnost je pro váš projekt nejlepší. Obecně jsem zjistil, že tyto body jsou užitečné:

  • Jaká je zamýšlená velikost databáze (tj. Může být zpracována na jediném strojním systému)?
  • Budou položky často upravovány nebo zůstanou opraveny?
  • Má databáze přistupovat a upravovat více stran / aplikací současně?

Blockchain Ethereum v průběhu času neustále roste a od června 2018 se blíží 1 TB, což je malé, a proto není optimální pro distribuovaný systém zpracování, jako je Hadoop. Databáze blockchainu bude zapsána jednou a poté rozšířena pouze o nové položky, přičemž staré položky zůstanou nezměněny. Zamýšlený případ použití této databáze má být zapsán jedním kanálem a přístupný pouze pro čtení ostatními kanály, takže jej opravdu nemusíme spouštět na serveru. Udržování databáze lokálně na vašem počítači povede k rychlému čtení, což je žádoucí a dosažitelné pomocí systému správy bez serverů, jako je SQLite. A Python má vestavěnou knihovnu sqlite3, takže ani nemusíme instalovat nové balíčky.

Návrh databáze

Dalším krokem je návrh vaší databáze. Nezapomeňte, která datová pole jsou pro vaši analýzu nejrelevantnější, a snažte se optimalizovat vyhledávání i ukládání. Pokud například nemáte v úmyslu použít stateRoot, můžete jej úplně přeskočit nebo ponechat v samostatné tabulce. Tabulku s menším počtem sloupců lze prohledávat rychleji a pokud si později uvědomíte, že ve skutečnosti máte stav stateRoot, budete k ní mít stále přístup. Můžete také chtít oddělit informace o bloku od informací o transakci; Pokud tak neučiníte, vlastnosti bloku, jako je časové razítko, se budou opakovat Nkrát pro všechny transakce v bloku a plýtvají spoustou místa. Přiřazení transakce s vlastnostmi bloku bude snadné s operací JOIN později.

Databáze, kterou jsem navrhl, se skládá ze 3 tabulek:

  • Rychlý: nejdůležitější informace o transakci pro rychlý přístup a analýzu,
  • TX: všechny informace o zbývajících transakcích,
  • Block: block-specific info.

Konvence pojmenování proměnných se s ohledem na původní web3py mírně změnila, aby se zbavily nejasností, jako je volání hashů bloků a transakčních hashů „hash“, nebo použití „od“ / „do“ jako názvů sloupců, které v SQL má jiný význam a program by selhal.

Hodnoty transakcí, zůstatky a další velká čísla je třeba uložit do databáze jako řetězce. Důvodem je, že SQLite dokáže zpracovat pouze podepsaná celá čísla uložená v až 8 bajtech, s maximální hodnotou 2⁶³-1 = 9223372036854775807. To je často mnohem nižší než hodnoty transakce ve wei (např. Pouze 1 ETH = 10 ⁸ wei).

Vytvoření vaší mini databáze

Celý kód najdete na GitHubu. Bude uspořádat informace o blockchainu podle horního schématu a vydá soubor blockchain.db obsahující data předem určeného počtu bloků. Chcete-li jej otestovat, přejděte do souboru database.py a vyberte přiměřené číslo pro počet bloků, které mají být zapsány, např.

Nblocks = 10000

Ve výchozím nastavení byste měli nasměrovat objekt web3 na váš koncový bod Infura. Můžete také přejít na poskytovatele IPC, pokud jej máte (tj. Místní uzel), pouze odkomentujte řádek

# nebo připojení přes uzel na VM
# web3 = Web3 (Web3.IPCProvider ('/ cesta k geth.ipc /'))

a opravit cestu. Pak jednoduše spusťte v příkazovém řádku python database.py. Kód vypíše číslo posledního zapsaného bloku do souboru lastblock.txt pro případ, že budete muset restartovat místo, kde jste skončili.

Jak používat databázi

Jakmile zapíšete první záznamy do databáze, můžete s nimi začít komunikovat prostřednictvím ipsthon shellu. Například pro tisk prvních 5 řádků tabulky „Quick“ můžete spustit níže uvedený kód.

Místní uzel vs. Infura

Pokud chcete vytvořit velkou databázi, měli byste stáhnout geth a synchronizovat uzel. Synchronizaci lze provést ve 3 základních režimech:

Pokud nepotřebujete předchozí stavy účtu, můžete synchronizovat svůj uzel v rychlém režimu [6].

Níže je graf ukazující rychlost, jakou tento kód zapisuje do databáze, komunikující s plně synchronizovaným uzlem lokálně (IPC) vs. s adresou na Infura (Infura). Jak vidíte, vyplatí se tento kód spustit v místním uzlu, protože získáte rychlostní zvýšení o téměř 2 řády (aka 100x)!

Čas potřebný k zápisu 10 bloků transakcí mezi bloky 2000000 a 2000400. Čas je v logaritmickém měřítku (10⁰ = 1, 10¹ = 10 atd.;).

souhrn

Nyní, když máte vlastní lokální databázi toho, co se stalo a co se děje na blockchainu, můžete ji začít zkoumat. Můžete například spočítat počet transakcí od jejich vzniku, zjistit, kolik adres je generováno jako funkce času - nebe je limitem toho, co se můžete o svém stvoření dozvědět. Právě jsme připravili půdu pro vaše hřiště pro vědu o údajích. Tak jděte do toho a prozkoumejte to, nebo zkontrolujte další příspěvky pro potenciální aplikace.

Pokud máte zájem o analytické služby blockchainu společnosti Validity Labs, kontaktujte [email protected]