Ethereum blockchain bilan qanday aloqa qilish va Python va SQL bilan ma'lumotlar bazasini yaratish

Blokchain haqidagi tanishtiruv seminarlari ko'pincha "peer-to-peer" tarmog'ining va bank daftarlarining oson hazm bo'ladigan hikoyasi bilan boshlanadi va keyin aqlli shartnomalarni kodlashga o'tishadi, bu juda keskin. Shunday qilib, o'zingizni chakalakzor ichida yurganingizni tasavvur qiling va Ethereum blockchainni siz hozir o'rganmoqchi bo'lgan g'alati mavjudot deb o'ylang. Bugun biz jonzotni kuzatamiz, u bilan o'zaro aloqa qilamiz va u haqidagi barcha ma'lumotlarni o'zingizning shaxsiy foydalanishingiz uchun markazlashtirilgan omborga yig'amiz.

Birinchi uchrashuvga tayyorgarlik

Birinchidan, web3py-ni o'rnatishingiz kerak. Web3py - bu Ethereum blockchain-ga ulanish uchun Python kutubxonasi. Oldindan bilishingiz kerak bo'lgan narsa, ma'lumotlarni yuklab olish mumkin bo'lgan markaziy ma'muriy tizim mavjud emas. Resurslarni bir-biri bilan o'zaro almashadigan o'zaro bog'langan tugunlar ("tengdoshlar") ma'lumotlarning tasdiqlangan nusxasini (yoki uning qismini) saqlaydi. Tarmoq Ethereum protokolini bajaradi, bu tugunlarning bir-biri bilan va / yoki ushbu tarmoq orqali aqlli shartnomalarning o'zaro ta'sir qilish qoidalarini belgilaydi.

Agar siz tranzaktsiyalar, balanslar, bloklar va boshqa narsalar to'g'risida ma'lumotga kirishni xohlasangiz, siz hali bilmagan blockchain-ga yozilgan bo'lsangiz, protokol tugunlarga ulanishni talab qiladi. Tugunlar doimiy ravishda bir-birlari bilan yangi ma'lumotlarni almashadilar va ma'lumotlarni tekshiradilar, shu bilan siz 1) o'zgartirilmagan ma'lumotlarga va 2) eng yangi ma'lumotlarga ega ekanligingizga ishonch hosil qilasiz.

Mahluqqa birinchi qarashda foydalanishingiz mumkin bo'lgan ikkita asosiy tugun toifasi mavjud: mahalliy yoki mezbon. Mahalliy tugun sizning kompyuteringizda ishlay oladi, demak siz avval blockchain-ni qurilmangizga sinxronlashtiradigan, saqlash bilan shug'ullanadigan va tugallash uchun vaqt sarflaydigan geth kabi bir mijozni yuklab olishingiz kerak. Birinchi to'qnashuvda mezbonlik qiladigan tugun yaxshiroq tanlovdir - uni kimdir boshqaradi, lekin siz osongina unga ulanib, o'zingizni blockchain bilan o'ynashingiz mumkin.

Infura-ga o'ting va bunday joylashtirilgan tugunga kirish uchun o'zingizning shaxsiy hisobingizni yarating. Tugatganingizdan so'ng siz ulanishingiz mumkin bo'lgan tarmoqlar ro'yxatini ko'rasiz: asosiy tarmoq (asosiy Ethereum blockchain) va bir nechta testnetlar, bu erda siz o'zingizning aqlli shartnomalaringizni sinab ko'rishingiz mumkin, shunda siz xato qilishingiz mumkin. Mannetga qimmat kodni kiritishdan oldin ularni to'g'rilang.

Birinchi yondashuv uchun vaqt. Web3 ob'ektini import qiling va HTTP ulanishini o'rnating.

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

Hammasi tayyor! Endi siz veb3 API yordamida ma'lumotlar tuzilishini o'rganishingiz mumkin.

Muayyan bloklar haqida ma'lumot olinmoqda ...

# joriy blok raqami
>>> web3.eth.blockNumber
5658173
# eng so'nggi qazib olingan blok tarkibini belgilang
>>> web3.eth.getBlock ("eng so'nggi")

Ushbu buyruq AttributeDict ma'lumotlar strukturasini qaytaradi, bu quyidagicha ko'rinadigan kalit-qiymat juftliklarining lug'atidir:

Ushbu o'zgaruvchilarning barchasi darhol sizga foydali bo'lmaydi, chunki ba'zilari juda texnik va ularning ma'nosi siz blockchainning qanday ishlashini chuqurroq tushunganingizdagina ma'no beradi. Siz ular haqida ko'proq ma'lumotni "Sariq qog'oz" da o'qishingiz yoki hozircha o'tkazib yuborishingiz va tushunarli bo'lganlar bilan ishlashingiz mumkin.

