Bagaimana untuk berinteraksi dengan blockchain Ethereum dan membuat pangkalan data dengan Python dan SQL

Bengkel pengenalan tentang blockchain sering bermula dengan kisah yang mudah dicerna dari rangkaian peer-to-peer dan pengarah bank, dan kemudian melompat terus ke coding kontrak pintar, yang cukup mendadak. Oleh itu, bayangkan diri anda berjalan ke dalam hutan dan fikirkan Ethereum blockchain sebagai makhluk pelik yang anda akan belajar. Hari ini kita akan melihat makhluk itu, berinteraksi dengannya dan mengumpulkan semua data mengenainya ke dalam simpanan terpusat untuk kegunaan anda sendiri.

Menyediakan untuk pertemuan pertama

Pertama, anda perlu memasang web3py. Web3py adalah perpustakaan Python untuk menyambungkan dengan blok Ethereum. Apa yang anda perlu ketahui sebelum ini ialah tidak ada sistem pentadbiran pusat di mana data boleh dimuat turun dari. Nod yang saling berkaitan ("rekan"), yang berkongsi sumber antara satu sama lain, menyimpan salinan data yang telah disahkan (atau bahagiannya). Rangkaian ini melaksanakan protokol Ethereum, yang mentakrifkan peraturan-peraturan interaksi nod antara satu sama lain dan / atau kontrak cerdas melalui rangkaian itu.

Sekiranya anda ingin mengakses maklumat mengenai urus niaga, baki, blok atau apa-apa lagi yang ditulis ke dalam blockchain yang anda belum tahu, protokol ini memerlukan anda untuk menyambung ke nod. Node terus berkongsi data baru dengan satu sama lain dan mengesahkan data, jadi dengan cara ini anda pasti anda mendapat 1) data yang belum diganggu dan 2) yang paling terkini.

Terdapat dua kategori asas node yang anda boleh gunakan dalam pendekatan pertama anda kepada makhluk: tempatan atau dihoskan. Node setempat boleh berjalan di mesin anda, yang bermakna anda perlu memuat turun klien seperti geth yang akan menyelaraskan blokchain ke peranti anda, menduduki storan dan mengambil masa untuk diselesaikan. Untuk pertemuan pertama, nod yang dihoskan adalah pilihan yang lebih baik - ia dikawal oleh orang lain tetapi anda boleh dengan mudah menyambung dan bermain-main dengan blockchain anda sendiri.

Pergi ke Infura dan buat akaun percuma anda sendiri untuk mengakses nod yang dihoskan. Apabila anda selesai, anda akan melihat senarai rangkaian yang boleh anda sambungkan ke: mainnet (blok utama Ethereum utama), dan sekumpulan testimeter, yang ada pada dasarnya untuk menguji kontrak pintar anda, supaya anda boleh membuat kesilapan pada mereka dan membetulkannya sebelum anda menggunakan kod mahal kepada mainnet.

Masa untuk pendekatan pertama. Import objek Web3 dan buat sambungan HTTP.

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

Dan anda sudah bersedia! Sekarang anda boleh meneroka struktur data dengan API web3.

Mengambil maklumat tentang blok tertentu ...

# nombor blok semasa
>>> web3.eth.blockNumber
5658173
#get kandungan blok yang ditambang paling baru
>>> web3.eth.getBlock ('terkini')

Perintah ini mengembalikan struktur data AttributeDict, yang merupakan kamus pasangan kunci utama yang kelihatan seperti ini:

Tidak semua pemboleh ubah ini akan berguna kepada anda dengan segera, kerana sesetengahnya agak teknikal dan maknanya hanya akan masuk akal apabila anda mempunyai pemahaman yang lebih mendalam tentang bagaimana sebenarnya blockchain berfungsi. Anda boleh membaca lebih lanjut mengenai mereka dalam apa yang dipanggil 'Kertas Kuning' atau melangkau mereka untuk masa ini dan bekerja dengan yang mudah difahami.

