دليل مبسط إلى فهم أشجار وجذور Merkle
الصفحة الرئيسية
المقالات
دليل مبسط إلى فهم أشجار وجذور Merkle

دليل مبسط إلى فهم أشجار وجذور Merkle

متقدم
تاريخ النشر Jul 6, 2020تاريخ التحديث Dec 27, 2022
7m

المحتويات


ما هي شجرة Merkle؟

ظهرت فكرة شجرة Merkle في بداية الثمانينيات على يد رالف ميركل – عالم كمبيوتر اشتهر بعمله في مجال علم التشفير باستخدام المفتاح العام.
شجرة Merkle هي بنية تُستخدم للتحقق بفعالية من سلامة البيانات في مجموعة بيانات محددة، ولها أهمية بصورة خاصة في سياق شبكات  الأقران (النظير للنظير) حيث يحتاج المشاركون إلى مشاركة المعلومات والتحقق منها بصورة مستقلة.
وتمثل دوال التجزئة جزءاً جوهرياً من هياكل شجرة Merkle، ومن ثم فإننا ننصح بقراءة المقال بعنوان  ما هي التجزئة؟ قبل متابعة قراءة هذا المقال.


كيف تعمل أشجار Merkle؟

لنفترض أنك تود تنزيل ملفاً كبير الحجم. في حالة البرمجيات مفتوحة المصدر، ستود في المعتاد التحقق من أن قيمة تجزئة الملف الذي قمت بتنزيله تتوافق مع القيمة التي جعلها المطورون متاحة للجميع. فإذا كانت كذلك، فإنك تدرك أن الملف الذي لديك على جهاز الكمبيوتر الخاص بك يطابق ملفهم.

أما إذا كانت قيم التجزئة غير متطابقة، فهذا يعني أنك تواجه مشكلة. إما أنك قمت بتنزيل ملف برمجيات خبيثة ينتحل صفة البرنامج، أو أن عملية التنزيل لم تتم بنجاح، ومن ثم فإنه لا يعمل. إذا كانت عملية التنزيل لم تتم بنجاح، فإنك على الأرجح لن تكون سعيداً إذا تعين عليك الانتظار لبعض الوقت حتى يتم تنزيل الملف. وسيتعين عليك حينها أن تبدأ العملية من جديد وتأمل أن تسير على ما يرام هذه المرة.

قد تفكر في هذه الحالة فقط لو أن هناك طريقة أسهل للقيام بهذا الأمر.  لحسن الحظ، هنا يأتي دور شجرة Merkle، حيث إنه باستخدام هذه الشجرة يتم تقسيم الملف إلى أجزاء. فإذا كان حجم الملف 50 جيجابايت، قد يمكنك تقسيمه إلى مائة قطعة، كل قطعة حجمها 0.5 جيجابايت، وبالتالي يتم تنزيله قطعة قطعة. وهذا في الأساس ما تفعله عند استخدام ملفات تورنت. 
في هذه الحالة، سيوفر لك مصدر الملف قيمة تجزئة تُعرف باسم جذر Merkle. وهذه القيمة الفردية تعد تمثيلاً لكل جزء من البيانات التي يتكون منها ملفك، لكن جذر Merkle يجعل من الأسهل كثيراً التحقق من البيانات. 
لتبسيط الأمر، سننظر إلى هذا المثال حيث نستخدم ملفاً حجمه 8 جيجابايت مُقسم إلى 8 أجزاء، وسنطلق على هذه الأجزاء المختلفة الحروف من  A إلى  H. ثم سيمر كل جزء من خلال دالة تجزئة، مما ينتج عنه 8 قيم تجزئة مختلفة.


سنمرر كل جزء من الأجزاء الثمانية من خلال دالة تجزئة للحصول على قيم التجزئة الخاصة بها.


حسناً، لدينا الآن شيء منطقي أكثر إلى حد ما. فلدينا قيم تجزئة كل الأجزاء، وبالتالي إذا كان أحدها خطأ، ستدرك ذلك من خلال مقارنته بقيمة تجزئة المصدر، أليس كذلك؟ ربما، لكن هذا أيضاً غير فعال بشكل هائل، فإذا كان الملف يتكون من آلاف الأجزاء، فهل ستقوم حقاً بتجزئتها كلها ثم تقارن النتائج بحرص شديد؟

