تعریف درخت مرکل (merkle tree) و کاربرد آن در شبکه بیتکوین: همانطور که در این نوشته اشاره کردیم، هر بلاک بیت کوین شامل داده های تراکنش ها و یک header به عنوان محلی برای ذخیره سایر داده های دسترسی و خواندن یک بلاک میباشد.
یکی از فیلد هایی که در هدر بلاک قرار داده میشود فیلدی است با عنوان: hashMerkleRoot.
درخت مرکل از هش کردن یه زوج از TXID ها و سپس استفاده از همین هش به عنوان ورودی برای هش کردن با خروجی دو TXID دیگر بلاک ساخته میشود. برای درک بهتر به درختی که از هش کردن سه تراکنش 1و2و3 با تراکنش کوین بیس ایجاد شده و در انتها به ریشه درخت منتهی شده است دقت کنید:
همانطور که مشاهده کردید در ریشه این درخت هش تمامی تراکنش های یک بلاک (از طریقی که بالا گفته شد) ساخته شده و قرار میگیرد.
چرا hashMerkleRoot در هدر بلاک قرار میگیرد و چه استفاده ای از آن میشود؟
برای ساخت یک شناسه یکتای هش شده از تمامی تراکنش های داخل یک بلاک، بدون ساختار درختی هم میتوانستیم با هش کردن تمامی TXID ها به هدف مان برسیم. مثل شکل زیر:
اما مشکل اینجا بود که برای بررسی وجود یا عدم وجود یک تراکش در یک بلاک میبایست تک تک TXID ها را با هش به وجود آمده بررسی میکردیم و این کار منابع بیشتری را صرف خود میکرد.
در حالیکه وقتی طبق متد درخت، همانند شکل زیر، دو به دو هش تراکنش ها را ادغام و از آن ها به عنوان ورودی یک سطح بالا تر انتخاب کنیم، با داشتن داده 3 سطح (در مثال زیر) وجود یا عدم وجود تراکنش را در بلاک تشخیص میدهمیم، در حالیکه بدون این ساختار ممکن بود تا 6 بررسی انجام شود:
البته با توضیحات بالا مشخص شد که اگر تعداد تراکنش ها در یک بلاک بالا باشد این ساختار کاربرد خود را نشان میدهد در غیر این صورت بود و نبود ان چتدان تفاوتی برای کارایی بررسی تراکنش ها ندارد.
یک کاربرد دیگر درخت مرکل این است که با وجود این ساختار، نود های سبک بیت کوینی (thin client) نیز به سادگی و بدون داشتن منابع یک فول نود بیت کوینی تنها با دریافت بلاک هدر ها که شامل hashMerkleRoot ها هستند بتوانند تراکنش ها را در یک بلاک تایید نمایند: