نیما قائدشرفی

گاه نوشته های یک توسعه‌دهنده نرم‌افزار

              

بیتکوین به زبان [نسبتا] پیچیده

یکشنبه ۷ تیر ۹۴

بیتکوین به زبان [نسبتا] پیچیده

احتمالا خیلی از کسانی که به طور روزمره از اینترنت استفاده می‌کنند در مورد بیتکوین شنیده‌اند. اما اکثرا نمی‌دانند که واقعا بیتکوین چیست و چگونه کار می‌کند. منابع مختلفی در مورد اینکه بیتکوین چیست وجود دارد. در وبسایت Coindesk بیتکوین به این صورت توضیح داده شده است: بیتکوین نوعی واحد پول دیجیتالی است که به صورت الکترونیکی ساخته و نگهداری می‌شود. کسی آن را کنترل نمی‌کند. بیتکوینها مانند دلار و یورو چاپ نمی‌شوند، آنها توسط تعداد زیادی از مردم در سراسر دنیا با نرم‌افزارهایی که مسائل ریاضی را حل می‌کنند، تولید می‌شوند.

ویژگی اصلی بیتکوین که آن را از دیگر واحدهای پولی متمایز می‌کند نامتمرکز بودن آن است. به این معنی که هیچ موجودیت مرکزی اعم از یک سازمان، بانک یا دولت مرکزی آن را کنترل نمی‌کند. بلکه تعداد زیادی ازکامپیوترها که بیتکوین‌ها رو تولید یا اصطلاحا ماین (mine) می‌کنند آن را سرپا نگه می‌دارند. این کامپیوترها در رقابت با هم برای حل یک مساله ریاضی تصادفی تراکنش‌های شبکه را پردازش می‌کنند تا زنجیره‌ای از بلاک‌ها را تولید کنند که مورد توافق همه‌ی کاربران شبکه باشد.

خب کم کم موضوع در حال پیچیده شدن است. قصد من از نوشتن این پست این است که توضیح دهم که اصلا چه دلیلی برای این توافق وجود دارد و چطور حاصل می‌شود بنابراین این پیچیدگی زیادتر می‌شود و برای فهمیدن آن حداقلی از دانش فنی و رمزنگاری نیز لازم است. سعی من بر این است که تا جای امکان مطلب را ساده‌تر توضیح دهم که قابل درک باشد.در ادامه بیشتر با بیت کوین آشنا شوید

مرگ بر بانک

اولین سوالی که ممکن است به ذهن برسد این است که اصلا بیتکوین چه مشکلی را حل می‌کند و چه نیازی به آن است؟ همانطوری که در بالا اشاره کردم برخلاف پول‌های رایج، بیتکوین نامتمرکز است. واحدهای پولی کنونی توسط یک سازمان، بانک یا دولت مرکزی که مورد اعتماد هستند تولید می‌شوند. وظیفه این موجودیت مرکزی کنترل وضعیت پول و تایید مالکیت آن است. مثلا بانک شما موجودی حساب شما را ذخیره و مدیریت می‌کند. در صورت انتقال وجه، بانک اطمینان حاصل می‌کند که موجودی از حساب شما کسر و به حساب فرد دوم افزوده شده است به قسمی که شما نمی‌توانید برای بار دوم موجودی کسر شده را به کس دیگری انتقال دهید. بیتکوین نیاز به بانک به عنوان موجودیت مورد اعتماد مرکزی برای جلوگیری از پرداخت مجددِ وجه پرداخت شده را حذف می‌کند و به جای آن این اعتماد عمومی را به صورت نامتمرکز و بر اساس توافق بین تمامی اعضای شبکه با محاسبات ریاضی و رمزنگاری ایجاد می‌کند. این توافق کاملا شفاف است و کلیه تراکنش‌های شبکه قابل دسترس برای تمامی افراد هستند. در ادامه توضیح می‌دهم که این توافق چطور حاصل می‌شود.

 

عدم توافق بهتر از یک توافق بد است

