মূল কন্টেন্টে যান

হ্যাশ ফাংশন — ETH.BUILD

ETH.BUILD শিক্ষামূলক টুল ব্যবহার করে ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশনের একটি ডেমোনস্ট্রেশন। হ্যাশ ফাংশন কীভাবে কাজ করে এবং কেন এগুলো ইথেরিয়ামের অ্যাকাউন্ট ও ডেটা ইন্টিগ্রিটি মডেলের জন্য মৌলিক, তা জানুন।

Date published: 14 জানুয়ারী, 2021

অস্টিন গ্রিফিথ-এর একটি টিউটোরিয়াল, যেখানে ETH.BUILD ভিজ্যুয়াল প্রোগ্রামিং টুল ব্যবহার করে ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশন কীভাবে কাজ করে তা দেখানো হয়েছে। এতে ডিটারমিনিজম, ফিক্সড-লেংথ আউটপুট, একমুখী বৈশিষ্ট্য এবং মার্কেল ট্রি নিয়ে আলোচনা করা হয়েছে।

এই ট্রান্সক্রিপ্টটি অস্টিন গ্রিফিথ দ্বারা প্রকাশিত মূল ভিডিও ট্রান্সক্রিপ্টের (opens in a new tab) একটি অ্যাক্সেসযোগ্য কপি। পড়ার সুবিধার জন্য এটি সামান্য সম্পাদনা করা হয়েছে।

হ্যাশ ফাংশনের পরিচিতি (0:00)

এটি ETH.BUILD নামের একটি সিরিজের প্রথম ভিডিও। এই টুলিংটি ব্যবহার করতে আপনি eth.build-এ যেতে পারেন, তবে এটি মূলত ইথেরিয়ামে কাজ করার সময় জিনিসগুলো কীভাবে কাজ করে সে সম্পর্কে ধারণা পেতে এবং পরীক্ষা-নিরীক্ষা করার জন্য।

আমরা প্রথম যে মডিউলটি দেখব তা হলো একটি হ্যাশ ফাংশন। হ্যাশ ফাংশন জিনিসটা আসলে কী? এটি অনেকটা আঙুলের ছাপ বা ফিঙ্গারপ্রিন্টের মতো। আপনার কাছে একটি ইনপুট থাকবে — এটি যেকোনো কিছু হতে পারে — তবে আপাতত আমরা "hello world" টেক্সটটি ব্যবহার করব। অন্যদিকে আপনি একটি আউটপুট পাবেন, এবং সেই আউটপুটটি হলো 64-ক্যারেক্টারের একটি হেক্সাডেসিমাল স্ট্রিং। "0x" প্রিফিক্সের কারণে এটি 66 ক্যারেক্টার দেখায়, তবে এটি মূলত একটি 64-ক্যারেক্টারের হেক্স স্ট্রিং।

হ্যাশগুলোকে রঙ হিসেবে ভিজ্যুয়ালাইজ করা (0:50)

আপনি যদি হেক্স-এর দিকে তাকান, এটি দেখতে অনেকটা রঙের মতো মনে হয়, এবং আমরা এখানে যা দেখছি তা যদি রঙে রূপান্তর করি তবে বর্ণনা করা সহজ হতে পারে। তাই আমরা যা করব তা হলো, স্ট্রিংটি যাই হোক না কেন তার প্রথম ছয়টি ক্যারেক্টার নেব এবং সেটিকে একটি রঙ হিসেবে প্রদর্শন করব। আমরা যদি সেটির দিকে তাকাই, তবে দেখতে পাব এটি একটি সুন্দর বেগুনি রঙ।

চলুন দেখি আমার নামের রঙ কী — এই তো, একটি সুন্দর ফরেস্ট গ্রিন (গাঢ় সবুজ)। এবার চলুন আবার "hello world"-এ ফিরে যাই — এটি আবার সেই বেগুনি রঙ।

ডিটারমিনিজম এবং ফিক্সড-লেংথ আউটপুট (1:38)

আমরা এইমাত্র যা আবিষ্কার করলাম তা হলো এটি ডিটারমিনিস্টিক। মূলত, আমরা ইনপুট হিসেবে যাই দিই না কেন, আমরা সবসময় অন্যদিকে একই জিনিস আউটপুট হিসেবে পাব।

দ্বিতীয় বৈশিষ্ট্যটি হলো আপনি যেকোনো আকারের যেকোনো কিছু ইনপুট দিতে পারেন। আমি কীবোর্ডে এলোমেলো চাপ দিয়ে রঙের পরিবর্তন দেখতে পারি, কিন্তু সেই স্ট্রিংটি 66-ক্যারেক্টার দৈর্ঘ্যেরই থাকে। আপনি এখানে যাই দিন না কেন — এমনকি একটি ফাইলও — আমি আমার ছেলে লিওর এই ফাইলটি ড্রপ করে সেটিকে একটি হ্যাশ হিসেবে ইনপুট দিতে পারি এবং একটি সুন্দর কমলা রঙ পেতে পারি। তারপর আমি একটি BIP ওয়ার্ড লিস্ট টেক্সট ডকুমেন্ট ড্রপ করতে পারি এবং এটি একটি সুন্দর হালকা নীল রঙ দেখাবে। আমি যদি লিওকে আবার ফিরিয়ে আনি, অনুমান করুন তো এর রঙ কী হবে? আমরা জানি এটি সেই কমলা রঙই হবে। আপনি যা ইনপুট দেন, তার এই ডিটারমিনিস্টিক ফিঙ্গারপ্রিন্টটি আপনি পাবেন।