Qisqasi, blokda blok sarlavhasi, unga yozilgan tasdiqlangan tranzaktsiyalar ro'yxati va amakilar ro'yxati mavjud (asosiy blokchainga aylantirish uchun o'z bloklari bilan juda sekin ishlaydigan konchilar identifikatorlari, ammo baribir Ether uchun mukofotlanganlar) ularning hisoblash kuchi). Quyida men pastki kategoriyalarga bo'lingan har bir o'zgaruvchining ma'nosi nimani anglatishini o'qishingiz mumkin.

Umumiy

Kon bilan bog'liq

Ambalajlar

Texnik

... bitimlar va ularning tushumlari

Endi biz bitta operatsiyani blokda noyob identifikatorlari, ya'ni tranzaktsion xeshlari orqali qidirishimiz mumkin.

Ilgari bo'lgani kabi, web3py bizga atributlar lug'atini qaytaradi. Quyidagi jadvalda har bir kalit nimani anglatishi haqida qisqacha ma'lumot berilgan.

Nihoyat, biz tranzaksiya kvitantsiyalariga ham qarashimiz mumkin:

Bitim kvitansiyasida bir nechta takrorlangan va yangi yozuvlar mavjud; yangilari quyida tushuntiriladi.

Ma'lumot uchun men ushbu jadvallarni tuzish uchun Sariq qog'ozdan tashqari turli xil qo'shimcha manbalarni ham qo'shganman [2, 3, 4, 5].

Ko'rib turganingizdek, bir nechta oddiy buyruqlar bilan siz allaqachon tarmoqqa ulanishingiz va tranzaktsiyalar, bloklar yoki holatlar haqida asosiy ma'lumotlarni olishingiz mumkin. Bu bunday ma'lumotlar bilan nima qilish mumkinligi uchun yangi oyna ochadi!

Ma'lumotlar bazasini boshqarish tizimi

Ma'lumotlaringizni tegishli bazaga yozishni rejalashtirayotganda, ehtimol Python ishqibozlari uchun boshqarish tizimlari uchun serversiz SQLite yoki serverga asoslangan MySQL, PostgreSQL yoki Hadoop kabi echimlar mavjudligini tushunasiz. Siz nima qilishni rejalashtirganingizga qarab, sizning loyihangiz uchun qaysi variant eng mos ekanligini aniqlashingiz kerak bo'ladi. Umuman olganda, men ushbu fikrlarni foydali deb topdim:

  • Ma'lumotlar bazasining rejalashtirilgan hajmi qanday (ya'ni uni bitta mashina tizimida qayta ishlash mumkin)?
  • Yozuvlar tez-tez tahrirlansa bo'ladimi yoki ular doimiy bo'lib qoladimi?
  • Ma'lumotlar bazasiga bir vaqtning o'zida bir nechta tomonlar / ilovalar tomonidan kirish va tahrir qilish kerakmi?

Ethereum blockchain vaqt o'tishi bilan tobora o'sib bormoqda, 2018 yil iyuniga kelib 1 TB ga yaqinlashdi, bu kichkina, shuning uchun Hadoop singari taqsimlangan qayta ishlash tizimi uchun maqbul emas. Blokchain bazasi bir marta yoziladi va keyin faqat yangi yozuvlar bilan kengaytirilib, eski yozuvlar o'zgarishsiz qoladi. Ushbu ma'lumotlar bazasining maqsadli foydalanish holati bitta kanal tomonidan yozilishi va boshqa kanallar tomonidan o'qilishi kerak, shuning uchun uni serverda ishlatishimiz shart emas. Ma'lumotlar bazasini kompyuteringizda lokal saqlash SQLite kabi serversiz boshqarish tizimi yordamida istalgan va erishish mumkin bo'lgan tez o'qishga olib keladi. Va Python-da o'rnatilgan sqlite3 kutubxonasi bor, shuning uchun biz yangi paketlarni o'rnatishga ham hojat yo'q.

Ma'lumotlar bazasini loyihalash

Keyingi qadam sizning ma'lumotlar bazangizni loyihalash. Tahlil qilish uchun qaysi ma'lumotlar maydonlari eng muhimligini yodda tuting va qidirishni ham, saqlashni ham optimallashtirishni maqsad qiling. Masalan, stateRoot-dan foydalanishni rejalashtirmasangiz, uni butunlay o'tkazib yuborishni yoki alohida jadvalda saqlashni xohlashingiz mumkin. Kamroq ustunli jadvalni tezroq qidirish mumkin, va keyinroq siz aslida davlatRoot-dan foydalanish holati mavjudligini anglasangiz, unga kirish imkoniyatiga ega bo'lasiz. Shuningdek, siz bloklangan ma'lumotni tranzaksiya ma'lumotidan ajratib qo'yishingiz mumkin; agar shunday qilmasangiz, vaqt belgisi kabi blok xususiyatlari blokdagi barcha operatsiyalar uchun N marta takrorlanadi, ko'p joyni isrof qiladi. Blok xususiyatlari bilan tranzaktsiyalarni taqqoslash, keyinroq JOIN bilan oson bo'ladi.

