Πώς να δημιουργήσετε το δικό σας Cryptocurrency χρησιμοποιώντας το Python

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

Ουσιαστικά, ένα blockchain είναι μια δημόσια βάση δεδομένων που τεκμηριώνει αμετάκλητα και επικυρώνει την κατοχή και τη μετάδοση ψηφιακών στοιχείων. Τα ψηφιακά νομίσματα, όπως το Bitcoin και το Ethereum, βασίζονται σε αυτήν την ιδέα. Το Blockchain είναι μια συναρπαστική τεχνολογία που μπορείτε να χρησιμοποιήσετε για να μετατρέψετε τις δυνατότητες των εφαρμογών σας.

Αργά, βλέπουμε κυβερνήσεις, οργανισμούς και άτομα να χρησιμοποιούν την τεχνολογία blockchain για να δημιουργήσουν τα δικά τους κρυπτονομίσματα και να αποφύγουμε να μείνουμε πίσω. Συγκεκριμένα, όταν το Facebook πρότεινε τη δική του κρυπτογράφηση, που ονομάζεται Libra, η ανακοίνωση προκάλεσε πολλά νερά σε όλο τον κόσμο.

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

Το σκέφτηκα και αποφάσισα να αναπτύξω έναν αλγόριθμο που δημιουργεί ένα crypto.

Αποφάσισα να καλέσω το cryptocurrency fccCoin .

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

Εδώ είναι το βασικό σχέδιο του αλγορίθμου blockchain για τη δημιουργία του fccCoin :

class Block: def __init__(): #first block class pass def calculate_hash(): #calculates the cryptographic hash of every block class BlockChain: def __init__(self): # constructor method pass def construct_genesis(self): # constructs the initial block pass def construct_block(self, proof_no, prev_hash): # constructs a new block and adds it to the chain pass @staticmethod def check_validity(): # checks whether the blockchain is valid pass def new_data(self, sender, recipient, quantity): # adds a new transaction to the data of the transactions pass @staticmethod def construct_proof_of_work(prev_proof): # protects the blockchain from attack pass @property def last_block(self): # returns the last block in the chain return self.chain[-1] 

Τώρα, επιτρέψτε μου να εξηγήσω τι συμβαίνει…

1. Δημιουργία της πρώτης κατηγορίας Block

Ένα blockchain αποτελείται από πολλά μπλοκ που ενώνονται μεταξύ τους (ακούγεται οικείο, έτσι;).

Η αλυσίδα των μπλοκ γίνεται έτσι ώστε εάν ένα μπλοκ αλλοιωθεί, η υπόλοιπη αλυσίδα καθίσταται άκυρη.

Εφαρμόζοντας την παραπάνω ιδέα, δημιούργησα την ακόλουθη αρχική κατηγορία μπλοκ:

import hashlib import time class Block: def __init__(self, index, proof_no, prev_hash, data, timestamp=None): self.index = index self.proof_no = proof_no self.prev_hash = prev_hash self.data = data self.timestamp = timestamp or time.time() @property def calculate_hash(self): block_of_string = "{}{}{}{}{}".format(self.index, self.proof_no, self.prev_hash, self.data, self.timestamp) return hashlib.sha256(block_of_string.encode()).hexdigest() def __repr__(self): return "{} - {} - {} - {} - {}".format(self.index, self.proof_no, self.prev_hash, self.data, self.timestamp) 

Όπως μπορείτε να δείτε από τον παραπάνω κώδικα, ορίσαμε τη συνάρτηση __init __ () , η οποία θα εκτελεστεί όταν ξεκινά η κλάση Block , όπως και σε οποιαδήποτε άλλη κλάση Python.

