Κωδικοποίηση Blockchain: Οι πολλές διαφορετικές γλώσσες που χρειάζεστε!

Σε αυτόν τον οδηγό, θα εξετάσουμε μερικές από τις πιο σημαντικές κωδικοποιήσεις Blockchain. Και αν μόλις ξεκινήσετε ρίξτε μια ματιά στα ολοκληρωμένα μαθήματα blockchain.

Η τεχνολογία blockchain είναι απίστευτα συναρπαστική. Δεν θα είναι υπερβολικό να σκεφτούμε ένα μέλλον που θα οικοδομηθεί εξ ολοκλήρου πάνω του. Λοιπόν, τι πρέπει να μάθετε για να ξεκινήσετε να αναπτύσσετε το blockchain; Ποιες γλώσσες θα σας δώσουν το προβάδισμα; Ας ξεκινήσουμε με την κωδικοποίηση blockchain!

Contents

Προγραμματισμός προβλημάτων Blockchain

Πριν ξεκινήσουμε, ας δούμε μερικές από τις προκλήσεις που αντιμετωπίζει ένας προγραμματιστής blockchain. Η δημιουργία και η συντήρηση ενός δημόσιου blockchain δεν είναι εύκολη για πολλούς λόγους.

(Πριν συνεχίσουμε, μια τεράστια κραυγή στον David Schwartz για την κεντρική του ομιλία σχετικά με τη χρήση του C ++ στην ανάπτυξη λογισμικού blockchain στο CPPCON 2016.)

Κωδικοποίηση Blockchain

Blockchain Coding Difficulty Challenge # 1: Ασφάλεια

Blockchains, ως Ντέιβιντ Σβαρτς το θέτει, πρέπει να είναι φρούρια. Πρώτον, ο κώδικας είναι δημόσιος και ανοιχτός για όλους. Όλοι μπορούν να αναζητήσουν τον κώδικα και να ελέγξουν για σφάλματα και ευπάθειες. Ωστόσο, σε αντίθεση με άλλους πόρους ανοιχτού κώδικα, το μειονέκτημα της εύρεσης τρωτών σημείων στον κώδικα blockchain είναι τεράστιο. Κάθε προγραμματιστής μπορεί να χαράξει και να ξεφύγει με δυνητικά εκατομμύρια και εκατομμύρια δολάρια. Λόγω αυτών των νόμιμων προβλημάτων ασφάλειας, η ανάπτυξη του blockchain είναι συνήθως πολύ αργή.

Blockchain Coding Difficulty Challenge # 2: Διαχείριση πόρων

Είναι σημαντικό να συμβαδίζετε με το δίκτυο. Δεν μπορείτε να μείνετε πολύ πίσω και να μην ανταποκριθείτε σε όλες τις απαιτήσεις δικτύου. Πρέπει να είστε καλά εξοπλισμένοι για να χειρίζεστε απομακρυσμένα και τοπικά ερωτήματα.

Blockchain Coding Difficulty Challenge # 3: Απόδοση

Το blockchain πρέπει πάντα να αποδίδει στις υψηλότερες δυνατές δυνατότητές του, αλλά για να συμβεί αυτό, η επιλεγμένη γλώσσα πρέπει να είναι εξαιρετικά ευέλικτη. Το θέμα είναι ότι υπάρχουν συγκεκριμένες εργασίες στο blockchain που είναι παραλληλισμένες ενώ υπάρχουν κάποιες εργασίες που δεν μπορούν να γίνουν παράλληλα.

Ένα καλό παράδειγμα μιας “παράλληλης” εργασίας είναι η επαλήθευση ψηφιακής υπογραφής. Το μόνο που χρειάζεστε για την επαλήθευση της υπογραφής είναι το κλειδί, η συναλλαγή και η υπογραφή. Με μόνο τρία δεδομένα μπορείτε να πραγματοποιήσετε επαληθεύσεις με παράλληλο τρόπο.

Ωστόσο, δεν πρέπει να γίνουν όλες οι λειτουργίες σε ένα blockchain. Σκεφτείτε την ίδια την εκτέλεση συναλλαγών. Δεν είναι δυνατή η παράλληλη εκτέλεση πολλαπλών συναλλαγών. πρέπει να γίνει ένα κάθε φορά για να αποφευχθούν σφάλματα όπως διπλές δαπάνες. Ορισμένες γλώσσες είναι καλές σε παράλληλες λειτουργίες, ενώ μερικές είναι καλές σε μη παράλληλες λειτουργίες.

Εκπαιδεύστε για να γίνετε προγραμματιστής Blockchain

Ξεκινήστε τη δωρεάν δοκιμή σας σήμερα!

Πρόκληση δυσκολίας κωδικοποίησης Blockchain # 4: Απομόνωση

Τι είναι η ντετερμινιστική συμπεριφορά?

  • Εάν A + B = C, τότε ανεξάρτητα από τις περιστάσεις, το A + B θα είναι πάντα ίσο με το C. Αυτό ονομάζεται ντετερμινιστική συμπεριφορά.
  • Οι συναρτήσεις Hash είναι ντετερμινιστικές, που σημαίνει ότι το hash του A θα είναι πάντα H (A).

Έτσι, στην ανάπτυξη blockchain, όλες οι συναλλαγές πρέπει να είναι ντετερμινιστικές. Δεν μπορείτε να έχετε μια συναλλαγή που συμπεριφέρεται με έναν τρόπο και στη συνέχεια συμπεριφέρεται με άλλο τρόπο την επόμενη μέρα. Ομοίως, δεν μπορείτε να έχετε έξυπνα συμβόλαια που λειτουργούν με δύο διαφορετικούς τρόπους σε δύο διαφορετικά μηχανήματα.

Η μόνη λύση σε αυτό είναι η απομόνωση. Βασικά, απομονώνετε τις έξυπνες συμβάσεις και τις συναλλαγές σας από μη ντετερμινιστικά στοιχεία.

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

