Überblick
Merkletree wird in der Bitcoin -Technologie häufig eingesetzt. Dieser Artikel zielt darauf ab, einen einfachen Merkletree über Code zu implementieren und das Treeroot von Merkle Tree zu berechnen.
Merkle Tree ist eine Datenstruktur, die jede Art von Daten, die zwischen Computern gespeichert, verarbeitet und übertragen werden.
Der Hauptzweck des Merkle -Baumes besteht derzeit darin, sicherzustellen, dass die vom Peer -Netzwerk empfangenen Datenblöcke nicht beschädigt und unverändert sind, und zu überprüfen, ob andere Peer -Netzwerke nicht lügen, um gefälschte Datenblöcke zu senden.
Beispiel für Merkle -Baumanwendungen
Bitcoin
Gita
Mazons Dynamo
Gassandra
Anwendungen in Bitcoin
Jeder Block in Bitcoin enthält eine Sammelsignatur aller Transaktionen. Diese Signatur wird mit Merkle Tree implementiert. Der Merkle -Baum wird für Bitcoin verwendet, um alle Transaktionen im Block zusammenzufassen, einen digitalen Fingerabdruck des gesamten Transaktionen zu erzeugen und einen sehr effektiven Prozess zu ermöglichen, um zu überprüfen, ob die Transaktion im Block enthalten ist.
Eine sehr wichtige Verwendung von Merkle -Bäumen besteht darin, zu überprüfen, ob der Block eine angegebene Transaktion enthält. Merkle -Bäume werden durch rekursive Hashing -Paare von Knoten konstruiert, bis es nur einen Hash gibt.
Implementierung von Merkle Tree Code
Der Knoten des Hash -Baums heißt Merkle Root. Der Merkle -Baum kann überprüfen, ob ein Datenelement im Baum mit der Zeitkomplexität von Log2 (N) enthalten ist:
Pakettest; import Java.Security.MessAnedigest; Import Java.util.ArrayList; Import Java.util.List; öffentliche Klasse Merkletrees {// Transaktionsliste Liste <string> txlist; // Merkle Root String Root; / ** * Konstruktor * @param txlist Transaktionsliste Transaktionsliste */ public merkletrees (Liste <string> txlist) {this.txlist = txlist; root = ""; } /*** Führen Sie Merkle_Tree aus und setzen Sie Root. */ public void merkle_tree () {list <string> temptxlist = new ArrayList <string> (); für (int i = 0; i <this.txlist.size (); i ++) {temptXlist.add (this.txlist.get (i)); } List <string> newtxlist = getNewtxlist (tuptXlist); while (newtxlist.size ()! } this.root = newtxlist.get (0); } /*** Node Hash -Liste zurückgeben. * @Param TUPPTXLIST * @RETURN */ private Liste <string> getNewtxList (Liste <string> treTxlist) {list <string> newtxlist = new ArrayList <string> (); int index = 0; while (index <temptxlist.size ()) {// linke String links = temptxlist.get (index); Index ++; // Right String right = ""; if (index! } // sha2 hex value String sha2hexValue = getSha2hexValue (links + rechts); newtxlist.add (sha2hexValue); Index ++; } return newtxlist; } / ** * hex String zurückgeben * @param str * @return * / public String getSha2hexValue (String str) {byte [] Cipher_Byte; try {MessagedIGest md = MessagedIGest.getInstance ("SHA-256"); md.update (str.getBytes ()); cipher_byte = md.Digest (); StringBuilder sb = new StringBuilder (2 * cipher_byte.length); für (byte b: cipher_byte) {sb.append (string.format ("%02x", B & 0xff)); } return sb.toString (); } catch (Ausnahme e) {e.printstacktrace (); } zurückkehren ""; } / ** * ROOT * @Return * / public String getRoot () {return this.root; }}Datenvorbereitung
Wir geben die Transaktionsdaten in die Liste ein:
Liste <string> tempptxlist = new ArrayList <string> (); tuptXlist.add ("a"); tuptXlist.add ("b"); temptxlist.add ("c"); temptxlist.add ("d"); tuptXlist.add ("e");Implementierungsprozess
Bereiten Sie Transaktionsdaten vor, um den Hash -Wert jeder Daten zu berechnen, und bilden Sie nach und nach die linken und rechten Knoten des Baumes, um die Schleife auszuführen, um zu wissen, dass am Ende nur eine Daten übrig bleiben
private list <string> getNewtxlist (list <string> treTxlist) {list <string> newtxlist = new ArrayList <string> (); int index = 0; while (index <temptxlist.size ()) {// linke String links = temptxlist.get (index); Index ++; // Right String right = ""; if (index! } // sha2 hex value String sha2hexValue = getSha2hexValue (links + rechts); newtxlist.add (sha2hexValue); Index ++; }prüfen
Pakettest; importieren java.util.ArrayList; import Java.util.list; öffentliche Klasse App {public static void main (String [] args) {list <string> treTxlist = new ArrayList <string> (); Temptxlist.add ("a"); Temptxlist.add ("B"); TemptxList.add ("C"); Temptxlist.add ("D"); temptxlist.add ("e"); Merkletrees Merkletrees = New Merkletrees (Temptxlist); Merkletrees.Merkle_Tree (); System.out.println ("root:" + merkletrees.getroot ()); }}Ausführungsergebnisse
Dieser Artikel implementiert einen einfachen Merkletree aus der Form eines einfachen binären Baums und berechnet Treeroot, aber tatsächlich ist MerkleTree nicht konservativ und binärer Baum kann auch Multi-Tork-Bäume sein.
90% dieses Artikels basieren auf der Übersetzung, Originaladresse
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.