بدوناغراق میشه گفت یکی از بهترین و هوشمندانهترین بخشهای شبکهٔ بیتکوین فرآیند سختی شبکه و کارکرد اونه.
تصویر زیر در یک نگاه همهچیز رو نشون میده، که در ادامه به توضیح اون خواهیم پرداخت.
سختی شبکه مقدار زمانیه که یک ماینر (استخراجگر) بتونه بلاکی رو استخراج و بعد فرآیند استخراجکردن بلاک بعدی رو شروع کنه.
برای این کار درجهٔ سختیای درنظر گرفته شده تا زمان استخراج بلاک از مقدار مشخصی بیشتر یا کمتر نشه و بلاکها بهطورمیانگین در حدود ده دقیقه تولید بشن. برای اینکه سختی شبکه در بازهٔ زمانی تعریفشده ثابت بمونه، درجهٔ سختی تقریباً هر دو هفته اصلاح میشه تا این زمان همیشه ده دقیقه باقی بمونه. بنابراین، تا الآن متوجه شدیم که بازهٔ زمانی ثابتی بین ساخت دو بلاک داریم، که در شبکهٔ بیتکوین ده دقیقهست و با سختی شبکه تنظیم میشه.
سختی شبکه از این جهت مهمه که تضمین میکنه در هر نقطهای از زمان—چه وقتی که تعداد ماینرهای موجود در شبکه زیاد بشه و چه وقتی که تعداد اونها کاهش پیدا کنه—زمان تولید هر بلاک همیشه حدود ده دقیقه خواهد بود. هرچقدر که تعداد ماینرها کم یا زیاد بشه، سختی شبکه به تناسب اون شبکه رو طوری تنظیم میکنه که تولید هر بلاک بهطورمیانگین ده دقیقه زمان ببره. اگه سختی شبکه ثابت میبود، با اضافهشدن ماینرها زمان کمتری طول میکشید تا بلاکهای جدید تولید بشن.
سختی شبکه هر ۲۰۱۶ بلاک—کموبیش هر دو هفته یه بار—اصلاح میشه. درواقع، ما ۲۰۱۶ بلاک داریم که برای تولید هرکدوم از اونها تا ده دقیقه زمان صرف میشه و به ما زمان «تغییر سختی» رو میده؛ اما نکتهای که وجود داره اینه که در اینجا ده دقیقه همیشه ثابت نیست بلکه بهطورمیانگین ده دقیقهست. بههرحال، برای محاسبه نیازه که ۲۰۱۶ (بلاک) رو در ۱۰ (دقیقه) ضرب کنیم، که عددی به دقیقه بهدست میاد. حالا اگه ماینرها جوری استخراج کنن که میانگین نه دقیقه بشه، زمان تغییر سختی هم تغییر میکنه و میشه ۲۰۱۶ (بلاک) ضربدر ۹ (دقیقه).
وقتی سختی شبکه کمتر از ده دقیقه باشه، زمان استخراج هر بلاک در ده دقیقه و در وسعت ۲۰۱۶ بلاک بیشتر از عدد یک میشه، بهاینمعنی که در هر ده دقیقه یک رابطهٔ ۱٫۱ بهوجود میاد که میگه در هر ده دقیقه ما یک بلاک و یکدهم بلاک داریم، که از این طریق بهدست میاد:
expected / actual
20160 / actual
20160/18144 = 1.11
۲۰۱۶۰ برابره با ضرب ده دقیقه در ۲۰۱۶ بلاک، که در حالت ایدهآل نیازه. ۱۸۱۴۴ برابره با ضرب نه دقیقه در ۲۰۱۶ بلاک، و نسبت دوم هم که نسبت حالت ده دقیقه به حالت نه دقیقه هست.
حالا از روی این نسبت سختی جدید برای شبکه تعیین میشه، که در رابطهٔ زیر میبینید:
difficulty × 1.11 = new difficulty
اینجا دو شرط داریم:
- اگه عدد نسبت بزرگتر از یک باشه (بهاینمعنی که بلاکها سریعتر از حالت ایدهآل (ده دقیقه) استخراج بشن)، بنابراین سختی شبکه باید افزایش پیدا کنه تا بتونیم شبکه و فرآیند استخراج رو به سمت ده دقیقه سوق بدیم.
- اگه عدد نسبت کمتر از یک باشه (بهاینمعنی که بلاکها دیرتر از حالت ایدهآل (ده دقیقه) استخراج بشن)، بنابراین سختی شبکه باید کاهش پیدا کنه تا بتونیم شبکه و فرآیند استخراج رو به—درست حدس زدید—ده دقیقه برسونیم.
بهاینصورت، سختی، از روی ۲۰۱۶ بلاک قبلی، برای ۲۰۱۶ بلاک آینده تنظیم میشه تا در اون زمان، با تعداد ماینرها و میانگین زمان پیداکردن هر بلاک، دوباره سنجیده بشه.
نکته: باید درنظر داشت که زمانی که سختی شبکه تنظیم میشه، به گونهای هست که نمیتونه از یک محدوده بیشتر یا کمتر بره، بدینشکل که حداقل یکچهارم برابر و حداکثر چهار برابر بشه، و بیشتر از «حداکثر» و کمتر از «حداقل» ممکن نیست.
این قسمت رو با یه مثال جلو میبریم.
فرض کنیم من به شما تعدادی از اعداد بین ۱ تا ۱۰۰ رو میدم.
شما میتونید در هر دقیقه یک عدد بین ۱ تا ۱۰۰ بهصورت تصادفی انتخاب کنید. شما میتونید اینقدر این انتخاب رو ادامه بدید تا به عددی که مدنظر من هست برسید.
فرض میکنیم من عدد ۵۰ رو درنظر گرفتم.
براساس اینکه شما در هر دقیقه تنها یک بار قادر به انتخاب شمارهای بین ۱ تا ۱۰۰ هستید، بنابراین این مورد دو دقیقه زمان می بره.
اما این خیلی آسونه. پس هدف رو به ۲۰ تغییر میدم. حالا شما میتونید هر ۱/۵ بار امتحان کنید، یا به معنی اینکه هر پنج دقیقه یک بار بهدست بیارید.
نکتهای که هست، شاید شما بار اول که عدد رو انتخاب می کنید، خوششانس باشید و مستقیم ۲۰ رو انتخاب کنید، ولی در بلندمدت به همون پنج دقیقه خواهید رسید، یعنی رسیدن به این شرایط هر پنج دقیقه بهطول میانجامه.
درنتیجه، برحسب میزان انتخابی که میتونید انجام بدید، میتونید از مقدار هدف برای محاسبهٔ زمان بهدستآوردن عدد موردنظر استفاده کنید.
در اینجا سروکار با کامپیوتره و کامپیوتر میتونه به جای اینکه بهطورمستقیم به هدف اشاره کنه، بیاد اون رو به تقسیماتی از محدودهای از اعداد تقسیم کنه و از دل اون، اعداد جدیدی بهدست بیاره که درنهایت به جواب یا هدف مسئله برسه.
This new number is able to control the height of the target.
این شمارهٔ جدید همون سختی شبکهست، که درواقع میشه خیلی ساده از اون برای تغییر مقدار عدد موردنظر و به تناسب اون طول زمان موردنظر استفاده کرد. تمام این فرآیند در رابطهٔ زیر نشون داده شده:
target = targetmax/difficulty
نمونههای مختلفی رو برای مثال در پایین میبینیم که چطور میشه با تغییر سختی شبکه طول پیداکردن هدف رو سختتر کرد:
The higher the difficulty, the lower the target.
برای بیتکوین، مشابه مثال سادهای که در قبل بود کار میکنه. بهاینمنظور، فرآیند هشینگ کاندید بلاک انجام میگیره تا ماینرها بتونن بهترین شانسهای خودشون رو امتحان کنن تا به عدد موردنظر برسن. در اینجا ماینرها امیدوارن که بتونن محدودهٔ کمتری رو انجام بدن تا سریعتر به عدد موردنظر برسن.
And seeing as miners are able to generate thousands of numbers (hash values) per minute, bitcoin uses ridiculously big numbers.
The numbers in bitcoin are just on a much bigger scale.
ازاونجاییکه هزاران ماینر در حال تلاش برای بهدستآوردن شانس خودشون هستن، بنابراین این مقدار طوری تغییر میکنه که اطمینان حاصل بشه با میزان کم و زیادشدن ماینرها به اندازهٔ ده دقیقه بهطول میانجامه. درنتیجه، عددهای هدف متناسب با تعداد ماینرها متغییر هستن.
Even though that difficulty number looks big, the target is still absurdly difficult to get under. It’s like a lottery.
ازاونجاییکه اعدادی که ما با اونها در این شبکه سروکار داریم اعداد بزرگی هستن، کامپیوتر ترجیح میده اونها رو به شکل هگزادسیمال کار کنه.
بهاینصورت میشه که بعد میبینیم ارزش هش هر بلاک یک چیزی شبیه به این میشه:
000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506
این هگزادسیماله؛ درواقع همون عدده که بهصورت هگزادسیمال دراومده. بنابراین، ماینرها تلاش میکنن تا به هدف هگزادسیمال موردنظر برسن.
شما بهراحتی میتونید اعداد هگزادسیمال رو به اعداد معمولی یا همون دسیمال تبدیل کنید.
Hexadecimal | 000000000004864c000000000000000000000000000000000000000000000000 |
---|---|
Decimal | 1861311314983800126815643622927230076368334845814253369901973504 |
Hexadecimal | 000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506 |
---|---|
Decimal | 1533267872647776902154320487930659211795065581998445848740226310 |
به همین دلیل، معمولاً دیده میشه که عدد موردنظر برای بهدستآوردن دارای دستهای از اعداد و حروفه.
این نکته رو نباید فراموش کرد که از لحاظ ارزش اعداد دسیمال با فرم هگزادسیمال یکی هستن و شما میتونید بهراحتی اونها رو به یکدیگه تبدیل کنید.
اعداد سختی شبکه در قالب اعداد اعشاری داده میشن، درحالیکه شما دارید میبینید که هش مورد نظر براساس هگزادسیمال داده شده. اما این ربطی نداره. شما میتونید هگزادسیمال رو دوباره به دسیمال تبدیل کنید و ببینید که درنهایت هر دو حالت نوشتاری اعداد سختی شبکهٔ یکسانی دارن.
Block 100,000 header. The target is hexadecimal, but it is stored in a compact format in the block header (called bits).
میشه با واردکردن دستور getdifficulty در کلاینت بیتکوین به این موضوع رسید.
همینطور میشه سختی شبکه رو با دستور getmininginfo دید.
بااینحال، اگه شما کلاینت بیتکوین رو ندارید، همیشه میتونید سختی شبکه رو از آدرس زیر ببینید:
http://chainquery.com/bitcoin-api/getdifficulty
همینطور اگه علاقهمند هستید که بدونید سختی شبکه در طول زمان چطور تغییر میکنه، میتونید از سایت زیر استفاده کنید، که به همراه چارت هست:
https://bitcoinwisdom.com/bitcoin/difficulty
از تکنولوژی لذت ببریم!