Wenn wir uns die Trends der letzten Jahre ansehen, haben wir die ganze Zeit über Blockchain gehört, aber nicht viel über die Besonderheiten.
Wir alle wissen, dass Kryptowährungen wie Bitcoin, Ethereum, Dogecoin, Matic und andere auf der Blockchain-Technologie beruhen. Blockchain führte die bedeutenden Ereignisse an, die zahlreiche Branchen im Jahr 2021 revolutionierten und den Weg für neue Errungenschaften ebneten.
Blockchain ist ein Mittel, um Daten auf eine Weise zu speichern, die schwer oder unmöglich zu bearbeiten, zu hacken oder zu betrügen ist. Es ist ein digitales Hauptbuch von Transaktionen, die dupliziert und über das gesamte Netzwerk von Computersystemen der Blockchain verteilt werden.
Es ist die bahnbrechende Datenbanktechnologie, die praktisch alle Kryptowährungen antreibt. Blockchain macht es unglaublich schwierig, das System zu hacken oder zu betrügen, indem identische Kopien einer Datenbank über ein gesamtes Netzwerk verteilt werden.
Während Bitcoin heute die prominenteste Verwendung für Blockchain ist, kann die Technologie eine sehr breite Palette von Anwendungen bedienen.
Kryptowährungen und Blockchains sind in den letzten Jahren immer beliebter geworden, und dieser Trend wird sich voraussichtlich fortsetzen.
In diesem Tutorial erstellen wir eine einfache Blockchain mit JavaScript. Es wird Ihnen ein grundlegendes Verständnis dafür vermitteln, wie eine Blockchain funktioniert.
Nennen wir es MelodyCoin und steigen Sie direkt in die Action ein!
Erstellen eines Blocks
Zunächst erstellen wir eine neue JavaScript-Datei, in der wir unseren gesamten Code platzieren.
Nennen wir es main.js und beginnen mit einer Beschreibung, wie eine Blockchain und Blöcke aussehen sollten.
Erstellen Sie eine Block-Klasse und geben Sie ihr zunächst eine Funktion Object() { [native code] }.
Beim Erstellen eines neuen Blocks müssen Sie ein Datum und den Hash des vorherigen Blocks angeben:
Hier sind die Definitionen für jede Eigenschaft:
- Der Zeitstempel gibt an, wann die Sperrung vorgenommen wurde. Sie können ein beliebiges Format verwenden (in diesem Fall einen UNIX-Zeitstempel).
- Jede Form von Daten, die Sie mit diesem Block verbinden möchten, kann in den Datenparameter aufgenommen werden. Wenn Sie eine Kryptowährung erstellen möchten, können Sie hier Transaktionsdaten wie Sender/Empfänger und den bewegten Geldbetrag hinterlegen.
- Der previousHash ist eine Zeichenfolge, die den Hash des vorherigen Blocks enthält. Dies wird die Blockkette erzeugen, die später für die Integrität unserer Blockchain entscheidend sein wird.
Hashes erstellen
Jeder Block ist mit dem vorhergehenden Block verknüpft (daher die Eigenschaft previousHash). Das heißt, jeder Block erfordert einen Hash. Ein Hash ist vergleichbar mit einem Fingerabdruck. Es ist für jeden Block unterschiedlich.
Der Hash eines Blocks kann berechnet werden, indem sein gesamter Inhalt durch eine Hash-Funktion geleitet wird.
Beginnen wir also mit der Implementierung einer Funktion, die den Hash des aktuellen Blocks berechnet.
Also definieren wir unter der Klasse Block die Funktion computeHash:
Der SHA256-Hash wird jedoch nicht von JavaScript unterstützt und muss aus einer externen Bibliothek bezogen werden.
Crypto-js ist ein fantastisches Paket, das sichere Implementierungen mehrerer Hash-Algorithmen enthält.
Dann können wir es in unseren main.js-Code importieren.
Nun, da wir unsere computeHash()-Funktion haben, lassen Sie uns sie in der Funktion unseres Blocks verwenden:
Nachdem wir beschrieben haben, wie ein Block aussieht, können wir definieren, wie eine Blockchain aussehen sollte. Lassen Sie uns also eine neue Klasse erstellen.
In diesem Szenario ist die Blockchain ein sehr einfaches Objekt, das eine Eigenschaftskette hat. Dies ist ein Array, das alle Blöcke in der Kette enthält.
Bevor wir Blöcke hinzufügen können, müssen wir zunächst einen sogenannten „Genesis-Block“ erstellen. Dies ist der erste Block in der Kette, und er ist insofern einzigartig, als er nicht auf einen vorherigen Block zeigen kann (es ist der erste!).
Um also den Genesis-Block zu erstellen, füge ich unserer Klasse eine Funktion namens createGenesisBlock () hinzu. Zurück in der Funktion Object() { [native code] } unserer Blockchain-Klasse.
Wir können den Genesis-Block jetzt immer dann einbinden, wenn wir eine neue Blockchain-Instanz erstellen:
Blockchain-Methoden
Lassen Sie uns nun Methoden zu unserer Blockchain-Klasse hinzufügen, die es uns ermöglichen, Dinge wie das Hinzufügen neuer Blöcke und das Abrufen des neuesten Blocks zu tun.
Die getLatestBlock-Funktion ist die einfachste. Es gibt einfach das letzte Mitglied des Kettenarrays zurück:
Die addBlock-Technik ist etwas komplizierter.
Bevor wir unserer Kette einen neuen Block hinzufügen können, müssen wir zuerst das vorherigeHash-Feld dieses Blocks entsprechend setzen.
Es muss auf den Hash des zuletzt zu unserer Kette hinzugefügten Blocks gesetzt werden. Wir müssen auch den Hash des neuen Blocks berechnen:
Testen
Mal sehen, wie unser MelodyCoin herausgekommen ist.
Erstellen Sie dazu eine Blockchain-Instanz. Lassen Sie uns ein paar weitere Blöcke hinzufügen:
Wir haben dort zwei neue Blöcke gemacht. Werfen wir einen Blick darauf, wie unsere Blockchain derzeit aussieht.
MelodyCoin wird stringifiziert und mit vier Leerzeichen formatiert:
Überprüfen Sie die Integrität der Blockchain
Blockchains sind fantastisch, denn sobald ein Block hinzugefügt wurde, kann er nicht geändert werden, ohne den Rest der Kette ungültig zu machen.
Allerdings gibt es für mich keine Methode, um mit dieser Implementierung die Integrität unserer Blockchain zu prüfen.
Lassen Sie uns eine isChainValid-Funktion in unsere Blockchain einführen. Wenn die Kette legitim ist, wird sie true zurückgeben; andernfalls wird false zurückgegeben:
Integrität testen
Wir können jetzt die Integrität unserer Blockchain auf die Probe stellen. Wenn wir es jetzt ausführen, wird es bestätigen, dass unsere Kette echt ist.
Lassen Sie uns nun versuchen, unsere Blockchain zu manipulieren. Lassen Sie uns Block 2 ändern und seinen Inhalt überschreiben (nehmen wir an, wir haben 100 Münzen statt vier übertragen).
Wenn wir dies ausführen, können wir sehen, dass die Software unseren Versuch erkennt, die Kette zu manipulieren.
Sie können jedoch glauben, dass es eine andere Methode gibt, mit der ich mich einmischen kann. Ich habe den Inhalt des Blocks geändert, aber den Hash nicht neu berechnet. Sie können also versuchen, clever zu sein und den Hash desselben Blocks neu zu berechnen.
Das war alles, was zu unserem winzigen Blockchain-Setup gehörte! Es ermöglicht uns, neue Blöcke hinzuzufügen und Manipulationen an Daten innerhalb der Kette zu erkennen.
Es gibt zwei Probleme mit unserer kleinen Blockchain, die wir angehen müssen:
- Moderne Computer sind extrem schnell und können in Sekundenschnelle Tausende von Blöcken zu unserer Kette hinzufügen. Wir wollen natürlich nicht, dass jemand unsere Blockchain zuspammt.
- Unsere Blockchain ist immer noch anfällig für Manipulationen. Sie können den Inhalt eines Blocks aktualisieren und dann einfach die Hashes (und vorherigen Hashes) für alle folgenden Blöcke neu berechnen. Selbst wenn Sie damit herumspielen, erhalten Sie am Ende eine legitime Kette.
Um diese Bedenken auszuräumen, verwenden Blockchains eine Technik, die als „Arbeitsnachweis“ bekannt ist. Sie müssen nachweisen, dass Sie eine erhebliche Menge an Rechenressourcen verwendet haben, um einen Block mit diesem Ansatz zu erstellen. Dies wird auch genannt Bergbau.
Proof-of-Work erfordert, dass der Hash eines Blocks mit einer bestimmten Anzahl von Nullen beginnt. Aber wie können Sie wissen, ob Ihr Hash dieser Regel entspricht?
Der Inhalt eines Blocks bestimmt seinen Hash. Wir erhalten also immer den gleichen Hash, sofern wir den Inhalt nicht verändern.
Jedem Block sollte als Lösung ein Nonce-Wert hinzugefügt werden. Dies sind im Wesentlichen einige zufällige Daten, die wir aktualisieren können, bis der Hash unseres Blocks mit genügend Nullen beginnt. Da Sie die Ausgabe einer Hash-Funktion nicht ändern können, müssen Sie viele verschiedene Kombinationen testen und auf das Beste hoffen.
Einführung von Mining in die Blockchain
Beginnen wir damit, eine Nonce in unsere Block-Klasse aufzunehmen. Die Nonce ist der einzelne Wert in unserem Block, den wir ändern können, um den Hash des Blocks zu beeinflussen.
Wir sind nicht in der Lage, den Zeitstempel oder die Daten zu ändern.
Als Nächstes schreiben wir eine mineBlock()-Funktion, die das eigentliche Mining eines Blocks durchführt. Diese Funktion erhält die benötigte Schwierigkeit als Parameter und wird so lange ausgeführt, bis der Hash unseres Blocks mit genügend Nullen beginnt.
Ich habe gerade eine einfache While-Schleife erstellt, die ausgeführt wird, bis unser Hash mit genügend Nullen beginnt. Wir verwenden die Schwierigkeit, um zu bestimmen, wie viele Nullen benötigt werden. Bei einer Schwierigkeit von 5 muss unser Hash mit 5 Nullen beginnen.
Wenn unser Hash nicht genügend Nullen enthält, erhöhen wir die Nonce um eins und berechnen den Hash neu. Und wenn wir einen Hash finden, der der Schwierigkeit entspricht, protokollieren wir ihn auf der Konsole.
Es gibt noch eine Sache, die wir tun müssen. Wir berücksichtigen die Nonce-Variable nicht wirklich in unserer computeHash-Methode, also hier ist sie:
Blockchain-Klasse
Lassen Sie uns diesen neuen Ansatz in unserer Blockchain-Klasse testen und sehen, wie es läuft.
Zu Beginn definiere ich die Schwierigkeit unserer Blockchain in der Funktion Object(). Wir definieren es hier, da wir es später irgendwo verwenden können.
Die addBlock-Funktion muss dann so modifiziert werden, dass sie den Block abbaut, bevor sie ihn in unsere Kette einfügt.
Verwenden Sie die Blockchain
Lassen Sie uns nun unsere neue Blockchain mit dem Proof-of-Work-Algorithmus verwenden. Fügen Sie hier ein paar console.log-Anweisungen hinzu.
Wenn wir diesen Code ausführen, können wir beobachten, dass der Mining-Prozess nicht mehr besonders schnell ist.
Es dauert einige Zeit, bis der Algorithmus Blöcke mit Hashes generiert, die mit drei Nullen beginnen (wie durch Schwierigkeit konfiguriert).
Das war also das Ende unseres grundlegenden Blockchain-Setups.
Dank des Proof-of-Work-Mechanismus können wir regulieren, wie schnell neue Blöcke zu unserer Blockchain hinzugefügt werden.
Es ist das wichtigste Sicherheitsmerkmal auf Blockchains. Und jetzt, da Sie verstehen, wie es funktioniert, erstellen Sie Ihr eigenes!
Hinterlassen Sie uns einen Kommentar