Γλώσσα κωδικοποίησης Blockchain # 1: Γ++

Πρώτα απ ‘όλα, ας ξεκινήσουμε με τον παππού όλων τους, το αειθαλή Γ++. Το C ++ δημιουργήθηκε από τον Bjarne Stroustrup ως επέκταση της γλώσσας C. Η Γλώσσα σχεδιάστηκε για να έχει την ευελιξία και την αποτελεσματικότητα του C αλλά με κάποιες σημαντικές διαφορές. Η μεγαλύτερη διαφορά μεταξύ C και C ++ είναι ότι ενώ το C είναι προσανατολισμένο στη διαδικασία, το C ++ είναι αντικειμενικό.

Αυτό σημαίνει ότι, στο C ++, τα δεδομένα και οι συναρτήσεις τυλίγονται σε ένα τακτοποιημένο μικρό πακέτο που ονομάζεται «αντικείμενα», πράγμα που σημαίνει ότι μόλις δημιουργηθεί ένα αντικείμενο, μπορεί εύκολα να κληθεί και να επαναχρησιμοποιηθεί σε άλλα προγράμματα, γεγονός που μειώνει σημαντικά τον χρόνο κωδικοποίησης..

Ας δούμε το απλούστερο πρόγραμμα C ++ στον κόσμο. Το πρόγραμμα «Hello World»:

#περιλαμβάνω

κύριος()

{

ραπτική << "Γειά σου Κόσμε!";

επιστροφή 0;

}

Αυτός ο κωδικός θα εκτυπώσει “Γεια Κόσμος!”

Λοιπόν, γιατί οι χρήστες εξακολουθούν να χρησιμοποιούν το C ++ για κωδικοποίηση; Σίγουρα υπάρχουν πολύ πιο λαμπερές γλώσσες τώρα, γιατί οι άνθρωποι εξακολουθούν να επιμένουν να επιστρέψουν στο C ++; Γιατί το bitcoin blockchain κωδικοποιείται στο C++?

Λοιπόν, όπως συμβαίνει, το C ++ έχει ορισμένα χαρακτηριστικά που το καθιστούν πολύ ελκυστικό. (Φωνίστε τον Peter Wiulle και τον David Schwartz για την ακόλουθη εξήγηση).

Χαρακτηριστικό # 1: Έλεγχος μνήμης

Θυμάστε τι είπαμε νωρίτερα για τις προκλήσεις της ανάπτυξης blockchain; Όχι μόνο θα πρέπει να είναι ασφαλή οχυρά, αλλά και να έχουν αποτελεσματική διαχείριση πόρων. Ένα blockchain υποτίθεται ότι αλληλεπιδρά με πολλά μη αξιόπιστα τελικά σημεία, ενώ παράλληλα παρέχει γρήγορη εξυπηρέτηση σε οποιονδήποτε και σε όλους τους κόμβους.

Αυτή η γρήγορη και γρήγορη υπηρεσία είναι κρίσιμη για την επιτυχία ενός κρυπτονομίσματος όπως το bitcoin. Θυμηθείτε, όλα βασίζονται στην αρχή της «συναίνεσης», όλοι οι κόμβοι στο δίκτυο πρέπει να αποδεχτούν και να απορρίψουν τα ίδια ακριβώς μπλοκ, αλλιώς θα μπορούσε να υπάρχει ένα πιρούνι στην αλυσίδα.

Για να ικανοποιήσετε όλες αυτές τις απαιτήσεις και να εκτελέσετε στο υψηλότερο επίπεδο, χρειάζεστε αυστηρό και πλήρη έλεγχο της χρήσης CPU και μνήμης. Το C ++ το δίνει στους χρήστες του.

Χαρακτηριστικό # 2: Νήμα

Όπως έχουμε συζητήσει προηγουμένως, μία από τις κύριες προκλήσεις του προγραμματισμού blockchain είναι η ολοκλήρωση εργασιών που παραλληλίζονται καλά και των εργασιών που δεν παραλληλίζονται. Οι περισσότερες γλώσσες ειδικεύονται σε μία, ωστόσο, η ικανότητα νήματος του C ++ είναι αρκετά καλή για να χειριστεί παράλληλες και μη παράλληλες εργασίες. Ένα νήμα είναι ένα σύνολο οδηγιών που μπορούν να εκτελεστούν ταυτόχρονα. Όχι μόνο το C ++ επιτρέπει εξαιρετικές εγκαταστάσεις πολλαπλών νημάτων με αποτελεσματική επικοινωνία μεταξύ νημάτων, αλλά βελτιστοποιεί επίσης την απόδοση ενός νήματος.

Χαρακτηριστικό # 3: Μετακίνηση σημασιολογίας

Μια από τις πιο ενδιαφέρουσες πτυχές του C ++ είναι η σημασιολογία μετακίνησης. Το Move semantics παρέχει έναν τρόπο για να μετακινηθούν τα περιεχόμενα μεταξύ αντικειμένων αντί να αντιγραφούν εντελώς. Ας δούμε τις διαφορές μεταξύ της σημασιολογίας αντιγραφής και της σημασιολογίας μετακίνησης. (Τα ακόλουθα δεδομένα λαμβάνονται από την απάντηση του Peter Alexander στο “Stackoverflow”).

Αντιγραφή σημασιολογίας:

  • διεκδικούν (b == c);
  • α = β;
  • διεκδικούν (a == b && b == γ);

Τι συμβαίνει λοιπόν εδώ; Η τιμή του b πηγαίνει σε a και b παραμένει αμετάβλητη στο τέλος του συνόλου.

Τώρα, σκεφτείτε το.

Μετακίνηση σημασιολογίας:

  • διεκδικούν (b = = c);
  • μετακίνηση (a, b);
  • διεκδικούν (a = = c);

Τι συμβαινει εδω?

