Πώς να αλληλεπιδράσετε με το block block του Ethereum και να δημιουργήσετε μια βάση δεδομένων με Python και SQL

Τα εισαγωγικά εργαστήρια σχετικά με το blockchain αρχίζουν συχνά με την εύκολη στην ιστορία ιστορία των δικτύων peer-to-peer και των τραπεζικών καταλόγων, και στη συνέχεια μεταπηδούν κατευθείαν σε κωδικοποίηση έξυπνων συμβάσεων, η οποία είναι αρκετά απότομη. Έτσι λοιπόν, φανταστείτε τον εαυτό σας να περπατάτε μέσα σε μια ζούγκλα και να σκεφτείτε την μπλοκ αλυσίδα Ethereum ως ένα περίεργο πλάσμα που πρόκειται ακριβώς να σπουδάσετε. Σήμερα θα παρατηρήσουμε το πλάσμα, θα αλληλεπιδράσουμε με αυτό και θα συλλέξουμε όλα τα δεδομένα γι 'αυτό σε μια κεντρική αποθήκευση για δική σας χρήση.

Ρύθμιση για την πρώτη συνάντηση

Πρώτον, θα πρέπει να εγκαταστήσετε το web3py. Το Web3py είναι μια βιβλιοθήκη Python για σύνδεση με το block block του Ethereum. Αυτό που πρέπει να γνωρίζετε εκ των προτέρων είναι ότι δεν υπάρχει κεντρικό διοικητικό σύστημα από το οποίο να μπορούν να μεταφορτωθούν τα δεδομένα. Οι διασυνδεδεμένοι κόμβοι ("peers"), οι οποίοι μοιράζονται πόρους μεταξύ τους, αποθηκεύουν ένα επαληθευμένο αντίγραφο των δεδομένων (ή του μέρους του). Το δίκτυο εκτελεί το πρωτόκολλο Ethereum, το οποίο καθορίζει τους κανόνες αλληλεπίδρασης κόμβων μεταξύ τους ή / και έξυπνων συμβάσεων μέσω αυτού του δικτύου.

Εάν θέλετε να αποκτήσετε πρόσβαση σε πληροφορίες σχετικά με συναλλαγές, υπόλοιπα, μπλοκ ή οτιδήποτε άλλο είναι γραμμένο στο blockchain για το οποίο δεν γνωρίζετε ακόμα, το πρωτόκολλο απαιτεί τη σύνδεση με τους κόμβους. Οι κόμβοι μοιράζονται συνεχώς νέα δεδομένα μεταξύ τους και επαληθεύουν τα δεδομένα, οπότε είστε σίγουροι ότι θα λάβετε 1) δεδομένα που δεν έχουν αλλοιωθεί και 2) τα οποία είναι πιο ενημερωμένα.

Υπάρχουν δύο βασικές κατηγορίες κόμβων που θα μπορούσατε να χρησιμοποιήσετε στην πρώτη σας προσέγγιση στο πλάσμα: τοπικό ή φιλοξενούμενο. Ένας τοπικός κόμβος μπορεί να τρέξει στο μηχάνημά σας, πράγμα που σημαίνει ότι πρέπει πρώτα να κατεβάσετε έναν πελάτη σαν geth που θα συγχρονίσει το blockchain στη συσκευή σας, καταλαμβάνοντας την αποθήκευση και παίρνοντας χρόνο για να ολοκληρωθεί. Για την πρώτη συνάντηση, ένας φιλοξενούμενος κόμβος είναι μια καλύτερη επιλογή - ελέγχεται από κάποιον άλλο, αλλά μπορείτε εύκολα να συνδεθείτε με αυτόν και να παίξετε με το blockchain μόνος σας.

Πηγαίνετε στο Infura και δημιουργήστε το δικό σας δωρεάν λογαριασμό για να έχετε πρόσβαση σε έναν τέτοιο φιλοξενούμενο κόμβο. Όταν τελειώσετε, θα δείτε μια λίστα με δίκτυα στα οποία θα μπορούσατε να συνδεθείτε: το mainnet (το κύριο μπλοκ αλυσίδας Ethereum) και μια δέσμη δοκιμαστικών πινάκων, τα οποία βρίσκονται εκεί για να δοκιμάσετε βασικά τα έξυπνα συμβόλαιά σας, ώστε να μπορείτε να κάνετε λάθη πάνω τους και να τα διορθώσετε προτού διαθέσετε δαπανηρό κώδικα στο mainnet.

Ώρα για την πρώτη προσέγγιση. Εισαγάγετε το αντικείμενο Web3 και δημιουργήστε μια σύνδεση HTTP.