كلا، بدلاً من هذا سنأخذ كل زوج من قيم التجزئة ونجمعهما معاً ثم نقوم بتجزئتهما معاً. وبالتالي، نقوم بتجزئة hA + hB، و hC + hD، و hE + hF، و hG + hH وبالتالي يصبح لدينا في النهاية 4 قيم تجزئة، ثم ننفذ جولة تجزئة أخرى لهذه القيم، ليصل عدد قيم التجزئة في النهاية إلى اثنتين. وفي النهاية، نقوم بتجزئة القيمتين المتبقيتين للحصول على قيمة التجزئة الرئيسية – جذر Merkle (أو قيمة التجزئة الجذرية).


يبدو الهيكل مثل شجرة مقلوبة، حيث في الصف الأخير تكون لدينا الأوراق التي تجتمع معاً لإنتاج العقد وفي النهاية الجذر.


لدينا الآن جذر Merkle الذي يمثل الملف الذي قمنا بتنزيله. يمكن مقارنة قيمة التجزئة الجذرية هذه بتلك التي يوفرها المصدر، فإذا كانت متطابقة، فهذا رائع! لكن إذا كانت قيم التجزئة مختلفة، فهذا يجعلنا على يقين أن البيانات تم تعديلها، أي أن جزءاً أو أكثر قد أنتج قيمة تجزئة مختلفة، وبالتالي فإن أي تعديل بسيط في البيانات سيمنحنا جذر Merkle مختلف تماماً. 

لحسن الحظ، ثمة طريقة سهلة لنا جميعاً للتحقق من الجزء الذي ينطوي على خطأ. في هذه الحالة، لنقل إن هذا الجزء مثلاً هو hE. في البداية، اطلب من أحد أقرانك قيمتي التجزئة اللتين أنتجتا جذر Merkle (hABCD و hEFGH). يجب أن تطابق القيمة  hABCD الخاصة بك القيمة الخاصة به حيث إنه لا يوجد خطأ في هذه الشجرة الفرعية. لكن هذا لا ينطبق على القيمة  hEFGH، وبالتالي يجب عليك التحقق من هذه القيمة. ثم تطلب بعد ذلك القيم hEF وhGH وتقارنها بالقيم الخاص بك. ستجد أن القيمة hGH سليمة، ومن ثم تدرك أن القيمة hEF هي السبب وراء المشكلة. وأخيراً، ستقارن قيم تجزئة hE وhF، وأنت الآن تعرف أن القيمة hE غير صحيحة، وبالتالي يمكنك إعادة تنزيل هذا الجزء.

باختصار، تنشأ شجرة Merkle عن طريق تقسيم البيانات إلى عدة أجزاء، وبعد ذلك يتم تجزئتها بشكل متكرر لتكوين جذر Merkle. وعندئذ يمكنك التحقق بفعالية مما إذا كان خطأ ما قد حدث لجزء من البيانات. وكما سنرى في القسم التالي، هناك بعض التطبيقات الأخرى المثيرة للاهتمام أيضاً.



هل ترغب في بدء التداول في العملات الرقمية؟ اشتر البيتكوين (BTC) على Binance (بينانس) الآن!



لماذا تُستخدم جذور Merkle في البيتكوين؟

ثمة بضع حالات لاستخدام أشجار Merkle، لكننا هنا سنركز على أهميتها في  سلاسل البلوكشين. تعد أشجار Merkle ذات أهمية كبيرة لعملة  البيتكوين وغيرها من العملات الرقمية. وتمثل مكوناً رئيساً لكل كتلة حيث توجد في أقسام تخزين الكتل. للوصول إلى أوراق الشجرة، نستخدم تجزئة المعاملة ( مُعرّف المعاملة) لكل معاملة موجودة في الكتلة. 

وفي هذه الحالة، يحقق جذر Merkle بضعة أغراض، وسنستعرض فيما يلي تطبيقاته في تعدين العملات الرقمية والتحقق من المعاملات.


التعدين

تتكون كتلة البيتكوين من جزأين، الجزء الأول هو قسم تخزين الكتلة، وهو جزء ذو حجم ثابت يحتوي على  بيانات وصفية للكتلة. والجزء الثاني هو قائمة بالمعاملات متغيرة الحجم، لكنها عادة ما تكون أكبر حجماً بكثير من قسم تخزين الكتلة.
يحتاج المُعدّنون إلى تجزئة البيانات بشكل متكرر لإنتاج مخرجات تطابق شروط محددة لتعدين كتلة صحيحة. ويمكنهم إجراء تريليونات المحاولات قبل العثور على كتلة صحيحة. وفي كل محاولة، يقومون بتغيير رقم عشوائي في قسم تخزين الكتلة (الرمز الخاص) لإنتاج مخرجات مختلفة. غير أن جزءاً كبيراً من الكتلة يظل كما هو. وقد يصل عدد المعاملات إلى آلاف المعاملات، وسيتعين عليك تجزئتها في كل مرة.