Μπορείτε να δείτε τη διαφορά μεταξύ των δύο μπλοκ κωδικών?

Όταν χρησιμοποιούμε την κίνηση σημασιολογίας, η τιμή του «b» δεν χρειάζεται να παραμείνει αμετάβλητη. Αυτή είναι η διαφορά μεταξύ της σημασιολογίας αντιγραφής και της σημασιολογίας μετακίνησης. Το μεγαλύτερο πλεονέκτημα της σημασιολογίας μετακίνησης είναι ότι μπορείτε να λάβετε αντίγραφα συγκεκριμένων δεδομένων μόνο όταν τα χρειάζεστε, γεγονός που μειώνει σημαντικά τον πλεονασμό του κώδικα και δίνει τεράστια ώθηση στην απόδοση. Όπως μπορείτε να δείτε, αυτή η αποτελεσματική διαχείριση μνήμης και η υψηλή απόδοση είναι και τα δύο επιθυμητά για το blockchain.

Χαρακτηριστικό # 4: Compile Time Polymorphism

Τι είναι ο πολυμορφισμός?

Θυμάσαι πότε ονομάσαμε το C ++ «αντικειμενοστρεφής προγραμματισμός (OOP) γλώσσα»; Ο πολυμορφισμός τυχαίνει να είναι ιδιοκτησία OOP. Χρησιμοποιώντας τον πολυμορφισμό, χρησιμοποιείτε ένα συγκεκριμένο χαρακτηριστικό με περισσότερους από έναν τρόπους. Στο C ++ ο πολυμορφισμός μπορεί να χρησιμοποιηθεί με δύο τρόπους:

  • Πολυμορφισμός μεταγλώττισης.
  • Πολυμορφισμός χρόνου εκτέλεσης.

Εδώ, θα επικεντρωθούμε μόνο στον πολυμορφισμό μεταγλώττισης. Υπάρχουν δύο τρόποι με τους οποίους το C ++ εφαρμόζει τον πολυμορφισμό μεταγλώττισης:

  • Υπερφόρτωση λειτουργίας.
  • Υπερφόρτωση χειριστή.

Υπερφόρτωση λειτουργίας:

Η υπερφόρτωση της λειτουργίας είναι όταν έχετε πολλές συναρτήσεις με το ίδιο όνομα αλλά με διαφορετική εισαγωγή παραμέτρων.

Εξετάστε αυτό το πρόγραμμα:

#περιλαμβάνω

χρησιμοποιώντας το namespace std;

τάξη Α

{

void func (int x) // η πρώτη παρουσία της συνάρτησης παίρνει μόνο μία ακέραια τιμή

{

ραπτική<<Χ<<endl;

}

void func (double x) // η δεύτερη παρουσία της συνάρτησης παίρνει μόνο μία διπλή τιμή

{

ραπτική<<Χ<<endl;

}

void func (int x, int y) // η τρίτη παρουσία της συνάρτησης παίρνει δύο ακέραιες τιμές

{

ραπτική<<x = ε<<endl;

}

}

int main ()

{

A obj1 // κάνοντας ένα αντικείμενο της κλάσης Α

// τώρα θα καλέσουμε τις συναρτήσεις

obj1.func (2);

obj1.func (2.65);

obj1.func (2,5);

επιστροφή 0;

}

Τώρα, όταν εκτελείτε αυτήν τη λειτουργία, η έξοδος θα είναι:

  • 2
  • 2.65
  • 7

Έτσι, όπως μπορείτε να δείτε, η ίδια λειτουργία func () χρησιμοποιήθηκε με 3 διαφορετικούς τρόπους.

Υπερφόρτωση χειριστή:

Στο C ++ ο ίδιος χειριστής μπορεί να έχει περισσότερες από μία έννοιες.

  • Π.χ. Το “+” μπορεί να χρησιμοποιηθεί τόσο για μαθηματική προσθήκη όσο και για συνένωση.
  • Η συνένωση σημαίνει βασικά τη λήψη δύο χορδών και τον συνδυασμό τους ως μία.
  • Έτσι 3 + 4 = 7.

ΚΑΙ

  • Block + geeks = Blockgeeks.
  • Ο ίδιος χειριστής έκανε δύο διαφορετικές λειτουργίες, αυτό είναι υπερφόρτωση χειριστή.

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

Χαρακτηριστικό # 5: Απομόνωση κώδικα

Το C ++ διαθέτει δυνατότητες χώρου ονομάτων που μπορούν να εισαχθούν από το ένα πρόγραμμα στο άλλο. Το Namespace βοηθά στην αποφυγή συγκρούσεων ονόματος. Επίσης, δεδομένου ότι το C ++ έχει τάξεις, μπορεί να λειτουργήσει ως όρια μεταξύ διαφόρων API και να συμβάλει στον σαφή διαχωρισμό.

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

Χαρακτηριστικό # 6: Ωριμότητα

Η γλώσσα είναι ώριμη και ενημερώνεται τακτικά. Υπάρχουν τουλάχιστον 3 στερεοί μεταγλωττιστές, όπως λέει ο David Schwartz, και οι νέες δυνατότητες στοχεύουν στην επίλυση πραγματικών προβλημάτων. Οι εντοπιστές εντοπισμού σφαλμάτων και αναλυτικά εργαλεία όλων των ειδών είναι διαθέσιμα για τα πάντα, από το προφίλ απόδοσης έως τον αυτόματο εντοπισμό θεμάτων κάθε είδους. Αυτό σημαίνει ότι η γλώσσα αυξάνεται συνεχώς για να ενσωματώνει νεότερα και καλύτερα χαρακτηριστικά.

Λόγω των παραπάνω χαρακτηριστικών, ο Satoshi Nakamoto επέλεξε το C ++ να είναι η βασική γλώσσα του πηγαίου κώδικα bitcoin.

Γλώσσα κωδικοποίησης Blockchain # 2: Javascript