شبکه بیتکوین برای ایجاد اجماع بین اعضا کلیه تراکنش‌ها را در یک پایگاه داده نامتمرکز به نام زنجیره بلاک یا Blockchain ذخیره می‌کند. این زنجیره توسط عملیاتی به نام ماینینگ (mining) ایجاد می‌شود و شامل تعدادی بلاک است. هر بلاک در بلاکچین شامل تعدادی تراکنش است که در واقع همان انتقال وجه‌های صورت گرفته هستند. تنها تراکنش‌هایی که در بلاکچین قرار دارند مورد تایید همه شبکه هستند. وجود یک تراکنش در بلاکچین این اطمینان را می‌دهد که بیتکوینهایی که در آن فرستاده شده‌ مجددا توسط فرستنده قابل استفاده نیستند (به زبان ساده از حساب او کم شده‌اند). حدودا هر ده دقیقه یک بلاک به انتهای بلاک‌چین افزوده می‌شود. بلاک جدید حاوی تراکنش‌های این ده دقیقه و چکیده‌ای (Hash) از آخرین بلاک زنجیره است. در واقع این چکیده باعث ایجاد زنجیره می‌شود و با دنبال کردن آنها می‌توان به بلاک‌های قبلی دسترسی پیدا کرد. بلاکچین کاملا عمومی است و هر عضو شبکه می‌تواند تراکنشهای آن را ببیند و دریافت کند. مثلا وبسایت blockchain.info آخرین تراکنش‌های شبکه را به صورت زنده نشان می‌دهد و این امکان وجود دارد که تراکنش‌های مربوط به یک آدرس خاص را نیز جستجو کرد.

هنگامی که یک انتقال وجه صورت می‌گیرد این تراکنش در شبکه منتشر می‌شود. تمامی افراد این تراکنش را دریافت می‌کنند منتها تا وقتی که یک تراکنش در داخل یک بلاک از زنجیره قرار نگرفته باشد به آن بلاک تایید نشده (Unconfirmed) گفته می‌شود. وقتی که که تراکنش توسط یک ماینر در یک بلاک قرار می‌گیرد و بلاک به انتهای بلاکچین افزوده میشود گفته می‌شود که این تراکنش در عمق یک بلاک ماین شده است یا اصطلاحا دارای یک تاییدیه (confirmation) است. به ازای هر بلاک جدید که بعد از آن به بلاک چین افزوده می‌شود عمق بلاک ذکر شده بیشتر می‌شود و یکی به تاییدیه‌های آن افزوده می‌شود. به عنوال مثال، در شکل زیر تمامی تراکنش‌هایی که در بلاک ۱۰۱ قرار دارند دارای یک تاییدیه هستند و تراکنش‌های داخل بلاک ۱۰۰ دارای ۲ تاییدیه هستند. به همین ترتیب بلاک ۲ دارای ۱۰۰ و بلاک ۱ دارای ۱۰۱ تاییدیه است.


بلاکچین

هر چه عمق یک تراکنش بیشتر باشد احتمال اینکه آن تراکنش برای همیشه در بلاکچین بماند بیشتر است زیرا نود (Node) های بیشتری از آن اطلاع پیدا می‌کنند. وقتی که یک تراکنش در بلاکچین قرار گرفت درخواست تراکنش‌ مشابه‌ (ارسال همان بیتکوینها) توسط شبکه رد می‌شود.

 

کارگران مشغول کارند

تا اینجای داستان به طور کلی توضیح دادم که بلاکچین چیست و تراکنشهای بیتکوین چگونه صورت می‌گیرند. ولی توضیحی در مورد اینکه اصلن بیتکوینها از کجا می‌آیند یا اینکه ماینرها چه می‌کنند ندادم. عده‌ای تصور می‌کنند که ماینرها برای خودشان یک نرم‌افزار اجرا می‌کنند که بیتکوین تولید کنند و سپس این بیتکوین‌ها را وارد مارکت بیتکوین می‌کنند تا بقیه استفاده کنند. به قول مسئولی این تصور غلطی است. در واقع کار اصلی ماینرها تولید بیتکوین نیست بلکه وظیفه آنها پردازش تراکنش‌هایی است که توسط کاربران بیتکوین ایجاد می‌شوند. ماینرها در رقابت با یکدیگر تلاش می‌کنند آخرین تراکنش‌های تایید نشده در شبکه را در قالب یک بلاک به انتهای بلاکچین اضافه کنند. این رقابت به صورت یک مسئله محاسباتی ریاضی بسیار سخت، تصادفی و بی‌مصرف است که برنده آن رقابت این اجازه را پیدا می‌کند که بلاک را به انتهای بلاکچین اضافه کند و تعداد مشخصی بیتکوین جایزه بگیرد. این جایزه همان بیتکوین‌های تولید شده هستند که برای قدردانی از ماینر زحمتکش و خوش‌شانس توسط شبکه به وی پرداخت می‌شود. تنها راه افزایش شانس خود در این رقابت داشتن توان محاسباتی بالا، CPU های قویتر و مصرف برق بیشتر است. هرچه تعداد بیشتری بیتکوین تولید شود سختی این مسئله به طور خودکار توسط شبکه بیشتر می‌شود و توان محاسباتی بالاتری نیاز است. همچنین هر چهار سال یک بار تعداد بیتکوینی که به عنوان جایزه به ماینر برنده داده می‌شود نصف می‌شود تا وقتی که این جایزه به صفر برسد. در زمان نوشتن این متن جایزه ماین کردن یک بلاک ۲۵ بیتکوین است و در چهار سال اول شروع بیتکوین از سال ۲۰۰۹ این مقدار۵۰ بیتکوین بود.