από web3 εισαγωγής web3
web3 = Web3 (Web3.HTTPProvider ("https://mainnet.infura.io/your-own-personal-number"))

Και είστε έτοιμοι! Τώρα μπορείτε να εξερευνήσετε τη δομή δεδομένων με το API web3.

Ανάκτηση πληροφοριών σχετικά με συγκεκριμένα μπλοκ ...

#current number block
>>> web3.eth.blockNumber
5658173
#get το περιεχόμενο του πιο πρόσφατα εξόρυξης μπλοκ
>>> web3.eth.getBlock ('τελευταία')

Αυτή η εντολή επιστρέφει τη δομή δεδομένων AttributeDict, η οποία είναι ένα λεξικό ζευγών κλειδιών-τιμών που μοιάζει με αυτό:

Δεν είναι όλες αυτές οι μεταβλητές αμέσως χρήσιμες για εσάς, καθώς ορισμένοι είναι αρκετά τεχνικοί και το νόημά τους θα έχει νόημα μόνο όταν έχετε βαθύτερη κατανόηση του τρόπου με τον οποίο λειτουργεί πραγματικά το blockchain. Μπορείτε να διαβάσετε περισσότερα για αυτά στο λεγόμενο «Κίτρινο Βιβλίο» ή να τα παρακάμψετε προς το παρόν και να εργαστείτε με τα εύκολα κατανοητά.

Με λίγα λόγια, ένα μπλοκ περιέχει την κεφαλίδα του μπλοκ, μια λίστα με τις επαληθευμένες συναλλαγές που γράφτηκαν σε αυτόν και μια λίστα με τους θείους (αναγνωριστές μπλοκ των ανθρακωρύχων που ήταν ελαφρώς αργά με τα μπλοκ τους για να φτάσουν στο κύριο blockchain, αλλά ακόμα ανταμείφθηκαν με Ether για υπολογιστική τους προσπάθεια). Παρακάτω μπορείτε να διαβάσετε ποια είναι η σημασία κάθε μεταβλητής, η οποία διαιρέθη σε υποκατηγορίες.

Γενικός

Ορυχεία

Ο θείος

Τεχνικός

... συναλλαγές και τα έσοδά τους

Τώρα μπορούμε επίσης να αναζητήσουμε μεμονωμένες συναλλαγές σε ένα μπλοκ από τους μοναδικούς τους αναγνωριστικούς κωδικούς, δηλαδή τις χρεώσεις των συναλλαγών.

Όπως και προηγουμένως, το web3py μας επιστρέφει ένα λεξικό χαρακτηριστικών. Ο παρακάτω πίνακας συνοψίζει τι αντιπροσωπεύει κάθε κλειδί.

Τέλος, μπορούμε επίσης να εξετάσουμε τα έσοδα από συναλλαγές:

Μια απόδειξη συναλλαγής περιέχει μερικές επαναλαμβανόμενες και νέες καταχωρήσεις. τα νέα εξηγούνται παρακάτω.

Για την αναφορά, περιλάμβανα διάφορους πρόσθετους πόρους εκτός από την Κίτρινη Βίβλο για την κατάρτιση αυτών των πινάκων [2, 3, 4, 5].

Όπως βλέπετε, με μερικές απλές εντολές μπορείτε ήδη να συνδεθείτε στο δίκτυο και να λάβετε βασικές πληροφορίες σχετικά με τις συναλλαγές, τα μπλοκ ή τις καταστάσεις στην ακατέργαστη μορφή. Αυτό ανοίγει ένα νέο παράθυρο σε αυτό που μπορεί να γίνει με τέτοια δεδομένα!

Σύστημα διαχείρισης βάσης δεδομένων

Όταν σχεδιάζετε να γράψετε τα δεδομένα σας σε μια σωστή βάση δεδομένων, τότε πιθανόν να συνειδητοποιήσετε ότι υπάρχουν πολλές λύσεις για συστήματα διαχείρισης έξω εκεί για τους λάτρεις της Python, όπως serverless SQLite ή MySQL, PostgreSQL ή Hadoop που βασίζονται σε διακομιστές. Ανάλογα με το τι σκοπεύετε να κάνετε, θα πρέπει να καθορίσετε ποια επιλογή είναι η καλύτερη για το σχέδιό σας. Σε γενικές γραμμές, βρήκα αυτά τα σημεία για να είναι χρήσιμα:

  • Ποιο είναι το προβλεπόμενο μέγεθος της βάσης δεδομένων (δηλαδή μπορεί να υποβληθεί σε επεξεργασία σε ένα σύστημα μηχανής);
  • Οι καταχωρήσεις πρόκειται συχνά να επεξεργαστούν ή θα παραμείνουν σταθερές;
  • Υποστηρίζεται η πρόσβαση στη βάση δεδομένων και η επεξεργασία από πολλαπλά μέρη / εφαρμογές ταυτόχρονα;