Στη συνέχεια έχουμε Javascript.

Μαζί με HTML και CSS είναι μία από τις τρεις βασικές τεχνολογίες στην παραγωγή περιεχομένου World Wide Web. Το Javascript χρησιμοποιείται συνήθως για τη δημιουργία πολύ διαδραστικών ιστοσελίδων. Έτσι, τώρα θα δούμε πώς να δημιουργήσουμε ένα πολύ απλό blockchain χρησιμοποιώντας Javascript. Τεράστια φωνή στο savjee.be για το περιεχόμενο αυτής της ενότητας.

Ας υποθέσουμε, θέλουμε να δημιουργήσουμε ένα απλό blockchain στο Javascript. Πριν το πράξουμε, υπάρχουν ορισμένα πράγματα που πρέπει να αντιμετωπίσουμε.

Τι είναι το blockchain και πώς ακριβώς λειτουργεί… κώδικα?

Ένα blockchain είναι βασικά μια αλυσίδα μπλοκ που περιέχουν δεδομένα. Είναι βασικά μια ένδοξη συνδεδεμένη λίστα. Ωστόσο, τι το καθιστά τόσο ξεχωριστό; Ένα blockchain είναι αμετάβλητο. Δηλαδή, όταν τα δεδομένα μπαίνουν μέσα σε ένα μπλοκ, δεν μπορούν ποτέ να αλλάξουν. Πώς επιτυγχάνει το blockchain ένα αμετάβλητο; Είναι λόγω ενός απλού αλλά ευφυούς μηχανισμού που ονομάζεται «κατακερματισμός». Δείτε το παρακάτω διάγραμμα:

Κωδικοποίηση Blockchain: Οι πολλές διαφορετικές γλώσσες που χρειάζεστε!

Ευγενική προσφορά εικόνας: Μέσο άρθρο της Lauri Hartikka

Κάθε μπλοκ συνδέεται με το προηγούμενο μπλοκ μέσω ενός δείκτη κατακερματισμού που περιέχει τον κατακερματισμό του προηγούμενου μπλοκ. Λοιπόν, πώς αυτό κάνει την αλυσίδα αμετάβλητη?

Μία από τις πιο συναρπαστικές ιδιότητες των κρυπτογραφικών λειτουργιών κατακερματισμού είναι ότι αν αλλάξετε ακόμη και την είσοδο λίγο, μπορεί να επηρεάσει σημαντικά το κατακερματισμό εξόδου. Π.χ. Κοίτα αυτό:

Κωδικοποίηση Blockchain: Οι πολλές διαφορετικές γλώσσες που χρειάζεστε!

Απλά αλλάζοντας το πρώτο “T” από κεφαλαίο σε πεζά άλλαξε δραστικά το hash εξόδου τόσο πολύ.

Λοιπόν, πώς αυτό επηρεάζει το blockchain?

Κάθε μπλοκ συνδέεται με το προηγούμενο μέσω του δείκτη κατακερματισμού. Επομένως, εάν κάποιος παραβίαζε τα δεδομένα σε ένα μπλοκ, θα άλλαζε δραστικά τον κατακερματισμό και, ως εκ τούτου, θα επηρέαζε ολόκληρη την αλυσίδα (καθώς όλα τα μπλοκ είναι συνδεδεμένα). Αυτό θα παγώσει την αλυσίδα που είναι αδύνατο και ως εκ τούτου τα μπλοκ παραμένουν αμετάβλητα.

Λοιπόν, πώς κάνουμε ένα μπλοκ; Σε τι αποτελείται ένα απλό μπλοκ; Στην απλή κρυπτοκοίνη μας που πρόκειται να κάνουμε (Ας το ονομάσουμε “BlockGeeksCoin”), κάθε μπλοκ θα έχει τα ακόλουθα στοιχεία:

  • Ευρετήριο: Για να γνωρίζετε τον αριθμό μπλοκ.
  • Χρονική σήμανση: Για να μάθετε την ώρα της δημιουργίας.
  • Δεδομένα: Τα δεδομένα μέσα στο μπλοκ.
  • Προηγούμενο Hash: Το κατακερματισμό του προηγούμενου μπλοκ.
  • Hash: Το Hash του τρέχοντος μπλοκ.

Πριν συνεχίσουμε. Πρέπει να καταλάβετε ορισμένους όρους που θα χρησιμοποιήσουμε στο πρόγραμμά μας:

  • Αυτό: Η λέξη-κλειδί “αυτό” καλείται μέσα σε μια συνάρτηση και σας επιτρέπει να έχετε πρόσβαση στις τιμές μέσα σε ένα συγκεκριμένο αντικείμενο που καλεί τη συγκεκριμένη συνάρτηση.
  • Κατασκευαστής: Ένας κατασκευαστής είναι μια ειδική λειτουργία που μπορεί να βοηθήσει στη δημιουργία και την προετοιμασία ενός αντικειμένου μέσα σε μια τάξη. Κάθε τάξη περιορίζεται σε έναν μόνο κατασκευαστή.

Τώρα που έχει γίνει, ας αρχίσουμε να κάνουμε το μπλοκ μας.

Δημιουργία του μπλοκ

const SHA256 = απαιτείται ("crypto-js / sha256");

μπλοκ τάξης

{

κατασκευαστής (ευρετήριο, χρονική σήμανση, δεδομένα, προηγούμενηHash = “)

{

this.index = ευρετήριο;

this.previousHash = previousHash;

this.timestamp = χρονική σήμανση;

this.data = δεδομένα;

this.hash = this.calculateHash ();

}

υπολογισμόςHash ()

{

επιστροφή SHA256 (this.index + this.pre sebelumnyaHash + this.timestamp + JSON.stringify (this.data)). toString ();

}

}

Ανάλυση κώδικα

