একটি Merkle গাছ হল একটি বাইনারি গাছ যা বৃহৎ ডেটা স্ট্রাকচারের বিষয়বস্তু দক্ষতার সাথে এবং নিরাপদে যাচাই করা সম্ভব করে। এই গাছের ধারণাটি 1982 সালে আমেরিকান ক্রিপ্টোগ্রাফার রাল্ফ মার্কেল দ্বারা প্রস্তাবিত এবং পেটেন্ট করা হয়েছিল।
যেকোন পরিমাণ ইনপুট ডেটার জন্য হ্যাশের দৈর্ঘ্য একই থাকে। পাতার শীর্ষবিন্দুতে ডেটার ব্লকগুলি থেকে হ্যাশ থাকে, যেখানে ভিতরের শীর্ষে দুটি চাইল্ড শীর্ষবিন্দুতে মান যোগ করা থেকে হ্যাশ অন্তর্ভুক্ত থাকে। পরিবর্তে, রুট শীর্ষবিন্দু সমগ্র ডেটা সেটের হ্যাশ নিয়ে গঠিত।
প্রাথমিকভাবে, ডেটার একটি সেট রয়েছে যা কোনওভাবেই একে অপরের সাথে সম্পর্কিত নয়। ডেটার প্রতিটি ব্লকের জন্য (একটি লেনদেন ব্লকচেইনের প্রসঙ্গে), আমাদের ব্লকের একটি হ্যাশ গণনা করতে হবে। ডেটা ব্লকের সংখ্যা 2^N
হওয়া উচিত, কারণ গাছটি তৈরি হওয়ার সাথে সাথে পূর্ববর্তী ব্লকগুলি প্রতিটি পুনরাবৃত্তিতে জোড়ায় জোড়ায় হ্যাশ করা হয়। হ্যাশের একটি জোড়া তারপর একত্রিত করা হয় এবং তাদের উপর ভিত্তি করে একটি নতুন হ্যাশ তৈরি করা হয়। যতক্ষণ পর্যন্ত প্রতিটি স্তরে গ্রুপ করার জন্য কিছু থাকে ততক্ষণ পর্যন্ত হ্যাশিং চলতে থাকবে এবং এটি বন্ধ হয়ে যাবে যখন শুধুমাত্র একটি জোড়া বাকি থাকবে যেখান থেকে রুট হ্যাশ – মার্কেল রুট – পাওয়া যাবে।
H(1-2) = keccak256(H(1) + H(2))
H(3-4) = keccak256(H(3) + H(4))
H(5-6) = keccak256(H(5) + H(6))
H(7-8) = keccak256(H(7) + H(8))
H(1-2-3-4) = keccak256(H(1-2) + H(3-4))
H(5-6-7-8) = keccak256(H(5-6) + H(7-8))
H(1-2-3-4-5-6-7-8) = keccak256(H(1-2-3-4) + H(5-6-7-8))
রুট হয়ে গেলে, আমরা ডেটা যাচাই করতে পারি। যদি রুট হ্যাশ মূল হ্যাশের সাথে মেলে তবে সবকিছু ঠিক আছে, ডেটা বৈধ। গাছের কাঠামোতে নির্দিষ্ট ডেটা উপস্থিত আছে কিনা তা দক্ষতার সাথে পরীক্ষা করাও সম্ভব।
ধরা যাক আমরা পরীক্ষা করতে চাই যে H2
হ্যাশ গাছে উপস্থিত রয়েছে। প্রমাণটি ডেটার একটি অ্যারে হবে: H1
, H3-4
, H5-6-7-8
। এই হ্যাশগুলির জন্য ধন্যবাদ, আমরা রুট হ্যাশ পুনর্গঠন করতে পারি:
H(1-2-3-4-5-6-7-8) = keccak256(keccak256(keccak256(H(1) + H(2)) + H(3-4)) + H(5-6-7-8))
তারপরে আমরা আসল হ্যাশের সাথে ফলাফলের হ্যাশের তুলনা করি। যদি তারা মিলে যায়, এর মানে হল যে হ্যাশ H2
গাছটিতে উপস্থিত রয়েছে।
আসুন এখন দেখি কিভাবে সলিডিটিতে মার্কেল ট্রি এবং ডেটা ভ্যালিডেশন বাস্তবায়ন করা যায়।
সরলতার জন্য, আমরা সরাসরি ব্লকচেইনে লেনদেনের অ্যারে লিখব, সেইসাথে হ্যাশের অ্যারেও। যেহেতু আমরা বিল্ট-ইন keccak256
ফাংশন ব্যবহার করব, যা 32 বাইটের হ্যাশ প্রদান করে, তাই হ্যাশ অ্যারের ডেটাটাইপ হবে bytes32
। অ্যারের একটি গতিশীল দৈর্ঘ্যও থাকবে। সাধারণভাবে, হ্যাশ অ্যারের দৈর্ঘ্য লেনদেন অ্যারের দৈর্ঘ্যের সমান হবে না, কারণ এটি উত্পাদিত হ্যাশ ধরে রাখবে। আমরা আগে থেকে দৈর্ঘ্য গণনা করতে পারি, কিন্তু কোড সরলীকরণের জন্য আমরা তা করব না। আপনি যদি চান, আপনি এই অ্যারেগুলির প্রতিটিকে public
করতে পারেন এবং লেনদেনের হ্যাশগুলি পড়তে পারেন৷
আমরা কনস্ট্রাক্টরে hashes
তৈরি করব। প্রথম ধাপ হল লুপে transactions
সহ ব্লকের জন্য হ্যাশ গণনা করা। তারপর, গাছের প্রতিটি স্তরে, হ্যাশের সংখ্যা 2 এর একটি ফ্যাক্টর দ্বারা হ্রাস করা হয়। যেহেতু আমরা হ্যাশগুলিকে হ্যাশ অ্যারেতে সংরক্ষণ করব, তাই ইনডেক্স অফসেটগুলি আলাদাভাবে সংরক্ষণ করতে হবে। অভ্যন্তরীণ লুপের পুনরাবৃত্তিকারী 2 দ্বারা বৃদ্ধি পেয়েছে কারণ আমরা গণনা করার সময় এবং হ্যাশ যোগ করার সময় কয়েকটি উপাদান গ্রহণ করব। এইবার abi.encodePacked
এ আমরা 2টি হ্যাশ যুক্ত করব যার প্রতিটিতে আমরা সঠিকভাবে সূচকগুলি সেট করব: বাম উপাদানের জন্য – বর্তমান শিফট অফসেটের মান + বর্তমান ট্রি স্তরে সূচক এবং ডান উপাদানের জন্য – একই + 1।
সুতরাং, আমরা গাছটি তৈরি করেছি, তবে আগ্রহের মধ্যে রয়েছে ডেটা যাচাই করা। এটি করার জন্য, আসুন একটি validateTransaction
ফাংশন লিখি যা একটি লেনদেন এবং তার সূচক নেয়। দুর্ভাগ্যবশত, সলিডিটির অ্যারেগুলির জন্য একটি find
পদ্ধতি নেই, তাই লেনদেন সূচকটি পাস করা সহজ।
প্রথমে, আসুন লেনদেনের হ্যাশ গণনা করি এবং প্রমাণের একটি অ্যারে তৈরি করি। আমরা লেনদেন অ্যারের দৈর্ঘ্যের উপর নির্ভর করে প্রমাণের সংখ্যা খুঁজে পাই এবং proofsIndexes
দৈর্ঘ্য নির্ধারণ করি। এর পরে, গাছের প্রতিটি স্তরে, আমরা প্রয়োজনীয় উপাদানটি খুঁজে পাই, সূচকের উপর নির্ভর করে, ডান বা বাম উপাদান গ্রহণ করে, hashes
অফসেটগুলিকে মাথায় রেখে। তারপরে আমরা প্রমাণ সূচকের অ্যারের মধ্য দিয়ে যাই, প্যারিটির জন্য সূচক পরীক্ষা করি এবং উপাদানটি জোড়ায় বাম বা ডানে আছে কিনা তার উপর নির্ভর করে হ্যাশ গণনা করি। অবশেষে, আমরা রুট হ্যাশের সাথে ফলাফলের হ্যাশের তুলনা করি এবং ফলাফলটি ফেরত দিই।
ব্লকচেইনে একটি মার্কেল গাছের বেশ কয়েকটি অ্যাপ্লিকেশন রয়েছে।
Merkle গাছ ছাড়া, ব্লকচেইন খুব কষ্টকর হবে, এবং Merkle প্রমাণ তথ্য সত্যতা সাশ্রয়ী মূল্যের যাচাই করার অনুমতি দেয়।
লেনদেনগুলিকে দক্ষতার সাথে সঞ্চয় করতে মার্কেল গাছ সক্রিয়ভাবে ব্লকচেইনে (যেমন, বিটকয়েন, ইথেরিয়াম) ব্যবহার করা হয়, তবে এটিই একমাত্র অ্যাপ্লিকেশন নয়। উদাহরণস্বরূপ, FTX এক্সচেঞ্জের পতনের পরে, অনেক এক্সচেঞ্জ একটি প্রুফ-অফ-রিজার্ভ পদ্ধতি প্রয়োগ করে, যা একটি মার্কেল গাছ ব্যবহার করে।