Cara berinteraksi dengan blockchain Ethereum dan membuat database dengan Python dan SQL

Lokakarya pengantar tentang blockchain sering dimulai dengan kisah yang mudah dicerna dari jaringan peer-to-peer dan buku besar bank, dan kemudian langsung beralih ke pengkodean kontrak pintar, yang cukup mendadak. Jadi, bayangkan Anda berjalan ke hutan dan menganggap blockchain Ethereum sebagai makhluk aneh yang baru saja Anda pelajari. Hari ini kami akan mengamati makhluk itu, berinteraksi dengannya dan mengumpulkan semua data tentangnya ke penyimpanan terpusat untuk Anda gunakan sendiri.

Menyiapkan pertemuan pertama

Pertama, Anda harus menginstal web3py. Web3py adalah pustaka Python untuk menghubungkan dengan blockchain Ethereum. Yang perlu Anda ketahui sebelumnya adalah bahwa tidak ada sistem administrasi pusat tempat data dapat diunduh. Node-node yang saling berhubungan (“peer”), yang berbagi sumber daya satu sama lain, menyimpan salinan data yang terverifikasi (atau bagiannya). Jaringan mengeksekusi protokol Ethereum, yang mendefinisikan aturan interaksi node satu sama lain dan / atau kontrak pintar melalui jaringan itu.

Jika Anda ingin mengakses informasi tentang transaksi, saldo, blok atau apa pun yang ditulis ke dalam blockchain yang belum Anda ketahui, protokol mengharuskan Anda untuk terhubung ke node. Node secara kontinyu berbagi data baru satu sama lain dan memverifikasi data, jadi dengan cara ini Anda yakin Anda mendapatkan 1) data yang belum dirusak dan 2) yang paling mutakhir.

Ada dua kategori dasar node yang bisa Anda gunakan dalam pendekatan pertama Anda ke makhluk: lokal atau host. Node lokal dapat berjalan di mesin Anda, yang berarti Anda harus mengunduh klien seperti geth terlebih dahulu yang akan menyinkronkan blockchain ke perangkat Anda, menempati penyimpanan dan meluangkan waktu untuk menyelesaikannya. Untuk pertemuan pertama, simpul yang dihosting adalah pilihan yang lebih baik - simpul ini dikendalikan oleh orang lain tetapi Anda dapat dengan mudah terhubung dengannya dan bermain-main dengan blockchain sendiri.

Pergi ke Infura dan buat akun gratis Anda sendiri untuk mengakses simpul yang dihosting tersebut. Setelah selesai, Anda akan melihat daftar jaringan yang bisa Anda hubungkan: mainnet (blockchain Ethereum utama), dan sekelompok testnets, yang pada dasarnya ada untuk menguji kontrak pintar Anda, sehingga Anda dapat membuat kesalahan pada mereka dan memperbaikinya sebelum Anda menggunakan kode mahal ke mainnet.

Saatnya untuk pendekatan pertama. Impor objek Web3 dan buat koneksi HTTP.

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

Dan Anda sudah siap! Sekarang Anda dapat menjelajahi struktur data dengan API web3.

Mengambil info tentang blok tertentu ...

# nomor blok saat ini
>>> web3.eth.blockNumber
5658173
# dapatkan konten dari blok yang terakhir ditambang
>>> web3.eth.getBlock ('terbaru')

Perintah ini mengembalikan struktur data AttributeDict, yang merupakan kamus pasangan nilai kunci yang terlihat seperti ini:

Tidak semua variabel ini akan segera bermanfaat bagi Anda, karena beberapa di antaranya cukup teknis dan artinya hanya akan masuk akal setelah Anda memiliki pemahaman yang lebih dalam tentang bagaimana sebenarnya blockchain bekerja. Anda dapat membaca lebih lanjut tentang hal itu dalam apa yang disebut 'Kertas Kuning' atau melewatkannya untuk sementara waktu dan bekerja dengan yang mudah dimengerti.