Παρέχω τις ακόλουθες παραμέτρους στη λειτουργία έναρξης:

  • self - αυτό αναφέρεται στην παρουσία της κλάσης Block , καθιστώντας δυνατή την πρόσβαση στις μεθόδους και τα χαρακτηριστικά που σχετίζονται με την κλάση.
  • ευρετήριο - αυτό παρακολουθεί τη θέση του μπλοκ μέσα στο blockchain.
  • proof_no — αυτός είναι ο αριθμός που παράγεται κατά τη δημιουργία ενός νέου μπλοκ (που ονομάζεται εξόρυξη).
  • prev_hash - αυτό αναφέρεται στο κατακερματισμό του προηγούμενου μπλοκ εντός της αλυσίδας.
  • δεδομένα - αυτό δίνει μια καταγραφή όλων των συναλλαγών που έχουν ολοκληρωθεί, όπως η ποσότητα που αγοράστηκε.
  • timestamp - αυτό τοποθετεί μια χρονική σήμανση για τις συναλλαγές.

Η δεύτερη μέθοδος στην τάξη, calcul_hash , θα δημιουργήσει το κατακερματισμό των μπλοκ χρησιμοποιώντας τις παραπάνω τιμές. Η μονάδα SHA-256 εισάγεται στο έργο για να βοηθήσει στην απόκτηση των κατακερματισμών των μπλοκ.

Αφού οι τιμές έχουν εισαχθεί στον αλγόριθμο κρυπτογραφικού κατακερματισμού, η συνάρτηση θα επιστρέψει μια συμβολοσειρά 256-bit που αντιπροσωπεύει τα περιεχόμενα του μπλοκ.

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

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

Τελικά, ένα μπλοκ θα μοιάζει με αυτό:

{ "index": 2, "proof": 21, "prev_hash": "6e27587e8a27d6fe376d4fd9b4edc96c8890346579e5cbf558252b24a8257823", "transactions": [ {'sender': '0', 'recipient': 'Quincy Larson', 'quantity': 1} ], "timestamp": 1521646442.4096143 } 

2. Δημιουργία της κατηγορίας Blockchain

Η κύρια ιδέα ενός blockchain, όπως υποδηλώνει το όνομα, περιλαμβάνει την «αλυσοδεσία» πολλών μπλοκ μεταξύ τους.

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

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

Επιτρέψτε μου να εξηγήσω τον ρόλο κάθε μεθόδου στην τάξη.

ένα. Μέθοδος κατασκευαστή

Αυτή η μέθοδος διασφαλίζει ότι το blockchain έχει δημιουργηθεί.

class BlockChain: def __init__(self): self.chain = [] self.current_data = [] self.nodes = set() self.construct_genesis() 

Εδώ είναι οι ρόλοι των χαρακτηριστικών του:

  • self.chain - αυτή η μεταβλητή διατηρεί όλα τα μπλοκ.
  • self.current_data - αυτή η μεταβλητή διατηρεί όλες τις ολοκληρωμένες συναλλαγές στο μπλοκ.
  • self.construct_genesis () - αυτή η μέθοδος θα φροντίσει για την κατασκευή του αρχικού μπλοκ.

σι. Κατασκευή του μπλοκ γένεσης

Η blockchain απαιτεί μια construct_genesis μέθοδο για την κατασκευή του αρχικού μπλοκ στην αλυσίδα. Στη σύμβαση blockchain, αυτό το block είναι ειδικό γιατί συμβολίζει την έναρξη του blockchain.

Σε αυτή την περίπτωση, ας το κατασκευάσει με απλά περνώντας κάποιες προκαθορισμένες τιμές στο construct_block μέθοδο.

Έδωσα στο proof_no και prev_hash μια τιμή μηδέν, αν και μπορείτε να δώσετε οποιαδήποτε τιμή θέλετε.

def construct_genesis(self): self.construct_block(proof_no=0, prev_hash=0) def construct_block(self, proof_no, prev_hash): block = Block( index=len(self.chain), proof_no=proof_no, prev_hash=prev_hash, data=self.current_data) self.current_data = [] self.chain.append(block) return block 

ντο. Κατασκευή νέων μπλοκ

Η construct_block μέθοδος χρησιμοποιείται για τη δημιουργία νέων μπλοκ στο blockchain.

