Αν κοιτάξουμε τις τάσεις των προηγούμενων ετών, έχουμε ακούσει για το blockchain όλη την ώρα, αλλά όχι πολλά για τις ιδιαιτερότητες.
Όλοι γνωρίζουμε ότι τα κρυπτονομίσματα όπως το Bitcoin, το Ethereum, το Dogecoin, το Matic και άλλα βασίζονται στην τεχνολογία blockchain. Το Blockchain ηγήθηκε των σημαντικών γεγονότων που έφεραν επανάσταση σε πολλούς κλάδους το 2021 και άνοιξαν το δρόμο για νέα επιτεύγματα.
Το Blockchain είναι ένα μέσο αποθήκευσης δεδομένων με τρόπο που είναι δύσκολο ή αδύνατο να επεξεργαστεί, να χακάρει ή να εξαπατήσει. Είναι ένα ψηφιακό καθολικό συναλλαγών που αντιγράφονται και κατανέμονται σε ολόκληρο το δίκτυο συστημάτων υπολογιστών του blockchain.
Είναι η πρωτοποριακή τεχνολογία βάσης δεδομένων που τροφοδοτεί σχεδόν όλα τα κρυπτονομίσματα. Το Blockchain καθιστά απίστευτα δύσκολο το χακάρισμα ή την εξαπάτηση του συστήματος διαδίδοντας πανομοιότυπα αντίγραφα μιας βάσης δεδομένων σε ένα ολόκληρο δίκτυο.
Ενώ το Bitcoin είναι πλέον η πιο σημαντική χρήση για το blockchain, η τεχνολογία μπορεί να εξυπηρετήσει μια πολύ μεγάλη ποικιλία εφαρμογών.
Τα κρυπτονομίσματα και τα blockchains είναι όλο και πιο δημοφιλή τα τελευταία χρόνια και αυτή η τάση αναμένεται να συνεχιστεί.
Θα φτιάξουμε ένα απλό blockchain με JavaScript σε αυτό το σεμινάριο. Θα σας παρέχει μια βασική κατανόηση του πώς λειτουργεί ένα blockchain.
Ας το ονομάσουμε MelodyCoin και ας μπούμε αμέσως στη δράση!
Δημιουργία μπλοκ
Αρχικά, θα δημιουργήσουμε ένα νέο αρχείο JavaScript στο οποίο θα τοποθετήσουμε όλο τον κώδικά μας.
Ας το ονομάσουμε main.js και ας ξεκινήσουμε με μια περιγραφή του πώς πρέπει να φαίνονται ένα blockchain και τα blocks.
Δημιουργήστε μια κλάση Block και δώστε της μια συνάρτηση Object() { [native code] } για αρχή.
Πρέπει να δώσετε μια ημερομηνία και τον κατακερματισμό του προηγούμενου μπλοκ κατά τη δημιουργία ενός νέου μπλοκ:
Ακολουθούν οι ορισμοί για κάθε ιδιοκτησία:
- Η χρονική σήμανση υποδεικνύει πότε έγινε το μπλοκ. Μπορείτε να χρησιμοποιήσετε όποια μορφή επιλέγετε (σε αυτήν την περίπτωση, μια χρονική σήμανση UNIX).
- Οποιαδήποτε μορφή δεδομένων θέλετε να συνδέσετε σε αυτό το μπλοκ μπορεί να συμπεριληφθεί στην παράμετρο δεδομένων. Εάν θέλετε να δημιουργήσετε ένα κρυπτονόμισμα, μπορείτε να διατηρήσετε εδώ δεδομένα συναλλαγών, όπως ο αποστολέας/παραλήπτης και το χρηματικό ποσό που μετακινήθηκε.
- Το previousHash είναι μια συμβολοσειρά που περιέχει τον κατακερματισμό του προηγούμενου μπλοκ. Αυτό είναι που θα δημιουργήσει την αλυσίδα των μπλοκ, η οποία θα είναι κρίσιμη για την παροχή της ακεραιότητας του blockchain μας αργότερα.
Δημιουργία Hashes
Κάθε μπλοκ συνδέεται με το προηγούμενο μπλοκ (άρα την ιδιότητα previousHash). Δηλαδή, κάθε μπλοκ απαιτεί έναν κατακερματισμό. Ο κατακερματισμός είναι παρόμοιος με το δακτυλικό αποτύπωμα. Είναι ξεχωριστό για κάθε μπλοκ.
Ο κατακερματισμός ενός μπλοκ μπορεί να υπολογιστεί περνώντας όλο το περιεχόμενό του μέσω μιας συνάρτησης κατακερματισμού.
Λοιπόν, ας ξεκινήσουμε με την υλοποίηση μιας συνάρτησης που υπολογίζει τον κατακερματισμό του τρέχοντος μπλοκ.
Έτσι, κάτω από την κλάση Block, ορίζουμε τη συνάρτηση accountHash:
Ωστόσο, ο κατακερματισμός SHA256 δεν υποστηρίζεται από JavaScript και πρέπει να ληφθεί από εξωτερική βιβλιοθήκη.
Το Crypto-js είναι ένα φανταστικό πακέτο που περιλαμβάνει ασφαλείς υλοποιήσεις αρκετών αλγορίθμων κατακερματισμού.
Στη συνέχεια, μπορούμε να το εισαγάγουμε στον κώδικα main.js μας.
Τώρα που έχουμε τη συνάρτησή μας accountHash(), ας τη χρησιμοποιήσουμε στη συνάρτηση του Block μας:
Αφού περιγράψουμε πώς μοιάζει ένα Block, μπορούμε να ορίσουμε πώς πρέπει να μοιάζει ένα Blockchain. Ας δημιουργήσουμε λοιπόν μια νέα τάξη.
Σε αυτό το σενάριο, το blockchain είναι ένα πολύ απλό αντικείμενο που έχει μια αλυσίδα ιδιοτήτων. Αυτή είναι μια διάταξη που συγκρατεί όλα τα μπλοκ στην αλυσίδα.
Προτού μπορέσουμε να προσθέσουμε μπλοκ, πρέπει πρώτα να δημιουργήσουμε αυτό που είναι γνωστό ως "μπλοκ γένεσης". Αυτό είναι το πρώτο μπλοκ στην αλυσίδα, και είναι μοναδικό στο ότι δεν μπορεί να δείξει ένα προηγούμενο μπλοκ (είναι το πρώτο!).
Έτσι, για να δημιουργήσω το μπλοκ γένεσης, θα προσθέσω μια συνάρτηση στην τάξη μας με το όνομα createGenesisBlock (). Επιστροφή στη συνάρτηση Object() { [native code] } της κλάσης μας Blockchain.
Μπορούμε τώρα να συμπεριλάβουμε το μπλοκ γένεσης κάθε φορά που χτίζουμε μια νέα παρουσία Blockchain:
Μέθοδοι Blockchain
Τώρα, ας προσθέσουμε μεθόδους στην τάξη Blockchain που θα μας επιτρέψουν να κάνουμε πράγματα όπως η προσθήκη νέων μπλοκ και η ανάκτηση του πιο πρόσφατου μπλοκ.
Η συνάρτηση getLatestBlock είναι η πιο βασική. Απλώς επιστρέφει το τελικό μέλος του πίνακα αλυσίδας:
Η τεχνική addBlock εμπλέκεται λίγο περισσότερο.
Προτού μπορέσουμε να προσθέσουμε ένα νέο μπλοκ στην αλυσίδα μας, πρέπει πρώτα να ρυθμίσουμε κατάλληλα το προηγούμενο πεδίο Hash αυτού του μπλοκ.
Πρέπει να οριστεί στον κατακερματισμό του μπλοκ που προστέθηκε πιο πρόσφατα στην αλυσίδα μας. Πρέπει επίσης να υπολογίσουμε τον κατακερματισμό του νέου μπλοκ:
Δοκιμές
Ας δούμε πώς βγήκε το MelodyCoin μας.
Δημιουργήστε ένα στιγμιότυπο blockchain για να το πετύχετε. Ας προσθέσουμε μερικά ακόμη μπλοκ:
Φτιάξαμε δύο νέα μπλοκ εκεί. Ας ρίξουμε μια ματιά στο πώς μοιάζει αυτή τη στιγμή το blockchain μας.
Το MelodyCoin θα είναι συμπαγές και μορφοποιημένο με τέσσερα κενά:
Επαληθεύστε την ακεραιότητα του Blockchain
Οι αλυσίδες μπλοκ είναι φανταστικές, επειδή μόλις προστεθεί ένα μπλοκ, δεν μπορεί να τροποποιηθεί χωρίς να ακυρωθεί το υπόλοιπο της αλυσίδας.
Ωστόσο, δεν υπάρχει μέθοδος για να ελέγξω την ακεραιότητα του blockchain μας με αυτήν την υλοποίηση.
Ας εισαγάγουμε μια συνάρτηση isChainValid στο blockchain μας. Εάν η αλυσίδα είναι νόμιμη, θα επιστρέψει αληθινή. Διαφορετικά, θα επιστρέψει false:
Δοκιμή ακεραιότητας
Μπορούμε τώρα να δοκιμάσουμε την ακεραιότητα του blockchain μας. Αν το εκτελέσουμε τώρα, θα επιβεβαιώσει ότι η αλυσίδα μας είναι γνήσια.
Ας προσπαθήσουμε τώρα να παραβιάσουμε το blockchain μας. Ας αλλάξουμε το μπλοκ 2 και ας αντικαταστήσουμε το περιεχόμενό του (ας υποθέσουμε ότι μεταφέραμε 100 νομίσματα αντί για τέσσερα).
Όταν το εκτελούμε, μπορούμε να δούμε ότι το λογισμικό αναγνωρίζει την προσπάθειά μας να παραβιάσουμε την αλυσίδα.
Ωστόσο, μπορείτε να πιστέψετε ότι υπάρχει μια άλλη μέθοδος για να ανακατευτώ σε αυτό. Άλλαξα τα περιεχόμενα στο μπλοκ αλλά δεν υπολόγισα ξανά τον κατακερματισμό. Έτσι, μπορείτε να προσπαθήσετε να είστε έξυπνοι και να υπολογίσετε ξανά τον κατακερματισμό του ίδιου μπλοκ.
Αυτό ήταν το μόνο που υπήρχε στη μικροσκοπική μας εγκατάσταση blockchain! Μας δίνει τη δυνατότητα να προσθέσουμε νέα μπλοκ και να ανιχνεύσουμε παραβιάσεις δεδομένων εντός της αλυσίδας.
Υπάρχουν δύο ζητήματα με το μικρό μας blockchain που πρέπει να αντιμετωπίσουμε:
- Οι σύγχρονοι υπολογιστές είναι εξαιρετικά γρήγοροι και μπορούν να προσθέσουν χιλιάδες μπλοκ στην αλυσίδα μας μέσα σε δευτερόλεπτα. Προφανώς δεν θέλουμε κανείς να στέλνει ανεπιθύμητα μηνύματα στο blockchain μας.
- Το blockchain μας εξακολουθεί να είναι ευάλωτο σε παραβιάσεις. Μπορείτε να ενημερώσετε τα περιεχόμενα ενός μπλοκ και, στη συνέχεια, απλώς να υπολογίσετε εκ νέου τους κατακερματισμούς (και τους προηγούμενους κατακερματισμούς) για όλα τα ακόλουθα μπλοκ. Ακόμα κι αν το μπερδέψετε, θα καταλήξετε με μια νόμιμη αλυσίδα.
Για να αντιμετωπίσουν αυτές τις ανησυχίες, τα blockchain χρησιμοποιούν μια τεχνική γνωστή ως "απόδειξη εργασίας". Πρέπει να αποδείξετε ότι χρησιμοποιήσατε σημαντικό αριθμό υπολογιστικών πόρων για να δημιουργήσετε ένα μπλοκ χρησιμοποιώντας αυτήν την προσέγγιση. Αυτό λέγεται επίσης εξόρυξη.
Η απόδειξη εργασίας απαιτεί ο κατακερματισμός ενός μπλοκ να ξεκινά με ένα συγκεκριμένο ποσό μηδενικών. Αλλά πώς μπορείτε να μάθετε αν ο κατακερματισμός σας ταιριάζει σε αυτόν τον κανόνα;
Τα περιεχόμενα ενός μπλοκ καθορίζουν τον κατακερματισμό του. Έτσι, λαμβάνουμε πάντα τον ίδιο κατακερματισμό, υπό την προϋπόθεση ότι δεν τροποποιούμε τα περιεχόμενα.
Κάθε μπλοκ θα πρέπει να έχει μια τιμή nonce που προστίθεται ως λύση. Αυτά είναι ουσιαστικά κάποια τυχαία δεδομένα που μπορούμε να ενημερώσουμε έως ότου ο κατακερματισμός του μπλοκ μας ξεκινήσει με αρκετά μηδενικά. Επειδή δεν μπορείτε να αλλάξετε την έξοδο μιας συνάρτησης κατακερματισμού, πρέπει να δοκιμάσετε πολλούς διαφορετικούς συνδυασμούς και να ελπίζετε για το καλύτερο.
Εισάγετε το Mining στο The Blockchain
Ας ξεκινήσουμε συμπεριλαμβάνοντας ένα nonce στην τάξη Block μας. Το nonce είναι η μοναδική τιμή στο μπλοκ μας που μπορούμε να τροποποιήσουμε για να επηρεάσει τον κατακερματισμό του μπλοκ.
Δεν μπορούμε να αλλάξουμε τη χρονική σήμανση ή τα δεδομένα.
Στη συνέχεια, ας γράψουμε μια συνάρτηση mineBlock() που θα κάνει την πραγματική εξόρυξη ενός μπλοκ. Αυτή η συνάρτηση θα αποσταλεί ως παράμετρος την απαιτούμενη δυσκολία και θα συνεχίσει να εκτελείται μέχρι ο κατακερματισμός του μπλοκ μας να ξεκινήσει με αρκετά μηδενικά.
Μόλις έφτιαξα έναν βασικό βρόχο while που θα έτρεχε μέχρι ο κατακερματισμός μας να ξεκινήσει με αρκετά μηδενικά. Χρησιμοποιούμε τη δυσκολία για να προσδιορίσουμε πόσα μηδενικά χρειάζονται. Με δυσκολία 5, ο κατακερματισμός μας πρέπει να ξεκινά με 5 μηδενικά.
Όταν ο κατακερματισμός μας δεν περιέχει αρκετά μηδενικά, αυξάνουμε το nonce κατά ένα και υπολογίζουμε ξανά τον κατακερματισμό. Και αν βρούμε ένα hash που αντιστοιχεί στη δυσκολία, το καταγράφουμε στην κονσόλα.
Υπάρχει ακόμα ένα πράγμα που πρέπει να κάνουμε. Δεν λαμβάνουμε πραγματικά υπόψη τη μεταβλητή nonce στη μέθοδο υπολογισμούHash, οπότε ορίστε:
Κατηγορία Blockchain
Ας δοκιμάσουμε αυτή τη νέα προσέγγιση στην κατηγορία blockchain μας και ας δούμε πώς θα πάει.
Αρχικά, θα ορίσω τη δυσκολία του blockchain μας στη συνάρτηση Object(). Το ορίζουμε εδώ αφού μπορούμε να το χρησιμοποιήσουμε κάπου αργότερα.
Η συνάρτηση addBlock πρέπει στη συνέχεια να τροποποιηθεί έτσι ώστε να εξορύσσει το μπλοκ πριν το προσθέσουμε στην αλυσίδα μας.
Χρησιμοποιήστε το Blockchain
Τώρα, ας χρησιμοποιήσουμε το νέο μας blockchain με τον αλγόριθμο απόδειξης εργασίας. Εδώ, προσθέστε μερικές δηλώσεις console.log.
Όταν εκτελούμε αυτόν τον κώδικα, μπορούμε να παρατηρήσουμε ότι η διαδικασία εξόρυξης δεν είναι πλέον ιδιαίτερα γρήγορη.
Χρειάζεται λίγος χρόνος για να δημιουργήσει ο αλγόριθμος μπλοκ με κατακερματισμούς που ξεκινούν με τρία μηδενικά (όπως διαμορφώνονται από τη δυσκολία).
Έτσι, αυτό ήταν το τέλος της βασικής μας εγκατάστασης blockchain.
Μπορούμε να ρυθμίσουμε πόσο γρήγορα προστίθενται νέα μπλοκ στο blockchain μας χάρη στον μηχανισμό απόδειξης εργασίας.
Είναι το πιο σημαντικό χαρακτηριστικό ασφαλείας στα blockchain. Και τώρα που καταλάβατε πώς λειτουργεί, ξεκινήστε να δημιουργείτε το δικό σας!
Αφήστε μια απάντηση