در مقاله قبلی در مورد ایده ساخت بیت کوین، اولین شبکه بانکی و مالی غیرمتمرکز در تاریخ، صحبت کردیم و بررسی کردیم که ساتوشوی ناکوموتو، خالق بیتکوین، چگونه با معرفی تکنولوژی بلاکچین که یک دفترکل غیرمتمرکز است عملا توانست چالشهای موجود برای ساخت شبکه را حل کند. همچنین در مورد یکی از مهمترین الگوریتمهای بلاکچین یعنی ماینینگ به روشی اثبات کار توضیحات مختصر و پایهای را دادیم. در این مقاله هم قصد داریم علاوه بر آشنایی کلی با مباحث هش، درخت مرکل و ساختمان بلوک در بلاکچین، بحث ماینینگ را به صورت الگوریتمیک و مفصلتر مورد بررسی قرار دهیم.
تابع هش SHA-256 یک تابع رمزنگاری یکطرفه است که هر نوع داده ورودی دیجیتالی (متن، عکس و نرمافزار) را در یک فرآیند پیچیده محاسباتی و ریاضیاتی به یک خروجی عددی ثابت 32 بایتی یکتا تبدیل میکند. به این خروجی اصطلاحاً «هش» میگویند. بلاکچین از الگوریتم SHA-256 برای کاربردهای زیادی از جمله عملیات ماینینگ، آدرس کیف پول و هش کردن تراکنشها استفاده میکند. در زیر چند نمونه هش را میبینیم.
درخت مرکل، یک ساختمان داده است که در برنامههای کامپیوتری استفاده میشود. در شبکه بیتکوین و دیگر رمزارزها از درخت مرکل برای رمزگذاری کارآمد و ایمنتر تراکنشها در بلاکچین استفاده میشود. به نمودار زیر نگاه کنید، در درخت مرکل ابتدا تراکنشها هش میشود. بلاکچین برای هش از الگوریتم SHA-256 استفاده میکند. سپس هر جفت هش بهدستآمده را به هم چسبانده میشود و یکبار دیگر هش گرفته میشود (مانند هش A و B) و این فرآیند آنقدر برای هر جفت هش انجام میشود تا در انتها یک هش باقی بماند که به آن اصطلاحاً «ریشه درخت مرکل» میگویند. بلاکچین هش «ریشه درخت مرکل» را در «هدر بلوک» قرار میدهد.
درخت مرکل در بلاکچین بسیار کاربردی است چرا که این امکان را میدهد تا تراکنشها را بدون آنکه نیاز به دانلود کل بلاکچین (تا این تاریخ، حدوداً 500 گیگابایت) باشد بررسی و تائید کنیم. برای این کار فقط نیاز است هدر بلوکها (تا این تاریخ، حدوداً 100 مگابایت) را داشته باشیم. برای مثال، فرض کنیم میخواهیم درستی تراکنش D را، در نمودار بالا، تائید کنیم. ازآنجاییکه هدر بلوکها را داریم پس روت درخت مرکل H(ABCDEFGH) را نیز داریم. فقط نیاز داریم از شبکه بخواهیم H(D)، H(C)، H(AB) و H(EFGH) را برایمان فراهم کند تا بتوانیم با محاسبه آنها به هش روت برسیم. اگر هش محاسبه شده با هش روت مرکل در بلوک هدر یکسان باشد به این معنا است که تراکنش D درست بوده است.
بلوکها از اساسیترین سازهها در بلاکچین هستند. هر بلوک متشکل از هدر و بدنه است. در هدر، متاداده و اطلاعات مربوط به پارامترهای ماینینگ قرار میگیرد. بدنه بلوک محل قرارگیری تراکنشها و پیام ماینر است. تراکنش کوینبیس همیشه اولین تراکنش است که بدنه قرار می گیرد؛ این تراکنش نشان دهنده پاداش ماینر است. تراکنشها از Mempool انتخاب میشود؛ Mempool یک فضای موقت است که تراکنشهای دریافت شده توسط هر نود در آن قرار میگیرد و هر ماینری میتواند بهدلخواه یک سری تراکنش را از آنجا انتخاب کند و داخل بلوک قرار دهد. این نکته هم قابلتوجه است که معمولاً تراکنشهایی که fee بیشتری (پاداش اضافه) برای ماینر در نظر گرفته باشند شانس بیشتری برای قرار گرفتن در بلوک را دارند.
تمرکز ما در این مقاله بر روی هدر بلاکچین است و اینکه بفهمیم چگونه میانرها با استفاده از هدر بلوک و تغییراتی در فیلدهای آن میتوانند ماینینگ را انجام دهند.
از اینجا به بعد برای ملموستر شدن مفاهیم و الگوریتم ماینینگ از یک مثال واقعی استفاده میکنیم. به نحوی که میخواهیم خود را بجای یک نود بگذاریم و با قراردادن پارامترهای هدر در الگوریتم، بلوک ساخته شده توسط ماینر را تائید کنیم.
قصد داریم بلوک شماره 69990 بلاکچین بیت کوین را مورد بررسی قرار میدهیم که در تاریخ 24 جولای 2010 ساخته شده است. در تصویر زیر بلوک شماره 69990 را میبینیم.
اندازه هدر بلوک در بلاکچین بیتکوین 80 بایت است و از شش فیلد مجزا تشکیل شده است. بلاکچین برای ذخیرهسازی هدر بلوک فیلدهای آن را به فرمت هگزادسیمال و به چینش لیتل-اندین تبدیل در میآورد. لیتل-اندین یک نوع چینش بایت در حافظ جانبی کامپیوتر است که کم ارزشترین بایت متغیر را در ابتداییترین خانه حافظه ذخیره میدهد.
اما هدر بلوک چگونه ساخت میشود و مقادیر فیلدهای آن چگونه تعیین میشود. برای پاسخ به این سؤال باید بدانیم که ساخت هدر بلوک مستقیماً مرتبط با بحث ماینینگ است زیرا که بعضی از فیلدهای آن مانند مرکل روت، زمان و نانس از متغییرهای الگوریتم ماینینگ محسوب میشوند و مقادیر نهایی آنها زمانی مشخص میشود که ماینر برنده بتواند بلوک را بسازد. بدین منظور برای شناخت بهتر فیلدهای هدر بلوک ابتدا میبایست باید با خود الگوریتم ماینینگ آشنا شویم.
به طور خلاصه الگوریتم ماینینگ اینگونه کار میکند: ماینر هدر بلوک را با انتخاب یک نانس تصادفی میسازد و دو بار از آن هش میگیرد تا هش بلوک ساخته شود. او هش بلوک را با «سختی شبکه» مقایسه میکند. اگر مقدارش کوچکتر باشد مانیر بلوک را می سازد و برای تائید به دیگر نودها شبکه ارسال میکند. اما اگر شرط بر قرار نشد ماینر دوباره عملیات ماینینگ را با پارامترهای جدید مانند تغییر نانس، عوض کردن تراکنش برای محاسبه جدید مرکل روت و بروزراسنی زمان انجام میدهد تا شاید شانس موفقیت را به دست آورد. اگر در این میان هر ماینری در شبکه زودتر بتواند به شرط مورد نظر برسد، عملیات ماینینگ برای بلوک جاری متوقف می شود و عملیات بر روی بلوک بعدی شروع میشود.
در بلاکچین «سختی شبکه» یعنی متغیری که تضمین میکند هر بلوک حدودا در مدت زمان 10 دقیقه ساخته شود. این متغیر هر دو هفته که معادل 2016 بلوک است به روز میشود. اگر نودهای زیادی به شبکه وارد شود و باعث شود بلوکها در کمتر از 10 دقیقه ساخته شوند عدد سختی شبکه کوچکتر خواهد شد و همینطور برعکس.
به تصویر زیر نگاه کنید. فرض کنیم می خواهیم سختی شبکه را برای بلوکهای 4032 تا 6048 محاسبه کنیم. برای این کار باید مدت زمان ساخت بلوک برای 2016 بلوک قبل از آن (یعنی از 2016 تا 4032) را بدست آوریم و آن را تقیسم بر عدد ثابت 20160، که نشان دهنده زمان استاندارد و ایده آل برای ساخت بلوک است، تقسیم کنیم و خروجی را در مقدار سختی شبکه ضرب کنیم تا سختی شبکه برای دو هفته آینده تعیین شود.
در نمودار زیر فلوچارت الگوریتم ماینینگ به روش اثبات کار را مشاهده میکنید.
1- انتخاب ورژن فعلی؛ ورژن فیلدی است که تغییرات و بروزرسانی پروتکل بیت کوین را نشان میدهد.
2- پیدا کردن هش بلوک قبل با بررسی زنجیره بلاکچین؛
3- انتخاب تعدادی تراکنش از حافظه mempool و قرار دادن در بلوک کاندید
4- ساخت تراکنش کوینبیس؛ تراکنش پاداش ماینر
5- محاسبه مرکل روت؛ با تراکنش کوینبیس و مجموعه تراکنشهای انتخاب شده
6- محاسبه سختی شبکه.
7- ثبت زمان جاری؛ زمان جاری نشان دهنده زمان شروع عملیات ماینینگ بلوک است و با فرمت یونیکس تایم ذخیره میشود.
8- به هم پیوستن فیلدهای اشاره شده در مراحل قبل و ساخت «مسیج بلوک»
9- انتخاب نانس؛ نانس یک عدد 4 بایتی است و مقدارش میتواند از صفر تا چهار میلیارد باشد. ماینر یک عدد رندم را انتخاب میکند.
10- چسباندن مقدار نانس به انتهای پیام بلوک و ایجاد یک هدر پیشنهادی برای بلوک
11- انجام دو بار هش SHA-256 بر روی هدر برای ساخت هش بلوک
12- مقایسه هش بلوک با سختی شبکه.
13- اگر هش خروجی از سختی شبکه بزرگتر باشد، دوباره از مرحله 9 الگوریتم را تکرار میکنیم. اگر تمامی مقادیر نانس را چک کردیم و هنوز نتوانستم به شرط ساخت بلوک برسیم میبایست با تغییر در زمان جاری و همچنین تغییر در تراکنشهای انتخابی یک مرکل روت جدید بسازیم و عملیات را دوباره تکرار کنیم
14- اگر هش خروجی کوچکتر از سختی شبکه بود، ماینر میتواند بلوک را بسازد. و بعد از آنمیبایست سریعاً بلوک را برای دیگر نودهای شبکه بفرستد تا آنها صحت کارش را نیز تائید کنند.
به تصویر زیر نگاه کنید، هدر بلوک شماره 69990 به همراه فیلدهای تشکیل دهنده آن را میبینید. ماینر توانسته با این پارامترها موفق به ساخت این بلوک شود. خب فرض کنیم ما یک نود هستیم و میخواهیم کار این ماینر را بررسی کنیم که آیا درست بوده است یا خیر!
تبدیل به فرمت استاندارد
در ابتدا، «زمان ساخت بلوک» را به فرمت یونیکس تایم تبدیل میکنیم که میشود: «1279982980»
سپس هر فیلد را به فرمت هگزادسیمال و چینش لیتل-اندین در میآوریم و به ترتیب به هم میچسبانیم. در تصویر زیر خروجی نهایی را میبینید.
از هدر بلوک دو بار هش SHA-256 می گیریم تا هش بلوک به دست آید.
خب از آنجایی که ورودی در چینش لیتیل-اندین بود. خروجی هم این چینش است. اما برای مقایسه با سختی شبکه باید هش بلوک را تبدیل به چینش بیگ-اندین کنیم که میشود:
همان جور دیدیم سختی شبکه برای این بلوک برابر با 1c0168fd است. اما این مقدار در واقع نسخه کوچک فیلد 32 بیتی آن است. بدین گونه نسخه کوچک را به مقدار واقعی تبدیل میکنیم:
خب با یک مقایسه ساده میبینیم که هش خروجی ماینر کوچکتر از سختی شبکه است، پس کار او درست بوده و میتوانسته بلوک را بسازد.
در این مقاله به صورت الگوریتمیک بررسی کردیم که ساتوشی ناکوموتو چگونه توانست، با استفاده از بلاکچین و الگوریتم ماینینگ به روش اثبات کار، ساختاری غیرمتمرکز برای ثبت تراکنشها و مفهوم پول بهوجود آورد. یکی از نقاط ضعف الگوریتم روش اثبات کار این است که احتیاج به منابع زیادی برای محاسبات هش دارد و خیلی دوست دار طبیعت نیست. برای همین بلاکچینهای مدرن به سراغ روشهای دیگری، مانند اثبات سهام، رفتند که به مراتب نقاط قوت بیشتری نسبت به روشاثبات کار دارند.
منابع:
https://learnmeabitcoin.com