একমুখী বৈশিষ্ট্য (2:37)

পরবর্তী সবচেয়ে গুরুত্বপূর্ণ বৈশিষ্ট্যটি হলো এটি একমুখী (one-directional)। আমি যদি আবার "hello world" ইনপুট দিই, তবে আমরা এই "4717" হ্যাশটি পাব। আমরা যদি সেই হ্যাশটি নিয়ে কাউকে পাঠাই এবং বলি "এই হলো আমার গোপনীয় তথ্যের হ্যাশ — তুমি যদি আমার গোপনীয় তথ্যটি অনুমান করতে পারো, তবে আমি তোমাকে একশ ডলার দেব," তারা এর কাছাকাছিও যেতে পারবে না।

ধরুন হ্যাশটি "4717" দিয়ে শুরু হয় এবং তারা একটি মিল খোঁজার চেষ্টা করতে থাকে। আপনি কেবল ছোট ছোট ক্যারেক্টার পরিবর্তন করে কাছাকাছি যেতে পারবেন না — আপনি হয় এটি মেলাতে পারবেন, নয়তো পারবেন না। আপনাকে মূলত ব্রুট-ফোর্স (brute-force) করে এটি অনুমান করতে হবে। যদি তারা কোনোভাবে "hello world" অনুমান করে ফেলে, তবে তারা উত্তরটি পেয়ে যাবে, কিন্তু যদি তারা এটি অনুমান করতে না পারে, তবে তারা কখনোই এটি পাবে না। আপনি কাছাকাছি যাচ্ছেন কি না তা বোঝার কোনো উপায় নেই।

ক্রিপ্টোগ্রাফি নিয়ে কাজ করার সময় আপনি দেখতে পাবেন যে একজন ডেভেলপার হিসেবে এটি মাঝে মাঝে হতাশাজনক, কারণ এটি হয় কাজ করে, নয়তো করে না — আপনি কাছাকাছি যাচ্ছেন কি না সে সম্পর্কে কোনো ইঙ্গিত পাবেন না। তবে এটি একটি ভালো দিক। একটি হ্যাশ ফাংশনের কাছে আমরা এই বৈশিষ্ট্যটিই চাই।

হ্যাশ ফাংশনের বৈশিষ্ট্যগুলোর সারসংক্ষেপ (3:43)

সুতরাং আমরা যা পেলাম: যেকোনো আকারের যেকোনো কিছু একটি হ্যাশ ফাংশনে ইনপুট দেওয়া যেতে পারে, এবং এটি সেই ডেটার একটি হুবহু 64-ক্যারেক্টারের হেক্সাডেসিমাল ফিঙ্গারপ্রিন্ট আউটপুট হিসেবে দেবে। এটি ডিটারমিনিস্টিক। এটি একমুখী — আপনি উল্টো পথে ফিরে যেতে পারবেন না। একটি হ্যাশ তৈরি করা সত্যিই খুব সহজ, কিন্তু হ্যাশের গোপনীয় তথ্যটি অনুমান করা সত্যিই খুব কঠিন।

মার্কেল ট্রি এবং হ্যাশগুলোকে একত্রিত করা (4:06)

এটি দিয়ে আমরা সত্যিই কিছু চমৎকার কাজ করতে পারি, যেমন একটি মার্কেল ট্রি। আমাদের কাছে তিনটি ইনপুট আছে, এবং আমরা সেগুলোকে একসাথে যুক্ত করতে পারি। আমরা সেই সব হ্যাশগুলোকে একত্রিত করতে পারি এবং তারপর সেই কম্বিনেশনটিকে হ্যাশ করতে পারি।

ঠিক এখানকার এই রঙটি — সেই বেগুনি রঙটি — এই সমস্ত হ্যাশের হ্যাশকে উপস্থাপন করে। আমি যদি "hello world"-কে পরিবর্তন করে "hello world one" করি, তবে সেই বেগুনি রঙটি পরিবর্তিত হয়ে যাবে। এই ইনপুটগুলোর যেকোনোটিতে সামান্য পরিবর্তন চূড়ান্ত হ্যাশটিকে পরিবর্তন করে দেবে। আপনি বিভিন্ন উপায়ে সব ধরনের ডেটা আনতে পারেন — এমনকি হ্যাশের একটি ট্রি, একটি মার্কেল ট্রি তৈরি করতে পারেন — অথবা পরপর একগুচ্ছ ব্লক রাখতে পারেন, এবং এই চূড়ান্ত হ্যাশটি এই সমস্ত কিছুর ওপর ভিত্তি করে তৈরি হবে। যদি পথিমধ্যে কোথাও কোনো ছোট জিনিসও পরিবর্তিত হয়, তবে চূড়ান্ত হ্যাশটি পরিবর্তিত হয়ে যাবে।

মূল শিক্ষণীয় বিষয় (5:53)

মূল শিক্ষণীয় বিষয়টি হলো একটি হ্যাশ ফাংশন মূলত একটি ফিঙ্গারপ্রিন্টের মতো। আমি যদি কিছু টাইপ করি, তবে এটি ডিটারমিনিস্টিক উপায়ে আমাকে আমার প্রত্যাশিত আউটপুটটি দেবে। এটিই হলো একটি হ্যাশ ফাংশন — ETH.BUILD-এ স্বাগতম। চলুন কিছু দারুণ জিনিস তৈরি করি এবং এই যাত্রায় অনেক কিছু শিখি।

এই পৃষ্ঠাটি কি সহায়ক ছিল?