Εντάξει, οπότε αυτό είναι εδώ έξω. Έτσι, στην πρώτη γραμμή του κώδικα ονομάσαμε τη βιβλιοθήκη crypto-js επειδή η συνάρτηση κατακερματισμού sha256 δεν είναι διαθέσιμη σε JavaScript.

Στη συνέχεια, καλέσαμε έναν κατασκευαστή μέσα στην τάξη για να ζητήσουμε αντικείμενα που θα έχουν συγκεκριμένες τιμές. Αυτό που πιθανότατα τραβάει το βλέμμα σας είναι η λειτουργία calculHash (). Ας δούμε τι ακριβώς κάνει.

Σε ένα μπλοκ, παίρνουμε όλα τα περιεχόμενα και κατακερματίζουμε για να πάρουμε το κατακερματισμό του συγκεκριμένου μπλοκ. Χρησιμοποιούμε τη συνάρτηση JSON.stringify για να μετατρέψουμε τα δεδομένα του μπλοκ σε συμβολοσειρά για να το κατακερματιστούν.

Εντάξει, έτσι έχουμε το μπλοκ έτοιμο και καλό να ξεκινήσουμε. Τώρα ας συνδέσουμε τα μπλοκ μαζί σε ένα blockchain.

Δημιουργία του blockchain

κατηγορία Blockchain

{

// Ενότητα 1 Δημιουργία μπλοκ Genesis

κατασκευαστής()

{

this.chain = [this.createGenesisBlock ()];

}

createGenesisBlock ()

{

επιστροφή νέου μπλοκ (0, "01/01/2017", "Genesis μπλοκ", "0");

}

// ενότητα 2 προσθήκη νέων μπλοκ

getLatestBlock ()

{

επιστρέψτε αυτό.chain [this.chain.length – 1];

}

addBlock (newBlock) {

newBlock.previousHash = this.getLatestBlock (). hash;

newBlock.hash = newBlock.calculateHash ();

this.chain.push (newBlock);

}

// ενότητα 3 επικύρωση της αλυσίδας

isChainValid ()

{

για (let i = 1; i < this.chain.length; εγώ ++)

{

const currentBlock = this.chain [i];

const previousBlock = this.chain [i – 1];

εάν (currentBlock.hash! == currentBlock.calculateHash ()) {

επιστροφή ψευδής?

}

εάν (currentBlock.previousHash! == previousBlock.hash)

{

επιστροφή ψευδής?

}

}

επιστροφή αληθινή?

}

}

Ανάλυση κώδικα

Εντάξει, οπότε πολλά πράγματα συμβαίνουν στην παραπάνω αλυσίδα, ας το χωρίσουμε σε ενότητες.

Ενότητα 1: Το Genesis Block

Τι είναι το μπλοκ γένεσης?

Το μπλοκ γένεσης είναι το πρώτο μπλοκ του μπλοκ αλυσίδας και ο λόγος για τον οποίο είναι ξεχωριστό είναι ότι ενώ κάθε bock δείχνει το μπλοκ που ήταν προηγουμένως, το μπλοκ γένεσης δεν δείχνει τίποτα. Έτσι, τη στιγμή που δημιουργείται μια νέα αλυσίδα, το μπλοκ γένεσης καλείται αμέσως. Επίσης, μπορείτε να δείτε τη συνάρτηση “createGenesisBlock ()” όπου έχουμε δώσει τα δεδομένα του μπλοκ χειροκίνητα:

createGenesisBlock ()

{

επιστροφή νέου μπλοκ (0, “01/01/2017”, “Genesis block”, “0”);

}

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

Ενότητα 2: Προσθήκη των μπλοκ

Πρώτον, θα πρέπει να γνωρίζουμε ποιο είναι το τελευταίο μπλοκ στο blockchain. Για αυτό χρησιμοποιούμε τη συνάρτηση getLatestBlock ().

getLatestBlock ()

{

επιστρέψτε αυτό.chain [this.chain.length – 1];

}

Τώρα που έχουμε προσδιορίσει το τελευταίο μπλοκ, ας δούμε πώς θα προσθέσουμε νέα μπλοκ.

addBlock (newBlock) {

newBlock.previousHash = this.getLatestBlock (). hash;

newBlock.hash = newBlock.calculateHash ();

this.chain.push (newBlock);

}

Λοιπόν, τι συμβαίνει εδώ; Πώς προσθέτουμε τα μπλοκ; Πώς ελέγχουμε εάν το συγκεκριμένο μπλοκ είναι έγκυρο ή όχι?

Θυμηθείτε τα περιεχόμενα ενός μπλοκ?

Ένα μπλοκ έχει το κατακερματισμό του προηγούμενου μπλοκ δεξιά?

Έτσι, αυτό που πρόκειται να κάνουμε εδώ είναι απλό. Συγκρίνετε την προηγούμενη τιμή Hash του νέου μπλοκ με την τιμή κατακερματισμού του τελευταίου μπλοκ.

Κωδικοποίηση Blockchain: Οι πολλές διαφορετικές γλώσσες που χρειάζεστε!

Ευγενική προσφορά εικόνας: Μέσο άρθρο της Lauri Hartikka

Εάν αυτές οι δύο τιμές ταιριάζουν, τότε αυτό σημαίνει ότι το νέο μπλοκ είναι νόμιμο και προστίθεται στο blockchain.

Ενότητα 3: Επικύρωση της αλυσίδας

Τώρα, πρέπει να ελέγξουμε ότι κανείς δεν ταιριάζει με το blockchain μας και ότι όλα είναι σταθερά.

Χρησιμοποιούμε το βρόχο “για” για μετάβαση από το μπλοκ 1 στο τελευταίο μπλοκ. Το μπλοκ Genesis είναι το μπλοκ 0.

για (let i = 1; i < this.chain.length; εγώ ++)