ممکن است بپرسید اصلا چرا ماینرها با هم رقابت می‌کنند و یک مسئله محاسباتی سخت را حل می‌کنند؟ این رقابتِ بسیار سخت برای آن ایجاد شده که تعداد بلاک‌هایی که روزانه به بلاکچین افزوده می‌شود ثابت باشد. همانطور که قبلا هم گفتم هدف ماین‌کردن این است که تمام اعضای شبکه به یک اجماع امن و غیرقابل مداخله برسند. این اجماع از طریق رقابت بر سر حل مسئله‌ سخت و با شانس مساوی برای همه حاصل می‌شود.

حال می‌پردازیم به این موضوع که ماینرها چه مسئله‌ای را حل می‌کنند؟ و چرا این مسئله سخت است؟ برای فهم این بخش نیاز است که با مفهوم درهم‌سازی آشنایی داشته باشید. یک تابع درهم‌سازی یا هش تابعی است که یک ورودی با طول نامشخص را به چکیده‌ای (hash) از آن با طول ثابت تبدیل می‌کند. ویژگی چکیده علاوه بر ثابت بودن طول آن این است که:

  • برگشت ناپذیر است: این امکان وجود ندارد که از چکیده یک داده به خود آن رسید.
  • با احتمال بسیار بالایی یکتاست. در واقع احتمال پیدا کردن داده‌ای دیگر با چکیده‌ی مشابه بسیار بسیار پایین و نزدیک به صفر است (منوط به اینکه طول چکیده با اندازه کافی زیاد باشد. مثلا در الگوریتم SHA-256 این طول ۲۵۶ بیت است) به همین دلیل گفته می‌شود که یکتاست.
  • هر تغییر کوچک در داده ورودی،‌ خروجی را به طور کامل و غیر قابل پیش‌بینی تغییر می‌دهد.

مثلا با استفاده از الگوریتم SHA-256 چکیده اسم nasir مقدار زیر است:

e921bd3a79aa884506a8a1578c555c9548a9355d050974ccecc79baff4f45ce7

چکیده بالا ویژگی‌های گفته شده را دارد: امکان ندارد که با داشتن آن به کلمه nasir رسید، یکتاست و تغییر کوچکی در کلمه nasir آن را به کلی تغییر می‌دهد. مثلا چکیده کلمه nasis معادل زیر است:

5c9389e56d3150ab47b1cef288ba5dd91be683882d69ccbe9e48c0f08307d941

در پروتکل بیتکوین، رقابت ماینرها بر سر پیدا کردن داده‌ای است که چکیده آن با تعداد مشخصی صفر شروع شود. این داده‌ی ورودی ترکیبی است از اطلاعات اصلی بلاک مانند زمان، تراکنش‌ها و یک مقدار تصادفی به نام نانس (nonce) که ماینرها با تغییر آن به دنبال چکیده با تعداد مشخص صفر در ابتدای آن هستند. برای فهم بهتر در نظر بگیرید که بخواهیم عددی به انتهای nasir اضافه کنیم که چکیده آن دارای ۱۰ صفر در ابتدای آن باشد. چکیده‌ای مانند:

0000000000866211bbd7aa959ba46a804d1d9c2dd24a2ae2e0adddbe7772bae5

پیدا کردن عددی که پس از افزودن به nasir چنین چکیده‌ای داشته باشد بسیار مشکل است و تنها راه ممکن، امتحان کردن عددهای مختلف، محاسبه چکیده و شمردن تعداد صفرهای ابتدایی است تا وقتی که چنین چکیده‌ای پیدا شود. این دقیقا مسئله‌ای است که ماینرها بر سر آن رقابت می‌کنند. سختی مسئله نیز با تغییر دادن تعداد صفرهای ابتداییِ مورد نیاز تنظیم می‌شود. این درجه سختی به طور خودکار توسط پروتکل بیتکوین تغییر می‌کند تا اطمینان حاصل شود که حداکثر یک بلاک در هر ده دقیقه ماین شود. در صورتی که تعداد ماینرها زیاد شود و احتمال پیدا کردن چکیده بالا رود، پروتکل، چکیده‌ای با صفرهای بیشتردرخواست می‌کند. از طرف دیگر وقتی که به اندازه کافی بلاک جدید ماین نشود سختی ماین کردن کاهش داده می‌شود تا پیدا کردن بلاک جدید راحت‌تر شود.