Pendek kata, blok mengandungi header header, senarai transaksi yang diverifikasi yang ditulis dan senarai paman (pengenal blok pelombong yang sedikit terlalu perlahan dengan blok mereka untuk membuatnya menjadi blok utama tetapi masih mendapat ganjaran dengan Ether untuk usaha pengiraan mereka). Di bawah ini anda boleh membaca apa makna dari setiap pembolehubah, yang saya terbahagi kepada subkategori.

Ketua

Berkaitan Perlombongan

Uncles

Teknikal

... urus niaga dan penerimaan mereka

Sekarang kita juga boleh mencari transaksi tunggal dalam satu blok oleh pengenal uniknya, iaitu had transaksi.

Seperti yang sebelumnya, web3py mengembalikan kamus kamus sifat. Jadual di bawah meringkaskan apa yang penting bagi setiap kunci.

Akhir sekali, kami juga boleh melihat resit transaksi:

Resit transaksi mengandungi beberapa penyertaan yang berulang dan baru; yang baru dijelaskan di bawah.

Untuk rujukan, saya memasukkan pelbagai sumber tambahan selain Kertas Kuning untuk menyusun jadual ini [2, 3, 4, 5].

Seperti yang anda dapat lihat, dengan hanya beberapa arahan mudah anda sudah dapat menyambung ke rangkaian dan mendapatkan maklumat asas tentang transaksi, blok, atau negeri dalam format mentah. Ini membuka tetingkap baru untuk apa yang boleh dilakukan dengan data sedemikian!

Sistem Pengurusan Pengkalan data

Apabila merancang untuk menulis data anda ke pangkalan data yang betul, anda mungkin menyedari bahawa terdapat banyak penyelesaian untuk sistem pengurusan di luar sana untuk peminat Python, seperti SQLite tanpa pelayan, atau MySQL, PostgreSQL, atau Hadoop berasaskan pelayan. Bergantung pada apa yang anda mahu lakukan, anda perlu menentukan pilihan mana yang terbaik untuk projek anda. Secara umum, saya dapati perkara ini dapat membantu:

  • Apakah saiz pangkalan data yang dimaksudkan (iaitu ia boleh diproses pada sistem mesin tunggal)?
  • Adakah penyertaan akan sering diedit atau adakah mereka tetap tetap?
  • Adakah pangkalan data sepatutnya diakses dan diedit oleh pelbagai pihak / apl secara serentak?

Roket Ethereum semakin berkembang dari masa ke masa, mendekati 1 TB pada Jun 2018, yang kecil, oleh itu tidak optimum untuk sistem pemprosesan yang diedarkan seperti Hadoop. Pangkalan data blockchain akan ditulis sekali dan kemudian hanya diperluas dengan entri baru, meninggalkan entri lama tidak berubah. Kes penggunaan yang digunakan untuk pangkalan data ini adalah ditulis oleh satu saluran dan diakses hanya oleh saluran lain, jadi kita tidak perlu menjalankannya pada pelayan. Menyimpan pangkalan data secara tempatan pada mesin anda akan menghasilkan pembacaan cepat, yang wajar dan boleh dicapai dengan sistem pengurusan tanpa server seperti SQLite. Dan Python mempunyai perpustakaan terbina dalam sqlite3, oleh itu kita tidak perlu memasang pakej baru.

Reka bentuk pangkalan data

Langkah seterusnya ialah mereka bentuk pangkalan data anda. Perlu diingat bidang data mana yang paling relevan untuk analisa anda, dan bertujuan untuk mengoptimumkan carian dan penyimpanan. Sebagai contoh, jika anda tidak merancang untuk menggunakan stateRoot, anda mungkin mahu melangkauinya sepenuhnya atau menyimpannya dalam jadual berasingan. Jadual dengan lajur yang lebih sedikit boleh dicari dengan lebih cepat, dan jika anda kemudian menyedari bahawa anda benar-benar mempunyai kes penggunaan untuk stateRoot, anda masih dapat mengaksesnya. Anda juga mungkin mahu memisahkan maklumat blok dari maklumat transaksi; jika anda tidak, menyekat ciri seperti cap waktu akan diulang N kali untuk semua urus niaga di blok, membuang banyak ruang. Memadankan transaksi dengan sifat bloknya akan mudah dengan operasi JOIN kemudian.