Εδώ είναι τι συμβαίνει με τα διάφορα χαρακτηριστικά αυτής της μεθόδου:

  • ευρετήριο - αυτό αντιπροσωπεύει το μήκος του blockchain.
  • proof_nor & prev_hash - η μέθοδος καλούντος τους περνά.
  • δεδομένα - περιέχει μια εγγραφή όλων των συναλλαγών που δεν περιλαμβάνονται σε κανένα μπλοκ στον κόμβο.
  • self.current_data - χρησιμοποιείται για την επαναφορά της λίστας συναλλαγών στον κόμβο. Εάν έχει δημιουργηθεί ένα μπλοκ και οι συναλλαγές κατανέμονται σε αυτόν, η λίστα επαναφέρεται για να διασφαλιστεί ότι μελλοντικές συναλλαγές θα προστεθούν σε αυτήν τη λίστα. Και, αυτή η διαδικασία θα πραγματοποιείται συνεχώς.
  • self.chain.append () - αυτή η μέθοδος ενώνει νεόκτιστα μπλοκ στην αλυσίδα.
  • επιστροφή - τελευταία, επιστρέφεται ένα δομημένο αντικείμενο.

ρε. Έλεγχος εγκυρότητας

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

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

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

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

@staticmethod def check_validity(block, prev_block): if prev_block.index + 1 != block.index: return False elif prev_block.calculate_hash != block.prev_hash: return False elif not BlockChain.verifying_proof(block.proof_no, prev_block.proof_no): return False elif block.timestamp <= prev_block.timestamp: return False return True 

μι. Προσθήκη δεδομένων συναλλαγών

Η μέθοδος new_data χρησιμοποιείται για την προσθήκη των δεδομένων συναλλαγών σε ένα μπλοκ. Είναι μια πολύ απλή μέθοδος: δέχεται τρεις παραμέτρους (λεπτομέρειες αποστολέα, λεπτομέρειες παραλήπτη και ποσότητα) και προσαρτά τα δεδομένα συναλλαγών στη λίστα self.current_data .

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

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

Αυτός ο δείκτης υπολογίζεται προσθέτοντας 1 στο ευρετήριο του τρέχοντος μπλοκ (που είναι το τελευταίο στο blockchain). Τα δεδομένα θα βοηθήσουν έναν χρήστη στην υποβολή της συναλλαγής στο μέλλον.

def new_data(self, sender, recipient, quantity): self.current_data.append({ 'sender': sender, 'recipient': recipient, 'quantity': quantity }) return True 

φά. Προσθήκη απόδειξης εργασίας

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

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

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

@staticmethod def proof_of_work(last_proof): '''this simple algorithm identifies a number f' such that hash(ff') contain 4 leading zeroes f is the previous f' f' is the new proof ''' proof_no = 0 while BlockChain.verifying_proof(proof_no, last_proof) is False: proof_no += 1 return proof_no @staticmethod def verifying_proof(last_proof, proof): #verifying the proof: does hash(last_proof, proof) contain 4 leading zeroes? guess = f'{last_proof}{proof}'.encode() guess_hash = hashlib.sha256(guess).hexdigest() return guess_hash[:4] == "0000" 

σολ. Να πάρει το τελευταίο μπλοκ

Lastly, the latest_blockmethod is a helper method that assists in obtaining the last block in the blockchain. Remember that the last block is actually the current block in the chain.

@property def latest_block(self): return self.chain[-1] 

Let’s sum everything together

Here is the entire code for creating the fccCoin cryptocurrency.

You can also get the code on this GitHub repository.