{

const currentBlock = this.chain [i];

const previousBlock = this.chain [i – 1];

Σε αυτό το μέρος του κώδικα ορίζουμε δύο όρους, το τρέχον μπλοκ και το προηγούμενο μπλοκ. Και τώρα απλά θα βρούμε το κατακερματισμό αυτών των δύο τιμών.

εάν (currentBlock.hash! == currentBlock.calculateHash ()) {

επιστροφή ψευδής?

}

εάν (currentBlock.previousHash! == previousBlock.hash)

{

επιστροφή ψευδής?

}

}

επιστροφή αληθινή?

}

Εάν το “previousHash” του τρέχοντος μπλοκ δεν είναι ίσο με το “Hash” του προηγούμενου μπλοκ, τότε αυτή η συνάρτηση θα επιστρέψει False, αλλιώς θα επιστρέψει True.

Χρησιμοποιώντας το blockchain

Τώρα, θα χρησιμοποιήσουμε επιτέλους το blockchain για να δημιουργήσουμε το BlockGeeksCoin.

  • let BlockGeeksCoin = νέο Blockchain ();
  • BlockGeeksCoin.addBlock (νέο μπλοκ (1, “20/07/2017”, {ποσό: 4}));
  • BlockGeeksCoin.addBlock (νέο μπλοκ (2, “20/07/2017”, {ποσό: 8}));

Και αυτό είναι!

Τι συνέβη εδώ?

Δημιουργήσαμε ένα νέο cryptocurrency με βάση το blockchain και το ονομάσαμε BlockGeeksCoin. Επικαλούμενος αυτό το νέο αντικείμενο, ενεργοποίησα τον κατασκευαστή, ο οποίος με τη σειρά του δημιούργησε αυτόματα το μπλοκ Genesis.

Απλά προσθέσαμε δύο ακόμη μπλοκ σε αυτό και τους δώσαμε μερικά δεδομένα.

Είναι τόσο απλό.

(Ευχαριστώ savjee.be για την εκπληκτική και απλή εξήγηση.)

Γλώσσα κωδικοποίησης Blockchain # 3: Python

Ο Guido van Rossum, ολλανδός προγραμματιστής, δημιούργησε την Python το 1991. Ο Python βασίζεται σε μια απλή φιλοσοφία: Απλότητα και Μινιμαλισμός. Ένας από τους πιο αξιοσημείωτους τρόπους με τους οποίους ενσωμάτωσαν την απλότητα στη γλώσσα τους είναι χρησιμοποιώντας λευκά κενά για να σηματοδοτούν μπλοκ κώδικα αντί για αγκύλες ή λέξεις-κλειδιά. Ας δούμε τι σημαίνει αυτό.

Ας δούμε ένα απλό πρόγραμμα «γεια σας».

εκτύπωση («Γεια, κόσμος!»)

Ναι, αυτό είναι!

Συγκρίνετε αυτό με το πρόγραμμα «γειά σου κόσμος» C ++.

Δείτε πόσο λιγότερο περίπλοκο είναι σε σύγκριση; Τι γίνεται με κάτι πιο περίπλοκο; Ας πούμε ότι προσθέτουμε δύο αριθμούς και εκτυπώνουμε το αποτέλεσμα.

αριθ. 1 = 1,5

αριθ. 2 = 6.3

άθροισμα = float (num1) + float (num2)

εκτύπωση («Το άθροισμα των {0} και {1} είναι {2}». μορφή (num1, num2, sum))

Και αυτό είναι.

Το αποτέλεσμα αυτού του προγράμματος θα είναι:

  • Το άθροισμα των 1,5 και 6,3 είναι 7,8

Ας ξεκινήσουμε λοιπόν. Πώς θα προγραμματίσουμε ένα ολόκληρο blockchain χρησιμοποιώντας το Python; Τα ακόλουθα δεδομένα και κωδικός προέρχονται από το άρθρο του Gerald Nash στο Medium.

Δημιουργία του μπλοκ

Πρώτον, ας κάνουμε το μπλοκ μας:

εισαγωγή hashlib ως hasher

μπλοκ τάξης:

def __init __ (αυτο, ευρετήριο, χρονική σήμανση, δεδομένα, προηγούμενο_hash):

self.index = ευρετήριο

self.timestamp = χρονική σήμανση

self.data = δεδομένα

self.previous_hash = previous_hash

self.hash = self.hash_block ()

def hash_block (αυτο):

sha = hasher.sha256 ()

sha.update (str (self.index) +

str (self.timestamp) +

str (self.data) +

str (self.pre sebelumnya_hash))

επιστροφή sha.hexdigest ()

Ανάλυση κώδικα

Ξεκινάμε εισάγοντας τη βιβλιοθήκη κατακερματισμού για να χρησιμοποιήσουμε τις συντελεστές κατακερματισμού SHA 256 (όπως το Javascript).

Όπως και πριν, το μπλοκ έχει την ίδια τιμή:

  • Δείκτης.
  • Χρονική σήμανση.
  • Δεδομένα.
  • Προηγούμενο κατακερματισμό.
  • Χασίσι.

Μόλις εναντιωθεί, συμπληρώνουμε τις τιμές κατακερματισμού μέσω μιας συνάρτησης, όπως και πριν.

Δημιουργία του μπλοκ γένεσης

Τώρα, ας δημιουργήσουμε το μπλοκ Genesis:

εισαγωγή ημερομηνίας ως ημερομηνία

def create_genesis_block ():

επιστροφή Block (0, date.datetime.now (), “Genesis Block”, “0”)

Ανάλυση κώδικα

Έχουμε εισαγάγει ώρα για να τοποθετήσουμε τη χρονική σήμανση.

Δημιουργήσαμε απλώς το μπλοκ γένεσης και του δώσαμε χειροκίνητα ορισμένα δεδομένα για να εργαστούμε. Η προηγούμενη τιμή κατακερματισμού είναι “0” επειδή δεν δείχνει κανένα άλλο μπλοκ.

Δημιουργία των υπόλοιπων μπλοκ

