ภาพรวม
Merkletree ใช้กันอย่างแพร่หลายในเทคโนโลยี Bitcoin บทความนี้มีจุดมุ่งหมายที่จะใช้ Merkletree อย่างง่ายผ่านรหัสและคำนวณ treeroot ของ Merkle Tree
Merkle Tree เป็นโครงสร้างข้อมูลที่ตรวจสอบประเภทของข้อมูลใด ๆ ที่เก็บประมวลผลและส่งระหว่างคอมพิวเตอร์
ปัจจุบันวัตถุประสงค์หลักของต้นไม้ Merkle คือเพื่อให้แน่ใจว่าบล็อกข้อมูลที่ได้รับจากเครือข่ายเพียร์ไม่ได้รับความเสียหายและไม่เปลี่ยนแปลงและเพื่อตรวจสอบว่าเครือข่ายเพียร์อื่น ๆ ไม่ได้โกหกเพื่อส่งบล็อกข้อมูลปลอม
ตัวอย่างแอปพลิเคชัน Merkle Tree
Bitcoin
การออกไปข้างนอก
ไดนาโมของ Mazon
Gassandra
แอปพลิเคชันใน Bitcoin
แต่ละบล็อกใน Bitcoin มีลายเซ็นคอลเลกชันของธุรกรรมทั้งหมด ลายเซ็นนี้ถูกนำมาใช้โดยใช้ Merkle Tree Merkle Tree ใช้สำหรับ Bitcoin เพื่อสรุปการทำธุรกรรมทั้งหมดในบล็อกสร้างลายนิ้วมือดิจิตอลโดยรวมของชุดธุรกรรมทั้งหมดและให้กระบวนการที่มีประสิทธิภาพมากในการตรวจสอบว่าการทำธุรกรรมนั้นรวมอยู่ในบล็อกหรือไม่
การใช้ต้นไม้ Merkle ที่สำคัญมากคือการตรวจสอบว่าบล็อกมีธุรกรรมที่ระบุหรือไม่ ต้นไม้ Merkle ถูกสร้างขึ้นโดยคู่ของโหนด Hashing Pairs จนกว่าจะมีแฮชเพียงอันเดียว
การใช้รหัสต้นไม้ Merkle
โหนดของต้นไม้แฮชเรียกว่ารูท merkle ต้นไม้ Merkle สามารถตรวจสอบได้ว่าองค์ประกอบข้อมูลใด ๆ รวมอยู่ในต้นไม้โดยใช้ความซับซ้อนของเวลาของ log2 (n):
การทดสอบแพ็คเกจ; นำเข้า java.security.messagedigest; นำเข้า java.util.arraylist; นำเข้า java.util.list; คลาสสาธารณะ Merkletrees {// รายการธุรกรรม <String> txList; // รูทสตริงรูท merkle; / ** * constructor * @param txlist รายการธุรกรรมรายการธุรกรรม */ public merkletrees (รายการ <string> txlist) {this.txList = txList; root = ""; } /*** เรียกใช้งาน merkle_tree และตั้งค่ารูท */ โมฆะสาธารณะ merkle_tree () {list <string> temptxList = new ArrayList <String> (); สำหรับ (int i = 0; i <this.txlist.size (); i ++) {temptxlist.add (this.txlist.get (i)); } รายการ <String> newTxList = getNewTxList (temptxList); ในขณะที่ (newtxlist.size ()! = 1) {newTxList = getNewTxList (newTxList); } this.root = newtxlist.get (0); } /*** ส่งคืนรายการแฮชโหนด * @param temptxList * @return */ รายการส่วนตัว <String> getNewTxList (รายการ <String> temptxList) {รายการ <String> newTxList = new ArrayList <String> (); ดัชนี int = 0; ในขณะที่ (index <temptxlist.size ()) {// left string ซ้าย = temptxlist.get (ดัชนี); ดัชนี ++; // สตริงขวาขวา = ""; if (index! = temptxlist.size ()) {right = temptxlist.get (ดัชนี); } // sha2 hex ค่าสตริง sha2hexvalue = getsha2hexvalue (ซ้าย + ขวา); newtxlist.add (sha2hexvalue); ดัชนี ++; } ส่งคืน newtxlist; } / ** * return hex string * @param str * @return * / สตริงสาธารณะ getsha2hexvalue (สตริง str) {byte [] cipher_byte; ลอง {messageGeSest md = messageGeSt.getInstance ("sha-256"); md.update (str.getBytes ()); cipher_byte = md.digest (); StringBuilder sb = new StringBuilder (2 * cipher_byte.length); สำหรับ (byte b: cipher_byte) {sb.append (string.format ("%02x", b & 0xff)); } return sb.toString (); } catch (exception e) {e.printstacktrace (); } กลับ ""; } / ** * รับรูท * @return * / สตริงสาธารณะ getRoot () {return this.root; -การเตรียมข้อมูล
เราใส่ข้อมูลธุรกรรมลงในรายการ:
รายการ <String> temptxList = new ArrayList <String> (); temptxlist.add ("a"); temptxlist.add ("b"); temptxlist.add ("c"); temptxlist.add ("d"); temptxlist.add ("e");กระบวนการดำเนินการ
จัดทำข้อมูลธุรกรรมเพื่อคำนวณค่าแฮชของแต่ละข้อมูลและค่อยๆสร้างโหนดซ้ายและขวาของต้นไม้เพื่อเรียกใช้ลูปเพื่อทราบว่ามีเพียงข้อมูลเดียวเท่านั้นที่เหลืออยู่ในตอนท้าย
รายการส่วนตัว <String> getNewTxList (รายการ <String> temptxList) {รายการ <String> newTxList = new ArrayList <String> (); ดัชนี int = 0; ในขณะที่ (index <temptxlist.size ()) {// left string ซ้าย = temptxlist.get (ดัชนี); ดัชนี ++; // สตริงขวาขวา = ""; if (index! = temptxlist.size ()) {right = temptxlist.get (ดัชนี); } // sha2 hex ค่าสตริง sha2hexvalue = getsha2hexvalue (ซ้าย + ขวา); newtxlist.add (sha2hexvalue); ดัชนี ++; -ทดสอบ
การทดสอบแพ็คเกจ; นำเข้า java.util.arraylist; นำเข้า java.util.list; แอพระดับสาธารณะ {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {รายการ <string> temptxList = new ArrayList <String> (); temptxlist.add ("a"); temptxlist.add ("b"); temptxlist.add ("c"); temptxlist.add ("D"); temptxlist.add ("e"); merkletrees merkletrees = ใหม่ merkletrees (temptxlist); merkletrees.merkle_tree (); System.out.println ("root:" + merkletrees.getRoot ()); -ผลการดำเนินการ
บทความนี้ใช้ Merkletree อย่างง่ายจากรูปแบบของต้นไม้ไบนารีที่เรียบง่ายและคำนวณ Treeroot แต่ในความเป็นจริง Merkletree ไม่ได้อนุรักษ์และต้นไม้ไบนารีอาจเป็นต้นไม้หลายฟอร์ก
90% ของบทความนี้ขึ้นอยู่กับการแปลที่อยู่เดิม
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น