تعداد کل بیتکوینها مقدار ثابتی معادل ۲۱ میلیون بیتکوین است. همانطور که قبلا اشاره کردم بیتکوین‌هایی که به عنوان جایزه به ماینر برنده داده می‌شود حدودا هر چهار سال نصف می‌شود تا اینکه در سال ۲۱۴۰ این تعداد به صفر می‌رسد. در نتیجه ماین کردن تراکنش‌ها عملا سودی برای ماینرها ندارد و در نتیجه انگیزه‌‌ای نیز برای آن وجود نخواهد داشت. برای حل این مشکل هنگامی که تراکنشی ایجاد می‌شود این امکان وجود دارد که درصد کمی از آن را به عنوان کارمزد به ماینر پرداخت کرد. در این صورت حتی وقتی که جایزه‌ای وجود ندارد ماینرها تراکنش‌هایی که دارای کارمزد هستند را ماین کرده و به بلاکچین اضافه می‌کنند.

یک پایان تلخ بهتر از تلخی بی‌پایان است

ممکن است الان به فکرتان زده باشد که خودتان بیتکوین ماین کنید تا کمی پول در بیارید و بعد از اینکه به اندازه کافی بیتکوین داشتید آنها را بفروشید در سواحل جزایر قناری کاکتیل بنوشید. من دو دلیل برای این فکر شما می‌بینم. اول اینکه سخت‌افزار‌های زیاد و بسیار قوی برای درهم‌سازی دارید و مصرف برق آنها نیز برای شما مسئله‌ای نیست. طبعا در این صورت من توصیه می‌کنم که دست به کار شوید و بیتکوین ماین کنید. دلیل دومی که من برای این فکر می‌بینم این است که تصور درستی از سختی ماین کردن در زمان کنونی ندارید. برای اینکه بهتر درک کنید ترجمه پاراگرافی از این متن را بخوانید:

سختی ماین کردن یک بلاک بسیار زیاد است. با درجه سختی کنونی، شانس پیدا کردن یک چکیده کمتر از یک بر ۱۰ به توان ۱۹ است. پیدا کردن یک چکیده موفق سخت تر از پیدا کردن یک دانه شن مشخص در کره زمین است. برای پیدا کردن یک چکیده در هر ده دقیقه، نرخ درهم سازی باید به طرز دیوانه‌واری بالا باشد. در حال حاضر، ماینرهای شبکه بیتکوین حدودا ۲۵ میلیون گیگاهش (gigahash) در ثانیه تولید می‌کنند. یعنی ۲۵٫۰۰۰٫۰۰۰٫۰۰۰٫۰۰۰٫۰۰۰ بلاک در هر ثانیه هش می‌شوند تا وقتی که یک بلاک با چکیده مورد نظر پیدا شود. تخمین من (من نه این بابا) این است که قیمت سخت‌افزارهایی که برای ماین کردن بیتکوین استفاده می‌شوند بالغ بر ده‌ها میلیون دلار و مصرف برق آنها معادل کل مصرف کشور کامبوج باشد.

بنابراین بهتر است که بی‌خیال شید.

منبع : سیمکالن;

دیدگاه های شما

حامد

۲۲ خرداد ۹۶ - ۰۲:۱۲
ممنون خیلی مفید بود

مهسا

۱۲ شهریور ۹۴ - ۱۳:۴۳
خواهش :) موفق باشی

نیما قائدشرفی

۱۲ شهریور ۹۴ - ۰۸:۴۰
الان مشکلش رو پیدا کردم :))) مای اسکیول اجازه ذخیره اموت ایکون نمی ده‌ :|

نیما قائدشرفی

۱۲ شهریور ۹۴ - ۰۸:۳۸
سپاس ٬ من در ادامه کامنت قبلی به شما به خاطر دیر جواب دادن توضیح داده بودم ولی نمیدونم چرا نیستش :| برای اینکه بتونم به کامنت ها جواب بدم باید یکم اسکریپت رو بروز می کردم اما فرصت جور نمیشد. بازم ساری که دیر جواب دادم :)

مهسا

۱۲ شهریور ۹۴ - ۰۷:۵۴
حتما همینطوره :)

نیما قائدشرفی

۱۱ شهریور ۹۴ - ۲۲:۱۱
سلام خیلی ممنون مهسا جان. امیدوارم بتونم چیزی بنویسم که مفید باشه

Mahsa

۱۱ تیر ۹۴ - ۰۳:۱۹
salam. khili khob bod. mersi ke dobare shoro kardi :)