ملخص
يستخدم Merkletree على نطاق واسع في تكنولوجيا Bitcoin. تهدف هذه المقالة إلى تنفيذ Merkletree بسيط من خلال الكود وحساب Treeroot of Merkle Tree.
Merkle Tree هي بنية بيانات تتحقق من أي نوع من البيانات المخزنة ومعالجتها ونقلها بين أجهزة الكمبيوتر.
في الوقت الحالي ، يتمثل الغرض الرئيسي من شجرة Merkle في التأكد من أن كتل البيانات المستلمة من شبكة الأقران غير متضررة وغير متغيرة ، ولتحقق من أن شبكات الأقران الأخرى لا تكذب لإرسال كتل بيانات مزيفة.
مثال تطبيق شجرة ميركل
بيتكوين
جيتا
دينامو مازون
جاساندرا
التطبيقات في البيتكوين
تحتوي كل كتلة في Bitcoin على توقيع مجموعة من جميع المعاملات. يتم تنفيذ هذا التوقيع باستخدام شجرة Merkle. تُستخدم شجرة Merkle في Bitcoin لتلخيص جميع المعاملات في الكتلة ، وإنشاء بصمة رقمية شاملة لمجموعة المعاملات بأكملها ، وتوفير عملية فعالة للغاية للتحقق مما إذا كانت المعاملة مدرجة في الكتلة.
الاستخدام المهم للغاية لأشجار Merkle هو التحقق مما إذا كانت الكتلة تحتوي على معاملة محددة. يتم بناء أشجار Merkle بواسطة أزواج تجزئة العقد بشكل متكرر حتى يكون هناك تجزئة واحدة فقط.
تطبيق رمز شجرة ميركل
تسمى عقدة شجرة التجزئة جذر Merkle. يمكن لشجرة Merkle التحقق مما إذا كان يتم تضمين أي عنصر بيانات في الشجرة باستخدام التعقيد الزمني لـ log2 (n):
اختبار الحزمة ؛ استيراد java.security.messagedigest ؛ استيراد java.util.arraylist ؛ استيراد java.util.list ؛ merkletrees الفئة العامة {// قائمة المعاملات <string> txlist ؛ // Merkle Root String Root ؛ / ** * Constructor * param txlist قائمة المعاملات قائمة */ merkletrees العامة (قائمة <Tring> txlist) {this.txlist = txlist ؛ الجذر = "" ؛ } /*** تنفيذ merkle_tree وضبط الجذر. */ public void merkle_tree () {list <string> temptxlist = new ArrayList <String> () ؛ لـ (int i = 0 ؛ i <this.txlist.size () ؛ i ++) {temptxlist.add (this.txlist.get (i)) ؛ } قائمة <Tring> newtxList = getNewTxList (temptxlist) ؛ بينما (newtxlist.size ()! = 1) {newTxList = getNewTxList (newTxList) ؛ } this.root = newtxlist.get (0) ؛ } /*** قائمة تجزئة العقدة. * param temptxlist * return */ قائمة خاصة <string> getNewTxList (قائمة <Tring> temptxlist) {list <string> newtxList = new ArrayList <String> () ؛ int index = 0 ؛ بينما (index <temptxlist.size ()) {// string left left = temptxlist.get (index) ؛ فهرس ++ ؛ // Right String Right = "" ؛ if (index! = temptxlist.size ()) {right = temptxlist.get (index) ؛ } // sha2 hex value string sha2Hexvalue = getSha2HexValue (يسار + يمين) ؛ newtxlist.add (sha2Hexvalue) ؛ فهرس ++ ؛ } إرجاع newtxlist ؛ } / ** * return hex string * param str * return * / public string getSha2HexValue (String str) {byte [] cipher_byte ؛ حاول {messagedigest md = messagedigest.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 (استثناء e) {E.PrintStackTrace () ؛ } يعود ""؛ } / ** * get root * @return * / public string getRoot () {return this.root ؛ }}إعداد البيانات
نضع بيانات المعاملة في القائمة:
قائمة <Tring> temptxlist = new ArrayList <String> () ؛ temptxlist.add ("A") ؛ temptxlist.add ("B") ؛ temptxlist.add ("C") ؛ temptxlist.add ("D") ؛ TemptxList.add ("E") ؛عملية التنفيذ
قم بإعداد بيانات المعاملة لحساب قيمة التجزئة لكل بيانات ، وتشكيل العقد اليسرى واليسرى تدريجياً لتنفيذ الحلقة لمعرفة أن هناك بيانات واحدة فقط في النهاية
قائمة خاصة <Tring> getNewTxList (قائمة <Tring> temptxList) {List <String> newtxList = new ArrayList <string> () ؛ int index = 0 ؛ بينما (index <temptxlist.size ()) {// string left left = temptxlist.get (index) ؛ فهرس ++ ؛ // Right String Right = "" ؛ if (index! = temptxlist.size ()) {right = temptxlist.get (index) ؛ } // sha2 hex value string sha2Hexvalue = getSha2HexValue (يسار + يمين) ؛ newtxlist.add (sha2Hexvalue) ؛ فهرس ++ ؛ }امتحان
اختبار الحزمة ؛ استيراد java.util.arraylist ؛ استيراد java.util.list ؛ تطبيق الفئة العامة {public static void main (string [] args) {list <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 ()) ؛ }}نتائج التنفيذ
تنفذ هذه المقالة ميركليت بسيطة من شكل شجرة ثنائية بسيطة ويحسب Treeroot ، ولكن في الواقع ، Merkletree ليست متحفظة وقد تكون الأشجار الثنائية أيضًا أشجارًا متعددة الصدقة.
يعتمد 90 ٪ من هذه المقالة على الترجمة ، العنوان الأصلي
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.