اجماع و نحوه دستیابی به آن در بیت کوین

قبل از اینکه اجماع رو تعریف کنیم بهتره که یه مقدار برگردیم به عقب و ببینیم چرا ساتوشی ناکاموتو بیت کوین رو بوجود آورد؟ببینید ، واضحه که قبل از ارز های دیجیتال ، ارز های کاغذی و اسکناس ها وجود داشتند و دارند . پس ارز های دیجیتال (و اینجا به طور خاص بیت کوین ) باید مزیتی رو دارا باشند که مردم مجاب بشن برای ارزی که دیجیتاله و به قولی از یه مشت صفر و یک کنار هم ساخته شده و پشتوانه ای جز اعتماد خودشون نداره، وقت و هزینه صرف کنند و تو معاملات خودشون استفاده کنن.مزایا و معایب این ارزها زیاده ولی از مهم ترین مزیت های این ارزها که مردم رو به خودش جذب کرد،عدم نیاز به شخص ثالث در تراکنش ها (third party) و در نتیجه امنیت و شفافیت بیشتر در معاملات بوده.حالا این شخص ثالث یعنی چی ؟ یه دنیای بدون ارز‌ دیجیتال رو تصور کنیم و شخصی رو تصور کنید که قراره از یه فروشگاه اینترنتی مثل X خرید کنه و راهی جز خرید با استفاده از کارت اعتباریش نداره. شخص وارد سایت X میشه، کالای مورد نیازش رو انتخاب میکنه، اطلاعات کارت بانکی رو وارد میکنه و میفرسته برای X ، اطلاعات توسط سرور های X به بانک فرستاده میشه تا صحت اون ها چک بشه و بعد از تایید اطلاعات، سفارش ثبت میشه.اینجا بانک نقش شخص ثالث رو داره.شبکه بیت کوینشبکه بیت کوین یک شبکه غیر متمرکزه و طوری طراحی شده که برای انجام تراکنش بین دو طرف نیازی به واسطه برای تایید نباشه و خود شبکه تصمیم میگیره که این تراکنش معتبره یا نه.یعنی به جای اینکه صرفا یک پایگاه داده ی همگانی از تراکنش ها وجود داشته باشه که فقط تحت کنترل یک شخص باشه،کل افرادی که در شبکه ی بیت کوین حضور دارند در ثبت و تایید تراکنش ها شرکت دارند.یعنی اساسا همه‌ی node های موجود در شبکه، یک کپی از تمامی تراکنش های موجود از ابتدای پیدایش بیت کوین تا زمان حال که بهش ledger گفته میشه رو در اختیار دارن.شاید اولین تصورتون از ساختار درونی ledger ها این باشه که همه تراکنش ها به ترتیب زمانشون در یک لیست قرار میگیرن و یه بلاک(block) بزرگ از تمامی تراکنش هایی موجود از زمان پیدایش بیت کوین رو تشکیل میدن.ولی خب در واقعیت ledger از مجموعه ای از بلاک های بهم متصل که بهشون blockchain گفته میشه ساخته شده .هر بلاک حاوی تراکنش ها + hash بلاک قبلی هستش. hash رو میتونید یک تابع در نظر بگیرید که یک ورودی میگیره و یک خروجی عددی بر میگردونه(که خروجی معمولا برای کوتاه تر شدن در مبنای 16 قرار داره) .همچنین امکان نداره که دو تا ورودی متفاوت خروجی یکسان داشته باشند.محتوای بلاک ها همونطور ک احتمالا حدس زدید تراکنش ها هستند و هر بلاک تقریبا حجمی معادل 1MB داره و طبیعتا تعداد محدودی از تراکنش ها رو میتونه درون خودش جای بده.در شبکه بیت کوین هر ledger ای که طول بیشتری از بلاک ها رو داشته باشه به عنوان ledger مرجع در نظر گرفته میشه . همچنین این رو از من بپذیرید که به دلیل مکانیزم امضای دیجیتال، هیچکس در شبکه بیت کوین نمیتونه بجای کس دیگه ای تراکنشی انجام بده (دلیلش مفصله و از این مقاله خارجه) شما خودتون هم به سادگی میتونید سورس bitcoin رو از گیت هاب دانلود کنید و بعد از دانلود ledger، به عنوان یک node در شبکه فعالیت کنید.تو شکل زیر یه شمای کلی از شبکه بیت کوین رو میتونید ببینید. شبکه ی بیت کوین ( link.springer.com )اجماعخب با شبکه ی بیت کوین آشنا شدیم . حالا یه سوال و مشکل اساسی که به علت غیر متمرکز بودن این شبکه بوجود میاد اینه که کدوم node ها دارن راست میگن و ledger اصلی شبکه کدوم یکیه؟اینجاست که به مفهوم اجماع(consensus) می رسیم. اجماع یعنی اینکه تمامی node های حاضر در یک شبکه غیر متمرکز بر روی یک ledger مشترک به توافق برسن . بنابراین نیاز به یک ledger مرجع که باقی ledger ها نسبت به اون سنجیده بشوند به شدت حس میشه و اگر نتونیم همچین امکانی رو فراهیم به بن بست میخوریم.ایا صرف اینکه بگیم ledger ای که از بلاک های بیشتری ساخته شده باشه مرجع ماست مشکل رو حل میکنه؟ معلومه که نه ، چون با توجه به اطلاعاتی که تا الان بدست آوردیم، هر کسی میتونه هر چند تا بخواد بلاک تولید کنه و کنار هم بزاره و بگه این ledger اصلی شبکه بیت کوینه، بنابراین فرایند اضافه کردن بلاک ها به ledger باید پیچیده تر باشه. البته بدیهیه که این مسئله رو تو شبکه های متمرکز نداریم چون تنها یک پایگاه داده از تراکنش ها و اطلاعات حساب ها وجود داره و تحت کنترل یک سروره.(openledger.info) اجماعاثبات انجام کار(Proof of work)ساتوشی برای دست‌یابی به اجماع تو شبکه بیت کوین از مکانیزم اثبات انجام کار یا proof of work استفاده کرد(توسط شخص دیگه ای ابداع شده).بیت کوین طوری برنامه نویسی شده که به هر nodeای که بتونه به ledger یک بلاک اضافه کنه (که به این node اصطلاحا miner node میگن) جایزه میده. اما گرفتن این جایزه و اضافه کردن بلاک اصلا آسون نیست.روال خیلی کلی به این صورته که تراکنش های جدید به همه node ها فرستاده میشه (به اصطلاح broadcast).هر node تراکنش ها رو اعتبارسنجی میکنه و بعد اون ها رو موقتا تو جایی به اسم Mempool ذخیره میکنه.دقت کنید که این تراکنش ها معتبر هستند اما هنوز مورد تایید شبکه بیت کوین قرار نگرفتند و وارد ledger نشدند.حالا هر node علاوه بر این تراکنش ها،تراکنش هایی که شامل انتقال کارمزد سایر تراکنش ها به آدرس خودش + یک تراکنش جایزه که حدود 6.25 بیت کوین و بدون مبدا هست و مقصد هم آدرس خودش هست + یک عددی به نام nonce(مثلا عدد صفر) رو کنار هم میزاره و proof of workرو اجرا میکنه، در واقع اون node میاد و تمامی تراکنش های گفته شده به همراه nonce رو hash میکنه. hashکردن برای کامپیوتر های امروزی کار به شدت آسونیه بنابراین یک عدد به اسم سختی شبکه تعریف شده که در ادامه توضیح میدیم که فایدش چیه . بعد از hash کردن دو حالت پیش میاد اگه این عدد کوچک تر از سختی شبکه باشه ،اونnodeبرنده میشه و میتونه بلاک رو به ledger اضافه کنه و به همه nodeها اون بلاک رو میفرسته(broad cast) تا این nodeها هم بعد از بررسی صحت ادعای ماینر (کوچیک تر بودن hash بدست اومده از سختی شبکه و چک کردن اعتبار تراکنش ها )، اون بلاک رو به ledger خودشون اضافه کنن اگر این عدد از سختی شبکه بزرگ تر باشه ، ماینر nonce رو یکی زیاد میکنه و دوباره اون بلاک رو hash میکنه و الگوریتم اونقدر تکرار میشه تا یکی از nodeها بتونه hash مناسب رو پیدا کنه و برنده بشه و ماینر ها به سراغ استخراج بلاک بعدی میرن.بنابراین دلیل وجود nonce اینه که هر node هر بار hash متفاوتی نسبت به حالت قبل تولیدکنه.هر node با پیدا کردن hash مربوطه نشون میده که تلاش زیادی رو با حساب کردن hashهای متوالی انجام داده که دقیقا مفهوم proof of work رو میرسونه.هر چه قدرت پردازشی node بیشتر باشه، طبیعتا hash های بیشتری رو میتونه محاسبه کنه و شانس بیشتری داره که hashمورد نظرش کوچیک تر از سختی شبکه بشه، ولی اگه قدرت پردازشی یکسان باشه شانس رسیدن به hash مورد نظر یکسانه.دو تا نکتهاین جایزه ی استخراج بلاک ، هر چهار سال تحت رویدادی به اسم halving نصف میشه.سال 2012 جایزه استخراج هر بلاک 25 بیت کوین بوده، 2016 12.5بیتکوین و الان هم 6.25 و ...سختی شبکه پیوسته طوری تنظیم میشه که به طور میانگین تو کل شبکه هر ده دقیقه فقط یک بلاک mine بشه. proof of work (blockchainhub.net) با توجه توضیحات بالا جایزه ی خیلی خوبی به ماینر ها تعلق میگیره بنابراین طبیعیه هر node تلاش کنه که جایزه رو بدست بیاره و به فکر خرابکاری نباشه . در کنار اون با توجه به منابع به شدت بالایی که مکانیزم proof of work نیاز داره، حمله به شبکه رو برای مهاجم عملا بی فایده میکنه.فرض کنید موجودی آدرس یکی از ماینرها 0.5 بیت کوین باشه و اون 0.5 بیت کوین رو همزمان به دو نفر ارسال کنه، حتی بعد از ماین کردن این بلاک و فرستادن اون به nodeهای دیگه، اون node ها تنها تراکنش اول رو معتبر میدونن و تراکنش دومی توسط خود شبکه رجکت میشه.فرض ایجاد یه تراکنش جعلی هم همونطور که در ابتدا گفتیم کنار میره چون با توجه به مکانیزم امضای دیجیتال موجود در شبکه بیت کوین هیچکس جز خود فرد نمیتونه تراکنشی با ادرس خودش انجام بده. تنها یک سناریو برای حمله وجود داره و به این صورته که یک node یا گروهی از node های خرابکار 51درصد قدرت شبکه رو در اختیار داشته باشن(که با توجه به هزینه ای که برای اینکار نیازه، عملا غیر ممکنه ) و ledger ای با طول بیشتر تولید کنن که به عنوان ledger اصلی شبکه جایگزین بشه، با توجه به اینکه با اینکار صرفا جلوی تراکنش های اشخاص دیگه گرفته میشه (چون تنها 49 درصد قدرت شبکه در اختیار node های درستکاره و طبیعتا طول blockchain اون ها کوتاه تره ) و اعتماد مردم نسبت به بیت کوین از بین میره و از شبکه خارج میشن ولی در نهایت مهاجمین چیزی بدست نمیارن جز ضرر نجومی برای تامین منابع کافی :)ممنون از وقتی که گزاشتید