import hashlib import time class Block: def __init__(self, index, proof_no, prev_hash, data, timestamp=None): self.index = index self.proof_no = proof_no self.prev_hash = prev_hash self.data = data self.timestamp = timestamp or time.time() @property def calculate_hash(self): block_of_string = "{}{}{}{}{}".format(self.index, self.proof_no, self.prev_hash, self.data, self.timestamp) return hashlib.sha256(block_of_string.encode()).hexdigest() def __repr__(self): return "{} - {} - {} - {} - {}".format(self.index, self.proof_no, self.prev_hash, self.data, self.timestamp) class BlockChain: def __init__(self): self.chain = [] self.current_data = [] self.nodes = set() self.construct_genesis() def construct_genesis(self): self.construct_block(proof_no=0, prev_hash=0) def construct_block(self, proof_no, prev_hash): block = Block( index=len(self.chain), proof_no=proof_no, prev_hash=prev_hash, data=self.current_data) self.current_data = [] self.chain.append(block) return block @staticmethod def check_validity(block, prev_block): if prev_block.index + 1 != block.index: return False elif prev_block.calculate_hash != block.prev_hash: return False elif not BlockChain.verifying_proof(block.proof_no, prev_block.proof_no): return False elif block.timestamp <= prev_block.timestamp: return False return True def new_data(self, sender, recipient, quantity): self.current_data.append({ 'sender': sender, 'recipient': recipient, 'quantity': quantity }) return True @staticmethod def proof_of_work(last_proof): '''this simple algorithm identifies a number f' such that hash(ff') contain 4 leading zeroes f is the previous f' f' is the new proof ''' proof_no = 0 while BlockChain.verifying_proof(proof_no, last_proof) is False: proof_no += 1 return proof_no @staticmethod def verifying_proof(last_proof, proof): #verifying the proof: does hash(last_proof, proof) contain 4 leading zeroes? guess = f'{last_proof}{proof}'.encode() guess_hash = hashlib.sha256(guess).hexdigest() return guess_hash[:4] == "0000" @property def latest_block(self): return self.chain[-1] def block_mining(self, details_miner): self.new_data( sender="0", #it implies that this node has created a new block receiver=details_miner, quantity= 1, #creating a new block (or identifying the proof number) is awarded with 1 ) last_block = self.latest_block last_proof_no = last_block.proof_no proof_no = self.proof_of_work(last_proof_no) last_hash = last_block.calculate_hash block = self.construct_block(proof_no, last_hash) return vars(block) def create_node(self, address): self.nodes.add(address) return True @staticmethod def obtain_block_object(block_data): #obtains block object from the block data return Block( block_data['index'], block_data['proof_no'], block_data['prev_hash'], block_data['data'], timestamp=block_data['timestamp']) 

Now, let’s test our code to see if it works.

blockchain = BlockChain() print("***Mining fccCoin about to start***") print(blockchain.chain) last_block = blockchain.latest_block last_proof_no = last_block.proof_no proof_no = blockchain.proof_of_work(last_proof_no) blockchain.new_data( sender="0", #it implies that this node has created a new block recipient="Quincy Larson", #let's send Quincy some coins! quantity= 1, #creating a new block (or identifying the proof number) is awarded with 1 ) last_hash = last_block.calculate_hash block = blockchain.construct_block(proof_no, last_hash) print("***Mining fccCoin has been successful***") print(blockchain.chain) 

It worked!

Here is the output of the mining process:

***Mining fccCoin about to start*** [0 - 0 - 0 - [] - 1566930640.2707076] ***Mining fccCoin has been successful*** [0 - 0 - 0 - [] - 1566930640.2707076, 1 - 88914 - a8d45cb77cddeac750a9439d629f394da442672e56edfe05827b5e41f4ba0138 - [{'sender': '0', 'recipient': 'Quincy Larson', 'quantity': 1}] - 1566930640.5363243] 

Conclusion

There you have it!

That’s how you could create your own blockchain using Python.

Let me say that this tutorial just demonstrates the basic concepts for getting your feet wet in the innovative blockchain technology.

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

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

Ωστόσο, είναι ένα καλό σημείο εκκίνησης εάν αποφασίσετε να κάνετε το όνομά σας γνωστό στον εκπληκτικό κόσμο των κρυπτογράφησης.

Εάν έχετε σχόλια ή ερωτήσεις, δημοσιεύστε τα παρακάτω.

Ευτυχής κωδικοποίηση (crypto)!