Τώρα ας καθορίσουμε πώς θα δημιουργηθούν τα επόμενα μπλοκ.

def next_block (last_block):

this_index = last_block.index + 1

this_timestamp = date.datetime.now ()

αυτό_δεδομένα = "Γεια! Είμαι μπλοκ " + str (αυτό_index)

this_hash = last_block.hash

επιστροφή Block (this_index, this_timestamp, this_data, this_hash)

Ανάλυση κώδικα

Λοιπόν, πώς θα καθορίσουμε τις τιμές κάθε κομμάτι δεδομένων μέσα σε κάθε μπλοκ?

Ο δείκτης μπλοκ είναι απλώς ο δείκτης του τελευταίου μπλοκ +1.

Η χρονική σήμανση είναι η τρέχουσα ημερομηνία και ώρα.

Τα δεδομένα του μπλοκ είναι ένα απλό μήνυμα: «Γεια! Είμαι μπλοκ “.

Υπολογίζουμε χρησιμοποιώντας τη συνάρτηση που ορίσαμε νωρίτερα.

Και τελικά, επιστρέφουμε όλες αυτές τις τιμές στο μπλοκ.

Δημιουργία του blockchain

Τέλος, ας δημιουργήσουμε το blockchain.

blockchain = [create_genesis_block ()]

previous_block = blockchain [0]

num_of_blocks_to_add = 15

για i στην περιοχή (0, num_of_blocks_to_add):

block_to_add = next_block (προηγούμενο_μπλοκ)

blockchain.append (block_to_add)

previous_block = block_to_add

# Πείτε σε όλους για αυτό!

Τυπώνω "Ο αποκλεισμός # {} προστέθηκε στο blockchain!".μορφή (block_to_add.index)

Τυπώνω "Κατακερματισμός: {} ν".μορφή (block_to_add.hash)

Ανάλυση κώδικα

Πρώτον, δημιουργούμε το μπλοκ γένεσης και δίνουμε την αξία του στο “previous_block”.

Στη συνέχεια, καθορίζουμε πόσα μπλοκ να προσθέσουμε, σε αυτό το παράδειγμα θα ακολουθήσουμε με 15.

Λειτουργούμε λοιπόν έναν βρόχο που φτάνει μέχρι το 15 και προσθέτει κάθε μπλοκ στο blockchain. Στο τέλος της εμφάνισης, εκτυπώνουμε ποιο μπλοκ αριθμών έχει προστεθεί στο blockchain δείχνοντας τον αριθμό ευρετηρίου τους. Επιπλέον, εκτυπώνουμε το Hash επίσης.

Έτσι θα είναι η έξοδος:

Κωδικοποίηση Blockchain: Οι πολλές διαφορετικές γλώσσες που χρειάζεστε!

Ευγενική προσφορά εικόνας: Gerald Nash Medium Article

Προφανώς τόσο σε αυτό όσο και στο javascript θα μπορούσατε να προσθέσετε πιο περίπλοκα χαρακτηριστικά όπως το Proof Of Work. Αν θέλετε να μάθετε πώς να το εφαρμόσετε, συνιστάται να διαβάσετε το άρθρο του Gerald Nash. Αλλά προς το παρόν, τουλάχιστον ξέρετε πώς να δημιουργήσετε ένα απλό blockchain στο Python.

Γλώσσα # 4: Στερεότητα

Τέλος, φτάνουμε στη Στερεότητα. Για όσους θέλουν να μάθουν πώς να κάνουν DAPPs (Αποκεντρωμένες Εφαρμογές) ή να μπουν στο παιχνίδι ICO, η εκμάθηση της Στερεότητας είναι απόλυτη ανάγκη. Έχουμε ήδη έναν αναλυτικό οδηγό για τον οποίο μπορείτε να διαβάσετε εδώ. Ωστόσο, εδώ θα σας δώσουμε μια βασική επισκόπηση. Το Solidity αναπτύχθηκε από τους Gavin Wood, Christian Reitwiessner, Alex Beregszaszi, Yoichi Hirai και αρκετούς πρώην συνεισφέροντες του πυρήνα του ethereum για να επιτρέψουν τη σύνταξη έξυπνων συμβάσεων σε πλατφόρμες blockchain όπως το Ethereum.

Η σταθερότητα είναι μια γλώσσα με αόριστο τρόπο, χαλαρά δακτυλογραφημένη με σύνταξη πολύ παρόμοια με το ECMAScript (Javascript). Υπάρχουν ορισμένα βασικά σημεία που πρέπει να θυμάστε από το έγγραφο Ethereum Design Rationale, δηλαδή ότι εργαζόμαστε σε ένα μοντέλο στοίβας και μνήμης με μέγεθος λέξης 32 byte, το EVM (Ethereum Virtual Machine) μας δίνει πρόσβαση στο πρόγραμμα ” στοίβα »που μοιάζει με χώρο καταχώρησης όπου μπορούμε επίσης να κολλήσουμε διευθύνσεις μνήμης για να κάνουμε το πρόγραμμα Counter loop / jump (για διαδοχικό έλεγχο προγράμματος), μια επεκτάσιμη προσωρινή« μνήμη »και μια πιο μόνιμη« αποθήκευση »που στην πραγματικότητα γράφεται στο μόνιμο blockchain, και το πιο σημαντικό, το EVM απαιτεί απόλυτο ντετερμινισμό στα έξυπνα συμβόλαια.

Έτσι, προτού συνεχίσουμε, ας ρίξουμε μια ματιά σε ένα βασικό παράδειγμα σύμβασης Στερεότητας. (Κωδικοί που λαμβάνονται από το github).

Ας τρέξουμε έναν απλό βρόχο με σταθερότητα:

συμβόλαιο BasicIterator