Singkatnya, blok berisi header blok, daftar transaksi terverifikasi yang ditulis untuknya dan daftar paman (pengidentifikasi blok penambang yang sedikit terlalu lambat dengan blok mereka untuk membuatnya ke blockchain utama tetapi masih mendapat hadiah dengan Ether untuk upaya komputasi mereka). Di bawah ini Anda dapat membaca apa artinya dari setiap variabel, yang saya bagi menjadi beberapa subkategori.

Umum

Terkait pertambangan

Paman

Teknis

... transaksi dan penerimaannya

Sekarang kita juga dapat mencari satu transaksi dalam satu blok oleh pengidentifikasi unik mereka, yaitu hash transaksi.

Seperti sebelumnya, web3py mengembalikan kamus atribut kepada kami. Tabel di bawah ini merangkum arti dari setiap tombol.

Akhirnya, kita juga dapat melihat tanda terima transaksi:

Tanda terima transaksi berisi beberapa entri berulang dan baru; yang baru dijelaskan di bawah ini.

Untuk referensi, saya memasukkan berbagai sumber daya tambahan selain Yellow Paper untuk menyusun tabel ini [2, 3, 4, 5].

Seperti yang Anda lihat, hanya dengan beberapa perintah sederhana, Anda sudah dapat terhubung ke jaringan dan mendapatkan info dasar tentang transaksi, blokir, atau status dalam format mentah. Ini membuka jendela baru untuk apa yang dapat dilakukan dengan data tersebut!

Sistem manajemen basis data

Ketika berencana untuk menulis data Anda ke database yang tepat, Anda mungkin menyadari bahwa ada banyak solusi untuk sistem manajemen di luar sana untuk penggemar Python, seperti SQLite tanpa server, atau MySQL berbasis server, PostgreSQL, atau Hadoop. Bergantung pada apa yang ingin Anda lakukan, Anda harus menentukan opsi mana yang terbaik untuk proyek Anda. Secara umum, saya menemukan poin-poin ini sangat membantu:

  • Berapa ukuran database yang dimaksudkan (mis. Bisakah itu diproses pada sistem mesin tunggal)?
  • Apakah entri akan sering diedit atau akan tetap diperbaiki?
  • Apakah database seharusnya diakses dan diedit oleh banyak pihak / aplikasi secara bersamaan?

Blockchain Ethereum terus berkembang dari waktu ke waktu, mendekati 1 TB per Juni 2018, yang kecil, karenanya tidak optimal untuk sistem pemrosesan terdistribusi seperti Hadoop. Database blockchain akan ditulis sekali dan kemudian hanya diperluas dengan entri baru, meninggalkan entri lama tidak berubah. Kasing penggunaan yang dimaksudkan dari database ini akan ditulis oleh satu saluran dan diakses hanya-baca oleh saluran lain, jadi kami tidak benar-benar perlu menjalankannya di server. Menyimpan database secara lokal di mesin Anda akan menghasilkan pembacaan cepat, yang diinginkan dan dapat dicapai dengan sistem manajemen tanpa server seperti SQLite. Dan Python memiliki pustaka built-in sqlite3, jadi kami bahkan tidak perlu menginstal paket baru.

Desain database

Langkah selanjutnya adalah merancang basis data Anda. Ingatlah bidang data mana yang paling relevan untuk analisis Anda, dan bertujuan untuk mengoptimalkan pencarian dan penyimpanan. Misalnya, jika Anda tidak berencana menggunakan stateRoot, Anda mungkin ingin melompati atau menyimpannya dalam tabel terpisah. Tabel dengan kolom yang lebih sedikit dapat ditelusuri lebih cepat, dan jika Anda kemudian menyadari bahwa Anda benar-benar menggunakan case-use untuk stateRoot, Anda masih dapat mengaksesnya. Anda mungkin juga ingin memisahkan informasi blokir dari informasi transaksi; jika tidak, blokir properti seperti stempel waktu akan diulang N kali untuk semua transaksi dalam blok tersebut, menghabiskan banyak ruang. Mencocokkan transaksi dengan properti bloknya akan mudah dengan operasi GABUNG di kemudian hari.