Pangkalan data yang saya buat terdiri daripada 3 jadual:

  • Cepat: maklumat urus niaga yang paling relevan untuk akses pantas & analisis,
  • TX: semua maklumat urus niaga tertinggal,
  • Blok: maklumat khusus blok.

Konvensyen penamaan pembolehubah telah berubah sedikit demi sedikit kepada web3py asal untuk menghilangkan kekaburan, seperti memanggil kedua-dua hash blok dan hash transaksi "hash", atau menggunakan "dari" / "hingga" sebagai nama lajur, yang SQL mempunyai makna yang berbeza dan akan merosakkan program.

Nilai urus niaga, baki dan bilangan besar lain perlu disimpan dalam pangkalan data sebagai rentetan. Alasannya ialah SQLite boleh mengendalikan hanya bilangan bulat yang ditandatangani sehingga 8 bait, dengan nilai maksimum 2 ³ ³-1 = 9223372036854775807. Ini selalunya lebih rendah daripada nilai urusniaga dalam wei (mis. Hanya 1 ETH = 10¹8 wei).

Membina pangkalan data mini anda

Kod penuh boleh didapati di GitHub. Ia akan menganjurkan info blockchain mengikut skema atas dan mengeluarkan fail blockchain.db yang mengandungi data bilangan blok terdahulu. Untuk mengujinya, pergi ke fail database.py dan pilih nombor yang munasabah untuk bilangan blok yang hendak ditulis, cth.

Nblocks = 10000

Secara lalai, anda harus menunjukkan objek web3 ke titik akhir Infura anda. Anda juga boleh bertukar ke Penyedia IPC jika anda mempunyai satu (iaitu simpul lokal anda)

# atau sambungan melalui nod pada VM
# web3 = Web3 (Web3.IPCProvider ('/ path-to-geth.ipc /'))

dan menetapkan jalan. Kemudian hanya jalankan pada python command line.py. Kod ini akan membuang bilangan blok bertulis terakhir ke dalam lastblock.txt fail, sekiranya anda perlu memulakan semula tempat yang anda tinggalkan.

Bagaimana untuk menggunakan pangkalan data

Sebaik sahaja anda telah menulis entri pertama ke pangkalan data, anda boleh mula berkomunikasi dengannya melalui shell ipython. Sebagai contoh, untuk mencetak 5 baris pertama jadual "Pantas", anda boleh menjalankan kod di bawah.

Simpul tempatan berbanding Infura

Jika anda ingin membina pangkalan data yang besar, anda perlu memuat turun dan menyegerakkan nod. Penyegerakan boleh dilakukan dalam 3 mod asas:

Jika anda tidak memerlukan keadaan akaun lalu, anda boleh menyegerakkan nod anda dalam mod pantas [6].

Berikut adalah plot yang memperlihatkan kepada anda kelajuan di mana kod ini menulis kepada pangkalan data, berkomunikasi dengan nod yang disegerakkan secara setempat (IPC) berbanding alamat di Infura (Infura). Seperti yang anda lihat, ia membayar untuk menjalankan kod ini pada nod tempatan, kerana anda mendapat peningkatan kelajuan hampir 2 pesanan magnitud (alias 100x)!

Masa yang diperlukan untuk menulis 10 blok transaksi di antara blok 2000000 dan 2000400. Masa adalah pada skala logaritma (10⁰ = 1, 10¹ = 10 dan seterusnya;).

Ringkasan

Sekarang anda mempunyai pangkalan data tempatan anda sendiri tentang apa yang berlaku dan berlaku pada blockchain, anda boleh mula menjelajahnya. Sebagai contoh, anda boleh mengira bilangan urus niaga sejak genesisnya, lihat berapa banyak alamat yang dihasilkan sebagai fungsi masa - langit adalah batas untuk apa yang anda boleh belajar tentang makhluk anda. Kami hanya menetapkan pentas untuk taman permainan sains data anda. Jadi teruskan dan jelajahi, atau semak siaran seterusnya untuk aplikasi yang berpotensi.

Hubungi analytics@validitylabs.org jika anda berminat untuk menghalang perkhidmatan analitikal Labs Validity.