{

δημιουργός διευθύνσεων; // κρατήστε ένα "διεύθυνση"-τύπος σημείου

uint8 [10] ακέραιοι αριθμοί // δεσμεύστε ένα μέρος αποθήκευσης για 10 8-bit μη υπογεγραμμένους ακέραιους αριθμούς σε έναν πίνακα

συνάρτηση BasicIterator ()

{

δημιουργός = msg.sender;

uint8 x = 0;

// Ενότητα 1: Εκχώρηση τιμών

ενώ (x < integers.length) {

ακέραιοι αριθμοί [x] = x;

x ++;

}}

συνάρτηση getSum () σταθερές επιστροφές (uint) {

uint8 άθροισμα = 0;

uint8 x = 0;

// Ενότητα 2: Προσθήκη ακεραίων σε πίνακα.

ενώ (x < integers.length) {

άθροισμα = άθροισμα + ακέραιοι [x];

x ++;

}

ποσό επιστροφής;

}

// Ενότητα 3: Σκοτώνοντας τη σύμβαση

λειτουργία kill ()

{

εάν (msg.sender == δημιουργός)

{

αυτοκτονία (δημιουργός)

}

}

}

Ας αναλύσουμε λοιπόν.

Ενότητα 1: Εκχώρηση τιμών

Στο πρώτο βήμα, συμπληρώνουμε έναν πίνακα που ονομάζεται “ακέραιοι αριθμοί”, ο οποίος λαμβάνει 10 ακέραιοι αριθμούς 8-bit. Ο τρόπος που το κάνουμε είναι μέσω ενός βρόχου. Ας δούμε τι συμβαίνει στο βρόχο while.

ενώ (x < integers.length) {

ακέραιοι αριθμοί [x] = x;

x ++;

}

Θυμηθείτε, έχουμε ήδη αντιστοιχίσει μια τιμή “0” στον ακέραιο x. Ο βρόχος while πηγαίνει από 0 σε integers.length. Το Integers.length είναι μια συνάρτηση που επιστρέφει τη μέγιστη χωρητικότητα του πίνακα. Έτσι, εάν αποφασίσαμε ότι ένας πίνακας θα έχει 10 ακέραιους αριθμούς, το arrayname.length θα επιστρέψει μια τιμή 10. Στο βρόχο παραπάνω, η τιμή του x πηγαίνει από 0 – 9 (<10) και εκχωρεί την ίδια την τιμή στον πίνακα ακέραιων αριθμών. Έτσι, στο τέλος του βρόχου, οι ακέραιοι αριθμοί θα έχουν την ακόλουθη τιμή:

0,1,2,3,4,5,6,7,8,9.

Ενότητα 2: Προσθήκη περιεχομένου πίνακα

Μέσα στη συνάρτηση getSum () πρόκειται να προσθέσουμε τα περιεχόμενα του ίδιου του πίνακα. Ο τρόπος που θα το κάνουμε είναι επαναλαμβάνοντας το ίδιο ενώ βρόχος όπως παραπάνω και χρησιμοποιώντας τη μεταβλητή “άθροισμα” για να προσθέσουμε τα περιεχόμενα του πίνακα.

Ενότητα 3: Δολοφονία της σύμβασης

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

Όταν ρωτήθηκε για το ποια ήταν η έμπνευση και το κίνητρο πίσω από τη δημιουργία σταθερότητας, ο Δρ Gavin Woods το είπε:

«Το [Solidity] προοριζόταν να είναι ένα εξελιγμένο εργαλείο για την ανάπτυξη συμβολαίων που θα μπορούσε τελικά να δώσει στους προγραμματιστές και στους χρήστες καλές πληροφορίες για το τι έκανε ο κώδικας. Για να το βοηθήσω αυτό, επινόησα το NatSpec, μια μορφή τεκμηρίωσης φιλική προς τις συμβάσεις και την έκανα έναν πολίτη πρώτης κατηγορίας στο Solidity. Πρότεινα επίσης ένα επίσημο υποσύνολο γλωσσικών δοκιμών (δεν έχει ακόμη εφαρμοστεί) προκειμένου να μεγιστοποιήσω τα είδη εγγυήσεων ορθότητας που θα μπορούσαν να.

Εισήγαγα τις εκδηλώσεις ως πολίτης πρώτης κατηγορίας στη γλώσσα Solidity για να προσφέρω μια ωραία αφαίρεση για LOGs παρόμοια με τη μορφή κλήσεων λειτουργίας. Η έμπνευση για αυτό προήλθε από τα «σήματα» του συστήματος μετα-αντικειμένων Qt.

Ένα αργότερο χαρακτηριστικό που ο Christian R. και εγώ καταλάβαμε μαζί ήταν τροποποιητές λειτουργίας. που επιτρέπει τα χαρακτηριστικά που τοποθετούνται ως μέρος μιας υπογραφής συνάρτησης να κάνουν κάποιες τροποποιήσεις στο φαινόμενο σώμα λειτουργίας. Όντας ένα πολύ δηλωτικό μέσο έκφρασης, είναι ένα ιδίωμα που εμπίπτει ωραία στον χώρο προγραμματισμού με προσανατολισμό στη σύμβαση. “

Κωδικοποίηση Blockchain: Συμπέρασμα

Σε αυτό το άρθρο, έχουμε καλύψει μόνο 4 γλώσσες για κωδικοποίηση blockchain που χρησιμοποιούνται στην ανάπτυξη εντός και γύρω από το blockchain. Στην πραγματικότητα, υπάρχουν πολλές ακόμη γλώσσες που μπορείτε ενδεχομένως να χρησιμοποιήσετε (Java, Go). Εάν είστε προγραμματιστής, τότε οι δυνατότητες για εσάς είναι πραγματικά ατελείωτες. Καθώς ο κόσμος γίνεται όλο και πιο αποκεντρωμένος και το blockchain γίνεται όλο και πιο mainstream, το μέλλον για εσάς είναι σίγουρα απεριόριστο.

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me
Like this post? Please share to your friends:
map