Как да взаимодействате с блокчейна на Ethereum и да създадете база данни с Python и SQL

Встъпителните семинари за blockchain често започват с лесна за смилане история за партньорска мрежа и банкови книги, а след това прескачат направо към кодиране на интелигентни договори, което е доста рязко. Затова вместо това си представете себе си да влезете в джунгла и помислете за блокчейна Ethereum като за странно същество, което тъкмо предстои да изучавате. Днес ще наблюдаваме създанието, ще взаимодействаме с него и ще събираме всички данни за него в централизирано хранилище за ваша собствена употреба.

Настройка за първата среща

Първо, ще трябва да инсталирате web3py. Web3py е библиотека на Python за свързване с блокчейн Ethereum. Това, което трябва да знаете предварително, е, че няма централна административна система, от която да могат да се изтеглят данните. Взаимосвързаните възли („връстници“), които споделят ресурси помежду си, съхраняват проверено копие на данните (или нейната част). Мрежата изпълнява протокола Ethereum, който определя правилата за взаимодействие на възлите един с друг и / или интелигентни договори през тази мрежа.

Ако искате да получите достъп до информация за транзакции, баланси, блокове или каквото и да е друго, е записано в blockchain, за което все още не знаете, протоколът изисква да се свържете с възлите. Възлите непрекъснато споделят нови данни помежду си и проверяват данните, така че по този начин сте сигурни, че получавате 1) данни, които не са били подправени и 2) които са най-актуални.

Има две основни категории възли, които бихте могли да използвате при първия си подход към съществото: локални или хоствани. Локален възел може да работи на вашата машина, което означава, че първо трябва да изтеглите клиент като geth, който ще синхронизира блокчейна с вашето устройство, заемайки място за съхранение и отнема време за завършване. За първата среща хостваният възел е по-добър избор - той се контролира от някой друг, но можете лесно да се свържете с него и да играете сами с blockchain.

Отидете в Infura и направете свой собствен безплатен акаунт за достъп до такъв хостван възел. Когато приключите, ще видите списък с мрежи, с които бихте могли да се свържете: mainnet (основната блокчейн на Ethereum) и куп тестови мрежи, които са там, за да тестват по принцип вашите интелигентни договори, така че да можете да правите грешки върху тях и ги коригирайте, преди да внедрите скъп код в основната мрежа.

Време е за първия подход. Импортирайте обекта Web3 и установете HTTP връзка.

