Free Bitcoins: FreeBitcoin | BonusBitcoin
Coins Kaufen: Bitcoin.de | AnycoinDirekt | Coinbase | CoinMama (mit Kreditkarte) | Paxfull
Handelsplätze / Börsen: Bitcoin.de | KuCoin | Binance | BitMex | Bitpanda | eToro
Lending / Zinsen erhalten: Celsius Network | Coinlend (Bot)
Cloud Mining: Hashflare | Genesis Mining | IQ Mining
Heute werden wir unsere eigene grundlegende, dezentrale Kryptowährungsimplementierung mithilfe der Blockchain-Technologie und Python vornehmen.
Wir können jede objektorientierte Programmiersprache verwenden, und ich werde Python verwenden.
Das Wichtigste, worauf sich die meisten Kryptowährungen verlassen, ist Blockchain. Eine Blockchain ist einfach eine Kette, die ein Block ist. Und ein Block ist eine Datenstruktur, die Informationen enthält, z. B. Transaktionen. Jeder Block hat auch einen eigenen Hash und den Hash des vorherigen Blocks in der Kette. Ein Hash ist eine eindeutige Kennung, die dem Namen einer Person ähnelt (wenn keiner den gleichen Namen hat). Wenn wir eine Reihe von Personen haben und jede Person ihren eigenen Namen und den Namen der Person kennt, die sich in der Reihe befindet, wird die Reihe gespeichert und kann jederzeit neu erstellt werden. So erstellen und speichern wir die Blockchain.
Um eine Blockchain zu erstellen, erstellen wir für jedes der folgenden Elemente eine Klasse:
Klasse Blockchain (Objekt):
def __init __ (self):Klasse Block (Objekt):
def __init __ (self):Klasse Transaktion (Objekt):
def __init __ (self):
Dann werden wir einige wichtige Daten sowie eine Hashing-Funktion hinzufügen.
Wieder ein hash ist ein eindeutiger Bezeichner, und jeder Block und jede Transaktion benötigt einen, damit wir ihn identifizieren können. Wir berechnen den Hash mithilfe eines kryptografischen Hash-Algorithmus namens SHA256, der derselbe von Bitcoin verwendete Encoder ist. Der Hash wird von allen Daten in jedem Block oder jeder Transaktion bestimmt. Wenn also etwas manipuliert oder geändert wird, z. B. der Betrag in einer Transaktion, ändert sich auch der Hash, und wir wissen, dass etwas nicht stimmt.
Klasse Blockchain (Objekt):
def __init __ (self):
self.chain = []; #Blockchain ist ein Array von BlöckenKlasse Block (Objekt):
def __init __ (Selbst, Transaktionen, Zeit, Index):
self.index = index; #Blocknummer
self.transactions = Transaktionen; #Transaktionsdaten
self.time = time; #Zeitblock wurde erstellt
self.prev = ''; #Hash des vorherigen Blocks
self.hash = self.calculateHash (); #Hash of Block def calculatorHash (self):
hashTransactions = "";
für die Transaktion in self.transactions:
hashTransactions + = transaction.hash; hashString = str (self.time) + hashTransactions + self.prev + str (self.index) + str (self.nonse);
hashEncoded = json.dumps (hashString, sort_keys = True) .encode ();
return hashlib.sha256 (hashEncoded) .hexdigest ();Klasse Transaktion (Objekt):
def __init __ (self, sender, reciever, amt):
self.sender = sender;
self.reciever = Empfänger;
self.amt = amt;
self.time = time ();
self.hash = self.calculateHash (); def calculatorHash (self):
hashString = self.sender + self.reciever + str (self.amt) + str (self.time);
hashEncoded = json.dumps (hashString, sort_keys = True) .encode ();
return hashlib.sha256 (hashEncoded) .hexdigest ();
Dann müssen wir eine Funktion erstellen, um der Blockchain Blöcke hinzuzufügen:
Klasse Blockchain (Objekt):
...
def getLastBlock (self):
return self.chain[-1]; def addBlock (self, block):
if (len (self.chain)> 0):
block.prev = self.getLastBlock (). hash;
sonst:
block.prev = "none";
self.chain.append (block);
Wenn wir dies testen, indem wir eine Instanz einer Blockchain erstellen und ihr in einem Testskript 3 leere Blöcke hinzufügen, erhalten wir:
Wie wir sehen können, wurde eine Blockchain erfolgreich erstellt und wir haben 3 Blöcke mit einem eigenen Hash und dem Hash des vorherigen Blocks in der Kette.
Denken Sie daran, dass sich auch der Hash des manipulierten Blocks ändern würde, wenn jemand Daten in der Blockkette ändern würde, wodurch die Kette unterbrochen würde. Wenn also jemand den Wert einer Transaktion ändert, um ihm mehr Geld zu geben, würde dies die Kette unterbrechen. Wenn diese Person jedoch die Hashes jedes Blocks in der Kette neu berechnet, kann sie daraus wieder eine gültige Blockchain erstellen, die die manipulierten Daten enthält. Dies ist sehr gut mit einem Computer möglich, der die Hashwerte des Blocks und des vorherigen Blocks in Sekunden neu berechnen kann.
Damit dies nicht passiert, basiert die Blockchain-Technologie auf dem so genannten Proof-of-Work-Algorithmus.
Der einfachste Weg für mich, dies zu verstehen, bestand darin, mir vorzustellen, dass wir drei Variablen haben: x, y und z. Wir haben z, kennen y nicht und müssen einen Wert x so finden, dass x * y = z. Um dies zu lösen, sollten wir zunächst einen beliebigen Wert für x erraten, z. B. 1. Wir multiplizieren 1 * y und erhalten die Rückmeldung, wenn dieser Wert gleich z ist. Wenn dies nicht der Fall ist, sollten wir einen anderen Wert für x versuchen, z. B. 2. Wir multiplizieren 2 * x und sehen, ob es gleich z ist. Wir tun dies für jeden möglichen Wert von x, bis wir x * y = z erhalten. Dieser Vorgang wird aufgerufen rohe Gewalt, bei dem wir jeden Versuch berechnen, bis wir zufällig die richtige Antwort berechnen. Sobald wir diesen Wert für x erhalten haben, speichern wir ihn in unserem Block, was sich auf den Hash auswirkt (und ihn zum richtigen macht).
Beachten Sie, dass dies ein sehr einfaches Beispiel ist und nicht implementiert werden würde, da es zu schnell ist, um es zu lösen. Ein Beispiel für eines, das tatsächlich verwendet werden würde, ist das Folgende: Aber ja, ein Proof-of-Work-Algorithmus stellt sicher, dass sich das Umschreiben der gesamten Blockchain nicht lohnt, da wir ein neues 'x' lösen müssten (das tatsächlich aufgerufen wird) 'nonce' in diesem Kontext) für jeden Block und es würde ein dauern sehr lange Zeit.
Der Prozess der Lösung dieses Proof-of-Work, um einen neuen Block für unsere Krypowährung zu erstellen, wird aufgerufen Bergbau. Für unsere Kryptowährung habe ich einen Proof-of-Work-Algorithmus implementiert, der einen variablen Unsinn auflöst, sodass der Hash des Blocks mit "1234" beginnt.
Klasse Blockchain (Objekt):
def __init __ (self):
self.chain = [self.addGenesisBlock()];
self.pendingTransactions = [];
Selbstschwierigkeit = 4;
self.minerRewards = 50;
self.blockSize = 10; def addTransaction (self, sender, reciever, amt, keyString, senderKey):
keyByte = keyString.encode ("ASCII");
senderKeyByte = senderKey.encode ("ASCII"); #print (type (keyByte), keyByte); key = RSA.import_key (keyByte);
senderKey = RSA.import_key (senderKeyByte); wenn nicht absender oder nicht empfänger oder nicht amt:
print ("Transaktionsfehler 1");
falsch zurückgeben; transaction = Transaktion (Absender, Empfänger, amt); transaction.signTransaction (key, senderKey); wenn nicht transaction.isValidTransaction ():
print ("Transaktionsfehler 2");
falsch zurückgeben;
self.pendingTransactions.append (Transaktion);
return len (self.chain) + 1;Klasse Block (Objekt):
...
def mineBlock (Selbst, Schwierigkeit):
arr = [];
für i in range (0, schwierigkeit):
arr.append (i + 1);#compute bis zum Beginn des Hash = 0123..Schwierigkeit
arrStr = map (str, arr);
hashPuzzle = '' .join (arrStr);
#print (len (hashPuzzle));
während self.hash[0:difficulty] ! = hashPuzzle:
self.nonse + = 1;
self.hash = self.calculateHash ();
'' '
print ("Nonse:", self.nonse);
print ("Hash-Versuch:", self.hash);
print ("Hash We Want:", hashPuzzle, "...");
drucken("");
#schlaf (0,8);
'' '
drucken("");
print ("Block Mined! Nonse zum Lösen des Arbeitsnachweises:", self.nonse);
return True;
Wenn wir dies testen, indem wir einen neuen Block mit seinen eigenen Transaktionen abbauen, erhalten wir:
So funktioniert es! Als wir den Block abgebaut haben, stellte sich heraus, dass die Lösung für nonce 61601 war, was dazu führen würde, dass der Hash des Blocks mit 1234 beginnt.
Jetzt müssen wir überprüfen können, ob jede von uns getätigte Transaktion gültig ist. Wir werden dies genauso tun, wie die Leute ihre Schecks im wirklichen Leben unterschreiben, um sie gültig zu machen.
Zu diesem Zweck weisen Krypowährungen jeder "Geldbörse" oder jedem Benutzer einen eigenen Satz eindeutiger Schlüssel zu: einen privaten Schlüssel und einen öffentlichen Schlüssel. Mit diesen Schlüsseln können Benutzer ihre Transaktionen signieren, um sie gültig zu machen. Um dies zu implementieren, verwenden wir eine Python-Bibliothek namens PyCryptoDome. Der Verschlüsselungsalgorithmus, mit dem wir diese Schlüssel generieren, heißt RSA (Rivest-Shamir-Adleman)..
Klasse Blockchain (Objekt):
...
def addTransaction (self, sender, reciever, amt, keyString, senderKey):
keyByte = keyString.encode ("ASCII");
senderKeyByte = senderKey.encode ("ASCII"); key = RSA.import_key (keyByte);
senderKey = RSA.import_key (senderKeyByte); wenn nicht absender oder nicht empfänger oder nicht amt:
print ("Transaktionsfehler 1");
falsch zurückgeben; transaction = Transaktion (Absender, Empfänger, amt); transaction.signTransaction (key, senderKey); wenn nicht transaction.isValidTransaction ():
print ("Transaktionsfehler 2");
falsch zurückgeben;
self.pendingTransactions.append (Transaktion);
return len (self.chain) + 1; def generateKeys (self):
key = RSA.generate (2048)
private_key = key.export_key ()
file_out = open ("private.pem", "wb")
file_out.write (private_key) public_key = key.publickey (). export_key ()
file_out = open ("receiver.pem", "wb")
file_out.write (public_key)#print (key.export_key ());
Klasse Transaktion (Objekt):
return key.publickey (). export_key (). decode ('ASCII');
...
def signTransaction (self, key, senderKey):
if (self.hash! = self.calculateHash ()):
print ("Transaktionsmanipulationsfehler");
falsch zurückgeben;
if (str (key.publickey (). export_key ())! = str (senderKey.publickey (). export_key ())):
print ("Transaktionsversuch, von einer anderen Brieftasche signiert zu werden");
falsch zurückgeben; self.signature = "gemacht";
#print (key.sign (self.hash, ""));
print ("Made Signature!");
return True; def isValidTransaction (self):
if (self.hash! = self.calculateHash ()):
falsch zurückgeben;
if (self.sender == self.reciever):
falsch zurückgeben;
if (self.sender == "Miner Rewards"):
return True;
wenn nicht self.signature oder len (self.signature) == 0:
print ("Keine Unterschrift!")
falsch zurückgeben;
return True;
Wenn wir eine neue Brieftasche erstellen und Schlüssel generieren, erhalten wir:
Wenn wir nun Transaktionen durchführen, überprüfen wir, ob diese mit diesen Schlüsseln gültig sind, wie im Code angegeben.
Schließlich ist das Wichtigste an der Kryptowährung und der Blockchain-Technologie, dass es sich um Relies handelt Dezentralisierung. Dies bedeutet, dass es sich nicht auf einen zentralen Kontrollpunkt stützt, sondern auf einen Peer-to-Peer-Netzwerk.
Ein Beispiel für ein zentrales System ist eine Bank. Es ist zentralisiert, da es sowohl Ihr gesamtes Geld als auch alle Daten zu Transaktionen speichert besitzen Datenbank, die sie überprüfen unabhängig. Sie vertrauen der Bank mit Ihrem Geld.
Bei einem dezentralen System wie einem Peer-to-Peer-Netzwerk (P2P) sind die Verantwortlichkeiten für die Speicherung und Überprüfung von Daten auf die Personen verteilt. In Bezug auf die Blockchain hat jeder in diesem P2P-Netzwerk, der für jeden offen ist, eine Kopie der vollständigen Blockchain. Das macht es zu einem verteiltes Hauptbuch, wo Daten von mehreren Knoten geöffnet und gespeichert werden.
Wenn ein neuer Block zur Blockkette hinzugefügt werden muss, überprüft jede Person, ob es in Ordnung ist, ihn zur Kette hinzuzufügen, und fügt ihn ihrer eigenen Version der Blockkette hinzu. Wenn alles auscheckt und wir über 50% des Netzwerks verfügen, das dieser neuen Version der Blockchain zustimmt, dann haben wir Konsensoder Mehrheitsvereinbarung. Wenn wir uns über eine neue Version der Blockchain einig sind, wird diese neue Version zur akzeptierten Blockchain.
Wenn jemand Daten in der Blockchain ändern würde, würde sich seine Version von derjenigen unterscheiden, die von der Mehrheit des Netzwerks akzeptiert wird, und er / sie wäre nicht in der Lage, diese Änderung in die echte, akzeptierte Blockchain zu übernehmen.
Um dies zu implementieren, registrieren wir jeden Benutzer unserer Kryptowährung als Knoten:
Klasse Blockchain (Objekt):
...
def register_node (self, address):
parsedUrl = urlparse (Adresse);
self.nodes.add (parsedUrl.netloc);
Und für die Konsensüberprüfung halten wir es zu Testzwecken einfach und sagen, dass die längste Blockchain im Peer-to-Peer-Netzwerk die richtige Version ist.
Klasse Blockchain (Objekt):
...
def resolveConflicts (self):
Nachbarn = self.nodes;
newChain = None; maxLength = len (self.chain); für Knoten in Nachbarn:
response = orders.get (f'http: // {node} / chain '); if response.status_code == 200:
length = response.json ()['length'];
chain = response.json ()['chain']; if length> maxLength und self.isValidChain ():
maxLength = length;
newChain = chain; wenn newChain:
self.chain = self.chainJSONdecode (newChain);
print (self.chain);
return True; falsch zurückgeben;
Wenn wir jetzt unsere Krypowährung auf zwei separaten Servern ausführen, was genau so ist, wie es wäre, wenn sie auf zwei verschiedenen Computern ausgeführt würde, können wir feststellen, dass unsere Blockchain jetzt dezentralisiert ist:
Wir haben gerade unsere eigene grundlegende Kryptowährung von Grund auf erstellt! Ich habe meine eigene benutzerfreundliche Oberfläche erstellt, um die Kryptowährung einfach zu verwenden und mit ihr zu interagieren. Vielleicht schreibe ich in Teil 2 darüber.
Als nächstes habe ich versucht, dies öffentlich zu machen und es mit einer Art Mitgliedschaft im Fitnessstudio in Verbindung zu bringen, aber es stellt sich heraus, dass dies bereits eine echte Sache in der Entwicklung ist! Ich finde das super cool und kann es kaum erwarten, zu sehen (und beizutragen), was Dezentralisierung und Kryptowährung uns in Zukunft bringen.
Aber ja, das ist so ziemlich alles. Wie immer kannst du den gesamten Code auf meinem Github überprüfen und mich jederzeit kontaktieren, wenn du Fragen oder Bedenken hast!
Free Bitcoins: FreeBitcoin | BonusBitcoin
Coins Kaufen: Bitcoin.de | AnycoinDirekt | Coinbase | CoinMama (mit Kreditkarte) | Paxfull
Handelsplätze / Börsen: Bitcoin.de | KuCoin | Binance | BitMex | Bitpanda | eToro
Lending / Zinsen erhalten: Celsius Network | Coinlend (Bot)
Cloud Mining: Hashflare | Genesis Mining | IQ Mining