بلاکچین مجموعه متوالی از بلاکها هست. برای اینکه متوجه بشید این بلاکها چطور به هم به صورت سریالی متصل میشن و تراکنش ها در هر بلاک چطور قرار میگیره که مانع از تقلب میشه باید قبل از هر چیز با ساختار بلاک آشنا باشید.
در هر بلاک یک مگابایت اطلاعات به صورت هش به عنوان بخشی از الگوریتم اثبات کار بیت کوین ذخیره میشه که ۸۰ بایت متعلق به هدر و مابقی، دادههای تراکنش است.
محتوای هدر بلاک دارای شناسه منحصر به فردی با نام هش هدر بلاک است. هر هدر بلاک در شبکه بیت کوین شامل ۵ بخش اصلی است: ورژن، هش بلاک قبلی، ثبت زمان، سختی و نانس، ریشه درخت مرکل.
در بلاک 645536 در قالب هگزادسیمال، یک هدر بلوک معمولی به صورت زیر است:
اطلاعاتی که در هدر بلاک وجود دارند عبارتند از:
ورژن
این عدد ورژن بلاک یا نسخهای از قوانینی است که این بلاک بر اساس آن قابل تایید است. ۴ تا نسخه هست و نشان میدهد که کدام مجموعه از قوانین اعتبارسنجی بلاک را باید دنبال کرد.
هش هدر بلاک قبلی
بلاک قبل از این بلاک در بلاک چین هم دارای یک هدر مخصوص به خود است که هش آن در هدر بلاک بعدی ثبت میشود. هش SHA256(SHA256()) هدر بلوک قبلی، تضمین می کند که هیچ بلوک قبلی بدون تغییر هدر بلوک قابل تغییر نیست.
هش ریشه مرکل تراکنشها
به صورت خلاصه و ساده، میشود “هش مجموع تراکنشهای موجود در این بلاک”.
یک هش SHA256(SHA256()) ریشه merkle از هشهای تمام تراکنشهای موجود در بلوک مشتق میشود و این اطمینان را میدهد که هیچ یک از آن تراکنشها بدون تغییر هدر قابل تغییر نیستند.
عملکرد درخت مرکل در تراکنش آلیس به باب
در شکل بالا TA بیانگر یک تراکنش معمولی است که در مثال فوق قابل مشاهده است. این تراکنشها به طور مجزا هش میشوند تا مقدار هش هر کدام مشخص شود. برای مثال TD از تابع هش عبور میکند تا مقدار هش HD متناظر با آن مشخص شود. در مورد بیت کوین، تابع هشی که استفاده میشود، SHA256 است.
ابتدا هر تراکنش به طور مجزا هش می شود تا برای آن مقدار هش مشخصی ایجاد شود، سپس مقدار هش جدید با هش تابع همجوار ترکیب می شود و در صورت ترکیب این دو تابع، هش جدید متفاوتی تولید می شود.
برای مثال، مقادیر هش HC و HD ترکیب و هش میشوند تا هش HCD تولید شود. در مثال فوق، ۸ تراکنش با مقادیر هش مختص به خود وجود دارد. هرچند اگر تعداد تراکنشها فرد باشد، برای مثال ۷ تراکنش وجود داشته باشد، هش هفتم با خود جفت میشود تا مقدار هش جدید تولید شود و در این صورت، HH با HH ترکیب میشود تا HHH ایجاد شود.
این فرآیند تا زمانی تکرار میشود که آخرین مقدار هش به دست آید. به این مقدار، ریشه مرکل میگویند. در مثال فوق، ریشه مرکل HABCDEFG است. اندازه ریشه مرکل ۳۲ بایت است و در هدر بلاک قرار میگیرد که بیانگر خلاصه ای از اطلاعات تمام تراکنشهاست.
مزیت های ساختار درخت مرکل
- بررسی آسان این موضوع که آیا در تراکنشها مداخلهای صورت گرفته است یا خیر
- استفاده کمتر از منابع
- تایید آسان اضافه شدن تراکنش خاص در بلاک
مداخله ناپذیر
یکی از مزایای ساماندهی کردن تراکنشها در ساختار درخت مرکل این است که بسیار راحت و آسان میتوان تایید کرد در هیچ کدام از تراکنشهای داخل بلاک، مداخلهای صورت نگرفته باشد.
برای مثال اگر تراکنش TH به تراکنش TXYZ تغییر کرده باشد، مقدار هش آن نیز متفاوت خواهد بود؛ بنابراین، هنگامی که هش به دست آمده با هش مجاور خود ترکیب شود، هش نهایی نیز متفاوت خواهد شد. این امر منجر به ریشه مرکل کاملا متفاوتی میشود، بنابراین میتوان نتیجه گرفت که هرگاه ریشه مرکل تغییر کند، در یک یا بیش از یک تراکنش مداخله و تغییر ایجاد شده است.
استفاده از منابع کمتر
ساماندهی تراکنشها در ساختار درخت مرکل در مقایسه با هش کردن مجموعه تراکنشها و وارد کردن آنها به هدر بلاک، از منابع کمتری استفاده میکند.
اگرچه از نظر فنی، اگر تمام تراکنشها به صورت روش دوم یا همان هش تراکنشها و وارد کردن آنها به هدر بلاک ساماندهی شوند، همچنان عملکرد خواهد داشت؛ اما از منابع بسیار زیادی استفاده خواهد کرد.
این روش مدیریت تراکنشها به دلیل هزینه بسیار زیاد مدیریت منابع بیشتر، میتواند منجر به کاهش نودها در شبکه بیت کوین شود. در نتیجه، غیرمتمرکز شدن شبکه بیت کوین کاهش مییابد.
تایید یک تراکنش
درخت مرکل به کاربران امکان میدهد تا بدون دانلود کردن کل بلاک چین، بتوانند بررسی کنند یک تراکنش مشخص در بلاک حضور دارد یا خیر. اگرچه با استفاده از کلاینتهای سبکتر نظیر پروتکل SPV، کاربران میتوانند بررسی کنند که تراکنش مورد نظرشان در بلاک چین حضور دارد یا خیر.
برای مثال اگر کاربر بخواهد بررسی کند که آیا تراکنش HD در بلاک حضور دارد، به جای دانلود کل بلاک چین و بررسی آن، تنها چیزی که وی نیاز دارد ریشه مرکل، HAHEFGH، HAB و HC است. اگرچه همچنان برای تایید حضور تراکنش در بلاک به اطلاعات مربوطه نیاز است، اما به طور چشمگیری بهتر از دانلود کل بلاک چین است.
تایم استمپ
این عدد نشاندهنده دقیق زمانی است که در آن ماینر شروع به پیدا کردن هش بلاک کرده است. زمان بلوک یک زمان یونیکس است که در آن ماینر شروع به هش کردن هدر کرده (طبق گفته ماینر). باید بیشتر از زمان میانه 11 بلوک قبلی باشد.
برچسب های زمانی اختلاف یک الی دو ساعته دارند. هنگامی که یک نود به نود دیگری متصل میشود، Timestamp آن را میخواند و اختلاف زمانی خود را بر حسب زمان UTC تنظیم میکند؛ در نتیجه زمان تنظیم شده کل شبکه همان ساعت فعلی بر حسب UTC به علاوه اختلاف زمانی نودها است. این اختلاف هرگز بیشتر از ۷۰ دقیقه نسبت به زمان مرجع یا همان UTC نیست.
شرایط یک برچسب زمانی معتبر بدین صورت است: بیشتر از میانگین برچسبهای زمانی ۱۱ بلاک قبلی و کمتر از زمان تنظیم شده در شبکه، به علاوه ۲ ساعت اضافی باشد. زمان تنظیم شده در شبکه را نیز TimeStampهای نودها مشخص میکند؛ در نتیجه دقیق نیستند و نیازی هم به این مورد نیست.
هدف از برچسب زمانی چیست؟
شاید اینطور به نظر برسد که زمان، عامل مهمی در شبکه بیت کوین نیست، زیرا بلاکها ترتیب مشخصی دارند و مرجع هر بلاک، هش ریت بلاک قبلی است. بلاک های بیت کوین هم چنین شامل تراکنش ها، درخت مرکل منتهی به هدر بلاک و هش بلاک است که برای گواه اثبات کار مورد استفاده قرار میگیرند. در نگاه اول به نظر میرسد این عوامل برای تراکنش ها و سیستم اجماع شبکه کافی باشد. هرچند مساله تنظیم سختی شبکه نیز نقش مهمی دارد. اگر ماینرهای زیادی در شبکه حضور داشته باشند زمان استخراج بلاک کاهش مییابد و اگر ماینرهای زیادی از شبکه خارج شوند زمان استخراج بلاک به شدت زیاد میشود و شبکه ناپایدار میشود. به منظور برطرف کردن این مشکل، هر دو هفته یکبار، سختی شبکه مجددا تنظیم میشود تا مدت زمان استخراج بلاک بر روی ۱۰ دقیقه ثابت بماند. به منظور تثبیت زمان ده دقیقه ای، مفهوم و عامل زمان به بلاک چین وارد شده و بخشی از سیستم اجماع میشود. در نتیجه، بلاک ها باید دارای برچسب زمانی باشند و از اینرو میتوان شبکه بیت کوین را به عنوان اولین ساعت الکترونیکی توزیع شده در جهان در نظر گرفت. دلیل استفاده از برچسب زمانی بیت کوین عبارتند از:
محاسبه سختی شبکه
انجام تراکنش های تایم لاک ( شرایطی برای تراکنش که فقط در زمان یا بلاک مشخصی از بلاک چین پردازش شود.) اولین دلیل استفاده از برچسب زمانی، تعیین سختی شبکه و هم چنین شناسایی تغییرات هش ریت بلاک است. اگر برچسب زمانی وجود نداشته باشد نودها نمیتوانند متوجه سختی شبکه شوند زیرا نمیدانند استخراج بلاک های قبلی چه مقدار طول کشیده است. ماینرها میتوانند برچسب زمانی را دستکاری کرده و تغییر دهند اما نودها، برچسب های زمانی که خارج از محدوده قابل قبول باشد را رد میکنند.
تنظیم زمان شبکه به صورت غیرمتمرکز و با همگام سازی با سایر نودها صورت میگیرد. یک نود، برچسب زمانی تمام نودهای همتای خود را بر حسب زمان UTC از آنها دریافت میکند و اگر در محدوده ۷۰ دقیقه ای اشاره شده باشد، میانگین زمان شبکه از تمام برچسب های زمانی نودها محاسبه خواهد شد.
به همین دلیل است که برچسب زمانی در شبکه بلاکچین از اهمیت بالایی برخوردار است و در واقع مجموعی از این المانها در الگوریتم شبکه بیت کوین اجماع را به وجود آوردهاند.
سختی هدف یا nBits
نشان دهنده تارگت یا هدفی است که توسط شبکه مشخص شده و در صورتی که هشی که ماینر برای این بلاک پیدا میکند از این عدد کوچکتر باشد، بلاک استخراج شده تلقی میشود و ماینر به پاداشش میرسد.
تصویر زیر نمونه ای از هش بلاک است که صفرهای ابتدایی آن،نشان دهنده شرط تعیین شده از طریق پارامتر سختی شبکه میباشد:
هر چه تعداد صفر ها بیشتر باشد، سختی بیشتر است.
در شبکه بیت کوین با توجه به تعداد ماینرها و قدرت پردازشی شبکه، سختی به عنوان ابزاری برای اندازهگیری توان پردازشی مورد نیاز برای استخراج یک بلاک استفاده میشود.
سختی بلاک در تمامی شبکه یکسان است و این یعنی شانس تمامی استخراج کنندگان برای پیدا کردن هش صحیح برابر است. شبکه بیت کوین معمولا تعداد معینی از بلاکها را برای پردازش در مدت زمانی مشخص، تعیین میکنند (به عنوان مثال در شبکه بیت کوین، هر 2016 بلاک باید در مدت زمان دو هفته یا 20160 دقیقه استخراج شود؛ یعنی به طور متوسط، هر بلاک در ده دقیقه) و با تنظیم خودکار سختی شبکه، انجام این روش را تضمین میکنند. اگر تعداد بلاکهای پردازششده با هدف برابر نباشد، سختی شبکه تغییر یافته و با مدت زمان مشخصشده هماهنگ خواهد شد.
نانس (Nonce)
نانس (Nonce) مخفف عبارت “عددی که تنها یک بار به کار میرود” (Number only used once) است و به عددی گفته میشود که به یک بلاک هش شده (Hashed) – یا رمزنگاری شده – در بلاک چین اضافه شده و هنگامی که این عدد به همراه هش بلاک مجدداً هش شوند (Rehash)، قادر خواهند بود هشی ایجاد کنند که شرایط و محدودیتهای تعریف شده توسط پارامتر سختی شبکه (Network Difficulty) را برآورده نماید.
میدانیم که تابع هشینگ، تابعی یک طرفه است که در ازای ورودی یکتا، همیشه خروجی یکتایی تولید میکند. با توجه به اینکه اطلاعات موجود در هدر بلاک (شامل هش بلاک قبل، برچسب زمانی، ریشه درخت مرکل و …) داده های ورودی ثابت تابع هش هستند، هش خروجی همیشه یک مقدار خواد داشت. اما افزودن عدد متغیر نانس به این هش، ورودی متغیری را برای تابع هش ایجاد میکند که به ماینرها اجازه میدهد هش بلاک را متناسب با تارگت تعیین شده توسط سختی شبکه، پیدا کنند. نانس همان عددی است که استخراج کنندگان بلاک چین به دنبال یافتن آن هستند. زمانی که راهحل هش پیدا میشود، استخراج کنندگان در ازای آن بیت کوین دریافت خواهند کرد.
تصویر زیر خلاصه ای از اطلاعات موجود در بلاک به همراه عدد نانس میباشد:
تا اینجا متوجه شدید که به منظور ایمن نگه داشتن بلاک چین، دادههای مربوط به بلاکهای قبلی به مجموعهای از اعداد و حروف رمزنگاری یا “هش” تبدیل شده و در بلاک های بعدی ثبت میشوند تا از این طریق اطلاعات بلاک های قبلی غیرقابل دستکاری باشد. این فرآیند با استفاده از یک تابع درهم نگارنده یک طرفه انجام میشود که در ازای هر ورودی مشخص، خروجی مشخصی را با طول ثابت به وجود میآورد. یعنی هربار که ورودی را تکرار کنیم، خروجی مشابهی را دریافت خواهیم کرد و با ایجاد هرتغییر کوچکی در داده ورودی، خروجی تابع به شکل غیر قابل پیشبینی به هم میریزد. این تغییرات غیرقابل پیش بینی، همان چیزیست که یافتن نانس و تولید هش مورد نظر را برای ماینر ها (استخراج کننده ها) سخت میکند. این سیستم پیچیده باعث به وجود آمدن شبکه امنیتی بلاک چین شده است.
پیدا کردن نانس (Nonce)
فرآیند پیدا کردن هش از بلاک هِدِر (Block Header) آغاز میشود که دارای مواردی چون شماره نسخه بلاک، برچسب زمان، هش مورد استفاده در بلاک قبلی، هش ریشه مرکل (Merkle Root)، نانس و هش هدف است.
نانس زنجیرهای از اعداد تصادفی است که به محتوای هششده بلاک اضافه شده و سپس دوباره در فرآیند هش قرار گرفته است.
اگر هش با الزامات از پیش تعیینشده در هدف برابر باشد، بلاک موجود به بلاک چین اضافه میشود. جستجو در میان راهحلهای احتمالی به منظور پیدا کردن نانس با نام اثبات کار (Proof of Work) شناخته میشود.
مشخص کردن زنجیره عددی مورد استفاده به عنوان نانس (Nonce) به آزمون و خطای بسیار زیادی نیاز دارد، چرا که تمامی زنجیرهها تصادفی هستند. استخراج کننده باید نانس را پیدا کرده و آن را به هش متصل کند، نرخ فعلی را دوباره هش کرده و در نهایت نتیجه را با هش هدف مقایسه کند. اگر هش به دست آمده با الزامات تعیینشده برابر باشد، استخراجکننده راهحل مورد نظر را یافته است و پاداش را دریافت خواهد کرد.
استخراجکنندگان در بلاک چین سعی دارند به عنوان اولین نفر نانسی را که با آن، هش بلاک، سختی هدف بلاک را برآورده میکن، پیدا و بلاک را با موفقیت استخراج کنند.
پیدا کردن نانس در تلاش اول بسیار بعید است، چرا که استخراجکنندگان باید گزینههای زیادی را امتحان کنند تا نانس درست را بیابند. هرچه سختی شبکه – معیار مورد استفاده برای سنجش میزان دشواری ساختن هشی که از هدف کمتر است - بیشتر باشد، به دست آوردن راهحل نیز بیشتر طول خواهد کشید.
جمع بندی
بیایید یکبار دیگر به شکلی سادهتر به کل آن نگاه کنیم:
هر ماینر ابتدا تعدادی از تراکنشهای تایید نشده موجود در شبکه (این تراکنشها در فضای MemPool قرار دارند) را برای خود انتخاب میکند (معمولا تراکنشهایی را انتخاب میکنند که کارمزد بیشتری دارند) و آنها را در قالب یک بلاک طبق بندی میکند؛ یعنی بدنه بلاک پیشنهادی این ماینر، از همین تراکنشهای انتخابی او تشکیل شده است.
در هدر، ورژن یک عدد است که به واسطه آن ماینر به شبکه اعلام میکند که تابع کدام نسخه از قوانین شبکه است. هش هدر بلاک قبلی هم که بر اساس آخرین بلاک موجود در بلاک چین تعیین میشود.
هش ریشه مرکل هم که در واقع هش تمام تراکنشهای موجود در این بلاک پیشنهادی است و بر اساس تراکنشهای انتخاب شده تعیین میشود. زمان هم که مشخص است و nBits هم که به نوعی نشان دهنده تارگت است و توسط شبکه بیت کوین تعیین شده و معیاری برای سخت و آسان کردن رقابت (سختی شبکه) است. هرچه تارگت کوچکتر باشد (تعداد صفرهای ابتدای هش هدف بیشتر باشد)، شرایط سختتر میشود.
بعد از آن که تمام این اطلاعات مشخص شد، تنها چیزی که باقی میماند عدد نانس است که ماینر باید آن را خودش پیدا کند. ماینر ابتدا یک عدد شانسی را به جای نانس قرار میدهد.
اگر این هش مقدارش از عدد تارگت تعیین شده توسط شبکه کوچکتر باشد، ماینر موفق به استخراج بلاک پیشنهادی خودش شده و میتواند بلاکش را به زنجیره بلاک چین اضافه کند و پاداشش را دریافت کند؛ اما احتمال این که ماینر در اولین حدس خود برای عدد نانس موفق شود، نزدیک به صفر است (جلوتر متوجه میشوید که این احتمال چقدر کم است) و احتمالا آن عدد نانس منجر به پیدا شدن هش هدری بزرگتر از تارگت میشود که قابل قبول شبکه نیست.
در گام بعدی، ماینر حدس خود برای نانس را عوض میکند به فرض عدد ۲ را قرار میدهد و هش بلاک را محاسبه میکند و میبیند که هش هدر از تارگت کوچکتر میشود یا خیر و مجدد در صورت بزرگتر بودن هش، باز هم حدس خود برای عدد نانس را تغییر میدهد و با سعی و خطا این کار را ادامه میدهد.
برای تایید شدن یک بلاک، ماینرها باید نانس را طوری حدس بزنند که تعداد صفرهای ابتدای هش بلاک از تعداد صفرهای سختی هدف بیشتر یا مساوی باشد.
حال در آخر، بعد از کلی حدس یا موفق میشود که بلاک خود را به عنوان اولین نفر استخراج کند یا یک نفر دیگر در جایی دیگر از دنیا زودتر از او موفق میشود بلاک پیشنهادیش را استخراج کند؛ در این صورت ماینر از ادامه دادن به حدس زدن نانس برای بلاک خودش دست میکشد. چون حالا دیگر آخرین بلاک موجود در بلاک چین (بلاک قبلی) و هش آن تغییر کرده و ماینر باید این اطلاعات را هم به روز رسانی کند و دوباره مشغول به حدس زدن عدد نانس شود.
حتما شنیدهاید که میگویند مثلا فلان دستگاه ماینر، ۱۴ ترا هش بر ثانیه (Th/s) قدرت دارد. جالب است بدانید که این عدد یعنی آن دستگاه قادر است در هر ثانیه ۱۴ تریلیون حدس مختلف برای عدد نانس بزند؛ یعنی این دستگاه میتواند در یک ثانیه، کل فرآیند توضیح داده شده را ۱۴ تریلیون بار تکرار نماید!
با این توان خارقالعاده در حدس زدن پیاپی، اگر چنین دستگاهی بخواهد در حال حاضر (با فرض هش ریت کلی ۷۰ میلیون تراهش بر ثانیه)، به تنهایی در این رقابت جهانی شرکت کند، شانسش برای برنده شدن، در هر ده دقیقه که یک بلاک جدید به شبکه اضافه میشود، تقریبا یک در ۵ میلیون است! یعنی شاید سالها طول بکشد که این دستگاه بتواند به تنهایی موفق به استخراج یک بلاک جدید شود.
برای اطلاعات بیشتر و تخصصی این مقاله را از دست ندهید.