Το block block του Ethereum αυξάνεται σταθερά με την πάροδο του χρόνου, πλησιάζοντας σχεδόν 1 TB από τον Ιούνιο του 2018, το οποίο είναι μικρό, επομένως δεν είναι το βέλτιστο για ένα κατανεμημένο σύστημα επεξεργασίας όπως το Hadoop. Η βάση δεδομένων blockchain θα γραφτεί μία φορά και στη συνέχεια θα επεκταθεί μόνο με νέες καταχωρήσεις, αφήνοντας παλιές καταχωρήσεις αμετάβλητες. Η συγκεκριμένη περίπτωση χρήσης αυτής της βάσης δεδομένων πρέπει να γραφτεί από ένα κανάλι και να έχει πρόσβαση μόνο σε ανάγνωση από τα υπόλοιπα κανάλια, οπότε δεν χρειάζεται να την τρέχουμε σε ένα διακομιστή. Η διατήρηση της βάσης δεδομένων τοπικά στο μηχάνημά σας θα έχει ως αποτέλεσμα μια γρήγορη ανάγνωση, η οποία είναι επιθυμητή και εφικτή με ένα σύστημα διαχείρισης χωρίς διακομιστές όπως το SQLite. Και η Python διαθέτει μια ενσωματωμένη βιβλιοθήκη sqlite3, οπότε δεν χρειάζεται καν να εγκαταστήσουμε νέα πακέτα.

Σχεδιασμός βάσης δεδομένων

Το επόμενο βήμα είναι ο σχεδιασμός της βάσης δεδομένων σας. Λάβετε υπόψη σας ποια πεδία δεδομένων είναι τα πιο κατάλληλα για την ανάλυσή σας και επιδιώξτε τη βελτιστοποίηση αναζήτησης και αποθήκευσης. Για παράδειγμα, εάν δεν σκοπεύετε να χρησιμοποιήσετε το stateRoot, ίσως θέλετε να το παραλείψετε εντελώς ή να το κρατήσετε σε ξεχωριστό πίνακα. Ένας πίνακας με λιγότερες στήλες μπορεί να αναζητηθεί γρηγορότερα και αν αργότερα συνειδητοποιήσετε ότι έχετε πράγματι μια περίπτωση χρήσης για το stateRoot, θα έχετε ακόμα τη δυνατότητα πρόσβασης. Μπορεί επίσης να θέλετε να διαχωρίσετε τις πληροφορίες μπλοκ από τις πληροφορίες της συναλλαγής. αν δεν το κάνετε, οι ιδιότητες μπλοκ όπως το timestamp θα επαναληφθούν N φορές για όλες τις συναλλαγές στο μπλοκ, χάνοντας πολύ χώρο. Η αντιστοίχιση μιας συναλλαγής με τις ιδιότητες του μπλοκ θα είναι εύκολη με τη λειτουργία JOIN αργότερα.

Η βάση δεδομένων που σχεδίασα αποτελείται από 3 πίνακες:

  • Γρήγορη: οι πιο σχετικές πληροφορίες συναλλαγών για γρήγορη πρόσβαση και ανάλυση,
  • TX: όλες οι υπόλοιπες πληροφορίες συναλλαγής,
  • Αποκλεισμός: πληροφορίες συγκεκριμένου μπλοκ.

Η σύμβαση ονοματοποίησης των μεταβλητών έχει τροποποιηθεί ελαφρώς σε σχέση με την αρχική web3py για να απαλλαγούμε από αμφισημίες, όπως η κλήση τόσο του hash μπλοκ όσο και της συναλλαγής hash του "hash", ή χρησιμοποιώντας "από" / "to" ως ονόματα στηλών, Η SQL έχει διαφορετική σημασία και θα συντρίψει το πρόγραμμα.

Οι τιμές συναλλαγών, τα υπόλοιπα και άλλοι μεγάλοι αριθμοί πρέπει να αποθηκεύονται στη βάση δεδομένων ως συμβολοσειρές. Ο λόγος είναι ότι το SQLite μπορεί να χειριστεί μόνο υπογεγραμμένους ακέραιους αριθμούς αποθηκευμένους σε έως και 8 byte, με μέγιστη τιμή 2, 3-1 = 9223372036854775807. Αυτό συχνά είναι πολύ χαμηλότερο από τις τιμές συναλλαγής στο wei (π.χ., μόνο 1 ETH = 1018 wei).