Basis data yang saya desain terdiri dari 3 tabel:

  • Cepat: info transaksi paling relevan untuk akses cepat & analisis,
  • TX: semua info transaksi sisanya,
  • Blokir: info blok-spesifik.

Konvensi penamaan variabel telah sedikit diubah sehubungan dengan web3py asli untuk menghilangkan ambiguitas, seperti memanggil kedua blok hash dan transaksi hash "hash", atau menggunakan "dari" / "ke" sebagai nama kolom, yang pada SQL memiliki arti berbeda dan akan crash program.

Nilai transaksi, saldo, dan angka besar lainnya harus disimpan dalam database sebagai string. Alasannya adalah bahwa SQLite hanya dapat menangani bilangan bulat bertanda yang disimpan hingga 8 byte, dengan nilai maksimum 2⁶³-1 = 9223372036854775807. Ini sering jauh lebih rendah daripada nilai transaksi di wei (mis. Hanya 1 ETH = 10¹⁸ wei).

Membangun basis data mini Anda

Kode lengkap dapat ditemukan di GitHub. Ini akan mengatur info blockchain sesuai dengan skema atas dan menampilkan file blockchain.db yang berisi data sejumlah blok yang telah ditentukan sebelumnya. Untuk mengujinya, buka file database.py dan pilih angka yang masuk akal untuk jumlah blok yang akan ditulis, mis.

Nblock = 10.000

Secara default, Anda harus mengarahkan objek web3 ke titik akhir Infura Anda. Anda juga dapat beralih ke Penyedia IPC jika Anda memilikinya (mis. Simpul lokal Anda), cukup batalkan komentar pada baris

# atau koneksi via simpul pada VM
# web3 = Web3 (Web3.IPCProvider ('/ path-to-geth.ipc /'))

dan perbaiki jalurnya. Kemudian jalankan saja di baris perintah Anda python database.py. Kode akan membuang jumlah blok yang ditulis terakhir ke file lastblock.txt, jika Anda perlu me-restart di mana Anda tinggalkan.

Cara menggunakan database

Setelah Anda menulis entri pertama ke basis data, Anda dapat mulai berkomunikasi dengannya melalui shell ipython. Misalnya, untuk mencetak 5 baris pertama dari tabel "Cepat", Anda dapat menjalankan kode di bawah ini.

Node lokal vs. Infura

Jika Anda ingin membangun database besar, Anda harus mengunduh geth dan menyelaraskan sebuah simpul. Sinkronisasi dapat dilakukan dalam 3 mode dasar:

Jika Anda tidak membutuhkan status akun sebelumnya, Anda dapat menyinkronkan simpul Anda dalam mode cepat [6].

Di bawah ini adalah plot yang menunjukkan kecepatan kode ini menulis ke basis data, berkomunikasi dengan simpul yang sepenuhnya disinkronkan secara lokal (IPC) vs. alamat di Infura (Infura). Seperti yang dapat Anda lihat, membayar untuk menjalankan kode ini pada simpul lokal, karena Anda mendapatkan peningkatan kecepatan hampir 2 perintah besarnya (alias 100x)!

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

Ringkasan

Sekarang setelah Anda memiliki basis data lokal sendiri tentang apa yang terjadi dan terjadi di blockchain, Anda dapat mulai menjelajahinya. Misalnya, Anda dapat menghitung jumlah transaksi sejak awal, lihat berapa banyak alamat yang dihasilkan sebagai fungsi waktu - langit adalah batas untuk apa yang dapat Anda pelajari tentang makhluk Anda. Kami baru saja mengatur panggung untuk taman bermain sains data Anda. Jadi, lanjutkan dan jelajahi, atau periksa posting berikutnya untuk aplikasi potensial.

Hubungi analytics@validitylabs.org jika Anda tertarik dengan layanan analitik blockchain dari Validity Labs.