от уеб3 импортиране Web3
web3 = Web3 (Web3.HTTPProvider („https://mainnet.infura.io/your-own-personal-number“))

И вие сте готови! Сега можете да проучите структурата на данните с API на web3.

Извличане на информация за конкретни блокове ...

# текущ номер на блок
>>> web3.eth.blockNumber
5658173
# получете съдържанието на най-скоро изкопания блок
>>> web3.eth.getBlock ('последен')

Тази команда връща структурата на данните AttributeDict, която е речник на двойки ключ-стойност, който изглежда така:

Не всички тези променливи ще бъдат незабавно полезни за вас, тъй като някои от тях са доста технически и значението им ще има смисъл едва след като разберете по-задълбочено как действително работи blockchain. Можете да прочетете повече за тях в така наречената „Жълта книга“ или да ги пропуснете за момента и да работите с лесно разбираемите.

Накратко, блок съдържа заглавната част на блока, списък на проверените транзакции, написани в него, и списък на чичове (блокови идентификатори на миньори, които бяха малко прекалено бавни с блоковете си, за да стигнат до основната блокчейн, но все пак бяха наградени с Ether за техните изчислителни усилия). По-долу можете да прочетете какво е значението на всяка променлива, която разделих на подкатегории.

Общ

Mining, свързани с

Чичовци

Технически

... транзакции и техните разписки

Сега можем да търсим единични транзакции в блок чрез техните уникални идентификатори, т.е. хеши на транзакции.

Както преди, web3py ни връща речник с атрибути. Таблицата по-долу обобщава какво означава всеки ключ.

И накрая, можем да разгледаме и разписките за транзакции:

Разписка за транзакцията съдържа няколко повторени и нови записа; новите са обяснени по-долу.

За справка включих различни допълнителни ресурси, освен Жълтата книга, за да съставя тези таблици [2, 3, 4, 5].

Както можете да видите, само с няколко прости команди вече можете да се свържете с мрежата и да получите основна информация за транзакциите, блоковете или състоянията в необработен формат. Това отваря нов прозорец за това какво може да се направи с такива данни!

Система за управление на бази данни

Когато планирате да запишете данните си в подходяща база данни, вероятно осъзнавате, че има много решения за системи за управление там за ентусиасти на Python, като например без сървър SQLite или сървър базиран MySQL, PostgreSQL или Hadoop. В зависимост от това какво възнамерявате да направите, ще трябва да определите коя опция е най-добрата за вашия проект. Като цяло намирам, че тези точки са полезни:

  • Какъв е предвидения размер на базата данни (т.е. може ли да се обработва в една машина машина)?
  • Записите често ли ще се редактират или ще останат фиксирани?
  • Трябва ли базата данни да бъде достъпна и редактирана от няколко страни / приложения едновременно?

Блокчейнът на Ethereum с течение на времето расте постоянно, като се приближава до 1 TB към юни 2018 г., което е малко, следователно не е оптимално за разпределена система за обработка като Hadoop. Блокчейн базата данни ще бъде написана веднъж и след това само разширена с нови записи, оставяйки старите записи непроменени. Предвиденият случай на използване на тази база данни трябва да бъде написан от един канал и достъп до четене само от другите канали, така че всъщност не е необходимо да го стартираме на сървър. Съхраняването на базата данни локално на вашата машина ще доведе до бързо разчитане, което е желателно и постижимо със система за управление без сървър като SQLite. И Python има вградена библиотека sqlite3, така че дори не е необходимо да инсталираме нови пакети.

Дизайн на база данни

Следващата стъпка е проектирането на вашата база данни. Имайте предвид кои полета с данни са най-подходящи за вашия анализ и се стремете да оптимизирате както търсенето, така и съхранението. Например, ако не планирате да използвате stateRoot, може да искате да го прескочите напълно или да го съхраните в отделна таблица. Таблица с по-малко колони може да се търси по-бързо и ако по-късно разберете, че всъщност имате случай на използване за stateRoot, все пак ще имате достъп до него. Можете също така да искате да отделите информация за блока от информацията за транзакциите; ако не го направите, блокирането на свойства като времева марка ще се повтори N пъти за всички транзакции в блока, като се губи много място. Съпоставянето на транзакция с нейните свойства на блока ще бъде лесно с операцията JOIN по-късно.

Базата данни, която проектирах, се състои от 3 таблици:

  • Бързо: най-подходящата информация за транзакциите за бърз достъп и анализ,
  • TX: цялата остатъчна информация за транзакциите,
  • Блок: информация за конкретния блок.

Конвенцията за именуване на променливи е леко променена по отношение на оригиналния web3py, за да се отървете от неясноти, като извикване както на блоков хеш, така и на хеш на транзакция „хеш“ или използване „от“ / „до“ като имена на колони, което в SQL имат различно значение и ще сринат програмата.

Стойностите на транзакциите, баланси и други големи числа трябва да се съхраняват в базата данни като низове. Причината е, че SQLite може да обработва само подписани цели числа, съхранени в до 8 байта, с максимална стойност 2⁶³-1 = 9223372036854775807. Това често е много по-ниско от стойностите на транзакциите в wei (например само 1 ETH = 10¹⁸ wei).

Изграждане на вашата мини база данни

Пълният код можете да намерите в GitHub. Той ще организира информацията за blockchain според горната схема и ще изведе файл blockchain.db, съдържащ данни за предварително определен брой блокове. За да го тествате, отидете на database.py файл и изберете разумно число за броя на блоковете, които ще бъдат написани, напр.

Nblocks = 10000

По подразбиране трябва да насочите обекта web3 към вашата крайна точка Infura. Можете също да преминете към доставчика на IPC, ако имате такъв (т.е. местния ви възел), просто коментирайте линията

# или връзка чрез възел на VM
# web3 = Web3 (Web3.IPCProvider ('/ път-към-geth.ipc /'))

и фиксирайте пътя. След това просто стартирайте във вашия команден ред python database.py. Кодът ще зареже номера на последния написан блок във файла lastblock.txt, в случай че трябва да рестартирате там, където сте прекъснали.

Как да използвате базата данни

След като напишете първите записи в базата данни, можете да започнете да комуникирате с нея чрез ipython shell. Например, за да отпечатате първите 5 реда от таблицата „Бързо“, можете да стартирате кода по-долу.

Местен възел срещу Инфура

Ако искате да изградите голяма база данни, трябва да изтеглите geth и да синхронизирате възел. Синхронизацията може да се извърши в 3 основни режима:

Ако не се нуждаете от предишни състояния на акаунта, можете да синхронизирате своя възел в бърз режим [6].

По-долу е представен график, показващ скоростта, с която този код пише в база данни, комуникирайки с напълно синхронизирания възел локално (IPC) срещу адрес на Infura (Infura). Както можете да видите, изплаща се да стартирате този код на локален възел, тъй като получавате увеличение на скоростта от близо 2 порядъка (известен още като 100x)!

Времето, необходимо за записване на 10 блока транзакции между блокове 2000000 и 2000400. Времето е в логаритмичната скала (10⁰ = 1, 10¹ = 10 и така нататък;).

резюме

Сега, когато имате собствена локална база данни за случилото се и се случва в blockchain, можете да започнете да го изследвате. Например, можете да преброите броя на транзакциите след генезиса му, да видите колко адреси са генерирани като функция на времето - небето е ограничението за това, което можете да научите за вашето създание. Току-що сме поставили основата на вашата детска площадка за научни данни. Затова продължете напред и го проучете или проверете следващите публикации за потенциални приложения.

Свържете се с analytics@validitylabs.org, ако се интересувате от услугите за анализи на блокчейни на Validity Labs.