Δημιουργήστε τη μίνι βάση δεδομένων σας

Ο πλήρης κώδικας μπορεί να βρεθεί στο GitHub. Θα οργανώσει τις πληροφορίες blockchain σύμφωνα με το ανώτερο σχήμα και θα εξάγει ένα αρχείο blockchain.db που περιέχει δεδομένα ενός προκαθορισμένου αριθμού μπλοκ. Για να το δοκιμάσετε, μεταβείτε στο αρχείο database.py και επιλέξτε έναν λογικό αριθμό για τον αριθμό των μπλοκ που θα γραφτούν, π.χ.

Nblocks = 10000

Από προεπιλογή, θα πρέπει να δείξετε το αντικείμενο web3 στο τελικό σημείο Infura. Μπορείτε επίσης να μεταβείτε στον πάροχο IPC εάν έχετε έναν (δηλ. Τον τοπικό σας κόμβο), απλά αποσυνδέστε τη γραμμή

# ή σύνδεση μέσω κόμβου στο VM
# web3 = Web3 (Web3.IPCProvider ('/ path-to-geth.ipc /'))

και να διορθώσετε τη διαδρομή. Στη συνέχεια εκτελέστε απλά στη γραμμή εντολών python database.py. Ο κώδικας θα σβήσει τον αριθμό του τελευταίου γραπτού μπλοκ στο αρχείο lastblock.txt, σε περίπτωση που χρειαστεί να επανεκκινήσετε από εκεί που σταμάτησε.

Πώς να χρησιμοποιήσετε τη βάση δεδομένων

Μόλις έχετε γράψει τις πρώτες καταχωρήσεις στη βάση δεδομένων, μπορείτε να ξεκινήσετε την επικοινωνία μαζί του μέσω του κελύφους ipython. Για παράδειγμα, για να εκτυπώσετε τις πρώτες 5 σειρές του πίνακα "Γρήγορη", μπορείτε να εκτελέσετε τον παρακάτω κώδικα.

Τοπικός κόμβος εναντίον Infura

Αν θέλετε να δημιουργήσετε μια μεγάλη βάση δεδομένων, θα πρέπει να κάνετε λήψη του geth και να συγχρονίσετε έναν κόμβο. Ο συγχρονισμός μπορεί να γίνει σε 3 βασικές λειτουργίες:

Εάν δεν χρειάζεστε προηγούμενες καταστάσεις λογαριασμού, μπορείτε να συγχρονίσετε τον κόμβο σας σε γρήγορη λειτουργία [6].

Παρακάτω υπάρχει μια γραφική παράσταση που σας δείχνει την ταχύτητα με την οποία γράφεται αυτός ο κώδικας σε μια βάση δεδομένων, επικοινωνώντας με τον πλήρως συγχρονισμένο κόμβο τοπικά (IPC) έναντι μιας διεύθυνσης στο Infura. Όπως μπορείτε να δείτε, πληρώνει για να τρέξει αυτόν τον κώδικα σε έναν τοπικό κόμβο, καθώς παίρνετε την ώθηση ταχύτητας σχεδόν 2 τάξεων μεγέθους (περίπου 100x)!

Ο χρόνος που απαιτείται για την εγγραφή 10 μπλοκ συναλλαγών μεταξύ των μπλοκ 2000000 και 2000400. Ο χρόνος είναι στη λογαριθμική κλίμακα (10⁰ = 1, 10¹ = 10 κ.ο.κ.).

Περίληψη

Τώρα που έχετε τη δική σας τοπική βάση δεδομένων για το τι συνέβη και συμβαίνει σε blockchain, μπορείτε να αρχίσετε να το εξερευνείτε. Για παράδειγμα, μπορείτε να υπολογίζετε τον αριθμό των συναλλαγών από τη γέννησή του, να δείτε πόσες διευθύνσεις παράγονται ως συνάρτηση του χρόνου - ο ουρανός είναι το όριο για αυτό που μπορείτε να μάθετε για το πλάσμα σας. Θέσαμε ακριβώς τη σκηνή για την παιδική χαρά σας. Συνεχίστε να το εξερευνείτε ή ελέγξτε τις επόμενες θέσεις για πιθανές εφαρμογές.

Επικοινωνήστε με την [email protected] εάν ενδιαφέρεστε για υπηρεσίες αναλυτικής ανάλυσης blockchain Labs Validity Labs.