باید بدونیم که هر بلاک در بلاکچین هش خودش رو داره. به عنوان مثال بیاین فرض کنیم هش زیر، هش آخرین بلاک در شبکه هستش:
00000000004b7191bb0a3e804
هش ها رو فرضی و کوتاه شده برای راحتی مثال در نظر گرفتم.
اون صفرهایی که اول هش میبینین نشون دهنده ی سختی شبکه هستش. هر چقدر صفر بیشتر سختی شبکه هم بالاتر. (کار ماینر هم سخت تر).
حالا فرض کنیم هش های زیر، هش تراکنش هایی هستن که هنوز تایید نشدن:
921fda9692 60ba0333b4 dd6ef2d806
ماینر میاد و هش آخرین بلاک و هش این سه تا تراکنش رو ورمیداره و کنار هم قرار میده تا هش بلاک جدید رو به دست بیاره:
00000000004b7191bb0a3e804--921fda9692--60ba0333b4--dd6ef2d806
با دوتا خط فاصله هش هارو جدا کردم که بهتر متوجه بشین (در واقعیت وجود ندارن).
بیتکوین برای الگوریتم اثبات کارش از تابع هش sha256 استفاده میکنه. یعنی وقتی شما ورودی به این تابع پاس بدین یک هش بهتون در خروجی میده:
sha256(00000000004b7191bb0a3e804--921fda9692--60ba0333b4--dd6ef2d806) = 3BjkZ4wzJNHCgJFzQqYfUnz2j6utmTw //مثلا یک هشی
زمانی که ماینر هشی در خروجی بده که تعداد صفر های اولش با صفر های هش بلاک قبلی (در مثال ما 10 تا صفر) برابر باشه یعنی خروجی معتبره و توسط شبکه پذیرفته و بلاک جدید به بلاکچین اضافه میشه.
اما یک مشکلی که وجود داره اینه که شما ورودیت ثابته یعنی ورودی ما هش بلاک قبلی و هش سه تا تراکنشه پس خروجی هم ثابته. اگر خروجیش به اندازه کافی صفر نداشت تکلیف چیه؟ اینجاس که nonce مطرح میشه.
نانس صرفا یک عدده که برای متنوع بودن خروجی تابع هش استفاده میشه.
یعنی تابع برای رفع مشکلی که بالا گفتم به این شکل در میاد:
sha256(data+nonce)
حالا کار ماینر اینه که مثلا میاد از nonce = 1 شروع میکنه و تا به خروجی مد نظر شبکه (تعداد صفر های مشخص) نرسیده هی nonce رو افزایش میده و دوباره تابع رو اجرا میکنه. یعنی:
sha256(00000000004b7191bb0a3e804--921fda9692--60ba0333b4--dd6ef2d806----1) sha256(00000000004b7191bb0a3e804--921fda9692--60ba0333b4--dd6ef2d806----2) sha256(00000000004b7191bb0a3e804--921fda9692--60ba0333b4--dd6ef2d806----3) ...
فرض کنیم در nonce = 974 یعنی:
sha256(00000000004b7191bb0a3e804--921fda9692--60ba0333b4--dd6ef2d806----974)
به خروجی رسیدیم که اولش 10 تا صفر داره و هش بلاک قبلی هم 10 تا صفر داشته:
sha256(00000000004b7191bb0a3e804--921fda9692--60ba0333b4--dd6ef2d806----974) = 000000000033VfWqcsaAW1VP
و هوراااا این ماینر برنده میشه بلاکش توسط نود ها به شبکه اضافه میشه و جایزه ی استخراجش رو هم میگیره.
کار ماینر ها در واقع آزمون و خطاس، یک عدد رو افزایش میدن و دوباره تو یک تابع قرار میدن.
آخرین نکته اینکه بیت کوین در واقعیت از double sha256 استفاده میکنه و فرمول واقعی این هستش:
sha256(sha256(data+nonce))
(مثال های بالا ساده شده بودن و من یک sha256 در نظر گرفتم در حالیکه دوتاس)
راجع به sha256 در یک پست جداگانه به طور مفصل صحبت خواهم کرد.