Men yaratgan ma'lumotlar bazasi 3 jadvaldan iborat:

  • Tez: tez kirish va tahlil qilish uchun eng muhim tranzaktsiyalar ma'lumotlari
  • TX: qolgan barcha tranzaktsiya ma'lumotlari,
  • Bloklash: maxsus blok-ma'lumot.

O'zgaruvchilarni nomlash konventsiyasi veb3py-ga nisbatan bir muncha noaniqliklardan qutulish uchun, masalan, ikkala blokli xeshni va tranzaksiya xeshini "hash" yoki "dan" dan "gacha" ni ustun ustun nomlari sifatida ishlatish kabi noaniqliklardan xalos qilish uchun biroz o'zgartirildi. SQL boshqa ma'noga ega va dasturni buzishi mumkin.

Tranzaksiya qiymatlari, balanslar va boshqa katta raqamlar ma'lumotlar bazasida strings shaklida saqlanishi kerak. Sababi shundaki, SQLite faqat 8 baytgacha saqlangan imzolangan butun sonlarni ishlata oladi, maksimal qiymati 2⁶³-1 = 9223372036854775807. Bu odatda wei-dagi tranzaksiya qiymatlaridan ancha past (masalan, faqat 1 ETH = 10¹⁸ wei).

Mini ma'lumotlar bazangizni yaratish

To'liq kodni GitHub-da topish mumkin. U blockchain ma'lumotlarini yuqori sxemaga muvofiq tashkil qiladi va blockchain.db faylini oldindan belgilangan bloklarning ma'lumotlarini o'z ichiga olgan holda chiqaradi. Uni sinab ko'rish uchun, database.py fayliga o'ting va yozilishi kerak bo'lgan bloklar soniga mos keladigan raqamni tanlang, masalan.

Nbloklar = 10000

Odatiy bo'lib, web3 ob'ektini sizning Infura oxirgi nuqtangizga yo'naltirishingiz kerak. Bundan tashqari, siz IPC Provayderiga o'tishingiz mumkin (masalan, sizning mahalliy tuguningiz), shunchaki chiziqni ajratib oling.

# yoki VM tugunlari orqali ulanish
# veb3 = Veb3 (Web3.IPCProvider ('/ get-geth.ipc /'))

va yo'lni tuzating. Keyin buyruq satrida python database.py-da ishlating. Kod oxirgi yozilgan blokning raqamini lastblock.txt fayliga tashlaydi, agar siz to'xtagan joyni qayta boshlashingiz kerak bo'lsa.

Ma'lumotlar bazasidan qanday foydalanish kerak

Ma'lumotlar bazasiga birinchi yozuvlarni yozganingizdan so'ng, siz u bilan ipython shell orqali bog'lanishni boshlashingiz mumkin. Masalan, "Tez" jadvalning birinchi 5 qatorini chop etish uchun siz quyidagi kodni ishlatishingiz mumkin.

Mahalliy tugun va boshqalar. Infura

Agar siz katta ma'lumotlar bazasini yaratmoqchi bo'lsangiz, geth-ni yuklab olishingiz va tugunni sinxronlashtirishingiz kerak. Sinxronizatsiya uchta asosiy rejimda amalga oshirilishi mumkin:

Agar siz hisob qaydnomasining o'tgan holatlariga ehtiyoj sezmasangiz, tuguningizni tezkor rejimda sinxronlashtirishingiz mumkin [6].

Quyida sizga ushbu kodni ma'lumotlar bazasiga yozish tezligi, mahalliy sinxronlashtirilgan tugun bilan (IPC) va infuradagi (Infura) manzil bilan bog'lanish tezligi ko'rsatilgan. Ko'rib turganingizdek, ushbu kodni mahalliy tugunda ishlatish uchun pul to'lanadi, chunki siz kattalikdagi 2 ta buyurtmaga (aka 100x) tezlikni oshirasiz!

2000000 va 2000400-bloklar orasidagi 10 ta bitimni yozishga ketadigan vaqt. Vaqt logaritmik shkalada (10⁰ = 1, 10¹ = 10 va hokazo;).

Xulosa

Endi siz blockchainda nima bo'lgan va nima sodir bo'lganligi haqida o'zingizning mahalliy ma'lumotlar bazangiz bor, uni o'rganishni boshlashingiz mumkin. Masalan, uning yaratilishidan boshlab bitimlar sonini hisoblashingiz, vaqt funktsiyasi sifatida qancha manzillar yaratilishini ko'rishingiz mumkin - osmon sizning yaratganingiz haqida bilib olish uchun chegaradir. Biz shunchaki ma'lumotlar ilmiy maydonchasi uchun sahnani o'rnatdik. Shunday qilib, davom eting va uni o'rganing yoki potentsial dasturlar uchun keyingi xabarlarni tekshiring.

Agar siz Validatsion Laboratoriyasining blockchain tahlil xizmatlariga qiziqsangiz, analytics@validitylabs.org bilan bog'laning.