يساعد جذر Merkle على تسهيل العملية بشكل كبير، فعندما تبدأ في التعدين، تضع صفاً من جميع المعاملات التي تود تضمينها وتقوم بإنشاء شجرة Merkle. ثم تضع قيمة التجزئة الجذرية الناتجة (32 بايت) في قسم تخزين الكتلة. وبعد ذلك، عند التعدين كل ما تحتاج إليه هو تجزئة قسم تخزين الكتلة بدلاً من الكتلة بأكملها.

تنجح هذه الطريقة لأنها لا يمكن التلاعب بها، حيث تقوم بتلخيص جميع معاملات الكتلة بفعالية في تنسيق مدمج. ولا يمكنك العثور على قسم تخزين كتلة صحيح، ثم تغيير قائمة المعاملات لاحقاً لأن هذا من شأنه أن يغير جذر Merkle. وعند إرسال الكتلة إلى العقد الأخرى، فإنها تقوم بحساب الجذر من قائمة المعاملات، وإذا لم يطابق ذلك المذكور في قسم تخزين الكتلة، يتم رفض الكتلة.


التحقق

ثمة خاصية أخرى مثيرة للاهتمام في جذور Merkle يمكننا الاستفادة منها. وهذه الخاصية تهم برمجيات العقد البسيطة (العقد التي لا تحمل النسخة الكاملة من سلسلة البلوكشين). فإذا كنت تدير عقدة على جهاز محدود الموارد، فإنك لن تود تنزيل وتجزئة جميع معاملات الكتلة، بل يمكنك بدلاً من هذا طلب إثبات Merkle – وهو إثبات تقدمه العقدة بالكامل يثبت أن المعاملة موجودة في كتلة محددة. وغالباً ما يشار إلى هذا باسم التحقق المبسط من الدفع (SPV) وقد أوضحه ساتوشي ناكاموتو بالتفصيل في التقرير الفني لعملة البيتكوين.


للتحقق من hD، نحتاج فقط إلى قيم التجزئة الموضحة باللون الأحمر.


لننظر على سبيل المثال إلى السيناريو حيث نريد معرفة معلومات حول المعاملة ذات معرّف المعاملة hD. إذا كانت القيمة hC متوفرة لدينا، يمكننا التوصل إلى hCD. ثم نحتاج إلى  hAB لحساب hABCD. وأخيراً، في حالة  hEFGH، يمكننا التحقق من أن جذر Merkle الناتج يطابق ذلك الموجود في قسم تخزين الكتلة. فإذا كان مطابقاً، فهذا دليل على أن المعاملة كانت موجودة في الكتلة – حيث سيكون من المستحيل تقريباً إنشاء نفس قيمة التجزئة ببيانات مختلفة.

في المثال السابق، تعين علينا فقط إجراء التجزئة ثلاث مرات، وبدون إثبات Merkle، كنا سنحتاج إلى إجرائها 7 مرات. ونظراً لأن الكتل اليوم تحتوي على آلاف المعاملات، فإن استخدام إثبات Merkle يوفر الكثير من الوقت وموارد الحوسبة.


أفكار ختامية

لقد أثبتت أشجار Merkle أنها ذات فوائد جمة في مجموعة من تطبيقات علوم الكمبيوتر –  وكما رأينا فإنها ذات أهمية هائلة بالنسبة لسلاسل البلوكشين. وفي الأنظمة الموزعة، تتيح أشجار Merkle تسهيل عملية التحقق من المعلومات بدون إغراق الشبكة بسيل من البيانات غير الضرورية.

بدون أشجار Merkle (وجذور Merkle)، لن تكون كتل البيتكوين وغيرها من العملات الرقمية صغيرة الحجم كما هي اليوم. وفي حين أن برمجيات العقد البسيطة تفتقر إلى الخصوصية والأمان، يتيح إثبات Merkle للمستخدمين إمكانية التحقق مما إذا كانت معاملاتهم قد انضمت إلى إحدى الكتل بالحد الأدنى من التكاليف.